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
17
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
31
32
33
34
35 @Override
36 public MenuItem addItem(String caption, Command command) {
37 return addItem(caption, null, command);
38 }
39
40
41
42
43
44
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
61
62
63
64
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
89
90
91
92 @Override
93 public List<MenuItem> getItems() {
94 return menuItems;
95 }
96
97
98
99
100
101
102
103 @Override
104 public void removeItem(MenuItem item) {
105 if (item != null) {
106 menuItems.remove(item);
107 }
108 markAsDirty();
109 }
110
111
112
113
114
115
116 @Override
117 public void removeItems() {
118 menuItems.clear();
119 markAsDirty();
120 }
121
122
123
124
125
126
127 @Override
128 public int getSize() {
129 return menuItems.size();
130 }
131
132
133
134
135
136
137 @Override
138 public void setHtmlContentAllowed(boolean htmlContentAllowed) {
139 this.htmlContentAllowed = htmlContentAllowed;
140 markAsDirty();
141 }
142
143
144
145
146
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
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 }