Merge branch 'release/4.0.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / key / polytomous / PolytomousKeyListEditor.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.editor.key.polytomous;
12
13 import java.util.List;
14
15 import org.eclipse.core.runtime.IProgressMonitor;
16 import org.eclipse.jface.action.GroupMarker;
17 import org.eclipse.jface.action.MenuManager;
18 import org.eclipse.jface.viewers.StructuredSelection;
19 import org.eclipse.jface.viewers.TableViewer;
20 import org.eclipse.jface.viewers.TableViewerColumn;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.events.MouseAdapter;
23 import org.eclipse.swt.events.MouseEvent;
24 import org.eclipse.swt.graphics.Point;
25 import org.eclipse.swt.graphics.Rectangle;
26 import org.eclipse.swt.layout.FillLayout;
27 import org.eclipse.swt.widgets.Composite;
28 import org.eclipse.swt.widgets.Control;
29 import org.eclipse.swt.widgets.Menu;
30 import org.eclipse.swt.widgets.Table;
31 import org.eclipse.swt.widgets.TableItem;
32 import org.eclipse.ui.IEditorInput;
33 import org.eclipse.ui.IEditorSite;
34 import org.eclipse.ui.IWorkbenchActionConstants;
35 import org.eclipse.ui.PartInitException;
36 import org.eclipse.ui.PlatformUI;
37 import org.eclipse.ui.part.EditorPart;
38
39 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
40 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
41 import eu.etaxonomy.cdm.model.common.CdmBase;
42 import eu.etaxonomy.cdm.model.description.PolytomousKey;
43 import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
44 import eu.etaxonomy.cdm.model.taxon.Taxon;
45 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
46 import eu.etaxonomy.taxeditor.editor.EditorUtil;
47 import eu.etaxonomy.taxeditor.editor.key.KeyEditor;
48 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
49 import eu.etaxonomy.taxeditor.model.MessagingUtils;
50
51 /**
52 * @author n.hoffmann
53 * @created Mar 31, 2011
54 * @version 1.0
55 */
56 public class PolytomousKeyListEditor extends EditorPart implements
57 IConversationEnabled, IDirtyMarkable,
58 IPolytomousKeyEditorPage {
59
60 private class LinkListener extends MouseAdapter {
61 /*
62 * (non-Javadoc)
63 *
64 * @see
65 * org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events
66 * .MouseEvent)
67 */
68 @Override
69 public void mouseUp(MouseEvent event) {
70
71 if(event.button == 1 && event.count == 2) {
72 Table table = (Table) event.widget;
73 // Determine where the mouse was clicked
74 Point point = new Point(event.x, event.y);
75
76 int selectedColumn = getSelectedColumn(table, point);
77
78 if (table == null || point == null ){
79 return;
80 }
81
82 PolytomousKeyNode node = (PolytomousKeyNode) getTableItem(
83 table, point).getData();
84
85 if (selectedColumn == 4) {
86 PolytomousKeyNode linkData = getItemLinkData(node);
87 if (linkData != null) {
88 viewer.setSelection(new StructuredSelection(linkData), true);
89 }
90 }
91 if (selectedColumn == 5) {
92 Taxon taxon = getItemTaxon(node);
93 if (taxon != null) {
94 try {
95 EditorUtil.openTaxonBase((taxon).getUuid());
96 } catch (PartInitException e) {
97 MessagingUtils.error(getClass(), e);
98 }
99 }
100 }
101 }
102 }
103
104 private int getSelectedColumn(Table table, Point point) {
105 TableItem item = getTableItem(table, point);
106 if (item != null) {
107 for (int i = 0, n = table.getColumnCount(); i < n; i++) {
108 Rectangle rect = item.getBounds(i);
109 if (rect.contains(point)) {
110 // This is the selected column
111 return i;
112 }
113 }
114 }
115 return -1;
116 }
117
118 private TableItem getTableItem(Table table, Point point) {
119 return table.getItem(point);
120 }
121
122 /**
123 * @return
124 */
125 private PolytomousKeyNode getItemLinkData(PolytomousKeyNode node) {
126 return node.getChildren().isEmpty() ? null : node
127 .getChildAt(0);
128 }
129
130 /**
131 * @return
132 */
133 private Taxon getItemTaxon(PolytomousKeyNode node) {
134 return node.getTaxon();
135 }
136 }
137
138 public static final String ID = "eu.etaxonomy.taxeditor.editor.key.polytomous.list";
139
140 private TableViewer viewer;
141
142 private final KeyEditor editor;
143
144 public PolytomousKeyListEditor(KeyEditor editor) {
145 this.editor = editor;
146 }
147
148 /*
149 * (non-Javadoc)
150 *
151 * @see
152 * eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update
153 * (eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
154 */
155 @Override
156 public void update(CdmDataChangeMap arg0) {
157
158 }
159
160 /*
161 * (non-Javadoc)
162 *
163 * @see
164 * eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder
165 * ()
166 */
167 @Override
168 public ConversationHolder getConversationHolder() {
169 return ((PolytomousKeyEditorInput) getEditorInput())
170 .getConversationHolder();
171 }
172
173 /*
174 * (non-Javadoc)
175 *
176 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.
177 * IProgressMonitor)
178 */
179 @Override
180 public void doSave(IProgressMonitor monitor) {
181 }
182
183 /*
184 * (non-Javadoc)
185 *
186 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
187 */
188 @Override
189 public void doSaveAs() {
190 }
191
192 /*
193 * (non-Javadoc)
194 *
195 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite,
196 * org.eclipse.ui.IEditorInput)
197 */
198 @Override
199 public void init(IEditorSite site, IEditorInput input)
200 throws PartInitException {
201 setSite(site);
202 setInput(input);
203 }
204
205 /*
206 * (non-Javadoc)
207 *
208 * @see org.eclipse.ui.part.EditorPart#isDirty()
209 */
210 @Override
211 public boolean isDirty() {
212 return false;
213 }
214
215 /*
216 * (non-Javadoc)
217 *
218 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
219 */
220 @Override
221 public boolean isSaveAsAllowed() {
222 return false;
223 }
224
225 /*
226 * (non-Javadoc)
227 *
228 * @see
229 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
230 * .Composite)
231 */
232 @Override
233 public void createPartControl(Composite parent) {
234
235 FillLayout fillLayout = new FillLayout();
236 fillLayout.marginWidth = 0;
237 fillLayout.marginHeight = 0;
238 fillLayout.type = SWT.VERTICAL;
239 parent.setLayout(fillLayout);
240
241 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
242 | SWT.V_SCROLL | SWT.FULL_SELECTION);
243 getSite().setSelectionProvider(viewer);
244
245 createColumns(viewer);
246 viewer.getControl().addMouseListener(new LinkListener());
247 viewer.setContentProvider(new PolytomousKeyListContentProvider());
248 viewer.setLabelProvider(new PolytomousKeyListLabelProvider());
249
250 createMenu();
251
252 PolytomousKey key = ((PolytomousKeyEditorInput) getEditorInput())
253 .getKey();
254
255 setPartName(key.getTitleCache());
256
257 viewer.setInput(getEditorInput());
258 }
259
260 public int getTableItemCount() {
261 if (viewer != null && viewer.getTable() != null) {
262 return viewer.getTable().getItemCount();
263 }
264
265 return 0;
266 }
267
268 public PolytomousKey getViewerInputKey() {
269 return ((PolytomousKeyEditorInput) viewer.getInput()).getKey();
270 }
271 private void createMenu() {
272 // register context menu
273 MenuManager menuManager = new MenuManager();
274 menuManager
275 .add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
276 getSite().registerContextMenu(ID, menuManager, viewer);
277
278 Control control = viewer.getControl();
279 Menu menu = menuManager.createContextMenu(control);
280 menuManager.setRemoveAllWhenShown(true);
281 control.setMenu(menu);
282 }
283
284 // This will create the columns for the table
285 private void createColumns(TableViewer viewer) {
286 Table table = viewer.getTable();
287 String[] titles = { "Node", "Question", "Edge", "Statement", "Link", "Taxon" };
288 int[] bounds = { 50, 200, 50, 200, 100, 200 };
289
290 for (int i = 0; i < titles.length; i++) {
291 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
292 column.getColumn().setText(titles[i]);
293 column.getColumn().setWidth(bounds[i]);
294 column.getColumn().setResizable(true);
295 column.getColumn().setMoveable(true);
296 }
297 table.setHeaderVisible(true);
298 table.setLinesVisible(false);
299
300 }
301
302 /*
303 * (non-Javadoc)
304 *
305 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
306 */
307 @Override
308 public void setFocus() {
309 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setFocus();
310 }
311
312 /*
313 * (non-Javadoc)
314 *
315 * @see
316 * eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(
317 * java.lang.Object)
318 */
319 @Override
320 public void changed(Object element) {
321 if(element != null) {
322 viewer.update(element, null);
323 }
324
325 if (element instanceof PolytomousKeyNode) {
326 List<PolytomousKeyNode> children = ((PolytomousKeyNode) element)
327 .getParent().getChildren();
328 for (PolytomousKeyNode child : children) {
329 viewer.update(child, null);
330 }
331 }
332 viewer.refresh();
333 }
334
335 /* (non-Javadoc)
336 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
337 */
338 @Override
339 public void forceDirty() {
340 changed(null);
341 }
342
343 /*
344 * (non-Javadoc)
345 *
346 * @see
347 * eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(
348 * eu.etaxonomy.cdm.model.common.CdmBase)
349 */
350 @Override
351 public boolean postOperation(CdmBase objectAffectedByOperation) {
352 viewer.refresh();
353 getConversationHolder().bind();
354 getConversationHolder().commit(true);
355 editor.changed(objectAffectedByOperation);
356
357 if (objectAffectedByOperation != null) {
358 viewer.setSelection(new StructuredSelection(
359 objectAffectedByOperation), true);
360 }
361 return true;
362 }
363
364 /*
365 * (non-Javadoc)
366 *
367 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
368 */
369 @Override
370 public boolean onComplete() {
371 return true;
372 }
373
374 }