package eu.etaxonomy.taxeditor.editor.view.derivate;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map.Entry;
+import java.util.Set;
+
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IMemento;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.model.IContextListener;
import eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider;
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.campanula.derivatesearch.DerivateLabelProvider;
+import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
/**
- * Displays the derivate hierarchy of all derivates belonging to a taxon.
+ * Displays the derivate hierarchy of all derivates having one single {@link FieldUnit} as root.
*
*/
-public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider, IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData {
+public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider,
+ IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IContextListener {
- /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.view.desc"{trunked}</code> */
- public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
+ /**
+ * Key used for storing a single DerivateView in a memento
+ */
+ private static final String DERIVATE_VIEW_MEMENTO_KEY = "derivateView";
- private ConversationHolder conversation;
+ /**
+ * Key to to group mementos for every single DerivateView
+ */
+ private static final String DERIVATE_VIEWS_MEMENTO_KEY = "derivateViews";
- protected TreeViewer viewer;
+ public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
- private SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy> derivate;
+ private ConversationHolder conversation;
+
+ private TreeViewer viewer;
private boolean isDirty;
+ private final int dndOperations = DND.DROP_MOVE;
+
+ private DerivateLabelProvider labelProvider;
+
+ private Set<SingleRead> multiLinkSingleReads;
+
+ /**
+ * Default constructor
+ */
+ public DerivateView() {
+ CdmStore.getContextManager().addContextListener(this);
+ }
+
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl(Composite parent) {
viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
viewer.setContentProvider(new DerivateContentProvider());
- viewer.setLabelProvider(new DerivateLabelProvider());
+ labelProvider = new DerivateLabelProvider();
+ labelProvider.setConversation(conversation);
+ viewer.setLabelProvider(labelProvider);
viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
// Propagate selection from viewer
getSite().setSelectionProvider(viewer);
//create context menu
MenuManager menuManager = new MenuManager();
-
getSite().registerContextMenu(menuManager, viewer);
-
Control control = viewer.getControl();
Menu menu = menuManager.createContextMenu(control);
-
control.setMenu(menu);
+ generateMultiLinkSingleReads();
+ labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
+ IEditorInput editorInput = getEditorInput();
+ viewer.setInput(editorInput);
+ if(editorInput instanceof DerivateViewEditorInput){
+ SpecimenOrObservationBase<?> specimen = ((DerivateViewEditorInput) editorInput).getDerivate();
+ SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
+ setPartName(labelProvider.getDerivateText(rootElement));
+ viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
+ }
- viewer.setInput(getEditorInput());
+ //add drag'n'drop support
+ Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),};
+ viewer.addDragSupport(dndOperations, transfers, new DerivateDragListener(this));
+ viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this));
}
/* (non-Javadoc)
monitor.worked(1);
monitor.done();
firePropertyChange(PROP_DIRTY);
+ refreshTree();
}
/* (non-Javadoc)
*/
@Override
public void doSaveAs() {
- // TODO Auto-generated method stub
-
}
/* (non-Javadoc)
*/
@Override
public String getTitleToolTip() {
- // TODO Auto-generated method stub
return "Derivate View";
}
*/
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
- conversation = CdmStore.createConversation();
setSite(site);
setInput(input);
if(input instanceof DerivateViewEditorInput){
- derivate = ((DerivateViewEditorInput) input).getDerivate();
- }
- else{
- throw new PartInitException("Invalid Input: Must be DerivateViewEditorInput");
+ conversation = ((DerivateViewEditorInput) input).getConversationHolder();
}
}
*/
@Override
public boolean isSaveAsAllowed() {
- // TODO Auto-generated method stub
return false;
}
*/
@Override
public void setFocus() {
- // TODO Auto-generated method stub
-
+ viewer.getControl().setFocus();
+ //make sure to bind again if maybe in another view the conversation was unbound
+ if(!conversation.isBound()){
+ conversation.bind();
+ }
}
/* (non-Javadoc)
*/
@Override
public void update(CdmDataChangeMap changeEvents) {
- // TODO Auto-generated method stub
-
}
/* (non-Javadoc)
return conversation;
}
+ /**
+ * @return the viewer
+ */
+ public TreeViewer getViewer() {
+ return viewer;
+ }
+
/* (non-Javadoc)
* @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
*/
@Override
public void changed(Object element) {
- firePropertyChange(IEditorPart.PROP_DIRTY);
- viewer.setInput(getEditorInput());
setDirty(true);
+ firePropertyChange(IEditorPart.PROP_DIRTY);
+ viewer.refresh();
+ }
+
+ /**
+ * Refreshes the derivate hierarchy tree
+ */
+ public void refreshTree(){
+ generateMultiLinkSingleReads();
+ labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
+ viewer.refresh();
+ }
+
+ private void generateMultiLinkSingleReads() {
+ Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
+ for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
+ if(entry.getValue().size()>1){
+ multiLinkSingleReads.add(entry.getKey());
+ }
+ }
+ this.multiLinkSingleReads = multiLinkSingleReads;
+ }
+
+ /**
+ * @return a set of {@link SingleRead}s that have multiple parents
+ */
+ public Set<SingleRead> getMultiLinkSingleReads() {
+ return this.multiLinkSingleReads;
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void contextStop(IMemento memento, IProgressMonitor monitor) {
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void contextStart(IMemento memento, IProgressMonitor monitor) {
+// if(memento == null){
+// return;
+// }
+// IMemento editorMementos = memento.getChild(DERIVATE_VIEW_MEMENTO_KEY);
+// DerivateViewEditorInput input = new DerivateViewEditorInput(UUID.fromString(editorInput.getString(DerivateViewEditorInput.UUID_MEMENTO_KEY)));
+// try {
+// EditorUtil.open(input);
+// } catch (PartInitException e) {
+// AbstractUtility.error(getClass(), "Error opening an editor window", e);
+// }
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void contextRefresh(IProgressMonitor monitor) {
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
+// if (!conversation.isBound()) {
+// conversation.bind();
+// }
+// conversation.close();
+// if(memento == null){
+// return;
+// }
+//
+// IEditorInput input = getEditorInput();
+// if(input instanceof IPersistable){
+// memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
+// ((IPersistable) input).saveState(memento);
+// }
}
}