Add IEventBaseService to application controller #5403
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / referencingobjects / ReferencingObjectsView.java
index fbd5000f4e715fd77206fe1a8a5dddeb2c0c8cd5..682f60debad484c7b39c292b51513d5770e77020 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* European Distributed Institute of Taxonomy
 * http://www.e-taxonomy.eu
-* 
+*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * See LICENSE.TXT at the top of this package for the full license terms.
 */
@@ -22,71 +22,78 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.TreeNode;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
-
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.INullSelectionListener;
-import org.eclipse.ui.ISelectionListener;
-
 import org.eclipse.ui.IWorkbenchPart;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.IAgentService;
-import eu.etaxonomy.cdm.api.service.ICommonService;
+import eu.etaxonomy.cdm.api.service.IDescriptionService;
+import eu.etaxonomy.cdm.api.service.IEventBaseService;
 import eu.etaxonomy.cdm.api.service.IGroupService;
-
+import eu.etaxonomy.cdm.api.service.IMediaService;
 import eu.etaxonomy.cdm.api.service.INameService;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.IReferenceService;
 import eu.etaxonomy.cdm.api.service.ITaxonService;
 import eu.etaxonomy.cdm.api.service.IUserService;
-
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.EventBase;
 import eu.etaxonomy.cdm.model.common.Group;
-
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.User;
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.description.DescriptionBase;
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.cdm.model.media.Media;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
-
-import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
 import eu.etaxonomy.taxeditor.model.DescriptionHelper;
-import eu.etaxonomy.taxeditor.model.LineSelection;
+import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.view.AbstractCdmViewPart;
 
 /**
- * <p>ReferencingObjectsView class.</p>
- *
  * @author p.ciardelli
  * @created 08.07.2009
  * @version 1.0
  */
