revert contextRefresh implementation
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / navigator / e4 / TaxonNavigatorE4.java
index 72dbc265bc7416fe9682831d7d0481f129fd6083..74284994ae746922325ceb6ef9c1281f539eac8d 100644 (file)
@@ -28,16 +28,23 @@ import javax.inject.Inject;
 import org.eclipse.core.commands.operations.UndoContext;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.di.annotations.Optional;
 import org.eclipse.e4.ui.di.Focus;
 import org.eclipse.e4.ui.di.UIEventTopic;
 import org.eclipse.e4.ui.di.UISynchronize;
 import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
+import org.eclipse.e4.ui.model.application.ui.menu.impl.HandledToolItemImpl;
 import org.eclipse.e4.ui.services.EMenuService;
 import org.eclipse.e4.ui.workbench.modeling.EModelService;
 import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.IElementComparer;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -54,31 +61,36 @@ import org.eclipse.ui.IMemento;
 
 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
 import eu.etaxonomy.cdm.api.application.CdmChangeEvent;
+import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
 import eu.etaxonomy.cdm.api.application.ICdmChangeListener;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.api.service.IClassificationService;
+import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.ICdmBase;
-import eu.etaxonomy.cdm.model.common.ITreeNode;
 import eu.etaxonomy.cdm.model.taxon.Classification;
-import eu.etaxonomy.cdm.model.taxon.TaxonNaturalComparator;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
-import eu.etaxonomy.cdm.model.taxon.TaxonNodeByNameComparator;
-import eu.etaxonomy.cdm.model.taxon.TaxonNodeByRankAndNameComparator;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoByNameComparator;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoByRankAndNameComparator;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoNaturalComparator;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
+import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
 import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.DataChangeBridge;
 import eu.etaxonomy.taxeditor.model.IContextListener;
 import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;
+import eu.etaxonomy.taxeditor.navigation.AppModelId;
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
 import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
 import eu.etaxonomy.taxeditor.navigation.navigator.EmptyRoot;
 import eu.etaxonomy.taxeditor.navigation.navigator.Root;
 import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNodeNavigatorComparator;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.preference.NavigatorOrderEnum;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
@@ -144,14 +156,14 @@ public class TaxonNavigatorE4 implements
     }
 
        @PostConstruct
-       private void create(Composite parent, EMenuService menuService){
+       private void create(Composite parent, EMenuService menuService, IEclipseContext context){
            FillLayout layout = new FillLayout();
            layout.marginHeight = 0;
            layout.marginWidth = 0;
            layout.type = SWT.VERTICAL;
 
            parent.setLayout(layout);
-           viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
+           viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI));
            viewer.getControl().setLayoutData(LayoutConstants.FILL());
 
            viewer.setContentProvider(new TaxonNavigatorContentProviderE4());
@@ -163,6 +175,9 @@ public class TaxonNavigatorE4 implements
                 if(firstElement instanceof ICdmBase){
                     NavigationUtil.openEditor((ICdmBase) firstElement, viewer.getControl().getShell(), modelService, partService, application);
                 }
+                if(firstElement instanceof TaxonNodeDto){
+                    NavigationUtil.openEditor((TaxonNodeDto) firstElement, viewer.getControl().getShell(), modelService, partService, application);
+                }
             }
         });
 
@@ -171,45 +186,85 @@ public class TaxonNavigatorE4 implements
         viewer.addSelectionChangedListener(selectionChangedListener);
 
         //create context menu
-        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.navigator.popupmenu.taxonnavigator");
+        menuService.registerContextMenu(viewer.getControl(), AppModelId.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_NAVIGATOR_POPUPMENU_TAXONNAVIGATOR );
 
         //add drag'n'drop support
         Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer()};
         viewer.addDragSupport(dndOperations, transfers, new TreeNodeDragListenerE4(viewer));
-        viewer.addDropSupport(dndOperations, transfers, new TreeNodeDropAdapterE4(this));
-
-        //add toolbar
-//        MToolBar toolBar = MMenuFactory.INSTANCE.createToolBar();
-//        MHandledToolItem linkWithEditor = MMenuFactory.INSTANCE.createHandledToolItem();
-//        linkWithEditor.setIconURI("platform:/plugin/eu.etaxonomy.taxeditor.store/icons/synced.gif");
-//        Command command = commandService.getCommand("eu.etaxonomy.taxeditor.navigation.command.linkWithTaxon");
-//        MCommand mCommand = MCommandsFactory.INSTANCE.createCommand();
-//        mCommand.setElementId(command.getId());
-//        try {
-//            mCommand.setCommandName(command.getName());
-//        } catch (NotDefinedException e) {
-//            e.printStackTrace();
-//        }
-//        linkWithEditor.setCommand(mCommand);
-//        linkWithEditor.setType(ItemType.CHECK);
-//        toolBar.getChildren().add(linkWithEditor);
-//        thisPart.setToolbar(toolBar);
+        TreeNodeDropAdapterE4 dropAdapter = new TreeNodeDropAdapterE4(this);
+        ContextInjectionFactory.inject(dropAdapter, context);
+        viewer.addDropSupport(dndOperations, transfers, dropAdapter);
+
+        updateSyncButton();
+
+
 
            init();
        }
 
