1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.workbench.list;
35
36 import info.magnolia.ui.vaadin.grid.MagnoliaTable;
37 import info.magnolia.ui.workbench.ContentView;
38 import info.magnolia.ui.workbench.column.definition.ColumnFormatter;
39
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.Collections;
43 import java.util.LinkedHashSet;
44 import java.util.List;
45 import java.util.Set;
46
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50 import com.vaadin.data.Container;
51 import com.vaadin.data.Item;
52 import com.vaadin.data.Property;
53 import com.vaadin.data.Property.ValueChangeEvent;
54 import com.vaadin.event.ItemClickEvent;
55 import com.vaadin.event.ItemClickEvent.ItemClickListener;
56 import com.vaadin.shared.MouseEventDetails.MouseButton;
57 import com.vaadin.ui.Component;
58 import com.vaadin.ui.Table;
59 import com.vaadin.ui.Table.ColumnResizeEvent;
60 import com.vaadin.ui.Table.TableDragMode;
61
62
63
64
65 public class ListViewImpl implements ListView {
66
67 private static final Logger log = LoggerFactory.getLogger(ListViewImpl.class);
68
69 private static final int MINIMUM_COLUMN_WIDTH = 46;
70 private static final String DELETED_ROW_STYLENAME = "deleted";
71
72 private Table table;
73
74 private ListView.Listener listener;
75
76 protected void initializeTable(Table table) {
77 table.setSizeFull();
78
79 table.setImmediate(true);
80 table.setSelectable(true);
81 table.setMultiSelect(true);
82 table.setNullSelectionAllowed(true);
83
84 table.setDragMode(TableDragMode.NONE);
85 table.setEditable(false);
86 table.setColumnCollapsingAllowed(false);
87 table.setColumnReorderingAllowed(false);
88 table.setSortEnabled(true);
89
90 table.setCellStyleGenerator(new Table.CellStyleGenerator() {
91
92
93 @Override
94 public String getStyle(Table source, Object itemId, Object propertyId) {
95
96 if (propertyId == null && itemId != null) {
97 final Item item = source.getContainerDataSource().getItem(itemId);
98 if (item == null) {
99 return DELETED_ROW_STYLENAME;
100 } else {
101 return listener.getIcon(item);
102 }
103 }
104 return null;
105 }
106 });
107
108
109
110 table.addStyleName("no-header-checkbox");
111 this.table = table;
112 bindHandlers();
113 }
114
115 protected void bindHandlers() {
116 table.addValueChangeListener(new Property.ValueChangeListener() {
117 @Override
118 public void valueChange(ValueChangeEvent event) {
119 Object value = event.getProperty().getValue();
120
121 if (listener != null) {
122 Set<Object> items;
123 if (value instanceof Set) {
124 items = (Set) value;
125 } else if (value == null) {
126 items = Collections.emptySet();
127 } else {
128 items = new LinkedHashSet<Object>();
129 items.add(value);
130 }
131 listener.onItemSelection(items);
132 }
133 }
134 });
135
136 table.addItemClickListener(new ItemClickListener() {
137
138 @Override
139 public void itemClick(ItemClickEvent event) {
140
141 if (event.getButton() == MouseButton.RIGHT) {
142 if (listener != null) {
143 listener.onRightClick(event.getItemId(), event.getClientX(), event.getClientY());
144 }
145 } else if (event.isDoubleClick()) {
146 if (listener != null) {
147 listener.onDoubleClick(event.getItemId());
148 }
149 } else {
150 Object value = table.getValue();
151 if (value != null) {
152 Set<Object> items;
153 if (value instanceof Set) {
154 items = (Set<Object>) value;
155 } else {
156 items = new LinkedHashSet<Object>();
157 items.add(value);
158 }
159 if (items.size() == 1 && items.iterator().next().equals(event.getItemId())) {
160 table.setValue(null);
161 }
162 }
163 }
164 }
165 });
166
167 table.addColumnResizeListener(new Table.ColumnResizeListener() {
168
169 @Override
170 public void columnResize(ColumnResizeEvent event) {
171 if (event.getCurrentWidth() < MINIMUM_COLUMN_WIDTH) {
172 table.setColumnWidth(event.getPropertyId(), MINIMUM_COLUMN_WIDTH);
173 }
174 }
175 });
176 }
177
178 protected ListView.Listener getListener() {
179 return listener;
180 }
181
182 @Override
183 public void setListener(ContentView.Listener listener) {
184 this.listener = listener;
185 }
186
187 @Override
188 public void setContainer(Container container) {
189 table = createTable(container);
190 initializeTable(table);
191 }
192
193 protected Table createTable(Container container) {
194 return new MagnoliaTable(container);
195 }
196
197 @Override
198 public void addColumn(String propertyId, String title) {
199 table.setColumnHeader(propertyId, title);
200 List<Object> visibleColumns = new ArrayList<Object>(Arrays.asList(table.getVisibleColumns()));
201 if (!visibleColumns.contains(propertyId)) {
202 visibleColumns.add(propertyId);
203 }
204 table.setVisibleColumns(visibleColumns.toArray());
205 }
206
207 @Override
208 public void addColumn(String propertyId, String title, int width) {
209 addColumn(propertyId, title);
210 table.setColumnWidth(propertyId, width);
211 }
212
213 @Override
214 public void addColumn(String propertyId, String title, float expandRatio) {
215 addColumn(propertyId, title);
216 table.setColumnExpandRatio(propertyId, expandRatio);
217 }
218
219 @Override
220 public void setColumnFormatter(String propertyId, ColumnFormatter formatter) {
221 table.addGeneratedColumn(propertyId, formatter);
222 }
223
224 @Override
225 public void clearColumns() {
226 table.setVisibleColumns(new Object[]{});
227 }
228
229 @Override
230 public void select(List<Object> itemIds) {
231 table.setValue(null);
232 if (itemIds != null && !itemIds.isEmpty()) {
233 for (Object id : itemIds) {
234 table.select(id);
235 }
236 }
237
238 }
239
240 @Override
241 public void expand(Object itemId) {
242 }
243
244 @Override
245 public Component asVaadinComponent() {
246 return table;
247 }
248
249 @Override
250 public void setMultiselect(boolean multiselect) {
251 table.setMultiSelect(multiselect);
252 }
253
254 @Override
255 public void onShortcutKey(int keyCode, int[] modifierKeys) {
256 if (listener != null) {
257 listener.onShortcutKey(keyCode, modifierKeys);
258 }
259 }
260
261 }