Polytomous keys may be viewed as list as well
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / key / polytomous / PolytomousKeyListEditor.java
index 71eaa62e92c1086097eb843a67f0a1dfdb0092a1..921bbe9fc68bb46e6c3b94d80b6ee972894b6cdc 100644 (file)
 package eu.etaxonomy.taxeditor.editor.key.polytomous;
 
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.PartInitException;
@@ -20,7 +31,10 @@ import org.eclipse.ui.part.EditorPart;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.model.description.PolytomousKey;
+import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory;
 
 /**
@@ -31,12 +45,66 @@ import eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory;
 public class PolytomousKeyListEditor extends EditorPart implements
                IConversationEnabled {
 
+       private class LinkListener extends MouseAdapter {
+               /*
+                * (non-Javadoc)
+                * 
+                * @see
+                * org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events
+                * .MouseEvent)
+                */
+               @Override
+               public void mouseUp(MouseEvent event) {
+
+                       Table table = (Table) event.widget;
+                       // Determine where the mouse was clicked
+                       Point pt = new Point(event.x, event.y);
+
+                       final TableItem item = table.getItem(pt);
+                       if (item != null) {
+                               // Determine which column was selected
+                               int column = -1;
+                               for (int i = 0, n = table.getColumnCount(); i < n; i++) {
+                                       Rectangle rect = item.getBounds(i);
+                                       if (rect.contains(pt)) {
+                                               // This is the selected column
+                                               column = i;
+                                               break;
+                                       }
+                               }
+                               if (column == 3) {
+                                       PolytomousKeyNode node = (PolytomousKeyNode) item.getData();
+                                       Object linkData = getItemLinkData(node);
+                                       if (linkData instanceof PolytomousKeyNode) {
+                                               viewer.setSelection(new StructuredSelection(linkData),
+                                                               true);
+                                       } else if (linkData instanceof Taxon) {
+                                               try {
+                                                       EditorUtil.openTaxonBase(((Taxon) linkData)
+                                                                       .getUuid());
+                                               } catch (PartInitException e) {
+                                                       EditorUtil.error(getClass(), e);
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               /**
+                * @return
+                */
+               private Object getItemLinkData(PolytomousKeyNode node) {
+                       return node.getChildren().isEmpty() ? node.getTaxon() : node
+                                       .getChildAt(0);
+               }
+       }
+
        public static final String ID = "eu.etaxonomy.taxeditor.editor.key.polytomous.list";
 
        private CdmFormFactory formFactory;
        private Composite container;
 
-       private PolytomousKeyListViewer viewer;
+       private TableViewer viewer;
 
        /*
         * (non-Javadoc)
@@ -127,14 +195,48 @@ public class PolytomousKeyListEditor extends EditorPart implements
         */
        @Override
        public void createPartControl(Composite parent) {
-               container = formFactory.createComposite(parent);
 
-               viewer = new PolytomousKeyListViewer(container);
+               FillLayout fillLayout = new FillLayout();
+               fillLayout.marginWidth = 0;
+               fillLayout.marginHeight = 0;
+               fillLayout.type = SWT.VERTICAL;
+               parent.setLayout(fillLayout);
+
+               viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
+                               | SWT.V_SCROLL | SWT.FULL_SELECTION);
+               getSite().setSelectionProvider(viewer);
+
+               createColumns(viewer);
+               viewer.getControl().addMouseListener(new LinkListener());
+               viewer.setContentProvider(new PolytomousKeyListContentProvider());
+               viewer.setLabelProvider(new PolytomousKeyListLabelProvider());
+
+               // viewer.getControl().setLayoutData(CdmFormFactory.FILL());
+
                PolytomousKey key = ((PolytomousKeyEditorInput) getEditorInput())
                                .getKey();
+
                viewer.setInput(key);
        }
 
+       // This will create the columns for the table
+       private void createColumns(TableViewer viewer) {
+               Table table = viewer.getTable();
+               String[] titles = { "Node Number", "Question", "Statement", "Link" };
+               int[] bounds = { 50, 200, 200, 100 };
+
+               for (int i = 0; i < titles.length; i++) {
+                       TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+                       column.getColumn().setText(titles[i]);
+                       column.getColumn().setWidth(bounds[i]);
+                       column.getColumn().setResizable(true);
+                       column.getColumn().setMoveable(true);
+               }
+               table.setHeaderVisible(true);
+               table.setLinesVisible(false);
+
+       }
+
        /*
         * (non-Javadoc)
         *