+    protected void updateSyncButton() {
+        MPart viewPart = partService.findPart(AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_NAVIGATION_NAVIGATOR);
+        if(viewPart!=null){
+            MToolBar toolBar = viewPart.getToolbar();
+
+            List<MToolBarElement> toolBarElements = toolBar.getChildren();
+
+            MToolBarElement upperHandledMenuItem = toolBarElements.get(1);
+            if (upperHandledMenuItem instanceof HandledToolItemImpl){
+                ((HandledToolItemImpl)upperHandledMenuItem).setSelected(linkWithTaxon);
+            }
+        }
+    }
+
        /** {@inheritDoc} */
        protected IAdaptable getInitialInput() {
-               Comparator<TaxonNode> comparator;
-               if (PreferencesUtil.getSortNodesNaturally()){
-                       comparator = new TaxonNaturalComparator();
-               } else if (PreferencesUtil.getSortNodesStrictlyAlphabetically()){
-                       comparator = new TaxonNodeByNameComparator();
+               Comparator<TaxonNodeDto> comparator;
+               NavigatorOrderEnum orderValue = NavigatorOrderEnum.RankAndNameOrder;
+               try{
+                   orderValue = PreferencesUtil.getSortNodes();
+               }catch(IllegalArgumentException e){
+
+               }
+
+               if (orderValue.equals(NavigatorOrderEnum.NaturalOrder)){
+                       comparator = new TaxonNodeDtoNaturalComparator();
+               } else if (orderValue.equals(NavigatorOrderEnum.AlphabeticalOrder)){
+                       comparator = new TaxonNodeDtoByNameComparator();
                }else {
-                       comparator = new TaxonNodeByRankAndNameComparator();
+                       comparator = new TaxonNodeDtoByRankAndNameComparator();
                }
+
                TaxonNodeNavigatorComparator viewerComparator = new TaxonNodeNavigatorComparator(comparator);
                viewer.setComparator(viewerComparator);
+               viewer.setComparer(new IElementComparer() {
+
+               @Override
+            public int hashCode(Object element) {
+                   if (element instanceof TaxonNodeDto){
+                   TaxonNodeDto nodeDto = (TaxonNodeDto)element;
+
+                   String s = nodeDto.getUuid().toString();
+                   if (s != null) {
+                       return s.hashCode();
+                   }
+                   return element.hashCode();
+                   }else{
+                       return element.toString().hashCode();
+                   }
+               }
+
+            @Override
+            public boolean equals(Object element1, Object element2) {
+                if (element1 instanceof TaxonNodeDto && element2 instanceof TaxonNodeDto){
+                    TaxonNodeDto node1 = (TaxonNodeDto)element1;
+                    TaxonNodeDto node2 = (TaxonNodeDto)element2;
+                    return (node1.getUuid().equals(node2.getUuid()));
+                }else {
+                    return element1.equals(element2);
+                }
+            }
+               }
+               );
 
                if (CdmStore.isActive()) {
 
@@ -232,9 +287,10 @@ public class TaxonNavigatorE4 implements
                if (CdmStore.isActive()) {
                    cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
                    CdmApplicationState.getCurrentDataChangeService().register(this);
+                   viewer.setInput(getInitialInput());
                }
                CdmStore.getLoginManager().addObserver(this);
-        viewer.setInput(getInitialInput());
+
        }
 
        //Link with taxon selection
@@ -243,11 +299,22 @@ public class TaxonNavigatorE4 implements
        public void updateCurrentTaxon(@UIEventTopic(WorkbenchEventConstants.CURRENT_ACTIVE_EDITOR)ITaxonEditor editor){
            if(linkWithTaxon && editor!=null){
                viewer.refresh();
-               TaxonNode taxonNode = null;
+               TaxonNodeDto taxonNode = null;
                if(editor.getTaxon()!=null && editor.getTaxon().getTaxonNodes()!=null){
-                   taxonNode = editor.getTaxon().getTaxonNodes().iterator().next();
-                   viewer.reveal(taxonNode);
-                   viewer.setSelection(new StructuredSelection(taxonNode));
+                   if (editor instanceof TaxonNameEditorE4){
+                       taxonNode = new TaxonNodeDto( ((TaxonNameEditorE4)editor).getEditorInput().getTaxonNode());
+                   }else{
+                       if (editor.getTaxon().getTaxonNodes() != null && !editor.getTaxon().getTaxonNodes().isEmpty()){
+                           taxonNode = new TaxonNodeDto(editor.getTaxon().getTaxonNodes().iterator().next());
+                       }
+                   }
+                if (taxonNode != null){
+                    viewer.reveal(taxonNode);
+                    viewer.setSelection(new StructuredSelection(taxonNode));
+                }else{
+                    //TODO: show message in status bar
+                }
+
                }
            }
        }
@@ -272,8 +339,13 @@ public class TaxonNavigatorE4 implements
                        }
                }
                if(!viewer.getTree().isDisposed()){
+                   if (CdmStore.isActive()){
+                       viewer.setInput(getInitialInput());
+                   }
                    viewer.refresh();
                }
