View Javadoc
1   package com.vaadin.contextmenu;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import com.vaadin.server.ClientConnector;
7   import com.vaadin.server.Resource;
8   
9   public class AbstractMenu implements Menu {
10  
11      private final List<MenuItem> menuItems = new ArrayList<MenuItem>();
12      private boolean htmlContentAllowed;
13      private ClientConnector connector;
14  
15      private void markAsDirty() {
16          // FIXME check if it can be removed at all, or find a way to call it
17          // when needed
18          if (connector != null)
19              connector.markAsDirty();
20      }
21  
22      public AbstractMenu() {
23      }
24  
25      public AbstractMenu(ClientConnector connector) {
26          this.connector = connector;
27      }
28  
29      /*
30       * (non-Javadoc)
31       * 
32       * @see com.example.contextmenu.Menu#addItem(java.lang.String,
33       * com.example.contextmenu.AbstractMenu.Command)
34       */
35      @Override
36      public MenuItem addItem(String caption, Command command) {
37          return addItem(caption, null, command);
38      }
39  
40      /*
41       * (non-Javadoc)
42       * 
43       * @see com.example.contextmenu.Menu#addItem(java.lang.String,
44       * com.vaadin.server.Resource, com.example.contextmenu.AbstractMenu.Command)
45       */
46      @Override
47      public MenuItem addItem(String caption, Resource icon, Command command) {
48          if (caption == null) {
49              throw new IllegalArgumentException("caption cannot be null");
50          }
51          MenuItem newItem = new MenuItemImpl(caption, icon, command);
52          menuItems.add(newItem);
53          markAsDirty();
54  
55          return newItem;
56  
57      }
58  
59      /*
60       * (non-Javadoc)
61       * 
62       * @see com.example.contextmenu.Menu#addItemBefore(java.lang.String,
63       * com.vaadin.server.Resource, com.example.contextmenu.AbstractMenu.Command,
64       * com.example.contextmenu.AbstractMenu.MenuItem)
65       */
66      @Override
67      public MenuItem addItemBefore(String caption, Resource icon,
68              Command command, MenuItem itemToAddBefore) {
69          if (caption == null) {
70              throw new IllegalArgumentException("caption cannot be null");
71          }
72  
73          MenuItem newItem = new MenuItemImpl(caption, icon, command);
74          if (menuItems.contains(itemToAddBefore)) {
75              int index = menuItems.indexOf(itemToAddBefore);
76              menuItems.add(index, newItem);
77  
78          } else {
79              menuItems.add(newItem);
80          }
81  
82          markAsDirty();
83  
84          return newItem;
85      }
86  
87      /*
88       * (non-Javadoc)
89       * 
90       * @see com.example.contextmenu.Menu#getItems()
91       */
92      @Override
93      public List<MenuItem> getItems() {
94          return menuItems;
95      }
96  
97      /*
98       * (non-Javadoc)
99       * 
100      * @see com.example.contextmenu.Menu#removeItem(com.example.contextmenu.
101      * AbstractMenu .MenuItem)
102      */
103     @Override
104     public void removeItem(MenuItem item) {
105         if (item != null) {
106             menuItems.remove(item);
107         }
108         markAsDirty();
109     }
110 
111     /*
112      * (non-Javadoc)
113      * 
114      * @see com.example.contextmenu.Menu#removeItems()
115      */
116     @Override
117     public void removeItems() {
118         menuItems.clear();
119         markAsDirty();
120     }
121 
122     /*
123      * (non-Javadoc)
124      * 
125      * @see com.example.contextmenu.Menu#getSize()
126      */
127     @Override
128     public int getSize() {
129         return menuItems.size();
130     }
131 
132     /*
133      * (non-Javadoc)
134      * 
135      * @see com.example.contextmenu.Menu#setHtmlContentAllowed(boolean)
136      */
137     @Override
138     public void setHtmlContentAllowed(boolean htmlContentAllowed) {
139         this.htmlContentAllowed = htmlContentAllowed;
140         markAsDirty();
141     }
142 
143     /*
144      * (non-Javadoc)
145      * 
146      * @see com.example.contextmenu.Menu#isHtmlContentAllowed()
147      */
148     @Override
149     public boolean isHtmlContentAllowed() {
150         return htmlContentAllowed;
151     }
152 
153     void itemClicked(int itemId) {
154         MenuItem clickedItem = findItemById(itemId);
155         if (clickedItem != null) {
156             if (clickedItem.isCheckable())
157                 clickedItem.setChecked(!clickedItem.isChecked());
158 
159             if (clickedItem.getCommand() != null)
160                 clickedItem.getCommand().menuSelected(clickedItem);
161         }
162     }
163 
164     private MenuItem findItemById(int id) {
165         // TODO: create a map to avoid that?
166         return findItemById(getItems(), id);
167     }
168 
169     private MenuItem findItemById(List<MenuItem> items, int id) {
170         if (items == null)
171             return null;
172 
173         for (MenuItem item : items) {
174             if (item.getId() == id)
175                 return item;
176             else {
177                 MenuItem subItem = findItemById(item.getChildren(), id);
178                 if (subItem != null)
179                     return subItem;
180             }
181         }
182 
183         return null;
184     }
185 }