-public class ReferencingObjectsView extends AbstractCdmViewPart{
+public class ReferencingObjectsView extends AbstractCdmViewPart {
        private static final Logger logger = Logger
                        .getLogger(ReferencingObjectsView.class);
 
-       /** Constant <code>ID="eu.etaxonomy.taxeditor.bulkeditor.refer"{trunked}</code> */
        public static final String ID = "eu.etaxonomy.taxeditor.bulkeditor.view.referencingobjects";
-       
+
        private TableViewer viewer;
 
        private String referencedObjectTitleCache;
-       private ConversationHolder conversation; 
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#createViewer(org.eclipse.swt.widgets.Composite)
-        */
+       private ConversationHolder conversation;
+       private final ICdmEntitySession cdmEntitySession;
+
+       public ReferencingObjectsView() {
+           cdmEntitySession = CdmStore.getCurrentSessionManager().bindNullSession();
+       }
+
        /** {@inheritDoc} */
        @Override
        public void createViewer(Composite parent) {
@@ -97,9 +104,43 @@ public class ReferencingObjectsView extends AbstractCdmViewPart{
                createColumns(viewer);
                viewer.setContentProvider(new ReferencingObjectsContentProvider());
                viewer.setLabelProvider(new ReferencingObjectsLabelProvider());
-//             viewer.setInput(new ArrayList<CdmBase>());
+               viewer.setCellModifier(new ICellModifier() {
+            @Override
+            public void modify(Object element, String property, Object value) {
+            }
+
+            @Override
+            public Object getValue(Object element, String property) {
+                ITableLabelProvider tableLabelProvider = null;
+                if(viewer.getLabelProvider() instanceof ITableLabelProvider){
+                    tableLabelProvider = (ITableLabelProvider) viewer.getLabelProvider();
+                }
+                Object[] columnProperties = viewer.getColumnProperties();
+                for (int i=0;i<columnProperties.length;i++) {
+                    if(columnProperties[i].equals(property) && tableLabelProvider!=null){
+                        return tableLabelProvider.getColumnText(element, i);
+                    }
+                }
+                return "";
+            }
+
+            @Override
+            public boolean canModify(Object element, String property) {
+                return true;
+            }
+        });
+
+        //create context menu
+        MenuManager menuManager = new MenuManager();
+        getSite().registerContextMenu(menuManager, viewer);
+        Control control = viewer.getControl();
+        Menu menu = menuManager.createContextMenu(control);
+        control.setMenu(menu);
+
+        // Propagate selection from viewer
+        getSite().setSelectionProvider(viewer);
        }
-       
+
        /**
         * Create the columns for the table
         * @param viewer
@@ -109,8 +150,11 @@ public class ReferencingObjectsView extends AbstractCdmViewPart{
                String[] titles = {"Class", "Description", "UUID", "Object ID" };
                int[] bounds = { 100, 200, 100, 70};
 
+        CellEditor[] editors = new CellEditor[titles.length];
+
                for (int i = 0; i < titles.length; i++) {
                        TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+                       editors[i] = new TextCellEditor(table);
                        column.getColumn().setText(titles[i]);
                        column.getColumn().setWidth(bounds[i]);
                        column.getColumn().setResizable(true);
@@ -118,47 +162,52 @@ public class ReferencingObjectsView extends AbstractCdmViewPart{
                }
                table.setHeaderVisible(true);
                table.setLinesVisible(true);
+
+               viewer.setCellEditors(editors);
+               viewer.setColumnProperties(titles);
+       }
+
+       @Override
+       public void setFocus() {
+           cdmEntitySession.bind();
        }
 
-       /**
-        * <p>updateReferencingObjects</p>
-        *
-        * @param entity a {@link eu.etaxonomy.cdm.model.common.IdentifiableEntity} object.
-        */
        public void updateReferencingObjects(final UUID entityUUID, final Class objectClass) {
-               
+
                final Display display = Display.getCurrent();
-               
+
                Job job = new Job("Update Referencing Objects") {
-                       
+
                        @Override
                        protected IStatus run(IProgressMonitor monitor) {
                                monitor.beginTask("Calculating referencing objects", 10);
-                       
+
                                monitor.worked(3);
-                               
+
                                display.asyncExec(new Runnable() {
-                                       
+
                                        @Override
                                        public void run() {
                                                if (entityUUID != null){
-                                                       
+                                                   ICdmEntitySession previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
+                                                   cdmEntitySession.bind();
                                                        List<CdmBase> referencingObjects = getReferencingObjects(entityUUID, objectClass);
-                                                       
+                                                       if(previousCdmEntitySession != null) {
+                                                           previousCdmEntitySession.bind();
+                                                       }
                                                        updateView(referencingObjects);
-                                                       
-                                                       
+
                                                }
                                        }
                                });
-                               
+
                                monitor.done();
-                               
-                               
+
+
                                return Status.OK_STATUS;
                        }
                };
-               
+
                job.setPriority(Job.DECORATE);
                job.schedule();
        }
@@ -168,7 +217,7 @@ public class ReferencingObjectsView extends AbstractCdmViewPart{
         try {
                if (objectClass.getSuperclass().equals(TeamOrPersonBase.class) ){
                        referencedObject = CdmStore.getService(IAgentService.class).load(entity);
-               } else if (objectClass.getSuperclass().equals(TaxonNameBase.class)){
+               } else if (objectClass.getSuperclass().equals(NonViralName.class)){
                        referencedObject = CdmStore.getService(INameService.class).load(entity);
                } else if (objectClass.getSuperclass().equals(TaxonBase.class)){
                        referencedObject = CdmStore.getService(ITaxonService.class).load(entity);
@@ -180,34 +229,51 @@ public class ReferencingObjectsView extends AbstractCdmViewPart{
                        referencedObject = CdmStore.getService(IUserService.class).load(entity);
                } else if (objectClass.isAssignableFrom(Group.class)){
                        referencedObject = CdmStore.getService(IGroupService.class).load(entity);
-               }
+               } else if (objectClass.isAssignableFrom(Media.class)){
+                   referencedObject = CdmStore.getService(IMediaService.class).load(entity);
+               } else if (DescriptionBase.class.isAssignableFrom(objectClass)){
+                   referencedObject = CdmStore.getService(IDescriptionService.class).load(entity);
+               } else if (DescriptionElementBase.class.isAssignableFrom(objectClass)){
+                referencedObject = CdmStore.getService(IDescriptionService.class).loadDescriptionElement(entity, null);
+            } else if (objectClass.equals(Sequence.class)){
+                referencedObject = CdmStore.getService(ISequenceService.class).load(entity, null);
+            } else if (EventBase.class.isAssignableFrom(objectClass)){
+                referencedObject = CdmStore.getService(IEventBaseService.class).load(entity, null);
+            }
                        //referencedObject =(CdmBase) CdmStore.getService(IIdentifiableEntityService.class).load(referencedObject.getUuid());
                Set<CdmBase> setOfReferencingObjects = null;
-               
+
                if (referencedObject != null){
-                       referencedObjectTitleCache = ((IdentifiableEntity)referencedObject).getTitleCache();
-                       setOfReferencingObjects = CdmStore.getService(ICommonService.class).getReferencingObjects(referencedObject);
+                   if(referencedObject.isInstanceOf(IdentifiableEntity.class)){
+                       referencedObjectTitleCache = (HibernateProxyHelper.deproxy(referencedObject, IdentifiableEntity.class)).getTitleCache();
+                   }
+                   else if(referencedObject.isInstanceOf(DescriptionElementBase.class)){
+                       referencedObjectTitleCache = DescriptionHelper.getLabel(referencedObject);
+                   }
+                   else{
+                       referencedObjectTitleCache = null;
+                   }
+                       setOfReferencingObjects = CdmStore.getCommonService().getReferencingObjects(referencedObject);
                }
                if (setOfReferencingObjects != null){
-                       List<CdmBase> referencingObjects = new ArrayList<CdmBase>(setOfReferencingObjects);                     
-                       
+                       List<CdmBase> referencingObjects = new ArrayList<CdmBase>(setOfReferencingObjects);
+
                        Collections.sort(referencingObjects, new ReferencingClassComparator());
-                               
+
                        return referencingObjects;
-                       
+
                }
         } catch (Exception e) {
             logger.error("Error retrieving referencing objects", e);
+            setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
         }
                return null;
        }
-       
+
        class ReferencingClassComparator implements Comparator<CdmBase> {
 
-               /* (non-Javadoc)
-                * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-                */
-               public int compare(CdmBase o1, CdmBase o2) {
+               @Override
+        public int compare(CdmBase o1, CdmBase o2) {
                        String string1 = o1.getClass().getSimpleName();
                        String string2 = o2.getClass().getSimpleName();
                        int classCompare = string1.compareToIgnoreCase(string2);
@@ -220,102 +286,88 @@ public class ReferencingObjectsView extends AbstractCdmViewPart{
                        }
                }
        }
-       
-       /**
-        * 
-        */
+
        private void updateView(List<CdmBase> referencingObjects) {
                if (viewer != null && !viewer.getControl().isDisposed()){
-                       viewer.setInput(referencingObjects);
-                       if (referencedObjectTitleCache != null){
-                               setContentDescription("'" + referencedObjectTitleCache + "' is referenced by:");
-                       } else {
-                               setContentDescription("");
+                       try{
+                               viewer.setInput(referencingObjects);
+                               if (referencedObjectTitleCache != null){
+                                       setContentDescription("'" + referencedObjectTitleCache + "' is referenced by:");
+                               } else {
+                                       setContentDescription("");
+                               }
+                               showViewer();
+                       }catch(Exception e){
+                               setContentDescription("The referencing objects view could not be loaded completely. Some Problems occured.");
                        }
-                       showViewer();
+
                }
        }
 
        /** {@inheritDoc} */
-       public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-               if(! (part instanceof BulkEditor)){
-                       setContentDescription("");
-                       showEmptyPage();
-                       return;
-               }
-               
-               if(! (selection instanceof LineSelection)){
-                       return;
-               }
-               LineSelection lineSelection = (LineSelection) selection;
-               
-               if(lineSelection.size() != 1){
-                       return;
-               }
-                       
-               if(! (lineSelection.getFirstElement() instanceof IdentifiableEntity)){
-                       return;
-               }
-               
-               showViewer(part, lineSelection);
+       @Override
+    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+        if(part == this){
+            return;
+        }
+        if(selection instanceof IStructuredSelection){
+            showViewer(part, (IStructuredSelection) selection);
+        }
        }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#showViewer(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-        */
+
        /** {@inheritDoc} */
        @Override
        public void showViewer(IWorkbenchPart part, IStructuredSelection selection) {
        //      this.part = part;
-               
-               updateReferencingObjects(((IdentifiableEntity) selection.getFirstElement()).getUuid(),selection.getFirstElement().getClass() );
+
+               Object firstElement = selection.getFirstElement();
+               if(firstElement instanceof TreeNode){
+                   firstElement = ((TreeNode) firstElement).getValue();
+               }
+               if(firstElement instanceof CdmBase){
+                   updateReferencingObjects(((CdmBase) firstElement).getUuid(),firstElement.getClass() );
+               }
+               else{
+                   updateView(null);
+            setContentDescription("");
+               }
        }
-       
+
        /** {@inheritDoc} */
        @Override
        public void dispose() {
                conversation.close();
                selectionService.removePostSelectionListener(this);
                selectionService.removeSelectionListener(this);
+               cdmEntitySession.dispose();
                super.dispose();
-               
+
        }
 
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getViewer()
-        */
        /** {@inheritDoc} */
        @Override
        public Viewer getViewer() {
                return viewer;
        }
 
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#dirtyStateChanged()
-        */
        /** {@inheritDoc} */
        @Override
        public void changed(Object object) {
                // no editing in this view
        }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#onComplete()
-        */
+
        /** {@inheritDoc} */
        @Override
        public boolean onComplete() {
                return false;
        }
-       
+
        public void refresh(){
-               
                selectionService.removePostSelectionListener(this);
                selectionService.removeSelectionListener(this);
                selectionService.addPostSelectionListener(this);
                selectionService.addSelectionListener(this);
-               
-       }
 
+       }
 
 }