+
+               updateSyncButton();
        }
 
        /**
@@ -283,6 +355,15 @@ public class TaxonNavigatorE4 implements
         for(Object obj : objects) {
             viewer.refresh(obj);
         }
+        updateSyncButton();
+    }
+
+    /**
+     * Refresh this navigators viewer
+     */
+    public void refresh(Object object) {
+        viewer.refresh(object);
+        updateSyncButton();
     }
 
        /**
@@ -356,7 +437,7 @@ public class TaxonNavigatorE4 implements
 
                for (String uuid : string.split(" ")) { //$NON-NLS-1$
                        CdmBase cdmBaseObject = CdmStore.getService(
-                                       IClassificationService.class).getTaxonNodeByUuid(
+                                       ITaxonNodeService.class).find(
                                        UUID.fromString(uuid));
                        if (cdmBaseObject == null) {
                                // is this a tree uuid?
@@ -436,7 +517,7 @@ public class TaxonNavigatorE4 implements
 
        /** {@inheritDoc} */
        @Override
-       public boolean postOperation(CdmBase objectAffectedByOperation) {
+       public boolean postOperation(Object objectAffectedByOperation) {
            viewer.refresh();
                return true;
        }
@@ -451,6 +532,7 @@ public class TaxonNavigatorE4 implements
                if(o instanceof LoginManager){
                        refresh();
                }
+
        }
           /** {@inheritDoc} */
     @Override
@@ -460,6 +542,8 @@ public class TaxonNavigatorE4 implements
         }
 
         DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
+        updateSyncButton();
+
     }
 
     @Override
@@ -468,7 +552,7 @@ public class TaxonNavigatorE4 implements
     }
 
     @Override
-    public List<ITreeNode> getRootEntities() {
+    public List<TaxonNodeDto> getRootEntities() {
         if(root != null) {
             return root.getParentBeans();
         }
@@ -477,6 +561,7 @@ public class TaxonNavigatorE4 implements
 
     @Override
     public void onChange(CdmChangeEvent event) {
+        Object[] expandedElements = viewer.getExpandedElements();
         refresh();
         for(CdmBase cb : event.getChangedObjects()) {
                if(cb instanceof TaxonNode) {
@@ -487,9 +572,15 @@ public class TaxonNavigatorE4 implements
                     viewer.refresh(cb);
                 }
             } else if (cb instanceof Classification) {
+                if ( event.getAction().equals(Action.Create)){
+                    root.addRootNode((Classification)cb);
+                } else if ( event.getAction().equals(Action.Delete)){
+                    root.removeRootNode((Classification)cb);
+                }
                 viewer.refresh();
             }
         }
+        viewer.setExpandedElements(expandedElements);
     }
 
     @Override
@@ -533,6 +624,7 @@ public class TaxonNavigatorE4 implements
      */
     @Override
     public void contextRefresh(IProgressMonitor monitor) {
+//        viewer.refresh();
     }
 
     /**
@@ -541,4 +633,25 @@ public class TaxonNavigatorE4 implements
     @Override
     public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
     }
+
+    @Inject
+    @Optional
+    private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_NAVIGATOR)TaxonNodeDto dto){
+        if(dto!= null){
+            Object[] expandedElements = viewer.getExpandedElements();
+            refresh();
+            viewer.reveal(dto);
+            viewer.setExpandedElements(expandedElements);
+            viewer.setSelection(new StructuredSelection(dto));
+
+        }
+    }
+
+    @Inject
+    @Optional
+    private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_NAVIGATOR)boolean refresh){
+        if(refresh){
+            refresh();
+        }
+    }
 }