Implemented drag and drop for description elements as well as the functionality to...
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / descriptive / DescriptiveViewPart.java
index dc22f84565519a7b817cc429d73e8f07adba1901..1eb100f10cb55043da103e6d224badfc2419b059 100644 (file)
@@ -13,10 +13,8 @@ package eu.etaxonomy.taxeditor.editor.view.descriptive;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.log4j.Logger;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.resource.ImageDescriptor;
@@ -25,6 +23,8 @@ import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.graphics.ImageData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -36,36 +36,43 @@ import org.eclipse.ui.IWorkbenchActionConstants;
 import org.eclipse.ui.IWorkbenchPart;
 
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
+import eu.etaxonomy.taxeditor.editor.key.AbstractKeyEditor;
 import eu.etaxonomy.taxeditor.editor.view.AbstractCdmEditorViewPart;
 import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
+import eu.etaxonomy.taxeditor.model.FeatureNodeContainerTree;
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
 import eu.etaxonomy.taxeditor.model.ImageResources;
 
 /**
+ * <p>DescriptiveViewPart class.</p>
+ *
  * @author n.hoffmann
  * @created Jun 9, 2010
  * @version 1.0
  */
 public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IPartContentHasDetails, IPartContentHasSupplementalData {
-       private static final Logger logger = Logger
-                       .getLogger(DescriptiveViewPart.class);
 
+       /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.view.desc"{trunked}</code> */
        public static final String ID = "eu.etaxonomy.taxeditor.editor.view.description";
        
        private TreeViewer viewer;
        
-       private Map<TaxonDescription, FeatureNodeContainer> featureNodeContainerCache = new HashMap<TaxonDescription, FeatureNodeContainer>();
+       private Map<TaxonDescription, FeatureNodeContainerTree> featureNodeContainerCache = new HashMap<TaxonDescription, FeatureNodeContainerTree>();
 
        private ToggleDescriptionAction showAllElementsAction;
 
        private ToggleDescriptionAction hideAllElementsAction;
-               
+
+       private int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
+       
+       /** {@inheritDoc} */
        @Override
        public void createViewer(Composite parent) {
                
@@ -74,23 +81,26 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                viewer.setContentProvider(new DescriptiveContentProvider(featureNodeContainerCache));           
                viewer.setLabelProvider(new DescriptiveLabelProvider());
                
+               viewer.setSorter(new DescriptiveViewerSorter());
+               
                viewer.setAutoExpandLevel(2);
+               
+               
+               Transfer[] transfers = new Transfer[] { DescriptionElementTransfer.getInstance() };
+               viewer.addDragSupport(dndOperations, transfers, new DescriptionElementDragListener(
+                               this));
+               viewer.addDropSupport(dndOperations, transfers,
+                               new DescriptionElementDropAdapter(viewer));
                                                
                // Propagate selection from viewer
                getSite().setSelectionProvider(viewer);
                
-               // Add context menu to tree
-               MenuManager menuMgr = new MenuManager();
-               menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-               getSite().registerContextMenu(menuMgr, viewer);
-               
-               Control control = viewer.getControl();
-               Menu menu = menuMgr.createContextMenu(control);
-               control.setMenu(menu);                  
-               
                showAllElementsAction = new ToggleDescriptionAction(false);             
                hideAllElementsAction = new ToggleDescriptionAction(true);
                
+               // Add context menu to tree
+               createMenu();
+               
                createToolbar();
                
                // set initial input
@@ -102,6 +112,7 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
        /* (non-Javadoc)
         * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getInitialSelection()
         */
+       /** {@inheritDoc} */
        @Override
        protected ISelection getInitialSelection() {
                if(getEditor() != null){
@@ -117,12 +128,26 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                toolBarManager.add(hideAllElementsAction);
        }
        
+       /*
+        * TODO add to the views menu
+        */
        private void createMenu(){
-               IMenuManager menuManager = getViewSite().getActionBars().getMenuManager();
+               MenuManager menuManager = new MenuManager();
+               menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+               
+               getSite().registerContextMenu(menuManager, viewer);
+
+               // FIXME for some reason this is not working
                menuManager.add(showAllElementsAction);
                menuManager.add(hideAllElementsAction);
+                               
+               Control control = viewer.getControl();
+               Menu menu = menuManager.createContextMenu(control);
+               
+               control.setMenu(menu);  
        }
 
+       /** {@inheritDoc} */
        public void selectionChanged(IWorkbenchPart part, ISelection selection) {
                if(EditorUtil.getActiveEditor() == null){
                        showEmptyPage();
@@ -134,6 +159,11 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                        return;
                }
                
+               if(part instanceof AbstractKeyEditor){
+                       showEmptyPage();
+                       return;
+               }
+               
                if(part instanceof MultiPageTaxonEditor){
                        if(! part.equals(this.part)){
                                IEditorInput input = ((IEditorPart) part).getEditorInput();
@@ -163,6 +193,7 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                        setImageDescriptor(new ImageDescriptor() {
                                @Override
                                public ImageData getImageData() {
+                                       setText(expanded ? "Collapse All" : "Expand All");
                                        String resource = expanded ? ImageResources.COLLAPSE_ALL : ImageResources.EXPAND_ALL;
                                        return ImageResources.getImage(resource).getImageData();
                                }
@@ -183,48 +214,49 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                }
        }
 
+       /** {@inheritDoc} */
        @Override
        public boolean postOperation(CdmBase objectAffectedByOperation) {
-               boolean result = super.postOperation(objectAffectedByOperation);
+               return super.postOperation(objectAffectedByOperation);
+       }
+
+       /** {@inheritDoc} */
+       @Override
+       public void changed(Object object) {
+               for(FeatureNodeContainerTree containerTree : featureNodeContainerCache.values()){
+                       containerTree.buildTree();
+               }
+               viewer.refresh();
                
-               if(objectAffectedByOperation != null){
+               if(object instanceof DescriptionElementBase){
+                       DescriptionElementBase descriptionElement = (DescriptionElementBase) object;
+                       DescriptionBase description = descriptionElement.getInDescription();
+                       FeatureNodeContainerTree containerTree = featureNodeContainerCache.get(description);
                        
-                       if(objectAffectedByOperation instanceof DescriptionElementBase){
-                               DescriptionElementBase descriptionElement = (DescriptionElementBase) objectAffectedByOperation;
-                               FeatureNodeContainer container = getFeatureNodeContainerForDescriptionElement(descriptionElement);
-                               viewer.expandToLevel(container, 1);
-                       }
+                       FeatureNodeContainer featureNodeContainer = containerTree.getFeatureNodeContainerForDescriptionElement(descriptionElement);
+                       viewer.expandToLevel(featureNodeContainer, 1);
                        
-                       StructuredSelection selection = new StructuredSelection(objectAffectedByOperation);
-                       viewer.setSelection(selection, true);
                }
 
-               return result;
-       }
-       
-       /**
-        * 
-        * @param descriptionElement
-        * @return
-        */
-       private FeatureNodeContainer getFeatureNodeContainerForDescriptionElement(
-                       DescriptionElementBase descriptionElement) {
-               FeatureNodeContainer featureNodeContainerBranch = featureNodeContainerCache.get(descriptionElement.getInDescription());         
-               FeatureNodeContainer featureNodeContainer = featureNodeContainerBranch.getFeatureNodeContainerForDescriptionElement(descriptionElement);
-               return featureNodeContainer;
-       }
+               if(object != null){
+                       StructuredSelection selection = new StructuredSelection(object);
+                       viewer.setSelection(selection, true);
+               }
 
-       @Override
-       public void dirtyStateChanged() {
-               viewer.refresh(true);
-               super.dirtyStateChanged();
+               super.changed(object);
        }
 
+       /** {@inheritDoc} */
        @Override
        public Viewer getViewer() {
                return viewer;
        }
 
+       /**
+        * <p>onComplete</p>
+        *
+        * @return a boolean.
+        */
        public boolean onComplete() {
                return false;
        }