import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.UUID;
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.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
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.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.service.IOccurrenceService;
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.common.CdmBase;
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.IDirtyMarkable;
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
+import eu.etaxonomy.taxeditor.model.IPartContentHasMedia;
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
+import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateContentProvider;
import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
/**
- * Displays the derivate hierarchy of all derivates having one single {@link FieldUnit} as root.
+ * Displays the derivate hierarchy of the specimen specified in the editor input.
*
*/
-public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider,
- IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IContextListener {
-
- /**
- * 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";
+public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkable,
+ IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IPartContentHasMedia,
+ ISelectionChangedListener, IPostOperationEnabled {
public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
private Set<SingleRead> multiLinkSingleReads;
+ private ISelection selection = null;
+
/**
* Default constructor
*/
public DerivateView() {
- CdmStore.getContextManager().addContextListener(this);
}
/* (non-Javadoc)
viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
viewer.setContentProvider(new DerivateContentProvider());
labelProvider = new DerivateLabelProvider();
+ labelProvider.setConversation(conversation);
viewer.setLabelProvider(labelProvider);
- viewer.setAutoExpandLevel(2);
+ viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
// Propagate selection from viewer
getSite().setSelectionProvider(viewer);
+ //listen to selection changes
+ viewer.addSelectionChangedListener(this);
//create context menu
MenuManager menuManager = new MenuManager();
generateMultiLinkSingleReads();
labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
IEditorInput editorInput = getEditorInput();
- viewer.setInput(editorInput);
+ viewer.setInput(((DerivateViewEditorInput) editorInput).getRootUUIDs());
+ //set selection to selected derivate if only one was selected
if(editorInput instanceof DerivateViewEditorInput){
- SpecimenOrObservationBase<?> specimen = ((DerivateViewEditorInput) editorInput).getDerivate();
- SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
- setPartName(DerivateLabelProvider.getDerivateText(rootElement));
- viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
+ Set<UUID> derivateUUIDs = ((DerivateViewEditorInput) editorInput).getDerivateUUIDs();
+ if(derivateUUIDs.size()==1){
+ SpecimenOrObservationBase<?> specimen = CdmStore.getService(IOccurrenceService.class).load(derivateUUIDs.iterator().next());
+ if(specimen!=null){
+ viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
+ }
+ }
}
//add drag'n'drop support
*/
@Override
public void doSave(IProgressMonitor monitor) {
- monitor.beginTask("Saving Derivates", 3);
+ String taskName = "Saving hierarchy";
+ if(getEditorInput() instanceof DerivateViewEditorInput){
+ DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
+ taskName += " "+derivateViewEditorInput.getName();
+ }
+ monitor.beginTask(taskName, 3);
if (!conversation.isBound()) {
conversation.bind();
}
*/
@Override
public String getTitleToolTip() {
- return "Derivate View";
+ if(getEditorInput() instanceof DerivateViewEditorInput){
+ DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
+ return derivateViewEditorInput.getName();
+ }
+ return "Derivative Editor";
}
/* (non-Javadoc)
setSite(site);
setInput(input);
if(input instanceof DerivateViewEditorInput){
- conversation = ((DerivateViewEditorInput) input).getConversationHolder();
+ DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) input;
+ conversation = derivateViewEditorInput.getConversationHolder();
+ setPartName(derivateViewEditorInput.getName());
}
}
*/
@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();
viewer.refresh();
}
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
+ */
+ @Override
+ public void forceDirty() {
+ changed(null);
+ }
+
+ /**
+ * 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
*/
viewer.refresh();
}
+
private void generateMultiLinkSingleReads() {
Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
}
/* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
- public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
+ public void selectionChanged(SelectionChangedEvent event) {
+ this.selection = event.getSelection();
}
- /* (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) {
+ public ISelection getSelection() {
+ return selection;
}
- /* (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);
-// }
+ public DerivateLabelProvider getLabelProvider() {
+ return labelProvider;
}
/* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
+ * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
*/
@Override
- public void contextRefresh(IProgressMonitor monitor) {
+ public boolean postOperation(CdmBase objectAffectedByOperation) {
+ refreshTree();
+ if(objectAffectedByOperation!=null){
+ changed(objectAffectedByOperation);
+ }
+ return true;
}
/* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
+ * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
*/
@Override
- public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
-// if(memento == null){
-// return;
-// }
-//
-// IEditorInput input = getEditorInput();
-// if(input instanceof IPersistable){
-// memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
-// ((IPersistable) input).saveState(memento);
-// }
+ public boolean onComplete() {
+ return true;
}
}