merge
[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 PolytomousKeyNode node = (PolytomousKeyNode) getTableItem(
78 table, point).getData();
79
80 if (selectedColumn == 4) {
81 PolytomousKeyNode linkData = getItemLinkData(node);
82 if (linkData != null) {
83 viewer.setSelection(new StructuredSelection(linkData), true);
84 }
85 }
86 if (selectedColumn == 5) {
87 Taxon taxon = getItemTaxon(node);
88 if (taxon != null) {
89 try {
90 EditorUtil.openTaxonBase((taxon).getUuid());
91 } catch (PartInitException e) {
92 MessagingUtils.error(getClass(), e);
93 }
94 }
95 }
96 }
97 }
98
99 private int getSelectedColumn(Table table, Point point) {
100 TableItem item = getTableItem(table, point);
101 if (item != null) {
102 for (int i = 0, n = table.getColumnCount(); i < n; i++) {
103 Rectangle rect = item.getBounds(i);
104 if (rect.contains(point)) {
105 // This is the selected column
106 return i;
107 }
108 }
109 }
110 return -1;
111 }
112
113 private TableItem getTableItem(Table table, Point point) {
114 return table.getItem(point);
115 }
116
117 /**
118 * @return
119 */
120 private PolytomousKeyNode getItemLinkData(PolytomousKeyNode node) {
121 return node.getChildren().isEmpty() ? null : node
122 .getChildAt(0);
123 }
124
125 /**
126 * @return
127 */
128 private Taxon getItemTaxon(PolytomousKeyNode node) {
129 return node.getTaxon();
130 }
131 }
132
133 public static final String ID = "eu.etaxonomy.taxeditor.editor.key.polytomous.list";
134
135 private TableViewer viewer;
136
137 private final KeyEditor editor;
138
139 public PolytomousKeyListEditor(KeyEditor editor) {
140 this.editor = editor;
141 }
142
143 /*
144 * (non-Javadoc)
145 *
146 * @see
147 * eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update
148 * (eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
149 */
150 @Override
151 public void update(CdmDataChangeMap arg0) {
152
153 }
154
155 /*
156 * (non-Javadoc)
157 *
158 * @see
159 * eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder
160 * ()
161 */
162 @Override
163 public ConversationHolder getConversationHolder() {
164 return ((PolytomousKeyEditorInput) getEditorInput())
165 .getConversationHolder();
166 }
167
168 /*
169 * (non-Javadoc)
170 *
171 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.
172 * IProgressMonitor)
173 */
174 @Override
175 public void doSave(IProgressMonitor monitor) {
176 }
177
178 /*
179 * (non-Javadoc)
180 *
181 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
182 */
183 @Override
184 public void doSaveAs() {
185 }
186
187 /*
188 * (non-Javadoc)
189 *
190 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite,
191 * org.eclipse.ui.IEditorInput)
192 */
193 @Override
194 public void init(IEditorSite site, IEditorInput input)
195 throws PartInitException {
196 setSite(site);
197 setInput(input);
198 }
199
200 /*
201 * (non-Javadoc)
202 *
203 * @see org.eclipse.ui.part.EditorPart#isDirty()
204 */
205 @Override
206 public boolean isDirty() {
207 return false;
208 }
209
210 /*
211 * (non-Javadoc)
212 *
213 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
214 */
215 @Override
216 public boolean isSaveAsAllowed() {
217 return false;
218 }
219
220 /*
221 * (non-Javadoc)
222 *
223 * @see
224 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
225 * .Composite)
226 */
227 @Override
228 public void createPartControl(Composite parent) {
229
230 FillLayout fillLayout = new FillLayout();
231 fillLayout.marginWidth = 0;
232 fillLayout.marginHeight = 0;
233 fillLayout.type = SWT.VERTICAL;
234 parent.setLayout(fillLayout);
235
236 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
237 | SWT.V_SCROLL | SWT.FULL_SELECTION);
238 getSite().setSelectionProvider(viewer);
239
240 createColumns(viewer);
241 viewer.getControl().addMouseListener(new LinkListener());
242 viewer.setContentProvider(new PolytomousKeyListContentProvider());
243 viewer.setLabelProvider(new PolytomousKeyListLabelProvider());
244
245 createMenu();
246
247 PolytomousKey key = ((PolytomousKeyEditorInput) getEditorInput())
248 .getKey();
249
250 setPartName(key.getTitleCache());
251
252 viewer.setInput(getEditorInput());
253 }
254
255 public int getTableItemCount() {
256 if (viewer != null && viewer.getTable() != null) {
257 return viewer.getTable().getItemCount();
258 }
259
260 return 0;
261 }
262
263 public PolytomousKey getViewerInputKey() {
264 return ((PolytomousKeyEditorInput) viewer.getInput()).getKey();
265 }
266 private void createMenu() {
267 // register context menu
268 MenuManager menuManager = new MenuManager();
269 menuManager
270 .add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
271 getSite().registerContextMenu(ID, menuManager, viewer);
272
273 Control control = viewer.getControl();
274 Menu menu = menuManager.createContextMenu(control);
275 control.setMenu(menu);
276 }
277
278 // This will create the columns for the table
279 private void createColumns(TableViewer viewer) {
280 Table table = viewer.getTable();
281 String[] titles = { "Node", "Question", "Edge", "Statement", "Link", "Taxon" };
282 int[] bounds = { 50, 200, 50, 200, 100, 200 };
283
284 for (int i = 0; i < titles.length; i++) {
285 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
286 column.getColumn().setText(titles[i]);
287 column.getColumn().setWidth(bounds[i]);
288 column.getColumn().setResizable(true);
289 column.getColumn().setMoveable(true);
290 }
291 table.setHeaderVisible(true);
292 table.setLinesVisible(false);
293
294 }
295
296 /*
297 * (non-Javadoc)
298 *
299 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
300 */
301 @Override
302 public void setFocus() {
303 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setFocus();
304 }
305
306 /*
307 * (non-Javadoc)
308 *
309 * @see
310 * eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(
311 * java.lang.Object)
312 */
313 @Override
314 public void changed(Object element) {
315 if(element != null) {
316 viewer.update(element, null);
317 }
318
319 if (element instanceof PolytomousKeyNode) {
320 List<PolytomousKeyNode> children = ((PolytomousKeyNode) element)
321 .getParent().getChildren();
322 for (PolytomousKeyNode child : children) {
323 viewer.update(child, null);
324 }
325 }
326 viewer.refresh();
327 }
328
329 /* (non-Javadoc)
330 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
331 */
332 @Override
333 public void forceDirty() {
334 changed(null);
335 }
336
337 /*
338 * (non-Javadoc)
339 *
340 * @see
341 * eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(
342 * eu.etaxonomy.cdm.model.common.CdmBase)
343 */
344 @Override
345 public boolean postOperation(CdmBase objectAffectedByOperation) {
346 viewer.refresh();
347 getConversationHolder().bind();
348 getConversationHolder().commit(true);
349 editor.changed(objectAffectedByOperation);
350
351 if (objectAffectedByOperation != null) {
352 viewer.setSelection(new StructuredSelection(
353 objectAffectedByOperation), true);
354 }
355 return true;
356 }
357
358 /*
359 * (non-Javadoc)
360 *
361 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
362 */
363 @Override
364 public boolean onComplete() {
365 return true;
366 }
367
368 }