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;
35
36 import info.magnolia.event.EventBus;
37 import info.magnolia.objectfactory.ComponentProvider;
38 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
39 import info.magnolia.ui.workbench.column.definition.ColumnDefinition;
40 import info.magnolia.ui.workbench.definition.ContentPresenterDefinition;
41 import info.magnolia.ui.workbench.definition.WorkbenchDefinition;
42 import info.magnolia.ui.workbench.event.ItemDoubleClickedEvent;
43 import info.magnolia.ui.workbench.event.ItemRightClickedEvent;
44 import info.magnolia.ui.workbench.event.ItemShortcutKeyEvent;
45 import info.magnolia.ui.workbench.event.SelectionChangedEvent;
46
47 import java.util.ArrayList;
48 import java.util.Iterator;
49 import java.util.List;
50 import java.util.Set;
51
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55 import com.vaadin.data.Container;
56 import com.vaadin.data.Item;
57
58
59
60
61 public abstract class AbstractContentPresenterBase implements ContentPresenter, ContentView.Listener {
62
63 private static final Logger log = LoggerFactory.getLogger(AbstractContentPresenter.class);
64
65 protected static final String ICON_PROPERTY = "icon-node-data";
66
67 protected static final String ICON_TRASH = "icon-trash";
68
69 protected EventBus eventBus;
70
71 protected WorkbenchDefinition workbenchDefinition;
72
73 private List<Object> selectedItemIds = new ArrayList<Object>();
74
75 protected String viewTypeName;
76
77 protected ContentConnector contentConnector;
78
79 private final ComponentProvider componentProvider;
80
81 protected Container container;
82
83 public AbstractContentPresenterBase(ComponentProvider componentProvider) {
84 this.componentProvider = componentProvider;
85 }
86
87 protected ComponentProvider getComponentProvider() {
88 return componentProvider;
89 }
90
91 @Override
92 public ContentView start(WorkbenchDefinition workbenchDefinition, EventBus eventBus, String viewTypeName, ContentConnector contentConnector) {
93 this.workbenchDefinition = workbenchDefinition;
94 this.eventBus = eventBus;
95 this.viewTypeName = viewTypeName;
96 this.contentConnector = contentConnector;
97 return null;
98 }
99
100 @Override
101 public List<Object> getSelectedItemIds() {
102 return this.selectedItemIds;
103 }
104
105 public Object getSelectedItemId() {
106 return selectedItemIds.isEmpty() ? null : selectedItemIds.get(0);
107 }
108
109 @Override
110 public void setSelectedItemIds(List<Object> selectedItemIds) {
111 this.selectedItemIds = selectedItemIds;
112 }
113
114
115
116 @Override
117 public void onItemSelection(Set<Object> itemIds) {
118 Object rootItemId = contentConnector.getDefaultItemId();
119 if (itemIds == null || itemIds.isEmpty()) {
120 log.debug("Got null com.vaadin.data.Item. ItemSelectedEvent will be fired with null path.");
121 List<Object> ids = new ArrayList<Object>(1);
122
123 ids.add(rootItemId);
124 setSelectedItemIds(ids);
125 } else {
126 Iterator<Object> itemIdIt = itemIds.iterator();
127 while (itemIdIt.hasNext()) {
128 Object item = (Object) itemIdIt.next();
129
130
131
132 try {
133 if (rootItemId.equals(item) && itemIds.size() > 1) {
134 itemIdIt.remove();
135 }
136 } catch (Exception e) {
137 log.error("An error occurred while selecting a row in the data grid", e);
138 }
139 }
140
141 List<Object> selectedIds = new ArrayList<Object>(itemIds.size());
142 for (Object id : itemIds) {
143 selectedIds.add(id);
144 }
145
146 setSelectedItemIds(new ArrayList<Object>(selectedIds));
147 log.debug("com.vaadin.data.Item at {} was selected. Firing ItemSelectedEvent...", itemIds.toArray());
148 }
149 eventBus.fireEvent(new SelectionChangedEvent(itemIds));
150
151 }
152
153 @Override
154 public void onDoubleClick(Object itemId) {
155 if (itemId != null) {
156 try {
157 List<Object> ids = new ArrayList<Object>(1);
158 ids.add(itemId);
159 setSelectedItemIds(ids);
160 log.debug("com.vaadin.data.Item at {} was double clicked. Firing ItemDoubleClickedEvent...", getSelectedItemId());
161 eventBus.fireEvent(new ItemDoubleClickedEvent(getSelectedItemId()));
162 } catch (Exception e) {
163 log.error("An error occurred while double clicking on a row in the data grid", e);
164 }
165 } else {
166 log.warn("Got null com.vaadin.data.Item. No event will be fired.");
167 }
168 }
169
170 @Override
171 public void onRightClick(Object itemId, int clickX, int clickY) {
172 if (itemId != null) {
173 try {
174
175 if (!selectedItemIds.contains(itemId)) {
176 List<Object> ids = new ArrayList<Object>(1);
177 ids.add((Object) itemId);
178 setSelectedItemIds(ids);
179 select(ids);
180 }
181 log.debug("com.vaadin.data.Item at {} was right clicked. Firing ItemRightClickedEvent...", itemId);
182 eventBus.fireEvent(new ItemRightClickedEvent(itemId, clickX, clickY));
183 } catch (Exception e) {
184 log.error("An error occurred while right clicking on a row in the data grid", e);
185 }
186 } else {
187 log.warn("Got null com.vaadin.data.Item. No event will be fired.");
188 }
189 }
190
191 @Override
192 public void onShortcutKey(int keyCode, int[] modifierKeys) {
193 Item item;
194
195 if (selectedItemIds.size() == 1) {
196 try {
197
198 log.debug("com.vaadin.data.Item at {} was keyboard clicked. Firing ItemShortcutKeyEvent...", getSelectedItemId());
199 eventBus.fireEvent(new ItemShortcutKeyEvent(getSelectedItemId(), keyCode, modifierKeys));
200 } catch (Exception e) {
201 log.error("An error occurred while a key was pressed with a selected row in the data grid", e);
202 }
203 } else {
204 log.warn("Got null com.vaadin.data.Item. No event will be fired.");
205 }
206 }
207
208 protected Iterator<ColumnDefinition> getColumnsIterator() {
209 Iterator<ContentPresenterDefinition> viewsIterator = workbenchDefinition.getContentViews().iterator();
210 while (viewsIterator.hasNext()) {
211 ContentPresenterDefinition contentView = viewsIterator.next();
212 String viewType = contentView.getViewType();
213 if (viewType != null && viewType.equals(viewTypeName)) {
214 return getAvailableColumns(contentView.getColumns()).iterator();
215 }
216 }
217 return null;
218 }
219
220 @Override
221 public abstract String getIcon(Item item);
222
223
224 protected List<ColumnDefinition> getAvailableColumns(final List<ColumnDefinition> allColumns) {
225 final List<ColumnDefinition> availableColumns = new ArrayList<ColumnDefinition>();
226 Iterator<ColumnDefinition> it = allColumns.iterator();
227 while (it.hasNext()) {
228 ColumnDefinition column = it.next();
229 if (column.isEnabled() && (column.getRuleClass() == null || componentProvider.newInstance(column.getRuleClass(), column).isAvailable())) {
230 availableColumns.add(column);
231 }
232 }
233 return availableColumns;
234 }
235
236 @Override
237 public void select(List<Object> itemIds) {}
238
239 @Override
240 public void expand(Object itemId) {}
241
242 protected abstract Container initializeContainer();
243
244 protected ContentPresenterDefinition getPresenterDefinition() {
245 Iterator<ContentPresenterDefinition> viewsIterator = workbenchDefinition.getContentViews().iterator();
246 while (viewsIterator.hasNext()) {
247 ContentPresenterDefinition contentPresenterDefinition = viewsIterator.next();
248 String viewType = contentPresenterDefinition.getViewType();
249 if (viewType != null && viewType.equals(viewTypeName)) {
250 return contentPresenterDefinition;
251 }
252 }
253 return null;
254 }
255 }