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