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.TreeSelection;
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 eu.etaxonomy.cdm.api.conversation.ConversationHolder;
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
+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.IPartContentHasDetails;
import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
-import eu.etaxonomy.taxeditor.ui.campanula.derivatesearch.DerivateLabelProvider;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+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 {
+
+ /**
+ * Key used for storing a single DerivateView in a memento
+ */
+ private static final String DERIVATE_VIEW_MEMENTO_KEY = "derivateView";
+
+ /**
+ * Key to to group mementos for every single DerivateView
+ */
+ private static final String DERIVATE_VIEWS_MEMENTO_KEY = "derivateViews";
- /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.view.desc"{trunked}</code> */
- public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
+ public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
private ConversationHolder conversation;
- protected TreeViewer viewer;
+ private TreeViewer viewer;
private boolean isDirty;
+ private final int dndOperations = DND.DROP_MOVE;
+
+ private DerivateLabelProvider labelProvider;
+
+ private Set<SingleRead> multiLinkSingleReads;
+
+ /**
+ * Default constructor
+ */
+ public DerivateView() {
+ }
+
/* (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();
- FieldUnit fieldUnit = ((DerivateViewEditorInput) editorInput).getFieldUnit();
- setPartName(fieldUnit.toString());
- viewer.setSelection(new StructuredSelection(specimen));
+ SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
+ setPartName(labelProvider.getDerivateText(rootElement));
+ viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
}
+
+ //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 boolean isSaveAsAllowed() {
- // TODO Auto-generated method stub
return false;
}
*/
@Override
public void setFocus() {
+ viewer.getControl().setFocus();
//make sure to bind again if maybe in another view the conversation was unbound
if(!conversation.isBound()){
conversation.bind();
*/
@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) {
- viewer.setInput(getEditorInput());
setDirty(true);
firePropertyChange(IEditorPart.PROP_DIRTY);
+ viewer.refresh();
+ }
+
+ /**
+ * Refreshes the derivate hierarchy tree and expands the tree
+ * to show and select the given object.
+ *
+ * @param expandTo the object to which the tree should be expanded
+ */
+ public void refreshTree(Object expandTo){
+ refreshTree();
+ TreeSelection selection = (TreeSelection) viewer.getSelection();
+ viewer.expandToLevel(selection.getFirstElement(), 1);
+ viewer.setSelection(new StructuredSelection(new TreeNode(expandTo)));
+ }
+
+ /**
+ * 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;
}
}