taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/dialogs/filteredSelection/FilteredTaxonomicTreeSelectionDialog.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/dialogs/filteredSelection/FilteredTeamSelectionDialog.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CdmDataTransfer.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/CompositeBorderDecorator.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorAnnotation.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/EditorUtil.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupCompositeLabel.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/GroupedComposite.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IDirtyMarkableSelectionProvider.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IDropTargetable.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/IMultiPageTaxonEditorPage.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineBreakListener.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSquigglesStrategy.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/LineWrapSupport.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditor.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorAdapterFactory.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/MultiPageTaxonEditorDataChangeBehaviour.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputDataChangeBehaviour.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/TaxonEditorInputFactory.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/ViewerConfiguration.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/WidgetTransfer.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/EditNewTaxonHandler.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/OpenParentHandler.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SaveAllHandler.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewSpecimenHandler.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewTeamHandler.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/internal/TaxeditorEditorPlugin.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractNameComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroupComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalGroupComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroup.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AbstractGroupedContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/AcceptedNameContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ConceptGroup.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/ContainerFactory.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/EditorAnnotation.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/HomotypicalSynonymGroup.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/IterableSynonymyList.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationComposite.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroupComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineBreakListener.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSquigglesStrategy.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/LineWrapSupport.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisapplicationContainer.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/MisappliedGroup.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragListener.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDragSourceEffect.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetEffect.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameEditorDropTargetListener.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/NameViewer.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/RulerWithIcon.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/SynonymContainer.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/AbstractDynamicConceptRelationMenu.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/ChangeAcceptedTaxonToSynonymHandler.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/RefreshTreeHandler.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/handler/ShowTaxonomicTreeViewHandler.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/internal/TaxeditorNavigationPlugin.java -text
+taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/ClassificationContentProvider.java -text
+taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/ClassificationLabelProvider.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/EmptyRoot.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/Root.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/SynonymContentProvider.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodeDropAdapterAssistant.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodeLabelProvider.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonNodePropertyTester.java -text
-taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonomicTreeContentProvider.java -text
-taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TaxonomicTreeLabelProvider.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultLabelProvider.java -text
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/DescriptionHelper.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IContextListener.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IDataChangeBehavior.java -text
+taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartChangeListener.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasDetails.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/IPartContentHasSupplementalData.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/ImageResources.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/MementoHelper.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/NameHelper.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/NomenclaturalCodeHelper.java -text
+taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TaxeditorPartService.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TaxonTransfer.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TextHelper.java -text
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/TimeHelper.java -text
productName=EDIT Taxonomic Editor\r
-productBlurb=EDIT Taxonomic Editor\n\Version: 2.1.0\n\n\Copyright (C) 2009 EDIT\n\European Distributed Institute of Taxonomy\n\http://www.e-taxonomy.eu\r
+productBlurb=EDIT Taxonomic Editor\n\Version: 3.0\n\n\Copyright (C) 2009 EDIT\n\European Distributed Institute of Taxonomy\n\http://www.e-taxonomy.eu\r
super.dispose();\r
conversation.close();\r
}\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
}
\ No newline at end of file
<menu
label="Concept Relation">
<visibleWhen>
- <and>
- <not>
- <reference
- definitionId="isSynonym">
- </reference>
- </not>
- <not>
- <reference
- definitionId="isMisapplication">
- </reference></not>
- </and>
+ <or>
+ <reference
+ definitionId="isAcceptedTaxon">
+ </reference>
+ <reference
+ definitionId="isConceptRelation">
+ </reference>
+ </or>
</visibleWhen>
<dynamic
class="eu.etaxonomy.taxeditor.editor.name.handler.CreateConceptRelationMenu"
label="Misapplication"
style="push">
<visibleWhen>
- <and>
- <not>
- <reference
- definitionId="isSynonym">
- </reference>
- </not>
- <not>
- <reference
- definitionId="isConceptRelation">
- </reference>
- </not>
- </and>
+ <or>
+ <reference
+ definitionId="isAcceptedTaxon">
+ </reference>
+ <reference
+ definitionId="isMisapplication">
+ </reference>
+ </or>
</visibleWhen>
</command>
</menu>
label="Delete"
style="push">
<visibleWhen>
- <not>
+ <or>
<reference
- definitionId="isAcceptedTaxon">
+ definitionId="isSynonym">
+ </reference>
+ <reference
+ definitionId="isMisapplication">
</reference>
- </not>
+ <reference
+ definitionId="isConceptRelation">
+ </reference>
+ </or>
</visibleWhen>
</command>
<separator
class="eu.etaxonomy.taxeditor.editor.name.handler.GroupBasionymContributionItem"
id="taxeditor-editor.dynamic.setBasionym">
<visibleWhen>
- <reference
- definitionId="isTaxonBase">
- </reference>
+ <or>
+ <reference
+ definitionId="isAcceptedTaxon">
+ </reference>
+ <reference
+ definitionId="isSynonym">
+ </reference>
+ </or>
</visibleWhen>
</dynamic>
<command
package eu.etaxonomy.taxeditor.editor;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
import org.apache.log4j.Logger;
import org.eclipse.swt.dnd.ByteArrayTransfer;
import org.eclipse.swt.dnd.TransferData;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.taxeditor.store.CdmStore;
/**
* @author n.hoffmann
private static final Logger logger = Logger
.getLogger(CdmDataTransfer.class);
- private static final String CDMTYPENAME = "widget_type";
- private static final int CDMTYPEID = registerType (CDMTYPENAME);
- private static final CdmDataTransfer instance = new CdmDataTransfer();
+ private static int SEPARATOR = -10;
+ private static int EOF = -20;
- /*
- * The object associated with this transfer event
- */
- private CdmBase cdmObject;
+ private static final String TYPE_NAME = "cdmdata-transfer-format";
+ private static final int TYPE_ID = registerType (TYPE_NAME);
+ private static final CdmDataTransfer instance = new CdmDataTransfer();
public static synchronized CdmDataTransfer getInstance() {
return instance;
}
-
-
- public CdmBase getCdmObject(){
- return cdmObject;
- }
-
- public void setCdmObject(CdmBase cdmObject) {
- this.cdmObject = cdmObject;
- }
+
+ private ICdmBase cdmBase;
/* (non-Javadoc)
* @see org.eclipse.swt.dnd.Transfer#getTypeIds()
*/
@Override
protected int[] getTypeIds() {
- return new int[] { CDMTYPEID };
+ return new int[] { TYPE_ID };
}
/* (non-Javadoc)
*/
@Override
protected String[] getTypeNames() {
- return new String[]{ CDMTYPENAME };
+ return new String[]{ TYPE_NAME };
}
@Override
protected void javaToNative(Object object, TransferData transferData) {
- // No encoding needed since this is a hardcoded string read and written
- // in the same process.
- // See nativeToJava below
- byte[] check = CDMTYPENAME.getBytes();
- super.javaToNative(check, transferData);
+ byte[] bytes = toByteArray((ICdmBase[]) object);
+ if (bytes != null)
+ super.javaToNative(bytes, transferData);
}
+
+
@Override
protected Object nativeToJava(TransferData transferData) {
- Object result = super.nativeToJava(transferData);
- if (isInvalidNativeType(result)) {
- throw new RuntimeException(); //$NON-NLS-1$
+ byte[] bytes = (byte[]) super.nativeToJava(transferData);
+ return fromByteArray(bytes);
+ }
+
+
+ private byte[] toByteArray(ICdmBase[] cdmBaseObjects) {
+ /**
+ * Transfer data is an array of gadgets. Serialized version is: (int)
+ * number of gadgets (Gadget) gadget 1 (Gadget) gadget 2 ... repeat for
+ * each subsequent gadget see writeGadget for the (Gadget) format.
+ */
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ DataOutputStream out = new DataOutputStream(byteOut);
+
+ byte[] bytes = null;
+
+ try {
+
+ for(ICdmBase cdmBaseObject : cdmBaseObjects){
+ writeCdmBaseObject(cdmBaseObject, out);
+ }
+ out.close();
+ bytes = byteOut.toByteArray();
+ } catch (IOException e) {
+ // when in doubt send nothing
+ }
+ return bytes;
+ }
+
+
+ private ICdmBase[] fromByteArray(byte[] bytes) {
+ DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
+
+ try {
+ List<ICdmBase> cdmBaseObjects = new ArrayList<ICdmBase>();
+
+ try{
+ while(true){
+ cdmBaseObjects.add(readCdmBaseObject(in));
+ }
+ }catch(EOFException e){
+ return cdmBaseObjects.toArray(new ICdmBase[]{});
+ }
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ private ICdmBase readCdmBaseObject(DataInputStream in) throws IOException{
+ String className = in.readUTF();
+ in.readInt();
+ String idString = in.readUTF();
+ in.readInt();
+
+ if(className.equals(Synonym.class.getName()) || className.equals(Taxon.class.getName())){
+ ICdmBase object = CdmStore.getTaxonService().load(UUID.fromString(idString));
+
+ if(object == null){
+ return cdmBase;
+ }
+
+ return object;
}
- return cdmObject;
+
+ return null;
}
- private boolean isInvalidNativeType(Object result) {
- // No encoding needed since this is a hardcoded string read and written
- // in the same process.
- // See javaToNative above
- return !(result instanceof byte[])
- || !CDMTYPENAME.equals(new String((byte[]) result));
+ private void writeCdmBaseObject(ICdmBase cdmBase, DataOutputStream out) throws IOException{
+ /**
+ * CdmBase object serialization:
+ *
+ */
+ out.writeUTF(cdmBase.getClass().getName());
+ out.writeInt(SEPARATOR);
+ out.writeUTF(cdmBase.getUuid().toString());
+ out.writeInt(EOF);
+
+ if(cdmBase.getId() == 0){
+ // fallback for unsaved instances
+ this.cdmBase = cdmBase;
+ }
}
}
+++ /dev/null
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.ui.forms.IManagedForm;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
-import org.eclipse.ui.forms.widgets.ScrolledForm;\r
-\r
-/**\r
- * Draws a border on a Composite on an IManagedForm when it gets focus, \r
- * undraws it when the Composite loses focus.\r
- * \r
- * @author p.ciardelli\r
- *\r
- */\r
-public class CompositeBorderDecorator implements FocusListener { \r
- private static final Logger logger = Logger.getLogger(CompositeBorderDecorator.class);\r
- \r
- private FormToolkit toolkit;\r
- private ScrolledForm scrolledForm;\r
- private Composite borderedComposite;\r
- \r
- /**\r
- * If true, the <code>borderedComposite</code>'s border is erased when\r
- * it loses focus.\r
- */\r
- private boolean doLoseFocus = true;\r
-\r
- public CompositeBorderDecorator(Composite composite, IManagedForm form) {\r
- \r
- this.borderedComposite = composite;\r
- this.toolkit = form.getToolkit();\r
- this.scrolledForm = form.getForm();\r
- \r
- // Make sure composite retains its color scheme after being adapted to toolkit\r
- Color backgroundColor = composite.getBackground();\r
- \r
- toolkit.adapt(composite);\r
- \r
- composite.setBackground(backgroundColor);\r
- \r
- }\r
- \r
- \r
- public void focusGained(FocusEvent e) {\r
- paintBorder();\r
- }\r
-\r
- \r
- public void focusLost(FocusEvent e) {\r
- if (doLoseFocus) {\r
- unpaintBorder();\r
- }\r
- }\r
- \r
- public void setBorderedComposite(Composite borderedComposite) {\r
- this.borderedComposite = borderedComposite;\r
- }\r
- \r
- /**\r
- * If this is set to true, border will disappear when focus is lost.\r
- * Otherwise, it will remain until explicitly erased. \r
- * \r
- * @param doLoseFocus\r
- */\r
- public void setLoseFocus(boolean doLoseFocus) {\r
- this.doLoseFocus = doLoseFocus;\r
- }\r
- \r
- /**\r
- * Removes the border from <code>borderedComposite</code>.\r
- */\r
- public void unpaintBorder() {\r
- paintBorder(null); \r
- }\r
- \r
- /**\r
- * Adds a border to <code>borderedComposite</code>.\r
- */\r
- public void paintBorder() {\r
- paintBorder(FormToolkit.TEXT_BORDER);\r
- }\r
- \r
- private void paintBorder(String border) { \r
- borderedComposite.setData(FormToolkit.KEY_DRAW_BORDER, border);\r
- toolkit.paintBordersFor(borderedComposite.getParent());\r
- scrolledForm.reflow(false);\r
- }\r
-}
\ No newline at end of file
import org.eclipse.jface.dialogs.MessageDialog;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.swt.widgets.Display;\r
import org.eclipse.swt.widgets.Shell;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
* @return \r
* @throws PartInitException\r
*/\r
- private static IEditorPart open(IEditorInput input, String editorId)\r
- throws PartInitException {\r
- return getActivePage().openEditor(input, editorId);\r
+ private static void open(final IEditorInput input, final String editorId) throws PartInitException{\r
+ getActivePage().openEditor(input, editorId);\r
}\r
\r
/**\r
* @return\r
* @throws PartInitException\r
*/\r
- public static IEditorPart open(TaxonEditorInput input) throws PartInitException{\r
- IEditorPart editor = open(input, MultiPageTaxonEditor.ID);\r
-// editor.setFocus();\r
- return editor;\r
+ public static void open(TaxonEditorInput input) throws PartInitException{\r
+ open(input, MultiPageTaxonEditor.ID);\r
}\r
\r
/**\r
* @return\r
* @throws PartInitException \r
*/\r
- public static IEditorPart openTaxonNode(UUID taxonNodeUuid) throws PartInitException {\r
+ public static void openTaxonNode(UUID taxonNodeUuid) throws PartInitException {\r
TaxonEditorInput input = TaxonEditorInput.NewInstance(taxonNodeUuid); \r
- return open(input);\r
+ open(input);\r
}\r
\r
/**\r
* @return\r
* @throws PartInitException \r
*/\r
- public static IEditorPart openTaxon(UUID taxonUuid) throws PartInitException {\r
+ public static void openTaxon(UUID taxonUuid) throws PartInitException {\r
TaxonEditorInput input = TaxonEditorInput.NewInstanceFromTaxon(taxonUuid); \r
- return open(input);\r
+ open(input);\r
}\r
\r
- public static IEditorPart openTaxonBase(UUID taxonBaseUuid) throws PartInitException {\r
+ public static void openTaxonBase(UUID taxonBaseUuid) throws PartInitException {\r
TaxonEditorInput input = TaxonEditorInput.NewInstanceFromTaxonBase(taxonBaseUuid); \r
- return open(input);\r
+ open(input);\r
}\r
\r
\r
* @return The EditorPart.\r
* @throws PartInitException \r
*/\r
- public static IEditorPart openEmpty(UUID parentNodeUuid) throws PartInitException{\r
+ public static void openEmpty(UUID parentNodeUuid) throws PartInitException{\r
TaxonEditorInput input = TaxonEditorInput.NewEmptyInstance(parentNodeUuid);\r
- IEditorPart editorPart = open(input, MultiPageTaxonEditor.ID);\r
+ open(input, MultiPageTaxonEditor.ID);\r
+ \r
+ getActiveMultiPageTaxonEditor().changed(null);\r
\r
- if(editorPart instanceof MultiPageTaxonEditor){\r
- ((MultiPageTaxonEditor) editorPart).changed(null);\r
- }\r
\r
- return editorPart;\r
}\r
\r
public static void setSaving(boolean isSaving) {\r
+++ /dev/null
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.dnd.DND;\r
-import org.eclipse.swt.dnd.DropTarget;\r
-import org.eclipse.swt.dnd.DropTargetAdapter;\r
-import org.eclipse.swt.dnd.DropTargetEvent;\r
-import org.eclipse.swt.dnd.DropTargetListener;\r
-import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
-import org.eclipse.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
-\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.editor.name.AbstractNameComposite;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
-import eu.etaxonomy.taxeditor.preference.Resources;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 25.06.2008\r
- * @version 1.0\r
- */\r
-public class GroupComposite extends Composite {\r
- private static final Logger logger = Logger.getLogger(GroupComposite.class);\r
- \r
- protected TaxonNameEditor editor;\r
- protected Taxon taxon;\r
- \r
- private DropTarget target;\r
- private DropTargetListener dropListener;\r
- \r
- public GroupComposite(Composite parent) {\r
- super(parent, SWT.NONE);\r
-\r
- // Graphic layout of composite\r
- this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
- this.setLayout(new TableWrapLayout());\r
- Color groupBackgroundColor = EditorUtil.\r
- getColor(Resources.COLOR_COMPOSITE_BACKGROUND);\r
- this.setBackground(groupBackgroundColor);\r
-\r
- // Drop functionality\r
- this.setDroppable(true);\r
- \r
- logger.trace("Created a new Group composite");\r
- }\r
- \r
- public GroupComposite(TaxonNameEditor editor, Composite parent){\r
- this(parent);\r
- this.editor = editor;\r
- this.taxon = editor.getTaxon();\r
- }\r
- \r
- public void setDroppable(boolean droppable) {\r
- if (droppable) {\r
- Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()}; \r
- int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
- target = new DropTarget(this, operations);\r
- target.setTransfer(types);\r
- dropListener = new DropTargetAdapter() {\r
- \r
- public void dragEnter(DropTargetEvent event) {\r
- GroupComposite.this.notifyListeners(SWT.FocusIn, null);\r
- }\r
- \r
- public void dragLeave(DropTargetEvent event) {\r
- GroupComposite.this.notifyListeners(SWT.FocusOut, null);\r
- }\r
- \r
- public void drop(DropTargetEvent event) {\r
- \r
- if (event.data instanceof CdmBase) {\r
- \r
- final AbstractNameComposite composite = editor.getNameComposite(event.data);\r
- \r
- if(composite != null && composite.getDragSource() != null){\r
- \r
- // Make sure composite is not being dropped onto its current parent\r
- if ( ! composite.getParent().equals(GroupComposite.this)) {\r
- \r
- // Change parent at end of drag event\r
- composite.getDragSource().addListener(DND.DragEnd, new Listener() {\r
- \r
- public void handleEvent(Event event) {\r
- composite.setParent(GroupComposite.this);\r
- }\r
- });\r
- } \r
- }\r
- }\r
- }\r
- };\r
- target.addDropListener(dropListener); \r
- } else {\r
- if (dropListener != null) {\r
- target.removeDropListener(dropListener);\r
- }\r
- }\r
- }\r
- \r
- public void dispose() {\r
- \r
- if (target != null) {\r
- target.removeDropListener(dropListener);\r
- target.dispose();\r
- }\r
- \r
- super.dispose();\r
- }\r
-\r
- /**\r
- * @return the taxon\r
- */\r
- public Taxon getTaxon() {\r
- return taxon;\r
- }\r
-}\r
+++ /dev/null
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 10.09.2008\r
- * @version 1.0\r
- */\r
-public class GroupCompositeLabel extends Composite {\r
- private static final Logger logger = Logger\r
- .getLogger(GroupCompositeLabel.class);\r
-\r
- public GroupCompositeLabel(Composite parent, String labelText) {\r
- super(parent, SWT.NONE);\r
- \r
- // TODO move to group composite?\r
- \r
- TableWrapLayout tableWrapLayout = new TableWrapLayout();\r
- tableWrapLayout.horizontalSpacing = 1;\r
- tableWrapLayout.rightMargin = 10;\r
- tableWrapLayout.leftMargin = 10;\r
- tableWrapLayout.bottomMargin = 1;\r
- tableWrapLayout.topMargin = 1;\r
- tableWrapLayout.verticalSpacing = 1;\r
- setLayout(tableWrapLayout);\r
- setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));\r
- \r
- // Add the label\r
- final Label label = new Label(this, SWT.NONE);\r
- label.setText(labelText.toUpperCase());\r
- \r
- logger.trace(this.getClass().getSimpleName() + " created");\r
- }\r
-}\r
+++ /dev/null
-/**\r
- * Copyright (C) 2007 EDIT\r
- * European Distributed Institute of Taxonomy \r
- * http://www.e-taxonomy.eu\r
- * \r
- * The contents of this file are subject to the Mozilla Public License Version 1.1\r
- * See LICENSE.TXT at the top of this package for the full license terms.\r
- */\r
-\r
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.core.runtime.Assert;\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.text.IDocument;\r
-import org.eclipse.jface.text.TextViewer;\r
-import org.eclipse.jface.window.DefaultToolTip;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.custom.StyledText;\r
-import org.eclipse.swt.dnd.DND;\r
-import org.eclipse.swt.dnd.DragSource;\r
-import org.eclipse.swt.dnd.DragSourceAdapter;\r
-import org.eclipse.swt.dnd.DragSourceEvent;\r
-import org.eclipse.swt.dnd.DragSourceListener;\r
-import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.events.ControlAdapter;\r
-import org.eclipse.swt.events.ControlEvent;\r
-import org.eclipse.swt.events.ControlListener;\r
-import org.eclipse.swt.events.FocusAdapter;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
-import org.eclipse.swt.events.MouseAdapter;\r
-import org.eclipse.swt.events.MouseEvent;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Menu;\r
-import org.eclipse.ui.forms.IManagedForm;\r
-import org.eclipse.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
-\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.editor.name.NameViewer;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
-import eu.etaxonomy.taxeditor.model.TextHelper;\r
-import eu.etaxonomy.taxeditor.preference.Resources;\r
-\r
-/** \r
- * Formats <code>GroupedComposite</code> with cosmetic and layout properties specific to the\r
- * Editor. This should be used to maintain a consistent look and feel for all Editor \r
- * freetext area components, such as DescriptionElementComposite.\r
- * <p>\r
- * Requires an <code>IManagedForm</code>, whose <code>input</code> is set to the contents\r
- * of {@link #getData()} when the <code>GroupedComposite</code> gets focus, i.e. to\r
- * populate the property sheet with the data.\r
- * </p>\r
- * <p>\r
- * The <code>IManagedForm</code> is also required to have a <code>Taxon</code> in its \r
- * own <code>getData()</code>.\r
- * </p> \r
- * <p>\r
- * The <code>IManagedForm</code> can also used for drawing borders by calling the method \r
- * <code>createBorderSupport()</code>.\r
- * </p>\r
- * @author p.ciardelli\r
- * @created 02.06.2008\r
- * @version 1.0\r
- */\r
-abstract public class GroupedComposite extends Composite { \r
- private static final Logger logger = Logger.getLogger(GroupedComposite.class);\r
- \r
- protected TaxonNameEditor editor;\r
- \r
- protected NameViewer textViewer;\r
- protected IManagedForm managedForm;\r
- private Label nonEditableInfoLabel;\r
- private DefaultToolTip nonEditableInfoHover;\r
- \r
- private static GroupedComposite selection;\r
- \r
- private Taxon acceptedTaxon;\r
- \r
- private CompositeBorderDecorator borderDecorator; \r
- private FocusListener focusListener;\r
- private LineBreakListener lineBreakListener;\r
-\r
- private String emptyViewerPrompt;\r
- \r
- private int cursorPosition;\r
- \r
- public GroupedComposite(TaxonNameEditor editor, Composite parent){\r
- super(parent, SWT.NONE);\r
- \r
- this.editor = editor;\r
- this.managedForm = editor.getManagedForm();\r
- \r
- Object formData = managedForm.getForm().getBody().getData();\r
- Assert.isTrue(formData instanceof Taxon, \r
- "Managed form must have a Taxon in its data field.");\r
- acceptedTaxon = (Taxon) formData;\r
-\r
- createControl();\r
- \r
- logger.trace(this.getClass().getSimpleName() + " created");\r
- }\r
- \r
- protected void createControl() {\r
- setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
- TableWrapLayout layout = new TableWrapLayout();\r
- layout.leftMargin = 0;\r
- layout.topMargin = 0;\r
- layout.bottomMargin = 0;\r
- layout.verticalSpacing = 0;\r
- setLayout(layout);\r
- \r
- setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
- }\r
- \r
- protected void createLineWrapSupport() {\r
- if (textViewer instanceof NameViewer) {\r
- new LineWrapSupport(textViewer, managedForm);\r
- } else {\r
- logger.warn("Can't create line wrap support because textViewer has not been initialized.");\r
- }\r
- }\r
- \r
- public Taxon getEditorTaxon() {\r
- return acceptedTaxon;\r
- }\r
- \r
- protected void createTextViewer() {\r
- textViewer = new NameViewer(this);\r
- \r
-// textViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
-// \r
-// public void selectionChanged(SelectionChangedEvent event) {\r
-// // TODO Auto-generated method stub\r
-// \r
-// logger.warn("selectionChanged");\r
-// }\r
-// });\r
-// \r
-// textViewer.addViewportListener(new IViewportListener() {\r
-// \r
-// public void viewportChanged(int verticalOffset) {\r
-// // TODO Auto-generated method stub\r
-// logger.warn("viewportChanged");\r
-// }\r
-// });\r
-// \r
- focusListener = new FocusAdapter() {\r
- public void focusGained(FocusEvent e) {\r
- setFocus();\r
-// logger.warn("focusGained");\r
- }\r
- \r
- };\r
- \r
- textViewer.getTextWidget().addFocusListener(focusListener);\r
-// \r
- MouseAdapter mouseListener = new MouseAdapter() {\r
- public void mouseDown(MouseEvent e) {\r
- storeCursor();\r
- setFocus(); \r
- \r
-// logger.warn("mouseDown");\r
-// logger.warn(textViewer.getCursorPosition());\r
- }\r
- };\r
- this.addMouseListener(mouseListener);\r
- textViewer.getRulerControl().addMouseListener(mouseListener);\r
- textViewer.getTextWidget().addMouseListener(mouseListener);\r
- }\r
- \r
- /**\r
- * @param icon\r
- */\r
- public void setIcon(Image icon) {\r
- if (textViewer instanceof NameViewer) {\r
- textViewer.setIcon(icon);\r
- } else {\r
- logger.warn("Can't set icon because textViewer has not been initialized.");\r
- }\r
- }\r
- \r
- /**\r
- * @param indent\r
- */\r
- public void setIndent(int indent) {\r
- if (getLayout() instanceof TableWrapLayout) {\r
- TableWrapLayout layout = ((TableWrapLayout) getLayout());\r
- layout.leftMargin = indent;\r
- this.setLayout(layout);\r
- } else {\r
- logger.warn("Couldn't indent - composite's layout must be TableWrapLayout.");\r
- }\r
- } \r
- \r
- /* (non-Javadoc)\r
- * @see org.eclipse.swt.widgets.Composite#setFocus()\r
- */\r
- public boolean setFocus() {\r
- //logger.warn("Setting focus to groupd composite");\r
- setSelection();\r
- textViewer.getTextWidget().setFocus();\r
- return true;\r
- }\r
- \r
- /**\r
- * Set background on selection and the cursor to EOL\r
- * I wanted to move this to setFocus() but that leads to an infinite loop\r
- */\r
- public void setSelected(){\r
- setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_SELECTED));\r
- if(textViewer != null){\r
- placeCursor();\r
- }\r
- }\r
- \r
- /**\r
- * \r
- */\r
- protected void setSelection() {\r
- managedForm.setInput(this);\r
- }\r
- \r
- /**\r
- * \r
- */\r
- protected void setDelayedSelection(){\r
- //TODO this might be done better\r
- // this is the quickest solution i could come up with and it improves performance\r
- // please reimplement if you know better.\r
- selection = this;\r
- \r
- // start timer\r
- Display display = Display.getCurrent();\r
- Runnable runnable = new Runnable() {\r
- \r
- public void run() {\r
- managedForm.setInput(selection);\r
- }\r
- };\r
- display.timerExec(1000, runnable);\r
- \r
- }\r
- \r
- /**\r
- * \r
- */\r
- @Override\r
- public void setBackground(Color color) {\r
- super.setBackground(color);\r
- if(textViewer != null){\r
- textViewer.setBackground(color);\r
- }\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see org.eclipse.swt.widgets.Control#setFont(org.eclipse.swt.graphics.Font)\r
- */\r
- public void setFont(Font font) {\r
- if (textViewer != null) {\r
- textViewer.getTextWidget().setFont(font);\r
- } else {\r
- logger.warn("Can't set font because textViewer has not been initalized.");\r
- }\r
- }\r
- \r
- public TextViewer getTextViewer() {\r
- return textViewer;\r
- }\r
- \r
- /**\r
- * If <code>textViewer</code> has already been set, it will show a \r
- * <code>prompt</code> along the lines of "Click here to start entering data" \r
- * when empty.\r
- * \r
- * @param prompt\r
- */\r
- public void createEmptyViewerPrompt(final String prompt) {\r
- \r
- emptyViewerPrompt = prompt;\r
- \r
- Assert.isNotNull(textViewer);\r
-// new EmptyTextViewerPrompt(getTextViewer(), prompt);\r
- \r
- final StyledText textControl = textViewer.getTextWidget();\r
- final IDocument document = textViewer.getDocument();\r
- \r
- setFocusListener(new FocusListener() {\r
-\r
- \r
- public void focusGained(FocusEvent e) {\r
- if (document.get().equals(prompt)) {\r
- textControl.setFont(getViewerFont());\r
- document.set("");\r
- }\r
- }\r
-\r
- \r
- public void focusLost(FocusEvent e) {\r
- if (document.getLength() == 0) {\r
- initEmptyText();\r
- }\r
- }\r
- \r
- });\r
- textControl.addFocusListener(getFocusListener());\r
- \r
- if (document.getLength() == 0) {\r
- textControl.setFont(EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT));\r
- document.set(prompt);\r
- }\r
- }\r
- \r
- abstract protected Font getViewerFont();\r
-\r
- protected void initEmptyText() {\r
- Font defaultFont = EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT);\r
- textViewer.getTextWidget().setFont(defaultFont);\r
- \r
- textViewer.getDocument().set(getEmptyTextPrompt());\r
- placeCursor();\r
- }\r
-\r
- protected String getEmptyTextPrompt() {\r
- if (emptyViewerPrompt == null) {\r
- emptyViewerPrompt = "Click to edit";\r
- }\r
- return emptyViewerPrompt;\r
- }\r
-\r
- protected void setFocusListener(FocusListener focusListener) {\r
- this.focusListener = focusListener;\r
- }\r
-\r
- private FocusListener getFocusListener() {\r
- return focusListener;\r
- }\r
- \r
- /**\r
- * \r
- */\r
- public void createBorderSupport() {\r
- \r
- if (textViewer == null) {\r
- logger.warn("Could not create border support - getTextViewer() returned null.");\r
- } else {\r
- borderDecorator = new CompositeBorderDecorator(\r
- textViewer.getTextWidget(), managedForm); \r
- borderDecorator.setLoseFocus(false);\r
- textViewer.getTextWidget().addFocusListener(borderDecorator);\r
- }\r
- }\r
- \r
- protected void setBorderDecorator(CompositeBorderDecorator borderDecorator) {\r
- this.borderDecorator = borderDecorator;\r
- }\r
- \r
- protected CompositeBorderDecorator getBorderDecorator() {\r
- return borderDecorator;\r
- }\r
- \r
- public void drawBorder() {\r
- if (borderDecorator != null) {\r
- borderDecorator.paintBorder();\r
- }\r
- }\r
-\r
- /**\r
- * @param isDirty\r
- */\r
- public void setDirty(boolean isDirty) {\r
- managedForm.dirtyStateChanged();\r
- }\r
- \r
- public boolean isDirty(){\r
- return managedForm.isDirty();\r
- }\r
- \r
- public void setMenu (Menu menu) {\r
- super.setMenu(menu);\r
- \r
- if (textViewer != null) {\r
- textViewer.setMenu(menu);\r
- }\r
- }\r
- \r
- public void unpaintBorder() {\r
- if (borderDecorator != null) {\r
- borderDecorator.unpaintBorder();\r
- }\r
- }\r
- \r
- private Control draggableControl;\r
- private DragSource dragSource;\r
- \r
- protected void setDraggableControl(Control control) {\r
- draggableControl = control;\r
- }\r
-\r
- public DragSource getDragSource() {\r
- return dragSource;\r
- }\r
- \r
- public void setIsDraggable(boolean draggable) {\r
-\r
- if (draggable) {\r
-\r
- if (dragSource != null) {\r
- // Already initialized\r
- return;\r
- }\r
-\r
- if (draggableControl == null) {\r
- throw new NullPointerException(\r
- "Draggable control must be set to add draggability");\r
- }\r
- \r
- Transfer[] types = new Transfer[] { CdmDataTransfer.getInstance() }; \r
- int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;\r
-\r
- dragSource = new DragSource(draggableControl, operations);\r
- dragSource.setTransfer(types);\r
- dragSource.addDragListener(dragSourceListener);\r
-\r
- } else {\r
- dragSource = null;\r
- }\r
- }\r
-\r
- /**\r
- * Drag listener which passes the Composite as the data in a drag event.\r
- */\r
- DragSourceListener dragSourceListener = new DragSourceAdapter() {\r
-\r
- public void dragStart(DragSourceEvent event) {\r
- if (textViewer != null) {\r
- textViewer.getTextWidget().setFocus();\r
- }\r
- event.doit = true;\r
- }\r
- \r
- public void dragSetData(DragSourceEvent event) {\r
- Object data = GroupedComposite.this.getData();\r
- if(data instanceof CdmBase){\r
- CdmDataTransfer.getInstance().setCdmObject((CdmBase) data);\r
- }\r
-// WidgetTransfer.getInstance().setWidget(GroupedComposite.this);\r
- }\r
- };\r
-\r
- private String nonEditableText;\r
- ControlListener nonEditableResizeListener = new ControlAdapter() {\r
- \r
- int width = 0;\r
- \r
- public void controlResized(ControlEvent e) {\r
- if (nonEditableInfoLabel.getBounds().width == width) {\r
- return;\r
- }\r
- width = nonEditableInfoLabel.getBounds().width;\r
- if (nonEditableInfoLabel.getBounds().width > 0) {\r
- nonEditableInfoLabel.setText(\r
- Dialog.shortenText(nonEditableText.toUpperCase(), \r
- nonEditableInfoLabel));\r
- }\r
- }\r
- };\r
-\r
- private String nonEditableHoverText;\r
-\r
- private LabelEllipsisListener nonEditableLabelEllipsisListener;\r
- \r
- /**\r
- * nonEditableInfo is a label displayed underneath a GroupedComposite's \r
- * input field. For instance, NameComposites display things like name relations,\r
- * sec. references, etc. here.\r
- * \r
- * @param info the text to display in the label\r
- * @param append whether the string should be appended to text that is already shown in the label\r
- */\r
- public void setNonEditableInfo(String info, boolean append) {\r
- // TODO non editable info should only be drawn once, when everything else is drawn\r
- info = info.toUpperCase();\r
- \r
- if(append){\r
- nonEditableText += ", " + info;\r
- nonEditableHoverText += "\n" + info;\r
- }else{\r
- nonEditableText = info;\r
- nonEditableHoverText = info;\r
- }\r
- \r
- if (nonEditableInfoLabel == null) {\r
- nonEditableInfoLabel = new Label(this, SWT.NONE);\r
- TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP);\r
- // Set indent to viewer ruler's width \r
- if (textViewer != null && textViewer.getRulerControl() != null) {\r
- // TODO right justify\r
- layoutData.indent = NameViewer.RULER_WIDTH;\r
- }\r
- nonEditableInfoLabel.setLayoutData(layoutData);\r
- \r
-\r
- \r
- nonEditableLabelEllipsisListener = new LabelEllipsisListener(nonEditableInfoLabel) {\r
- @Override\r
- public String getLabelText() {\r
- return nonEditableText.toUpperCase();\r
- }\r
- }; \r
- nonEditableInfoLabel.addControlListener(nonEditableLabelEllipsisListener);\r
- \r
- nonEditableInfoHover = new DefaultToolTip(nonEditableInfoLabel);\r
- nonEditableInfoHover.setRespectDisplayBounds(true);\r
- \r
- } \r
- nonEditableInfoHover.setText(nonEditableHoverText);\r
- nonEditableInfoLabel.setText(nonEditableText);\r
- }\r
- \r
- /**\r
- * If the user hitting carriage return should cause something to happen -\r
- * i.e. the creation of a new composite - call this method and override\r
- * the method handleSplitText().\r
- */\r
- protected void createLineBreakListener() {\r
- if (textViewer != null) {\r
- lineBreakListener = new LineBreakListener() {\r
- @Override\r
- public void handleSplitText(String text) {\r
- GroupedComposite.this.handleSplitText(text); \r
- }\r
- };\r
- \r
- textViewer.getTextWidget().addVerifyListener(lineBreakListener);\r
- textViewer.getTextWidget().addKeyListener(lineBreakListener);\r
- } else {\r
- logger.warn("Can't create line break listener because textViewer has not been initalized.");\r
- }\r
- }\r
- \r
- /**\r
- * Supposed to be overridden in implementing classes\r
- * \r
- * @param text\r
- */\r
- protected void handleSplitText(String text) {\r
- logger.warn("No handleSplitText method defined for this composite.");\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.editor.name.GroupedComposite#dispose()\r
- */\r
- public void dispose () {\r
- \r
- if (dragSource != null) {\r
- dragSource.removeDragListener(dragSourceListener);\r
- } \r
- \r
- if (textViewer != null) {\r
- StyledText textWidget = textViewer.getTextWidget();\r
- \r
- if (focusListener != null) {\r
- textWidget.removeFocusListener(focusListener);\r
- }\r
- \r
- if (lineBreakListener != null) {\r
- textWidget.removeVerifyListener(lineBreakListener);\r
- textWidget.removeKeyListener(lineBreakListener);\r
- }\r
- \r
- if (borderDecorator != null) {\r
- textWidget.removeFocusListener(borderDecorator);\r
- }\r
- }\r
- \r
- if (nonEditableInfoLabel != null && nonEditableLabelEllipsisListener != null) {\r
- nonEditableInfoLabel.removeControlListener(nonEditableLabelEllipsisListener);\r
- }\r
-\r
- super.dispose();\r
- }\r
- \r
- \r
- \r
- abstract class LabelEllipsisListener extends ControlAdapter {\r
- \r
- private Label label;\r
- int width = 0;\r
-\r
- LabelEllipsisListener(Label label) {\r
- this.label = label;\r
- }\r
- \r
- abstract public String getLabelText();\r
- \r
- public void controlResized(ControlEvent e) {\r
- if (label.getBounds().width == width) {\r
- return;\r
- }\r
- width = label.getBounds().width;\r
- if (label.getBounds().width > 0) {\r
- label.setText(\r
-// Dialog.shortenText(getLabelText(), label));\r
- TextHelper.shortenText(getLabelText(), label));\r
- }\r
- }\r
- }\r
-\r
- public void storeCursor() {\r
- this.cursorPosition = textViewer.getCursorPosition();\r
- }\r
- \r
- /**\r
- * Puts the cursor to the position it was last seen on or to the end of line\r
- * if no former position is known.\r
- */\r
- public void placeCursor(){\r
- if(cursorPosition == 0){\r
- textViewer.setCursorToEOL();\r
- }else{\r
- textViewer.setCursorPosition(cursorPosition);\r
- }\r
- }\r
-}
\ No newline at end of file
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.editor;
+
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public interface IDropTargetable extends IPostOperationEnabled {
+
+ public Composite getControl();
+
+ public TaxonNameEditor getNameEditor();
+
+ public void dragEntered();
+
+ public void dragLeft();
+}
import org.eclipse.core.commands.operations.IUndoContext;\r
import org.eclipse.core.commands.operations.UndoContext;\r
import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.core.runtime.OperationCanceledException;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
import org.eclipse.ui.IEditorSite;\r
\r
@Override\r
public void doSave(IProgressMonitor monitor) {\r
-\r
- // Start the main progress monitor. The number of steps is set to the number of objects to be saved.\r
- IProgressMonitor newMonitor = EditorUtil.startMainMonitor(monitor,"Saving", getPages().size());\r
-\r
- try {\r
+ monitor.beginTask("Saving Editor", 4);\r
+ try{\r
if( ! conversation.isBound()){\r
conversation.bind();\r
}\r
+ monitor.worked(1);\r
\r
for(IEditorPart editorPage : getPages()){\r
if(editorPage instanceof TaxonNameEditor){\r
return;\r
}\r
}\r
-// newMonitor.subTask("- step X");\r
+ \r
editorPage.doSave(monitor);\r
- \r
- // In case the progress monitor was canceled throw an exception.\r
- if (newMonitor.isCanceled()) {\r
- throw new OperationCanceledException();\r
- }\r
- \r
- // Otherwise declare this step as done.\r
- newMonitor.worked(1);\r
+ monitor.worked(1);\r
}\r
\r
// commit the conversation and start a new transaction immediately\r
conversation.commit(true);\r
+ monitor.worked(1);\r
\r
this.setDirty(false);\r
- }\r
- finally {\r
- \r
- // Stop the progress monitor.\r
- newMonitor.done();\r
- }\r
+ monitor.worked(1);\r
+ }finally{\r
+ monitor.done();\r
+ }\r
}\r
\r
\r
throw new PartInitException(\r
"Invalid Input: Must be TaxonEditorInput");\r
\r
- // FIXME looks like we do it differently now\r
- // Get taxon from editor input\r
-// if (input.getAdapter(Taxon.class) != null) {\r
-// taxon = (Taxon) input.getAdapter(Taxon.class);\r
-// } else {\r
-// taxon = null;\r
-// }\r
- \r
this.input = (TaxonEditorInput) input;\r
\r
try {\r
IMultiPageTaxonEditorPage editorPage = getPage(page);\r
return editorPage != null && editorPage.redraw(focus);\r
}\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
}
\ No newline at end of file
\r
package eu.etaxonomy.taxeditor.editor;\r
\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
import org.eclipse.core.runtime.ListenerList;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
import org.eclipse.jface.util.SafeRunnable;\r
import org.eclipse.jface.viewers.IPostSelectionProvider;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.ISelectionChangedListener;\r
import org.eclipse.jface.viewers.SelectionChangedEvent;\r
import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.widgets.Display;\r
\r
/**\r
* @author p.ciardelli\r
+ * @author n.hoffmann\r
* @created 16.05.2008\r
* @version 1.0\r
*/\r
private ListenerList selectionChangedListeners = new ListenerList();\r
private ListenerList postSelectionChangedListeners = new ListenerList();\r
private ISelection selection;\r
+ private Job job;\r
\r
/*\r
* (non-Javadoc)\r
*/\r
public void setSelection(ISelection selection) {\r
this.selection = selection;\r
- firePostSelectionChanged(new SelectionChangedEvent(this, selection));\r
+ \r
+ // cancel previous selection setting\r
+ if(job != null){\r
+ job.cancel();\r
+ job = null;\r
+ }\r
+ \r
+ if(job == null){\r
+ final SelectionChangedEvent selectionChangedEvent = new SelectionChangedEvent(this, selection);\r
+ final Display display = Display.getCurrent();\r
+ job = new Job("Setting Selection"){\r
+ \r
+ @Override\r
+ protected IStatus run(IProgressMonitor monitor) {\r
+ monitor.beginTask("Setting Selection", 10);\r
+ \r
+ if(!monitor.isCanceled()){\r
+ display.asyncExec(new Runnable() {\r
+ \r
+ public void run() {\r
+ firePostSelectionChanged(selectionChangedEvent);\r
+ }\r
+ });\r
+ }\r
+ \r
+ return Status.OK_STATUS;\r
+ }\r
+ \r
+ };\r
+ \r
+ job.setPriority(Job.DECORATE);\r
+ job.schedule();\r
+ }\r
+ \r
}\r
\r
private void firePostSelectionChanged(final SelectionChangedEvent event) {\r
TaxonNode taxonNode = CdmStore.getTaxonNodeService().load(taxonNodeUuid, null);
if(taxonNode == null){
- MessageDialog.openWarning(EditorUtil.getShell(), "Not yet implemented", "Selected element is not type TaxonBase.");
+ EditorUtil.warningDialog("Not yet implemented", "Selected element is not type TaxonBase.");
return null;
}
+++ /dev/null
-package eu.etaxonomy.taxeditor.editor;\r
-\r
-import org.eclipse.swt.dnd.ByteArrayTransfer;\r
-import org.eclipse.swt.dnd.TransferData;\r
-import org.eclipse.swt.widgets.Widget;\r
-\r
-/**\r
- * For drag and drop - a drag widget with this transfer type can only be dropped onto\r
- * a drop widget with the same type.\r
- * \r
- * @author p.ciardelli\r
- *\r
- */\r
-public class WidgetTransfer extends ByteArrayTransfer {\r
-\r
- private static final String WIDGETTYPENAME = "widget_type";\r
- private static final int WIDGETTYPEID = registerType (WIDGETTYPENAME); \r
- private static final WidgetTransfer INSTANCE = new WidgetTransfer();\r
- \r
- /*\r
- * The object associated with this transfer event\r
- */\r
- private Widget widget;\r
- \r
- /*\r
- * Returns the singleton\r
- */\r
- public static synchronized WidgetTransfer getInstance() {\r
- return INSTANCE;\r
- }\r
- /*\r
- * Set transfer data for local use\r
- */\r
- public void setWidget(Widget widget) {\r
- this.widget = widget;\r
- }\r
- /*\r
- * Returns the local transfer data\r
- */\r
- public Widget getWidget() {\r
- return widget;\r
- }\r
- \r
- /* \r
- * The type ID is used to identify this transfer\r
- */\r
- @Override\r
- protected int[] getTypeIds() {\r
- return new int[] { WIDGETTYPEID };\r
- }\r
-\r
- @Override\r
- protected String[] getTypeNames() {\r
- return new String[] { WIDGETTYPENAME } ;\r
- }\r
-\r
- @Override\r
- protected void javaToNative(Object object, TransferData transferData) {\r
- // No encoding needed since this is a hardcoded string read and written\r
- // in the same process.\r
- // See nativeToJava below\r
- byte[] check = WIDGETTYPENAME.getBytes();\r
- super.javaToNative(check, transferData);\r
- }\r
-\r
- @Override\r
- protected Object nativeToJava(TransferData transferData) {\r
- Object result = super.nativeToJava(transferData);\r
- if (isInvalidNativeType(result)) {\r
- throw new RuntimeException(); //$NON-NLS-1$\r
- }\r
- return widget;\r
- }\r
- \r
- private boolean isInvalidNativeType(Object result) {\r
- // No encoding needed since this is a hardcoded string read and written\r
- // in the same process.\r
- // See javaToNative above\r
- return !(result instanceof byte[])\r
- || !WIDGETTYPENAME.equals(new String((byte[]) result));\r
- }\r
-}\r
import org.eclipse.core.commands.ExecutionEvent;\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.IHandler;\r
+import org.eclipse.swt.widgets.Display;\r
import org.eclipse.ui.PartInitException;\r
\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PartInitException;
import eu.etaxonomy.cdm.model.taxon.Taxon;
--- /dev/null
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.dnd.DND;\r
+import org.eclipse.swt.dnd.DropTarget;\r
+import org.eclipse.swt.dnd.DropTargetListener;\r
+import org.eclipse.swt.dnd.Transfer;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @author n.hoffmann\r
+ * @created 25.06.2008\r
+ * @version 1.0\r
+ */\r
+public abstract class AbstractGroup<T extends TaxonBase> implements IDropTargetable{\r
+ private static final Logger logger = Logger.getLogger(AbstractGroup.class);\r
+ \r
+ private Composite control;\r
+ \r
+ private List<AbstractGroupedContainer<T>> groupedContainers = new ArrayList<AbstractGroupedContainer<T>>(); \r
+ \r
+ protected TaxonNameEditor editor;\r
+ \r
+ private DropTarget target;\r
+ private DropTargetListener dropListener;\r
+\r
+ public AbstractGroup(TaxonNameEditor editor){\r
+ this.editor = editor;\r
+ \r
+ createControl();\r
+ \r
+ // Drop functionality\r
+ this.setDroppable(true);\r
+\r
+ }\r
+ \r
+ protected void createControl() {\r
+ control = editor.getToolkit().createComposite(editor.getControl());\r
+ \r
+ control.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+ TableWrapLayout layout = new TableWrapLayout();\r
+ \r
+ layout.topMargin = 0;\r
+ layout.rightMargin = 0;\r
+ layout.bottomMargin = 1;\r
+ layout.leftMargin = 0;\r
+ \r
+ layout.verticalSpacing = 0;\r
+ layout.horizontalSpacing = 0;\r
+ control.setLayout(layout);\r
+ \r
+ control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));\r
+ }\r
+ \r
+ public void add(AbstractGroupedContainer groupedContainer){\r
+ groupedContainers.add(groupedContainer);\r
+ groupedContainer.setGroup(this);\r
+ }\r
+ \r
+ public void remove(AbstractGroupedContainer groupedContainer){\r
+ deleteContainer(groupedContainer);\r
+ groupedContainers.remove(groupedContainer);\r
+ \r
+ editor.getManagedForm().reflow(true);\r
+ }\r
+ \r
+ public void removeAllContainers() {\r
+ for(AbstractGroupedContainer container : groupedContainers){\r
+ deleteContainer(container);\r
+ }\r
+ \r
+ groupedContainers.clear();\r
+ }\r
+ \r
+ public void clearContainers(){\r
+ groupedContainers.clear();\r
+ }\r
+ \r
+ public void deleteContainer(AbstractGroupedContainer groupedContainer){\r
+ groupedContainer.setMenu(null);\r
+ groupedContainer.getControl().dispose();\r
+ }\r
+ \r
+ public void clear(){\r
+ control.setMenu(null);\r
+ control.dispose();\r
+ }\r
+ \r
+ public List<AbstractGroupedContainer<T>> getGroupedContainers(){\r
+ return groupedContainers;\r
+ }\r
+ \r
+ \r
+ public void setDroppable(boolean droppable) {\r
+ if (droppable) {\r
+ Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()}; \r
+ int operations = DND.DROP_MOVE;\r
+ target = new DropTarget(control, operations);\r
+ target.setTransfer(types);\r
+ dropListener = new NameEditorDropTargetListener(this);\r
+ target.addDropListener(dropListener);\r
+ \r
+ target.setDropTargetEffect(new NameEditorDropTargetEffect(control));\r
+ \r
+ } else {\r
+ if (dropListener != null) {\r
+ target.removeDropListener(dropListener);\r
+ }\r
+ }\r
+ }\r
+ \r
+ public Composite getControl(){\r
+ return control;\r
+ }\r
+\r
+ public TaxonNameEditor getNameEditor() {\r
+ return editor;\r
+ }\r
+\r
+ public void dragEntered() {\r
+ Color color = EditorUtil.getColor(Resources.COLOR_DRAG_ENTER);\r
+ \r
+ for(AbstractGroupedContainer container : groupedContainers){\r
+ container.setBackground(color);\r
+ } \r
+ }\r
+\r
+ public void dragLeft() {\r
+ for(AbstractGroupedContainer container : groupedContainers){\r
+ container.restoreColor();\r
+ }\r
+ }\r
+ \r
+ public boolean postOperation(CdmBase objectAffectedByOperation) {\r
+ editor.getMultiPageTaxonEditor().changed(null);\r
+ redraw();\r
+ return true;\r
+ }\r
+\r
+ public abstract void redraw();\r
+}\r
--- /dev/null
+/**\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ * \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.lang.reflect.Method;\r
+import java.util.Set;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.Assert;\r
+import org.eclipse.jface.dialogs.Dialog;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.TextViewer;\r
+import org.eclipse.jface.window.DefaultToolTip;\r
+import org.eclipse.swt.custom.StyledText;\r
+import org.eclipse.swt.dnd.DND;\r
+import org.eclipse.swt.dnd.DragSource;\r
+import org.eclipse.swt.dnd.Transfer;\r
+import org.eclipse.swt.events.ControlAdapter;\r
+import org.eclipse.swt.events.ControlEvent;\r
+import org.eclipse.swt.events.ControlListener;\r
+import org.eclipse.swt.events.FocusAdapter;\r
+import org.eclipse.swt.events.FocusEvent;\r
+import org.eclipse.swt.events.FocusListener;\r
+import org.eclipse.swt.events.ModifyEvent;\r
+import org.eclipse.swt.events.ModifyListener;\r
+import org.eclipse.swt.events.MouseAdapter;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
+import eu.etaxonomy.cdm.model.name.NonViralName;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.labels.ILabelImageStrategy;\r
+import eu.etaxonomy.taxeditor.labels.LabelImageProvider;\r
+import eu.etaxonomy.taxeditor.model.ImageResources;\r
+import eu.etaxonomy.taxeditor.model.NameHelper;\r
+import eu.etaxonomy.taxeditor.model.TextHelper;\r
+import eu.etaxonomy.taxeditor.operations.CreateSynonymInNewGroupOperation;\r
+import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
+\r
+/** \r
+ * Formats <code>GroupedComposite</code> with cosmetic and layout properties specific to the\r
+ * Editor. This should be used to maintain a consistent look and feel for all Editor \r
+ * freetext area components, such as DescriptionElementComposite.\r
+ * <p>\r
+ * Requires an <code>IManagedForm</code>, whose <code>input</code> is set to the contents\r
+ * of {@link #getData()} when the <code>GroupedComposite</code> gets focus, i.e. to\r
+ * populate the property sheet with the data.\r
+ * </p>\r
+ * <p>\r
+ * The <code>IManagedForm</code> is also required to have a <code>Taxon</code> in its \r
+ * own <code>getData()</code>.\r
+ * </p> \r
+ * <p>\r
+ * The <code>IManagedForm</code> can also used for drawing borders by calling the method \r
+ * <code>createBorderSupport()</code>.\r
+ * </p>\r
+ * @author p.ciardelli\r
+ * @author n.hoffmann\r
+ * @created 02.06.2008\r
+ * @version 1.0\r
+ */\r
+abstract public class AbstractGroupedContainer<T extends TaxonBase> { \r
+ private static final Logger logger = Logger.getLogger(AbstractGroupedContainer.class);\r
+ \r
+ /**\r
+ * \r
+ */\r
+ public static final int SELECTED_FOCUS = 1;\r
+ public static final int SELECTED_NO_FOCUS = 2;\r
+ public static final int NOT_SELECTED = 3;\r
+ \r
+ /**\r
+ * ************ COMPOSITE TYPES ************\r
+ */\r
+ public String compositeType;\r
+ public static final String ACCEPTED_TAXON = "accepted_name_composite";\r
+ public static final String HOMOTYPIC_SYNONYM = "homotypic_name_composite";\r
+ public static final String HETEROTYPIC_SYNONYM = "heterotypic_name_composite";\r
+ public static final String MISAPPLIED_NAME = "misappliedname_name_composite";\r
+ public static final String CONCEPTRELATION = "concept_name_composite";\r
+\r
+ /**\r
+ * ************ INDENTATIONS ************\r
+ */\r
+ public static final int ACCEPTED_INDENT = 20;\r
+ public static final int SYNONYM_INDENT = 40;\r
+ public static final int MISAPPLIEDNAME_INDENT = 40;\r
+ public static final int CONCEPT_INDENT = 40;\r
+\r
+ \r
+ /**\r
+ * ************ ICONS ************\r
+ */\r
+ public static final Image ACCEPTED_ICON = ImageResources.getImage(ImageResources.BLACK_SQUARE_ICON);\r
+ public static final Image HOMOTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HOMOTYPIC_SYN_ICON);\r
+ public static final Image HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
+ ImageResources.HOMOTYPIC_SYN_ORIGINAL_ICON);\r
+ public static final Image HETEROTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HETEROTYPIC_SYN_ICON);\r
+ public static final Image HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
+ ImageResources.HETEROTYPIC_SYN_ORIGINAL_ICON);\r
+ public static final Image MISAPPLIEDNAME_ICON = ImageResources.getImage(ImageResources.MISAPPLIED_NAME_ICON);\r
+ public static final Image CONCEPT_ICON = ImageResources.getImage(ImageResources.CONCEPT_ICON);\r
+ public static final Image AUTONYM_ICON = ImageResources\r
+ .getImage(ImageResources.AUTONYM_ICON);\r
+ public static final Image MOVE = ImageResources.getImage(ImageResources.MOVE_ICON);\r
+\r
+ /**\r
+ * ************ TRANSFORMATIONS ************\r
+ */\r
+ public static final String ADD_GROUP_BASIONYM = "add_group_basionym";\r
+ public static final String REMOVE_GROUP_BASIONYM = "remove_group_basionym";\r
+\r
+ private static final String EMPTY_NAME_PROMPT = "Click to add name";\r
+ \r
+ protected ParseHandler parseHandler;\r
+ \r
+ private FocusListener nameCompositeFocusListener;\r
+ private ModifyListener nameCompositeModifyListener;\r
+ \r
+ final Color not_editable_color = new Color(Display.getDefault(), 105, 114, 124);\r
+\r
+ /**\r
+ * 1st column: Return value expected from the last method mentioned in the object path (3rd column et seq.) to enable the freetext.\r
+ * 2nd column: The class the last method mentioned in the object path should be a member of. This should be null if there is no need to narrow this.\r
+ * 3rd column et seq.: The sequence of method names reflects the object path to the desired method starting from a member of TaxonBase.\r
+ */\r
+ private Object[][] enableFreetextFor = {\r
+ {"", null, "getName", "getAppendedPhrase"},\r
+ {false, null, "getName", "isProtectedAuthorshipCache"},\r
+ {false, null, "getName", "isProtectedNameCache"},\r
+// {false, "eu.etaxonomy.cdm.model.agent.Team", "getName", "getCombinationAuthorTeam", "isProtectedNomenclaturalTitleCache"}\r
+ };\r
+\r
+ \r
+ \r
+ protected TaxonNameEditor editor;\r
+ \r
+ protected NameViewer textViewer;\r
+ \r
+ private AbstractGroup<T> group;\r
+ \r
+ private Label nonEditableInfoLabel;\r
+ private DefaultToolTip nonEditableInfoHover;\r
+ \r
+ private static AbstractGroupedContainer selection;\r
+ \r
+ private FocusListener focusListener;\r
+ private LineBreakListener lineBreakListener;\r
+\r
+ private int cursorPosition;\r
+\r
+ protected Composite control;\r
+\r
+ private Color backgroundColor;\r
+ \r
+ public AbstractGroupedContainer(TaxonNameEditor editor, AbstractGroup<T> group, T taxonBase){\r
+ this.editor = editor;\r
+ \r
+ this.group = group; \r
+ group.add(this);\r
+ \r
+ setData( (T) HibernateProxyHelper.deproxy(taxonBase));\r
+ \r
+ createControl();\r
+ \r
+ createTextViewer();\r
+ createLineWrapSupport();\r
+ createLineBreakListener();\r
+\r
+ setMenu(editor.getMenu());\r
+ \r
+ setDraggableControl(textViewer.getRulerControl());\r
+ \r
+ createEmptyViewerPrompt(EMPTY_NAME_PROMPT);\r
+ \r
+ parseHandler = ParseHandler.NewInstance(textViewer.getTextWidget(), taxonBase.getName());\r
+ \r
+ initializeComposite();\r
+ \r
+ createListener();\r
+\r
+ isFreeTextEnabled();\r
+ \r
+ logger.trace(this.getClass().getSimpleName() + " created");\r
+ }\r
+\r
+ \r
+ \r
+ protected void createListener(){\r
+ nameCompositeModifyListener = new ModifyListener(){\r
+ \r
+ public void modifyText(ModifyEvent e) {\r
+ // mark the composite dirty\r
+ setDirty(true);\r
+ // parse the text\r
+ NonViralName name = parseHandler.parse();\r
+ getTaxonBase().setName(name);\r
+ getTaxonBase().setTitleCache((getTaxonBase().generateTitle()));\r
+ \r
+ // show errors resulting from parsing\r
+ calculateErrors();\r
+ // store the position of the cursor \r
+ storeCursor();\r
+ // notify selection listener\r
+ setDelayedSelection();\r
+ }\r
+ };\r
+ nameCompositeFocusListener = new FocusAdapter(){\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)\r
+ */\r
+ @Override\r
+ public void focusLost(FocusEvent e) {\r
+ super.focusLost(e);\r
+\r
+ persistName();\r
+ } \r
+ };\r
+ \r
+ addListener();\r
+ }\r
+ \r
+ private void addListener(){\r
+ textViewer.getTextWidget().addModifyListener(nameCompositeModifyListener);\r
+ textViewer.getTextWidget().addFocusListener(nameCompositeFocusListener);\r
+ }\r
+ \r
+ private void removeListener(){\r
+ textViewer.getTextWidget().removeModifyListener(nameCompositeModifyListener);\r
+ textViewer.getTextWidget().removeFocusListener(nameCompositeFocusListener);\r
+ }\r
+ \r
+ /**\r
+ * Initialize the composite specific code\r
+ * \r
+ */\r
+ protected abstract void initializeComposite();\r
+ \r
+ protected String getEmptyTextPrompt() {\r
+ return EMPTY_NAME_PROMPT;\r
+ }\r
+ \r
+ /**\r
+ * \r
+ */\r
+ private void showNameRelations() {\r
+ TaxonNameBase<?, ?> name = getName();\r
+ if (name == null) {\r
+ return;\r
+ }\r
+ \r
+ ILabelImageStrategy strategy = LabelImageProvider.getLabelStrategy(name);\r
+ LabelImageProvider labelProvider = new LabelImageProvider(strategy);\r
+ \r
+ Set<NameRelationship> nameRelations = name.getNameRelations();\r
+ if (nameRelations.size() == 0) {\r
+ return;\r
+ }\r
+ for (NameRelationship nameRelation : nameRelations) {\r
+ String typeLabel = null;\r
+ TaxonNameBase<?, ?> relatedName = null; \r
+\r
+ if (name.equals(nameRelation.getFromName())) {\r
+ typeLabel = labelProvider.getNameRelationTypeLabel( \r
+ nameRelation.getType());\r
+ relatedName = nameRelation.getToName();\r
+ } else {\r
+ typeLabel = labelProvider.getNameRelationTypeInverseLabel( \r
+ nameRelation.getType());\r
+ relatedName = nameRelation.getFromName();\r
+ }\r
+ \r
+// setNonEditableInfo(typeLabel + " " + NameHelper.getDisplayName(relatedName));\r
+ }\r
+ }\r
+ \r
+ protected void initTextViewer() {\r
+ \r
+ showNameRelations();\r
+ \r
+ String text = NameHelper.getDisplayNameWithRef(getData());\r
+ \r
+ if (text.length() == 0) {\r
+ initEmptyText();\r
+ } else {\r
+ textViewer.setText(text);\r
+ placeCursor();\r
+ }\r
+ calculateErrors();\r
+ }\r
+ \r
+ synchronized protected void calculateErrors() {\r
+ textViewer.clearErrors();\r
+ textViewer.setShowParsingErrors(getName());\r
+ }\r
+\r
+ protected void handleSplitText(String text) {\r
+ // Create a synonym in a new homotypic group using text as name\r
+ TaxonNameBase synonymName = ParseHandler.quickParse(text);\r
+ \r
+ EditorUtil.executeOperation(new CreateSynonymInNewGroupOperation\r
+ ("New Heterotypic Synonym", editor.getUndoContext(), editor.getTaxon(), synonymName, editor));\r
+ logger.debug("new heterotypic synonym created through entering of line break");\r
+ }\r
+\r
+ /**\r
+ * Refreshes the display with latest data from the model.\r
+ * \r
+ * Note: Will not parse the text and not calculate errors! \r
+ * \r
+ */\r
+ public void refresh() {\r
+ showNameRelations();\r
+ \r
+ String text = NameHelper.getDisplayNameWithRef(getTaxonBase());\r
+ \r
+ if (text.length() == 0) {\r
+ initEmptyText();\r
+ } else {\r
+ removeListener();\r
+ textViewer.getTextWidget().setText(text);\r
+ addListener();\r
+ }\r
+ \r
+ updateNonEditableInfo();\r
+ \r
+// placeCursor();\r
+ \r
+ isFreeTextEnabled();\r
+ }\r
+\r
+ protected abstract void updateNonEditableInfo();\r
+ \r
+ /**\r
+ * \r
+ */\r
+ private void isFreeTextEnabled() {\r
+ // Decide whether editing of freetext is allowed or not.\r
+ if (freetextEditingAllowed()) {\r
+ \r
+ // set editable\r
+ textViewer.getTextWidget().setEditable(true);\r
+ \r
+ // restore foreground font color again\r
+ textViewer.getTextWidget().setForeground(control.getForeground());\r
+ } else {\r
+ // set non-editable\r
+ textViewer.getTextWidget().setEditable(false);\r
+ \r
+ // grey out text as a non-editable indicator\r
+ textViewer.getTextWidget().setForeground(not_editable_color);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Checks whether the freetext should be editable based on specific empty fields.\r
+ * @return\r
+ */\r
+ private boolean freetextEditingAllowed() {\r
+ boolean enableFreetext = true;\r
+\r
+ enableFreetext &= taxonFieldsEmpty();\r
+\r
+ return enableFreetext;\r
+ }\r
+\r
+ /**\r
+ * Checks whether specific fields of specific type have specific values.\r
+ * This generic implementation can easily go completely nuts if enableFreetextFor was filled wrong.\r
+ * @return\r
+ */\r
+ private boolean taxonFieldsEmpty() {\r
+ boolean enableFreetext = true;\r
+\r
+ if (getTaxonBase() != null) {\r
+ for (Object[] methodSequence : enableFreetextFor) {\r
+ int sequenceCount = 0;\r
+ Object taxonObject = HibernateProxyHelper.deproxy(getTaxonBase());\r
+ Object referenceType = null;\r
+ boolean useReference = false;\r
+ Class<? extends CdmBase> referenceInstance = null;\r
+ for (Object method : methodSequence) {\r
+ sequenceCount++;\r
+\r
+ if (sequenceCount == 1) {\r
+ referenceType = method;\r
+ } else if (sequenceCount == 2) {\r
+ try {\r
+ if (method != null) {\r
+ referenceInstance = (Class<? extends CdmBase>) Class.forName((String) method);\r
+ useReference = true;\r
+ } else {\r
+ useReference = false;\r
+ }\r
+ } catch (ClassNotFoundException e) {\r
+ logger.error("Class " + method + " could not be found: ", e);\r
+ return false;\r
+ }\r
+ } else {\r
+ Method getter = null;\r
+ try {\r
+ if (taxonObject != null) { // authorTeams can be null\r
+ Class<? extends Object> clazz = taxonObject.getClass();\r
+ boolean goOn = false;\r
+ if (methodSequence.length == sequenceCount) {\r
+ if (useReference) {\r
+ if (referenceInstance.newInstance().isInstanceOf((Class<? extends CdmBase>) clazz)) {\r
+ goOn = true;\r
+ } else {\r
+ goOn = false;\r
+ }\r
+ } else {\r
+ goOn = true;\r
+ }\r
+ } else {\r
+ goOn = true;\r
+ }\r
+ \r
+ if (goOn) {\r
+ getter = clazz.getMethod((String)method, (Class<?>[])null);\r
+ taxonObject = HibernateProxyHelper.deproxy(getter.invoke(taxonObject, (Object[])null));\r
+ if (methodSequence.length == sequenceCount) {\r
+ enableFreetext &= isEqual(referenceType, taxonObject);\r
+// if (!enableFreetext) {\r
+// logger.error("Freetext disabled for: " + taxonBase);\r
+// }\r
+ }\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ logger.error("Method " + method + " could not be called: " + e.getMessage());\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } else {\r
+ logger.warn("TaxonBase is null. This should not happen.");\r
+ }\r
+\r
+ return enableFreetext;\r
+ }\r
+\r
+ /**\r
+ * Checks whether two objects are equal. Only works for cases of interest.\r
+ * @param referenceType\r
+ * @param object\r
+ * @return\r
+ */\r
+ private boolean isEqual(Object referenceType, Object object) {\r
+ boolean equal = false;\r
+ if (referenceType instanceof Boolean) {\r
+ if ((Boolean)referenceType.equals((Boolean)object)) {\r
+ equal = true;\r
+ } else {\r
+ equal = false;\r
+ }\r
+ } else {\r
+ // This can only be a String in our cases so far. Needs reimplementation in case this is not always the case.\r
+ if (referenceType.equals(CdmUtils.Nz((String)object))) {\r
+ equal = true;\r
+ } else {\r
+ equal = false;\r
+ }\r
+ }\r
+ return equal;\r
+ }\r
+\r
+ /**\r
+ * Parse the text and calculate errors\r
+ * \r
+ */\r
+ public void parseAndCalculateErrors(){\r
+ removeListener();\r
+ parseHandler.parse();\r
+ addListener();\r
+ calculateErrors();\r
+ }\r
+\r
+ /**\r
+ * @return the taxonBase\r
+ */\r
+ public T getTaxonBase() {\r
+ return getData();\r
+ }\r
+ \r
+ public TaxonNameBase getName(){\r
+ return getTaxonBase().getName();\r
+ }\r
+\r
+ public void persistName(){\r
+ if(isDirty()){\r
+ logger.warn("Found dirty composite: " + this + ". Name: " + textViewer.getTextWidget().getText());\r
+ getTaxonBase().setName(parseHandler.parseAndResolveDuplicates());\r
+ \r
+ getTaxonBase().setTitleCache((getTaxonBase().generateTitle()));\r
+\r
+ }\r
+ }\r
+ \r
+ public AbstractGroup getGroup(){\r
+ return group;\r
+ }\r
+ \r
+ public void remove(){\r
+ getGroup().remove(this);\r
+ }\r
+ \r
+ protected void createControl() {\r
+ control = editor.getToolkit().createComposite(group.getControl());\r
+ \r
+ control.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+ TableWrapLayout layout = new TableWrapLayout();\r
+ layout.leftMargin = 0;\r
+ layout.rightMargin = 0;\r
+ layout.topMargin = 5;\r
+ layout.bottomMargin = 5;\r
+ \r
+ layout.verticalSpacing = 0;\r
+ layout.horizontalSpacing = 0;\r
+ \r
+ control.setLayout(layout);\r
+ \r
+ setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
+ }\r
+ \r
+ public Composite getControl(){\r
+ return control;\r
+ }\r
+ \r
+ protected void createLineWrapSupport() {\r
+ if (textViewer instanceof NameViewer) {\r
+ new LineWrapSupport(textViewer, editor.getManagedForm());\r
+ } else {\r
+ logger.warn("Can't create line wrap support because textViewer has not been initialized.");\r
+ }\r
+ }\r
+ \r
+ \r
+ protected void createTextViewer() {\r
+ textViewer = new NameViewer(control);\r
+ \r
+ focusListener = new FocusAdapter() {\r
+ public void focusGained(FocusEvent e) {\r
+ for(AbstractGroupedContainer container : editor.getGroupedContainers()){\r
+ container.colorSelected(NOT_SELECTED);\r
+ }\r
+ editor.getManagedForm().setInput(AbstractGroupedContainer.this);\r
+// setSelected();\r
+ placeCursor();\r
+ colorSelected(SELECTED_FOCUS);\r
+ logger.warn("TextViewer gained focus: " + AbstractGroupedContainer.this);\r
+ }\r
+ public void focusLost(FocusEvent e) {\r
+// colorSelected(NOT_SELECTED);\r
+ logger.warn("TextViewer lost focus: " + AbstractGroupedContainer.this);\r
+ logger.warn("------------");\r
+ };\r
+ };\r
+ textViewer.getTextWidget().addFocusListener(focusListener);\r
+ \r
+// \r
+ MouseAdapter mouseListener = new MouseAdapter() {\r
+ public void mouseDown(MouseEvent e) {\r
+ storeCursor();\r
+// setFocus(); \r
+ \r
+// logger.warn("mouseDown");\r
+// logger.warn(textViewer.getCursorPosition());\r
+ }\r
+ };\r
+ control.addMouseListener(mouseListener);\r
+ textViewer.getRulerControl().addMouseListener(mouseListener);\r
+ textViewer.getTextWidget().addMouseListener(mouseListener);\r
+ }\r
+ \r
+ /**\r
+ * @param icon\r
+ */\r
+ public void setIcon(Image icon) {\r
+ if (textViewer instanceof NameViewer) {\r
+ textViewer.setIcon(icon);\r
+ } else {\r
+ logger.warn("Can't set icon because textViewer has not been initialized.");\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @param indent\r
+ */\r
+ public void setIndent(int indent) {\r
+ if (control.getLayout() instanceof TableWrapLayout) {\r
+ TableWrapLayout layout = ((TableWrapLayout) control.getLayout());\r
+ layout.leftMargin = indent;\r
+ layout.rightMargin = ACCEPTED_INDENT;\r
+ control.setLayout(layout);\r
+ } else {\r
+ logger.warn("Couldn't indent - composite's layout must be TableWrapLayout.");\r
+ }\r
+ } \r
+ \r
+ /**\r
+ * \r
+ * @return\r
+ */\r
+ public void setSelected() {\r
+ textViewer.getTextWidget().setFocus();\r
+ }\r
+ \r
+ public boolean isSelected(){\r
+ return editor.getSelectedObject() == this;\r
+ }\r
+ \r
+ public void colorSelected(int mode){\r
+ if(!control.isDisposed()){\r
+ String colorString = null;\r
+ \r
+ switch(mode){\r
+ case SELECTED_FOCUS:\r
+ colorString = Resources.COLOR_CONTROL_SELECTED_FOCUS;\r
+ break;\r
+ case SELECTED_NO_FOCUS:\r
+ colorString = Resources.COLOR_CONTROL_SELECTED;\r
+ break;\r
+ default:\r
+ colorString = Resources.COLOR_COMPOSITE_BACKGROUND;\r
+ }\r
+ \r
+ backgroundColor = EditorUtil.getColor(colorString);\r
+ \r
+ setBackground(backgroundColor);\r
+ }\r
+ }\r
+\r
+ \r
+ /**\r
+ * \r
+ */\r
+ protected void setDelayedSelection(){\r
+ //TODO this might be done better\r
+ // this is the quickest solution i could come up with and it improves performance\r
+ // please reimplement if you know better.\r
+ selection = this;\r
+ \r
+ // start timer\r
+ Display display = Display.getCurrent();\r
+ Runnable runnable = new Runnable() {\r
+ \r
+ public void run() {\r
+ editor.getManagedForm().setInput(selection);\r
+ }\r
+ };\r
+ display.timerExec(1000, runnable);\r
+ \r
+ }\r
+ \r
+ /**\r
+ * \r
+ */\r
+ public void setBackground(Color color) {\r
+ control.setBackground(color);\r
+ \r
+ for(Control child : control.getChildren()){\r
+ child.setBackground(color);\r
+ }\r
+ \r
+ if(textViewer != null){\r
+ textViewer.setBackground(color);\r
+ }\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.swt.widgets.Control#setFont(org.eclipse.swt.graphics.Font)\r
+ */\r
+ public void setFont(Font font) {\r
+ if (textViewer != null) {\r
+ textViewer.getTextWidget().setFont(font);\r
+ } else {\r
+ logger.warn("Can't set font because textViewer has not been initalized.");\r
+ }\r
+ }\r
+ \r
+ public TextViewer getTextViewer() {\r
+ return textViewer;\r
+ }\r
+ \r
+ /**\r
+ * If <code>textViewer</code> has already been set, it will show a \r
+ * <code>prompt</code> along the lines of "Click here to start entering data" \r
+ * when empty.\r
+ * \r
+ * @param prompt\r
+ */\r
+ public void createEmptyViewerPrompt(final String prompt) {\r
+ \r
+ Assert.isNotNull(textViewer);\r
+ \r
+ final StyledText textControl = textViewer.getTextWidget();\r
+ final IDocument document = textViewer.getDocument();\r
+ \r
+ setFocusListener(new FocusListener() {\r
+\r
+ \r
+ public void focusGained(FocusEvent e) {\r
+ if (document.get().equals(prompt)) {\r
+ textControl.setFont(getViewerFont());\r
+ document.set("");\r
+ }\r
+ }\r
+\r
+ \r
+ public void focusLost(FocusEvent e) {\r
+ if (document.getLength() == 0) {\r
+ initEmptyText();\r
+ }\r
+ }\r
+ \r
+ });\r
+ textControl.addFocusListener(getFocusListener());\r
+ \r
+ if (document.getLength() == 0) {\r
+ textControl.setFont(EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT));\r
+ document.set(prompt);\r
+ }\r
+ }\r
+ \r
+ abstract protected Font getViewerFont();\r
+\r
+ protected void initEmptyText() {\r
+ Font defaultFont = EditorUtil.getFont(Resources.FONT_DEFAULT_PROMPT);\r
+ textViewer.getTextWidget().setFont(defaultFont);\r
+ \r
+ textViewer.getDocument().set(getEmptyTextPrompt());\r
+ placeCursor();\r
+ }\r
+\r
+ protected void setFocusListener(FocusListener focusListener) {\r
+ this.focusListener = focusListener;\r
+ }\r
+\r
+ private FocusListener getFocusListener() {\r
+ return focusListener;\r
+ }\r
+\r
+ /**\r
+ * @param isDirty\r
+ */\r
+ public void setDirty(boolean isDirty) {\r
+ editor.getManagedForm().dirtyStateChanged();\r
+ }\r
+ \r
+ public boolean isDirty(){\r
+ return editor.getManagedForm().isDirty();\r
+ }\r
+ \r
+ public void setMenu (Menu menu) {\r
+ control.setMenu(menu);\r
+ \r
+ if (textViewer != null) {\r
+ textViewer.setMenu(menu);\r
+ }\r
+ }\r
+ \r
+ private Control draggableControl;\r
+ private DragSource dragSource;\r
+ \r
+ protected void setDraggableControl(Control control) {\r
+ draggableControl = control;\r
+ }\r
+\r
+ public DragSource getDragSource() {\r
+ return dragSource;\r
+ }\r
+ \r
+ public void setIsDraggable(boolean draggable) {\r
+\r
+ if (draggable) {\r
+\r
+ if (dragSource != null) {\r
+ // Already initialized\r
+ return;\r
+ }\r
+\r
+ if (draggableControl == null) {\r
+ throw new NullPointerException(\r
+ "Draggable control must be set to add draggability");\r
+ }\r
+ \r
+ Transfer[] types = new Transfer[] { CdmDataTransfer.getInstance() }; \r
+ int operations = DND.DROP_MOVE;\r
+\r
+ dragSource = new DragSource(draggableControl, operations);\r
+ dragSource.setTransfer(types);\r
+ \r
+ dragSource.addDragListener(new NameEditorDragListener(this));\r
+ dragSource.setDragSourceEffect(new NameEditorDragSourceEffect(control));\r
+ } else {\r
+ dragSource = null;\r
+ }\r
+ }\r
+\r
+ private String nonEditableText;\r
+\r
+ ControlListener nonEditableResizeListener = new ControlAdapter() {\r
+ \r
+ int width = 0;\r
+ \r
+ public void controlResized(ControlEvent e) {\r
+ if (nonEditableInfoLabel.getBounds().width == width) {\r
+ return;\r
+ }\r
+ width = nonEditableInfoLabel.getBounds().width;\r
+ if (nonEditableInfoLabel.getBounds().width > 0) {\r
+ nonEditableInfoLabel.setText(\r
+ Dialog.shortenText(nonEditableText.toUpperCase(), \r
+ nonEditableInfoLabel));\r
+ }\r
+ }\r
+ };\r
+\r
+ private String nonEditableHoverText;\r
+\r
+ private LabelEllipsisListener nonEditableLabelEllipsisListener;\r
+\r
+ private T data;\r
+ \r
+ /**\r
+ * nonEditableInfo is a label displayed underneath a GroupedComposite's \r
+ * input field. For instance, NameComposites display things like name relations,\r
+ * sec. references, etc. here.\r
+ * \r
+ * @param info the text to display in the label\r
+ * @param append whether the string should be appended to text that is already shown in the label\r
+ */\r
+ public void setNonEditableInfo(String info, boolean append) {\r
+ // TODO non editable info should only be drawn once, when everything else is drawn\r
+ info = info.toUpperCase();\r
+ \r
+ if(append){\r
+ nonEditableText += ", " + info;\r
+ nonEditableHoverText += "\n" + info;\r
+ }else{\r
+ nonEditableText = info;\r
+ nonEditableHoverText = info;\r
+ }\r
+ \r
+ if (nonEditableInfoLabel == null) {\r
+ nonEditableInfoLabel = editor.getToolkit().createLabel(control, "");\r
+ TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP);\r
+ // Set indent to viewer ruler's width \r
+ if (textViewer != null && textViewer.getRulerControl() != null) {\r
+ // TODO right justify\r
+ layoutData.indent = NameViewer.RULER_WIDTH;\r
+ }\r
+ nonEditableInfoLabel.setLayoutData(layoutData);\r
+ \r
+\r
+ \r
+ nonEditableLabelEllipsisListener = new LabelEllipsisListener(nonEditableInfoLabel) {\r
+ @Override\r
+ public String getLabelText() {\r
+ return nonEditableText.toUpperCase();\r
+ }\r
+ }; \r
+ nonEditableInfoLabel.addControlListener(nonEditableLabelEllipsisListener);\r
+ \r
+ nonEditableInfoHover = new DefaultToolTip(nonEditableInfoLabel);\r
+ nonEditableInfoHover.setRespectDisplayBounds(true);\r
+ \r
+ } \r
+ nonEditableInfoHover.setText(nonEditableHoverText);\r
+ nonEditableInfoLabel.setText(nonEditableText);\r
+ }\r
+ \r
+ public T getData(){\r
+ return data;\r
+ }\r
+ \r
+ public void setData(T data){\r
+ this.data = data;\r
+ }\r
+\r
+ /**\r
+ * If the user hitting carriage return should cause something to happen -\r
+ * i.e. the creation of a new composite - call this method and override\r
+ * the method handleSplitText().\r
+ */\r
+ protected void createLineBreakListener() {\r
+ if (textViewer != null) {\r
+ lineBreakListener = new LineBreakListener() {\r
+ @Override\r
+ public void handleSplitText(String text) {\r
+ AbstractGroupedContainer.this.handleSplitText(text); \r
+ }\r
+ };\r
+ \r
+ textViewer.getTextWidget().addVerifyListener(lineBreakListener);\r
+ textViewer.getTextWidget().addKeyListener(lineBreakListener);\r
+ } else {\r
+ logger.warn("Can't create line break listener because textViewer has not been initalized.");\r
+ }\r
+ }\r
+ \r
+ abstract class LabelEllipsisListener extends ControlAdapter {\r
+ \r
+ private Label label;\r
+ int width = 0;\r
+\r
+ LabelEllipsisListener(Label label) {\r
+ this.label = label;\r
+ }\r
+ \r
+ abstract public String getLabelText();\r
+ \r
+ public void controlResized(ControlEvent e) {\r
+ if (label.getBounds().width == width) {\r
+ return;\r
+ }\r
+ width = label.getBounds().width;\r
+ if (label.getBounds().width > 0) {\r
+ label.setText(TextHelper.shortenText(getLabelText(), label));\r
+ }\r
+ }\r
+ }\r
+\r
+ public void storeCursor() {\r
+ this.cursorPosition = textViewer.getCursorPosition();\r
+ }\r
+ \r
+ /**\r
+ * Puts the cursor to the position it was last seen on or to the end of line\r
+ * if no former position is known.\r
+ */\r
+ public void placeCursor(){\r
+ if(cursorPosition == 0){\r
+ textViewer.setCursorToEOL();\r
+ }else{\r
+ textViewer.setCursorPosition(cursorPosition);\r
+ }\r
+ }\r
+\r
+\r
+\r
+ public void setGroup(AbstractGroup<T> group) {\r
+ this.group = group;\r
+ }\r
+\r
+\r
+\r
+ public void restoreColor() {\r
+ setBackground(backgroundColor);\r
+ }\r
+}
\ No newline at end of file
+++ /dev/null
-/**\r
- * Copyright (C) 2007 EDIT\r
- * European Distributed Institute of Taxonomy \r
- * http://www.e-taxonomy.eu\r
- * \r
- * The contents of this file are subject to the Mozilla Public License Version 1.1\r
- * See LICENSE.TXT at the top of this package for the full license terms.\r
- */\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import java.lang.reflect.Method;\r
-import java.util.Set;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.swt.events.FocusAdapter;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
-import org.eclipse.swt.events.ModifyEvent;\r
-import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-\r
-import eu.etaxonomy.cdm.common.CdmUtils;\r
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.name.NameRelationship;\r
-import eu.etaxonomy.cdm.model.name.NonViralName;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.editor.GroupedComposite;\r
-import eu.etaxonomy.taxeditor.labels.ILabelImageStrategy;\r
-import eu.etaxonomy.taxeditor.labels.LabelImageProvider;\r
-import eu.etaxonomy.taxeditor.model.ImageResources;\r
-import eu.etaxonomy.taxeditor.model.NameHelper;\r
-import eu.etaxonomy.taxeditor.operations.CreateSynonymInNewGroupOperation;\r
-import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
-import eu.etaxonomy.taxeditor.preference.Resources;\r
-import eu.etaxonomy.taxeditor.store.StoreUtil;\r
-\r
-/**\r
- * Formats an <code>GroupedComposite</code> to display <code>TaxonNameBase</code> elements\r
- * in a <code>NameViewer</code>.\r
- * \r
- * @author p.ciardelli\r
- * @created 02.06.2008\r
- * @version 1.0\r
- */\r
-public abstract class AbstractNameComposite<T extends TaxonBase> extends GroupedComposite{\r
- private static final Logger logger = Logger\r
- .getLogger(AbstractNameComposite.class);\r
- /**\r
- * ************ COMPOSITE TYPES ************\r
- */\r
- public String compositeType;\r
- public static final String ACCEPTED_TAXON = "accepted_name_composite";\r
- public static final String HOMOTYPIC_SYNONYM = "homotypic_name_composite";\r
- public static final String HETEROTYPIC_SYNONYM = "heterotypic_name_composite";\r
- public static final String MISAPPLIED_NAME = "misappliedname_name_composite";\r
- public static final String CONCEPTRELATION = "concept_name_composite";\r
-\r
- /**\r
- * ************ INDENTATIONS ************\r
- */\r
- public static final int ACCEPTED_INDENT = 0;\r
- public static final int SYNONYM_INDENT = 15;\r
- public static final int MISAPPLIEDNAME_INDENT = 15;\r
- public static final int CONCEPT_INDENT = 15;\r
-\r
- /**\r
- * ************ FONTS ************\r
- */\r
-\r
- public Font getAcceptedFont(){\r
- Font font = StoreUtil.getFont(Resources.ACCEPTED_TAXON_FONT);\r
- return font;\r
- }\r
- \r
- public Font getSynonymFont(){\r
- Font font = StoreUtil.getFont(Resources.SYNONYM_FONT);\r
- return font;\r
- }\r
- \r
- public Font getMisapplicationFont(){\r
- Font font = StoreUtil.getFont(Resources.MISAPPLIEDNAME_FONT);\r
- return font;\r
- }\r
- \r
- public Font getConceptFont(){\r
- Font font = StoreUtil.getFont(Resources.CONCEPT_FONT);\r
- return font;\r
- }\r
- \r
- /**\r
- * ************ ICONS ************\r
- */\r
- public static final Image ACCEPTED_ICON = ImageResources\r
- .getImage(ImageResources.BLACK_SQUARE_ICON);\r
- public static final Image HOMOTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HOMOTYPIC_SYN_ICON);\r
- public static final Image HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
- ImageResources.HOMOTYPIC_SYN_ORIGINAL_ICON);\r
- public static final Image HETEROTYPIC_SYNONYM_ICON = ImageResources.getImage(ImageResources.HETEROTYPIC_SYN_ICON);\r
- public static final Image HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = ImageResources.getImage(\r
- ImageResources.HETEROTYPIC_SYN_ORIGINAL_ICON);\r
- public static final Image MISAPPLIEDNAME_ICON = ImageResources.getImage(ImageResources.MISAPPLIED_NAME_ICON);\r
- public static final Image CONCEPT_ICON = ImageResources.getImage(ImageResources.CONCEPT_ICON);\r
- public static final Image AUTONYM_ICON = ImageResources\r
- .getImage(ImageResources.AUTONYM_ICON);\r
- public static final Image MOVE = ImageResources.getImage(ImageResources.MOVE_ICON);\r
-\r
- /**\r
- * ************ TRANSFORMATIONS ************\r
- */\r
- public static final String ADD_GROUP_BASIONYM = "add_group_basionym";\r
- public static final String REMOVE_GROUP_BASIONYM = "remove_group_basionym";\r
-\r
- private static final String EMPTY_NAME_PROMPT = "Click to add name";\r
- \r
- protected ParseHandler parseHandler;\r
- \r
- protected T taxonBase;\r
- private FocusListener nameCompositeFocusListener;\r
- private ModifyListener nameCompositeModifyListener;\r
- final Color not_editable_color = new Color(Display.getDefault(), 105, 114, 124);\r
-\r
- /**\r
- * 1st column: Return value expected from the last method mentioned in the object path (3rd column et seq.) to enable the freetext.\r
- * 2nd column: The class the last method mentioned in the object path should be a member of. This should be null if there is no need to narrow this.\r
- * 3rd column et seq.: The sequence of method names reflects the object path to the desired method starting from a member of TaxonBase.\r
- */\r
- private Object[][] enableFreetextFor = {\r
- {"", null, "getName", "getAppendedPhrase"},\r
- {false, null, "getName", "isProtectedAuthorshipCache"},\r
- {false, null, "getName", "isProtectedNameCache"},\r
-// {false, "eu.etaxonomy.cdm.model.agent.Team", "getName", "getCombinationAuthorTeam", "isProtectedNomenclaturalTitleCache"}\r
- };\r
-\r
- /**\r
- * The constructor for a DescriptionElementComposite. Takes a parent Composite on which to\r
- * create itself, and an IManagedForm for Composite life cycle methods, i.e.\r
- * drawing borders, creating other Composites, creating line wrap support,\r
- * etc.\r
- * \r
- * @param parent\r
- * @param managedForm\r
- */\r
- public AbstractNameComposite(TaxonNameEditor editor, Composite parent, T taxonBase) {\r
- super(editor, parent);\r
- \r
- this.taxonBase = (T) HibernateProxyHelper.deproxy(taxonBase);\r
- \r
- setData(this.taxonBase);\r
- \r
- createTextViewer();\r
-// createBorderSupport();\r
- createLineWrapSupport();\r
- createLineBreakListener();\r
-\r
- this.setMenu(editor.getMenu());\r
- \r
- setDraggableControl(textViewer.getRulerControl());\r
- \r
- createEmptyViewerPrompt(EMPTY_NAME_PROMPT);\r
- \r
- parseHandler = ParseHandler.NewInstance(textViewer.getTextWidget(), taxonBase.getName());\r
- \r
- initializeComposite();\r
- \r
- createListener();\r
-\r
- isFreeTextEnabled();\r
- }\r
-\r
- protected void createListener(){\r
- nameCompositeModifyListener = new ModifyListener(){\r
- \r
- public void modifyText(ModifyEvent e) {\r
- // mark the composite dirty\r
- setDirty(true);\r
- // parse the text\r
- NonViralName name = parseHandler.parse();\r
- taxonBase.setName(name);\r
- taxonBase.setTitleCache((getTaxonBase().generateTitle()));\r
- \r
- // show errors resulting from parsing\r
- calculateErrors();\r
- // store the position of the cursor \r
- storeCursor();\r
- // notify selection listener\r
- setDelayedSelection();\r
- }\r
- };\r
- nameCompositeFocusListener = new FocusAdapter(){\r
-\r
- /* (non-Javadoc)\r
- * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)\r
- */\r
- @Override\r
- public void focusLost(FocusEvent e) {\r
- super.focusLost(e);\r
-\r
- persistName();\r
- } \r
- };\r
- \r
- addListener();\r
- }\r
- \r
- private void addListener(){\r
- textViewer.getTextWidget().addModifyListener(nameCompositeModifyListener);\r
- textViewer.getTextWidget().addFocusListener(nameCompositeFocusListener);\r
- }\r
- \r
- private void removeListener(){\r
- textViewer.getTextWidget().removeModifyListener(nameCompositeModifyListener);\r
- textViewer.getTextWidget().removeFocusListener(nameCompositeFocusListener);\r
- }\r
- \r
- /**\r
- * Initialize the composite specific code\r
- * \r
- */\r
- protected abstract void initializeComposite();\r
- \r
- protected String getEmptyTextPrompt() {\r
- return EMPTY_NAME_PROMPT;\r
- }\r
- \r
- /**\r
- * \r
- */\r
- private void showNameRelations() {\r
- TaxonNameBase<?, ?> name = getName();\r
- if (name == null) {\r
- return;\r
- }\r
- \r
- ILabelImageStrategy strategy = LabelImageProvider.getLabelStrategy(name);\r
- LabelImageProvider labelProvider = new LabelImageProvider(strategy);\r
- \r
- Set<NameRelationship> nameRelations = name.getNameRelations();\r
- if (nameRelations.size() == 0) {\r
- return;\r
- }\r
- for (NameRelationship nameRelation : nameRelations) {\r
- String typeLabel = null;\r
- TaxonNameBase<?, ?> relatedName = null; \r
-\r
- if (name.equals(nameRelation.getFromName())) {\r
- typeLabel = labelProvider.getNameRelationTypeLabel( \r
- nameRelation.getType());\r
- relatedName = nameRelation.getToName();\r
- } else {\r
- typeLabel = labelProvider.getNameRelationTypeInverseLabel( \r
- nameRelation.getType());\r
- relatedName = nameRelation.getFromName();\r
- }\r
- \r
-// setNonEditableInfo(typeLabel + " " + NameHelper.getDisplayName(relatedName));\r
- }\r
- }\r
- \r
- protected void initTextViewer(TaxonBase<?> taxonBase) {\r
- \r
- showNameRelations();\r
- \r
- String text = NameHelper.getDisplayNameWithRef(taxonBase);\r
- \r
- if (text.length() == 0) {\r
- initEmptyText();\r
- } else {\r
- textViewer.setText(text);\r
- placeCursor();\r
- }\r
- calculateErrors();\r
- }\r
- \r
- synchronized protected void calculateErrors() {\r
- textViewer.clearErrors();\r
- textViewer.setShowParsingErrors(getName());\r
- }\r
-\r
- protected void handleSplitText(String text) {\r
- // Create a synonym in a new homotypic group using text as name\r
- TaxonNameBase synonymName = ParseHandler.quickParse(text);\r
- \r
- EditorUtil.executeOperation(new CreateSynonymInNewGroupOperation\r
- ("New Heterotypic Synonym", editor.getUndoContext(), editor.getTaxon(), synonymName, editor));\r
- logger.debug("new heterotypic synonym created through entering of line break");\r
- }\r
-\r
- /**\r
- * Refreshes the display with latest data from the model.\r
- * \r
- * Note: Will not parse the text and not calculate errors! \r
- * \r
- */\r
- public void refresh() {\r
- showNameRelations();\r
- \r
- String text = NameHelper.getDisplayNameWithRef(getTaxonBase());\r
- \r
- if (text.length() == 0) {\r
- initEmptyText();\r
- } else {\r
- removeListener();\r
- textViewer.getTextWidget().setText(text);\r
- addListener();\r
- }\r
- \r
- updateNonEditableInfo();\r
- \r
-// placeCursor();\r
- \r
- isFreeTextEnabled();\r
- }\r
-\r
- protected abstract void updateNonEditableInfo();\r
- \r
- /**\r
- * \r
- */\r
- private void isFreeTextEnabled() {\r
- // Decide whether editing of freetext is allowed or not.\r
- if (freetextEditingAllowed()) {\r
- \r
- // set editable\r
- textViewer.getTextWidget().setEditable(true);\r
- \r
- // restore foreground font color again\r
- textViewer.getTextWidget().setForeground(getForeground());\r
- } else {\r
- // set non-editable\r
- textViewer.getTextWidget().setEditable(false);\r
- \r
- // grey out text as a non-editable indicator\r
- textViewer.getTextWidget().setForeground(not_editable_color);\r
- }\r
- }\r
-\r
- /**\r
- * Checks whether the freetext should be editable based on specific empty fields.\r
- * @return\r
- */\r
- private boolean freetextEditingAllowed() {\r
- boolean enableFreetext = true;\r
-\r
- enableFreetext &= taxonFieldsEmpty();\r
-\r
- return enableFreetext;\r
- }\r
-\r
- /**\r
- * Checks whether specific fields of specific type have specific values.\r
- * This generic implementation can easily go completely nuts if enableFreetextFor was filled wrong.\r
- * @return\r
- */\r
- private boolean taxonFieldsEmpty() {\r
- boolean enableFreetext = true;\r
-\r
- if (taxonBase != null) {\r
- for (Object[] methodSequence : enableFreetextFor) {\r
- int sequenceCount = 0;\r
- Object taxonObject = HibernateProxyHelper.deproxy(taxonBase);\r
- Object referenceType = null;\r
- boolean useReference = false;\r
- Class<? extends CdmBase> referenceInstance = null;\r
- for (Object method : methodSequence) {\r
- sequenceCount++;\r
-\r
- if (sequenceCount == 1) {\r
- referenceType = method;\r
- } else if (sequenceCount == 2) {\r
- try {\r
- if (method != null) {\r
- referenceInstance = (Class<? extends CdmBase>) Class.forName((String) method);\r
- useReference = true;\r
- } else {\r
- useReference = false;\r
- }\r
- } catch (ClassNotFoundException e) {\r
- logger.error("Class " + method + " could not be found: ", e);\r
- return false;\r
- }\r
- } else {\r
- Method getter = null;\r
- try {\r
- if (taxonObject != null) { // authorTeams can be null\r
- Class<? extends Object> clazz = taxonObject.getClass();\r
- boolean goOn = false;\r
- if (methodSequence.length == sequenceCount) {\r
- if (useReference) {\r
- if (referenceInstance.newInstance().isInstanceOf((Class<? extends CdmBase>) clazz)) {\r
- goOn = true;\r
- } else {\r
- goOn = false;\r
- }\r
- } else {\r
- goOn = true;\r
- }\r
- } else {\r
- goOn = true;\r
- }\r
- \r
- if (goOn) {\r
- getter = clazz.getMethod((String)method, (Class<?>[])null);\r
- taxonObject = HibernateProxyHelper.deproxy(getter.invoke(taxonObject, (Object[])null));\r
- if (methodSequence.length == sequenceCount) {\r
- enableFreetext &= isEqual(referenceType, taxonObject);\r
-// if (!enableFreetext) {\r
-// logger.error("Freetext disabled for: " + taxonBase);\r
-// }\r
- }\r
- }\r
- }\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- logger.error("Method " + method + " could not be called: " + e.getMessage());\r
- return false;\r
- }\r
- }\r
- }\r
- }\r
- } else {\r
- logger.warn("TaxonBase is null. This should not happen.");\r
- }\r
-\r
- return enableFreetext;\r
- }\r
-\r
- /**\r
- * Checks whether two objects are equal. Only works for cases of interest.\r
- * @param referenceType\r
- * @param object\r
- * @return\r
- */\r
- private boolean isEqual(Object referenceType, Object object) {\r
- boolean equal = false;\r
- if (referenceType instanceof Boolean) {\r
- if ((Boolean)referenceType.equals((Boolean)object)) {\r
- equal = true;\r
- } else {\r
- equal = false;\r
- }\r
- } else {\r
- // This can only be a String in our cases so far. Needs reimplementation in case this is not always the case.\r
- if (referenceType.equals(CdmUtils.Nz((String)object))) {\r
- equal = true;\r
- } else {\r
- equal = false;\r
- }\r
- }\r
- return equal;\r
- }\r
-\r
- /**\r
- * Parse the text and calculate errors\r
- * \r
- */\r
- public void parseAndCalculateErrors(){\r
- removeListener();\r
- parseHandler.parse();\r
- addListener();\r
- calculateErrors();\r
- }\r
-\r
- /**\r
- * @return the taxonBase\r
- */\r
- public T getTaxonBase() {\r
- return taxonBase;\r
- }\r
- \r
- public TaxonNameBase getName(){\r
- return getTaxonBase().getName();\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.editor.GroupedComposite#dispose()\r
- */\r
- @Override\r
- public void dispose() {\r
- super.dispose();\r
- //this.removeFocusListener(nameCompositeFocusListener);\r
- }\r
-\r
- public void persistName(){\r
- if(isDirty()){\r
- logger.warn("Found dirty composite: " + this + ". Name: " + textViewer.getTextWidget().getText());\r
- taxonBase.setName(parseHandler.parseAndResolveDuplicates());\r
- \r
- getTaxonBase().setTitleCache((getTaxonBase().generateTitle()));\r
-\r
- }\r
- }\r
-}
\ No newline at end of file
\r
import org.apache.log4j.Logger;\r
import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
\r
/**\r
* @author p.ciardelli\r
* @created 13.01.2009\r
* @version 1.0\r
*/\r
-public class AcceptedNameComposite extends AbstractNameComposite<Taxon> {\r
+public class AcceptedNameContainer extends AbstractGroupedContainer<Taxon> {\r
@SuppressWarnings("unused")\r
private static final Logger logger = Logger\r
- .getLogger(AcceptedNameComposite.class);\r
+ .getLogger(AcceptedNameContainer.class);\r
\r
- public AcceptedNameComposite(TaxonNameEditor editor, Composite groupComposite) {\r
- super(editor, groupComposite, editor.getTaxon());\r
+ public AcceptedNameContainer(TaxonNameEditor editor, AbstractGroup group) {\r
+ super(editor, group, editor.getTaxon());\r
}\r
\r
\r
public void initializeComposite(){\r
-// setIsDraggable(false);\r
setIcon(ACCEPTED_ICON);\r
setFont(getViewerFont());\r
setIndent(ACCEPTED_INDENT);\r
\r
- initTextViewer(getEditorTaxon());\r
+ initTextViewer();\r
}\r
\r
@Override\r
protected Font getViewerFont() {\r
- return getAcceptedFont();\r
+ return EditorUtil.getFont(Resources.ACCEPTED_TAXON_FONT);\r
}\r
\r
\r
+ \r
@Override\r
protected void updateNonEditableInfo() {\r
// not needed\r
\r
package eu.etaxonomy.taxeditor.editor.name;\r
\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
\r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
\r
/**\r
* @author p.ciardelli\r
* @created 26.01.2009\r
* @version 1.0\r
*/\r
-public class ConceptComposite extends AbstractNameComposite<Taxon> {\r
+public class ConceptContainer extends AbstractGroupedContainer<Taxon> {\r
\r
private TaxonRelationshipType relationshipType;\r
\r
\r
- private ConceptComposite(TaxonNameEditor editor, Composite parent,\r
+ private ConceptContainer(TaxonNameEditor editor, AbstractGroup group,\r
Taxon relatedTaxon, TaxonRelationshipType relationshipType, \r
boolean acceptedTaxonIsFromTaxon) {\r
- super(editor, parent, relatedTaxon);\r
+ super(editor, group, relatedTaxon);\r
\r
// FIXME the acceptedTaxonIsFromTaxon is never used and \r
// I can't remember what is was used for in the first place\r
\r
showSec();\r
\r
- initTextViewer(getTaxonBase());\r
+ initTextViewer();\r
}\r
\r
private void showRelationshipType() {\r
}\r
}\r
\r
- public static ConceptComposite getNewInstance(TaxonNameEditor editor, Composite parent, TaxonRelationship relationship){\r
+ public static ConceptContainer getNewInstance(TaxonNameEditor editor, AbstractGroup group, TaxonRelationship relationship){\r
\r
TaxonRelationshipType relationshipType = relationship.getType();\r
\r
if (relationship.getToTaxon().equals(editor.getTaxon())) {\r
- return new ConceptComposite (editor, parent, \r
+ return new ConceptContainer (editor, group, \r
relationship.getFromTaxon(), relationshipType, false);\r
} else {\r
- return new ConceptComposite (editor, parent, \r
+ return new ConceptContainer (editor, group, \r
relationship.getToTaxon(), relationshipType, true);\r
} \r
}\r
*/\r
@Override\r
protected Font getViewerFont() {\r
- return getConceptFont();\r
+ return EditorUtil.getFont(Resources.CONCEPT_FONT);\r
}\r
\r
public Taxon getRelatedTaxon() {\r
textViewer.setShowSecError(getTaxonBase());\r
}\r
\r
- public Object getData () {\r
- return getRelatedTaxon();\r
- }\r
- \r
- public boolean setParent(Composite parent) {\r
- boolean doSetParent = false;\r
- \r
- if (parent instanceof MisappliedGroupComposite) {\r
- IUndoableOperation operation = new ChangeConceptRelationshipTypeOperation("change to misapplication", \r
- editor.getUndoContext(), getEditorTaxon(), getTaxonBase(), TaxonRelationshipType.MISAPPLIED_NAME_FOR(), editor); //$NON-NLS-1$\r
- EditorUtil.executeOperation(operation);\r
- \r
- doSetParent = true;\r
- }\r
- \r
- if (parent instanceof HomotypicalGroupComposite) {\r
- HomotypicalGroup homotypicalGroup = \r
- ((HomotypicalGroupComposite)parent).getGroup();\r
- IUndoableOperation operation = new ChangeConceptToSynonymOperation\r
- ("change concept to synonym", editor.getUndoContext(), getEditorTaxon(), getTaxonBase(), homotypicalGroup, editor);\r
- EditorUtil.executeOperation(operation);\r
- \r
- doSetParent = true;\r
- }\r
- \r
- return doSetParent;\r
- }\r
-\r
@Override\r
protected void updateNonEditableInfo() {\r
showSec();\r
--- /dev/null
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 21.01.2009\r
+ * @version 1.0\r
+ */\r
+public class ConceptGroup extends AbstractGroup<Taxon> {\r
+\r
+ public ConceptGroup(TaxonNameEditor editor) {\r
+ super(editor);\r
+ }\r
+ \r
+ @Override\r
+ public void redraw() {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
+\r
+}\r
+++ /dev/null
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 21.01.2009\r
- * @version 1.0\r
- */\r
-public class ConceptGroupComposite extends GroupComposite {\r
-\r
- public ConceptGroupComposite(TaxonNameEditor editor, Composite parent) {\r
- super(editor,parent);\r
- }\r
-}\r
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class ContainerFactory {
+
+ private static final Logger logger = Logger.getLogger(ContainerFactory.class);
+
+ public static final int ACCEPTED = 1;
+ public static final int SYNONYM = 2;
+ public static final int MISAPPLICATION = 3;
+ public static final int CONCEPT = 4;
+
+ private static ContainerFactory instance = new ContainerFactory();
+
+ private ContainerFactory(){}
+
+ public static synchronized ContainerFactory getInstance(){
+ return instance;
+ }
+
+ public void createAcceptedTaxonsHomotypicGroup(TaxonNameEditor taxonNameEditor) {
+ Taxon taxon = taxonNameEditor.getTaxon();
+
+ // Draw homotypic group synonyms
+ HomotypicalGroup homotypicGroup = (HomotypicalGroup) HibernateProxyHelper.deproxy(taxon.getHomotypicGroup());
+ List<Synonym> homotypicSynonyms = homotypicGroup.getSynonymsInGroup(taxon.getSec());
+
+ HomotypicalSynonymGroup group = taxonNameEditor.getHomotypicSynonymGroup();
+
+ // check if the taxon has changed
+ if(group != null && ! taxon.getHomotypicGroup().equals(group.getGroup()) ){
+ group.removeAllContainers();
+ group.clear();
+ group = null;
+ }
+
+ // first run
+ if(group == null){
+ HomotypicalSynonymGroup homotypicalSynonymGroup = new HomotypicalSynonymGroup(taxonNameEditor, homotypicGroup);
+ taxonNameEditor.setHomotypicSynonymGroup(homotypicalSynonymGroup);
+ AcceptedNameContainer acceptedNameContainer = new AcceptedNameContainer(taxonNameEditor, homotypicalSynonymGroup);
+ taxonNameEditor.setAcceptedNameContainer(acceptedNameContainer);
+ for(Synonym synonym : homotypicSynonyms){
+ createContainerFactoryMethod(SYNONYM, homotypicalSynonymGroup, synonym);
+ }
+ }
+ // subsequent runs
+ else{
+ fillGroup(group, homotypicSynonyms, ACCEPTED);
+ }
+ }
+
+ public void createHeterotypicSynonymGroups(TaxonNameEditor taxonNameEditor) {
+ Taxon taxon = taxonNameEditor.getTaxon();
+
+ List<HomotypicalGroup> homotypicalGroups = taxon.getHeterotypicSynonymyGroups();
+
+ // reatins a reference to the homotypical group widgets
+ Map<HomotypicalGroup, HomotypicalSynonymGroup> retainedGroups = taxonNameEditor.getHeterotypicSynonymGroupsMap();
+
+ taxonNameEditor.clearHeterotypicSynonymGroups();
+
+ // iterate over taxas synonymy groups
+ for (HomotypicalGroup homotypicalGroup : homotypicalGroups) {
+ HomotypicalGroup homotypicalGroupDeproxied = (HomotypicalGroup) HibernateProxyHelper.deproxy(homotypicalGroup);
+
+ HomotypicalSynonymGroup group;
+ if(retainedGroups.containsKey(homotypicalGroupDeproxied)){
+ group = retainedGroups.get(homotypicalGroupDeproxied);
+ retainedGroups.remove(homotypicalGroupDeproxied);
+ }else{
+ group = new HomotypicalSynonymGroup(taxonNameEditor, homotypicalGroupDeproxied);
+ }
+
+ createHeterotypicSynonymGroup(taxonNameEditor, group);
+ taxonNameEditor.addHeterotypicSynonymGroup(group);
+ }
+
+ // remove all groups that did not match
+ for(AbstractGroup group : retainedGroups.values()){
+ group.clear();
+ }
+ }
+
+ public void createMisapplicationGroup(TaxonNameEditor taxonNameEditor) {
+ Taxon taxon = taxonNameEditor.getTaxon();
+
+ List<TaxonBase> content = new ArrayList<TaxonBase>(taxon.getMisappliedNames());
+
+ if(content.size() == 0 && taxonNameEditor.getMisappliedGroup() != null){
+ taxonNameEditor.getMisappliedGroup().clear();
+ taxonNameEditor.setMisapplicationsGroup(null);
+ }else{
+ AbstractGroup group = getMisappliedGroup(taxonNameEditor);
+ fillGroup(group, content, MISAPPLICATION);
+ }
+ }
+
+ public void createConceptGroup(TaxonNameEditor taxonNameEditor) {
+ Taxon taxon = taxonNameEditor.getTaxon();
+
+ Set<TaxonRelationship> filteredTaxonRelations = new HashSet<TaxonRelationship>();
+
+ for (TaxonRelationship relationship : taxon.getTaxonRelations()) {
+ if (! relationship.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR()) ||
+ relationship.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {
+ filteredTaxonRelations.add(relationship);
+ }
+ }
+
+ if(filteredTaxonRelations.size() == 0 && taxonNameEditor.getConceptGroup() != null){
+ taxonNameEditor.getConceptGroup().clear();
+ taxonNameEditor.setConceptGroup(null);
+ }else{
+ ConceptGroup group = getConceptGroup(taxonNameEditor);
+
+ // reatain old container
+ List<AbstractGroupedContainer<Taxon>> groupedContainers = group.getGroupedContainers();
+
+ group.removeAllContainers();
+
+ // Draw concept relation elements
+ for (TaxonRelationship relationship : filteredTaxonRelations) {
+ ConceptContainer.getNewInstance(group.getNameEditor(), group, relationship);
+ }
+ }
+ }
+
+
+ public void fillGroup(AbstractGroup group, List<? extends TaxonBase> content, int mode){
+ if(content == null || (mode != ACCEPTED && content.size() == 0)){
+ return;
+ }
+
+ AbstractGroupedContainer[] retainedContainers = (AbstractGroupedContainer[]) group.getGroupedContainers().toArray(new AbstractGroupedContainer[0]);
+
+ group.clearContainers();
+
+ if(retainedContainers.length > 0 && retainedContainers[0] instanceof AcceptedNameContainer){
+ group.add(retainedContainers[0]);
+ retainedContainers[0] = null;
+ }
+
+ for(TaxonBase taxonBase : content){
+ AbstractGroupedContainer existingContainer = null;
+ int i = 0;
+ for(AbstractGroupedContainer container : retainedContainers){
+ if(container != null && taxonBase.equals(container.getData())){
+ existingContainer = container;
+ retainedContainers[i] = null;
+ }
+ i++;
+ }
+ if(existingContainer != null){
+ group.add(existingContainer);
+ }else{
+ createContainerFactoryMethod(mode == ACCEPTED ? SYNONYM : mode, group, taxonBase);
+ }
+ }
+
+ // delete all container that were not used
+ for(AbstractGroupedContainer container : retainedContainers){
+ if(container != null){
+ group.deleteContainer(container);
+ }
+ }
+ }
+
+ public AbstractGroupedContainer createContainerFactoryMethod(int mode, AbstractGroup group, TaxonBase taxonBase){
+ switch(mode){
+ case ACCEPTED:
+ return new AcceptedNameContainer(group.getNameEditor(), group);
+ case SYNONYM:
+ return new SynonymContainer(group.getNameEditor(), group, (Synonym) taxonBase);
+ case MISAPPLICATION:
+ return new MisapplicationContainer(group.getNameEditor(), group, (Taxon) taxonBase);
+ case CONCEPT:
+ return null;
+ }
+ return null;
+ }
+
+ public void createHeterotypicSynonymGroup(TaxonNameEditor taxonNameEditor, HomotypicalSynonymGroup group) {
+ Taxon taxon = taxonNameEditor.getTaxon();
+
+ List<AbstractGroupedContainer<Synonym>> groupedContainers = group.getGroupedContainers();
+
+ List<Synonym> heterotypicSynonyms = group.getGroup().getSynonymsInGroup(taxon.getSec());
+
+ fillGroup(group, heterotypicSynonyms, SYNONYM);
+ }
+
+ /**********************************************************************************/
+
+
+
+
+ private MisappliedGroup getMisappliedGroup(TaxonNameEditor editor) {
+ if(editor.getMisappliedGroup() == null){
+ // Create the group composite
+ editor.setMisapplicationsGroup(new MisappliedGroup(editor));
+ }
+
+ MisappliedGroup misappliedGroup = editor.getMisappliedGroup();
+
+ // Put the group composite before concept group composite, if any
+ if (editor.getConceptGroup() != null) {
+ editor.getMisappliedGroup().getControl().moveAbove(editor.getConceptGroup().getControl());
+ }
+
+ return misappliedGroup;
+ }
+
+
+ private ConceptGroup getConceptGroup(TaxonNameEditor editor) {
+ if(editor.getConceptGroup() == null){
+ // Create the group composite
+ editor.setConceptGroup(new ConceptGroup(editor));
+ }
+
+ ConceptGroup conceptGroup = editor.getConceptGroup();
+
+ // Put the group composite after misapplied group composite, if any
+ if (editor.getMisappliedGroup() != null) {
+ editor.getConceptGroup().getControl().moveBelow(editor.getMisappliedGroup().getControl());
+ }
+
+ return conceptGroup;
+
+ }
+
+
+
+
+}
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.core.resources.IMarker;\r
+++ /dev/null
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 13.01.2009\r
- * @version 1.0\r
- */\r
-public class HomotypicalGroupComposite extends GroupComposite {\r
-\r
- private HomotypicalGroup group;\r
- \r
- public HomotypicalGroupComposite(TaxonNameEditor editor, Composite parent, HomotypicalGroup group) {\r
- \r
- super(editor, parent);\r
- \r
- this.group = group;\r
- }\r
- \r
- public HomotypicalGroup getGroup() {\r
- return group;\r
- }\r
-}\r
--- /dev/null
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.util.List;\r
+\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 13.01.2009\r
+ * @version 1.0\r
+ */\r
+public class HomotypicalSynonymGroup extends AbstractGroup {\r
+\r
+ private HomotypicalGroup group;\r
+ \r
+ public HomotypicalSynonymGroup(TaxonNameEditor editor, HomotypicalGroup group) {\r
+ super(editor);\r
+ this.group = group;\r
+ }\r
+ \r
+ public HomotypicalGroup getGroup() {\r
+ return group;\r
+ }\r
+\r
+ @Override\r
+ public void redraw() {\r
+ List<Synonym> synonyms = getGroup().getSynonymsInGroup(getNameEditor().getTaxon().getSec());\r
+ \r
+ ContainerFactory.getInstance().fillGroup(this, synonyms, ContainerFactory.SYNONYM);\r
+ }\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
+}\r
* See LICENSE.TXT at the top of this package for the full license terms.\r
*/\r
\r
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
\r
import java.util.ArrayList;\r
import java.util.Collection;\r
* See LICENSE.TXT at the top of this package for the full license terms.\r
*/\r
\r
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
\r
import org.eclipse.jface.text.source.Annotation;\r
import org.eclipse.jface.text.source.AnnotationPainter.SquigglesStrategy;\r
* See LICENSE.TXT at the top of this package for the full license terms.\r
*/\r
\r
-package eu.etaxonomy.taxeditor.editor;\r
+package eu.etaxonomy.taxeditor.editor.name;\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.jface.text.TextViewer;\r
\r
package eu.etaxonomy.taxeditor.editor.name;\r
\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
\r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
\r
/**\r
* @author p.ciardelli\r
* @created 13.01.2009\r
* @version 1.0\r
*/\r
-public class MisapplicationComposite extends AbstractNameComposite<Taxon> {\r
+public class MisapplicationContainer extends AbstractGroupedContainer<Taxon> {\r
\r
- public MisapplicationComposite(TaxonNameEditor editor, Composite parent, Taxon misappliedName) {\r
- super(editor, parent, misappliedName);\r
+ public MisapplicationContainer(TaxonNameEditor editor, AbstractGroup group, Taxon misappliedName) {\r
+ super(editor, group, misappliedName);\r
}\r
\r
\r
\r
showSec(); \r
\r
- initTextViewer(getMisappliedName());\r
+ initTextViewer();\r
}\r
\r
private void showSec() {\r
public Taxon getMisappliedName() {\r
return getTaxonBase();\r
}\r
- \r
- public boolean setParent(Composite parent) {\r
-\r
- boolean doSetParent = false; \r
-\r
- // Has this been moved to a HomotypicalGroup?\r
- if (parent instanceof HomotypicalGroupComposite) {\r
- \r
- HomotypicalGroup homotypicalGroup = \r
- ((HomotypicalGroupComposite)parent).getGroup();\r
- \r
- IUndoableOperation operation = new ChangeConceptToSynonymOperation\r
- ("change misapplication to synonym", editor.getUndoContext(), getEditorTaxon(), getMisappliedName(), homotypicalGroup, editor);\r
- EditorUtil.executeOperation(operation);\r
- \r
- doSetParent = true;\r
- }\r
- return doSetParent;\r
- }\r
\r
@Override\r
protected Font getViewerFont() {\r
- return getMisapplicationFont();\r
+ return EditorUtil.getFont(Resources.MISAPPLIEDNAME_FONT);\r
}\r
\r
protected void calculateErrors() {\r
textViewer.setShowSecError(getMisappliedName());\r
}\r
\r
- public Object getData () {\r
- return getMisappliedName();\r
- }\r
-\r
\r
@Override\r
protected void updateNonEditableInfo() {\r
--- /dev/null
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 13.01.2009\r
+ * @version 1.0\r
+ */\r
+public class MisappliedGroup extends AbstractGroup<Taxon> {\r
+\r
+ public MisappliedGroup(TaxonNameEditor editor) {\r
+ super(editor);\r
+ }\r
+\r
+ @Override\r
+ public void redraw() {\r
+ List<Taxon> misapplications = new ArrayList<Taxon>(editor.getTaxon().getMisappliedNames());\r
+ ContainerFactory.getInstance().fillGroup(this, misapplications, ContainerFactory.MISAPPLICATION);\r
+ }\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
+}\r
+++ /dev/null
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 13.01.2009\r
- * @version 1.0\r
- */\r
-public class MisappliedGroupComposite extends GroupComposite {\r
-\r
- public MisappliedGroupComposite(TaxonNameEditor editor, Composite parent) {\r
- super(editor, parent);\r
- }\r
-\r
-}\r
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.apache.log4j.Logger;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDragListener extends DragSourceAdapter {
+
+ private static final Logger logger = Logger.getLogger(NameEditorDragListener.class);
+
+ private AbstractGroupedContainer container;
+
+ public NameEditorDragListener(AbstractGroupedContainer container){
+ this.container = container;
+ }
+
+ public void dragFinished(DragSourceEvent event) {
+ if(!event.doit)
+ return;
+ if(event.detail == DND.DROP_MOVE){
+ logger.warn("drag finished");
+ container.remove();
+ }
+
+ };
+
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+ ICdmBase[] cdmBaseObjects = new ICdmBase[]{(ICdmBase) container.getData()};
+ if(CdmDataTransfer.getInstance().isSupportedType(event.dataType)){
+ event.data = cdmBaseObjects;
+ }
+ }
+
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ event.doit = container.getData() != null;
+ }
+}
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.eclipse.swt.dnd.DragSourceEffect;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDragSourceEffect extends DragSourceEffect {
+
+ public NameEditorDragSourceEffect(Control control) {
+ super(control);
+ }
+
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ // TODO Auto-generated method stub
+ super.dragStart(event);
+ }
+
+ @Override
+ public void dragFinished(DragSourceEvent event) {
+ // TODO Auto-generated method stub
+ super.dragFinished(event);
+ }
+
+}
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.eclipse.swt.dnd.DropTargetEffect;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.widgets.Control;
+
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;
+import eu.etaxonomy.taxeditor.preference.Resources;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDropTargetEffect extends DropTargetEffect {
+
+ public NameEditorDropTargetEffect(Control control) {
+ super(control);
+ }
+
+ public void dragEnter(DropTargetEvent dropTargetEvent) {
+
+
+
+ if(dropTargetEvent.widget instanceof IDropTargetable){
+ ((IDropTargetable) dropTargetEvent.widget).dragEntered();
+ }
+
+// if(! EditorUtil.getActiveMultiPageTaxonEditor().equals(editor.getMultiPageTaxonEditor())){
+// editor.getMultiPageTaxonEditor().setFocus();
+// }
+ }
+
+ public void dragLeave(DropTargetEvent dropTargetEvent) {
+
+
+
+ if(dropTargetEvent.widget instanceof Control){
+ ((Control) dropTargetEvent.widget).setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
+ }
+ }
+
+}
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.editor.name;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.operations.IUndoableOperation;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeHomotypicGroupOperation;
+import eu.etaxonomy.taxeditor.operations.ChangeSynonymToMisapplicationOperation;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class NameEditorDropTargetListener extends DropTargetAdapter {
+
+ private static final Logger logger = Logger.getLogger(NameEditorDropTargetListener.class);
+
+ private TaxonNameEditor editor;
+
+ private IDropTargetable target;
+
+ public NameEditorDropTargetListener(IDropTargetable target){
+ this.target = target;
+ editor = target.getNameEditor();
+ }
+
+ public void dragEnter(DropTargetEvent dropTargetEvent) {
+ target.dragEntered();
+
+// if(! EditorUtil.getActiveMultiPageTaxonEditor().equals(editor.getMultiPageTaxonEditor())){
+// editor.getMultiPageTaxonEditor().setFocus();
+// }
+ }
+
+ public void dragLeave(DropTargetEvent dropTargetEvent) {
+ target.dragLeft();
+ }
+
+ public void drop(DropTargetEvent event) {
+
+ TaxonBase taxonBase = getDroppedTaxonBase(event);
+
+ if (taxonBase != null) {
+ // Execute operations at end of drag event
+ AbstractPostOperation operation = createOperation(taxonBase);
+
+
+ // Execute operation if it has been initiated
+ if (operation == null) {
+ logger.warn("User unsuccessfully tried to drop: " + taxonBase.getClass());
+ } else {
+ EditorUtil.executeOperation(operation);
+ }
+ }
+ }
+
+ private AbstractPostOperation createOperation(TaxonBase taxonBase) {
+
+
+ if(taxonBase instanceof Synonym){
+ Synonym synonym = (Synonym) taxonBase;
+
+ if(target instanceof HomotypicalSynonymGroup){
+ HomotypicalGroup homotypicalGroup = ((HomotypicalSynonymGroup) target).getGroup();
+
+ return new ChangeHomotypicGroupOperation("Change Homotypical Group", editor.getUndoContext(),
+ editor.getTaxon(), synonym, homotypicalGroup, target);
+ }
+ else if(target instanceof MisappliedGroup){
+ return new ChangeSynonymToMisapplicationOperation("Change Synonym to Misapplication", editor.getUndoContext(),
+ editor.getTaxon(), synonym, target);
+ }
+ else if(target instanceof TaxonNameEditor){
+ return new ChangeHomotypicGroupOperation("Change Homotypical Group", editor.getUndoContext(),
+ editor.getTaxon(), synonym, null, target);
+ }
+
+ }else if(taxonBase instanceof Taxon){
+ Taxon concept = (Taxon) taxonBase;
+
+ if(target instanceof HomotypicalSynonymGroup){
+ HomotypicalGroup homotypicalGroup = ((HomotypicalSynonymGroup) target).getGroup();
+
+ return new ChangeConceptToSynonymOperation("Change to Synonym", editor.getUndoContext(),
+ editor.getTaxon(), concept, homotypicalGroup, target);
+ }
+ else if(target instanceof MisappliedGroup ){
+ return new ChangeConceptRelationshipTypeOperation("Change", editor.getUndoContext(),
+ editor.getTaxon(), concept, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), target);
+ }
+ }
+
+
+ return null;
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ // pass
+ }
+
+ private HomotypicalGroup getHomotypicalGroup() {
+ if(target instanceof HomotypicalSynonymGroup){
+ return ((HomotypicalSynonymGroup) target).getGroup();
+ }
+ return null;
+ }
+
+ private TaxonBase getDroppedTaxonBase(DropTargetEvent dropTargetEvent){
+ if(dropTargetEvent.data instanceof ICdmBase[]){
+
+ ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
+
+ if(cdmBaseObjects[0] instanceof TaxonBase){
+ return (TaxonBase) cdmBaseObjects[0];
+ }
+ }
+ return null;
+ }
+}
import org.eclipse.swt.SWT;\r
import org.eclipse.swt.graphics.Color;\r
import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Canvas;\r
import org.eclipse.swt.widgets.Composite;\r
import org.eclipse.swt.widgets.Control;\r
import org.eclipse.swt.widgets.Display;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.strategy.parser.ParserProblem;\r
-import eu.etaxonomy.taxeditor.editor.EditorAnnotation;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.editor.LineWrapSquigglesStrategy;\r
import eu.etaxonomy.taxeditor.editor.ViewerConfiguration;\r
import eu.etaxonomy.taxeditor.preference.Resources;\r
\r
\r
setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
\r
+ Canvas canvas = (Canvas) getControl();\r
+ TableWrapLayout layout = (TableWrapLayout) canvas.getLayout();\r
+ layout.topMargin = 0;\r
+ layout.rightMargin = 0;\r
+ layout.bottomMargin = 0;\r
+ layout.leftMargin = 0;\r
+ layout.verticalSpacing = 10;\r
+ layout.horizontalSpacing = 0;\r
+ \r
+ canvas.setLayout(layout);\r
+ \r
// Lay out the viewer's widgets\r
- getControl().setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
TableWrapData twdata = new TableWrapData(TableWrapData.FILL_GRAB);\r
+ getControl().setLayoutData(twdata);\r
+ \r
+ twdata = new TableWrapData(TableWrapData.FILL_GRAB);\r
getTextWidget().setLayoutData(twdata);\r
getTextWidget().setLineSpacing(5);\r
\r
}\r
\r
public void setBackground(Color color) {\r
+ \r
// Set background color of ruler\r
ruler.getControl().setBackground(color);\r
\r
+++ /dev/null
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.taxeditor.editor.name;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
-import org.eclipse.swt.graphics.Font;\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
-import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.operations.ChangeHomotypicGroupOperation;\r
-import eu.etaxonomy.taxeditor.operations.ChangeSynonymToMisapplicationOperation;\r
-\r
-/**\r
- * @author p.ciardelli\r
- * @created 13.01.2009\r
- * @version 1.0\r
- */\r
-public class SynonymComposite extends AbstractNameComposite<Synonym> {\r
- @SuppressWarnings("unused")\r
- private static final Logger logger = Logger\r
- .getLogger(SynonymComposite.class);\r
- \r
- public SynonymComposite(TaxonNameEditor editor, Composite parent, Synonym synonym) {\r
- super(editor, parent, synonym);\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.editor.name.NameComposite#initializeComposite()\r
- */\r
- @Override\r
- protected void initializeComposite() {\r
- setIsDraggable(true);\r
- setFont(getViewerFont());\r
- setIndent(SYNONYM_INDENT);\r
- \r
- TaxonNameBase name = getSynonym().getName();\r
- \r
- if(name == null){\r
- logger.error("Synonym with a null name detected. This should never happen.");\r
- }\r
- \r
- if (isHomotypic()) {\r
- if (name.isGroupsBasionym()) {\r
- setIcon(HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
- } else {\r
- setIcon(HOMOTYPIC_SYNONYM_ICON);\r
- } \r
- } else {\r
- if (name.isGroupsBasionym()) {\r
- setIcon(HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
- } else {\r
- setIcon(HETEROTYPIC_SYNONYM_ICON);\r
- }\r
- }\r
- \r
- initTextViewer(getSynonym());\r
- }\r
- \r
- private boolean isHomotypic() {\r
- HomotypicalGroup group = getSynonym().getHomotypicGroup();\r
- return group.equals(getEditorTaxon().getHomotypicGroup()); \r
- }\r
- \r
- public Synonym getSynonym() {\r
- return getTaxonBase();\r
- }\r
-\r
- public boolean setParent(Composite parent) {\r
-\r
- boolean doSetParent = false; \r
- \r
- // Has this been moved to the misapplied names group?\r
- if (parent instanceof MisappliedGroupComposite) {\r
- IUndoableOperation operation = new ChangeSynonymToMisapplicationOperation\r
- ("change to misapplication", editor.getUndoContext(), getEditorTaxon(), getSynonym(), editor); //$NON-NLS-1$\r
- EditorUtil.executeOperation(operation);\r
- \r
- doSetParent = true;\r
- }\r
-\r
- // Has this been moved to a HomotypicalGroup?\r
- if (parent instanceof HomotypicalGroupComposite) {\r
- \r
- HomotypicalGroup homotypicalGroup = \r
- ((HomotypicalGroupComposite)parent).getGroup();\r
- \r
- // Make sure we are not dropping synonym on its own group\r
- if (!homotypicalGroup.equals(getSynonym().getHomotypicGroup())) {\r
- IUndoableOperation operation = new ChangeHomotypicGroupOperation\r
- ("change type", editor.getUndoContext(), getEditorTaxon(), getSynonym(), homotypicalGroup, editor); //$NON-NLS-1$\r
- EditorUtil.executeOperation(operation);\r
- \r
- doSetParent = true;\r
- }\r
- }\r
- return doSetParent;\r
- }\r
- \r
-\r
- protected Font getViewerFont() {\r
- return getSynonymFont();\r
- }\r
- \r
- public Object getData () {\r
- return getSynonym();\r
- }\r
-\r
- @Override\r
- protected void updateNonEditableInfo() {\r
- // not needed\r
- }\r
-}
\ No newline at end of file
--- /dev/null
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.taxeditor.editor.name;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.swt.graphics.Font;\r
+\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ * @created 13.01.2009\r
+ * @version 1.0\r
+ */\r
+public class SynonymContainer extends AbstractGroupedContainer<Synonym> {\r
+ @SuppressWarnings("unused")\r
+ private static final Logger logger = Logger\r
+ .getLogger(SynonymContainer.class);\r
+ \r
+ public SynonymContainer(TaxonNameEditor editor, AbstractGroup group, Synonym synonym) {\r
+ super(editor, group, synonym);\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.editor.name.NameComposite#initializeComposite()\r
+ */\r
+ @Override\r
+ protected void initializeComposite() {\r
+ setIsDraggable(true);\r
+ setFont(getViewerFont());\r
+ setIndent(SYNONYM_INDENT);\r
+ \r
+ TaxonNameBase name = getSynonym().getName();\r
+ \r
+ if(name == null){\r
+ logger.error("Synonym with a null name detected. This should never happen.");\r
+ }\r
+ \r
+ if (isHomotypic()) {\r
+ if (name.isGroupsBasionym()) {\r
+ setIcon(HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
+ } else {\r
+ setIcon(HOMOTYPIC_SYNONYM_ICON);\r
+ } \r
+ } else {\r
+ if (name.isGroupsBasionym()) {\r
+ setIcon(HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON);\r
+ } else {\r
+ setIcon(HETEROTYPIC_SYNONYM_ICON);\r
+ }\r
+ }\r
+ \r
+ initTextViewer();\r
+ }\r
+ \r
+ private boolean isHomotypic() {\r
+ HomotypicalGroup group = getSynonym().getHomotypicGroup();\r
+ return group.equals(editor.getTaxon().getHomotypicGroup()); \r
+ }\r
+ \r
+ public Synonym getSynonym() {\r
+ return getTaxonBase();\r
+ }\r
+ \r
+\r
+ protected Font getViewerFont() {\r
+ return EditorUtil.getFont(Resources.SYNONYM_FONT);\r
+ }\r
+\r
+ @Override\r
+ protected void updateNonEditableInfo() {\r
+ // not needed\r
+ }\r
+}
\ No newline at end of file
\r
import org.apache.log4j.Logger;\r
import org.eclipse.core.commands.operations.IUndoContext;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
-import org.eclipse.core.runtime.Assert;\r
import org.eclipse.core.runtime.IAdaptable;\r
import org.eclipse.core.runtime.IProgressMonitor;\r
import org.eclipse.core.runtime.OperationCanceledException;\r
import org.eclipse.jface.viewers.StructuredSelection;\r
import org.eclipse.swt.dnd.DND;\r
import org.eclipse.swt.dnd.DropTarget;\r
-import org.eclipse.swt.dnd.DropTargetAdapter;\r
-import org.eclipse.swt.dnd.DropTargetEvent;\r
import org.eclipse.swt.dnd.Transfer;\r
import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
import org.eclipse.swt.widgets.Menu;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorSite;\r
import org.eclipse.ui.ISelectionListener;\r
import org.eclipse.ui.ISelectionService;\r
import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.IWorkbenchPartReference;\r
import org.eclipse.ui.PartInitException;\r
import org.eclipse.ui.forms.ManagedForm;\r
import org.eclipse.ui.forms.widgets.FormToolkit;\r
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;\r
import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;\r
-import eu.etaxonomy.taxeditor.editor.CompositeBorderDecorator;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
-import eu.etaxonomy.taxeditor.editor.GroupComposite;\r
-import eu.etaxonomy.taxeditor.editor.GroupedComposite;\r
+import eu.etaxonomy.taxeditor.editor.IDropTargetable;\r
import eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage;\r
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;\r
import eu.etaxonomy.taxeditor.editor.SimpleSelectionProvider;\r
+import eu.etaxonomy.taxeditor.model.IPartChangeListener;\r
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;\r
-import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;\r
-import eu.etaxonomy.taxeditor.operations.ChangeHomotypicGroupOperation;\r
+import eu.etaxonomy.taxeditor.model.TaxeditorPartService;\r
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
import eu.etaxonomy.taxeditor.preference.Resources;\r
\r
* @version 1.0\r
* @author n.hoffmann\r
*/\r
-public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditorPage, IAdaptable, IConversationEnabled, IPostOperationEnabled, IPartContentHasDetails\r
- , ISelectionListener {\r
+public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditorPage, IAdaptable, IConversationEnabled, IPostOperationEnabled, IPartContentHasDetails, IPartChangeListener\r
+ , ISelectionListener, IDropTargetable {\r
\r
private static final Logger logger = Logger.getLogger(TaxonNameEditor.class);\r
\r
+ public class Tupel{\r
+ \r
+ public HomotypicalGroup homotypicalGroup;\r
+ public HomotypicalSynonymGroup group;\r
+\r
+ public Tupel(HomotypicalGroup homotypicalGroup, HomotypicalSynonymGroup group){\r
+ this.homotypicalGroup = homotypicalGroup;\r
+ this.group = group;\r
+ }\r
+ \r
+ }\r
+ \r
+ public static final String ID = "eu.etaxonomy.taxeditor.taxonNameEditor";\r
+ \r
private Taxon taxon;\r
\r
- protected ManagedForm managedForm;\r
- protected ScrolledForm scrolledForm; \r
- protected Composite parent;\r
- protected IPostSelectionProvider provider;\r
+ private ManagedForm managedForm;\r
+ private ScrolledForm scrolledForm; \r
+ private Composite parent;\r
+ private IPostSelectionProvider provider;\r
\r
- protected MultiPageTaxonEditor editor;\r
+ private MultiPageTaxonEditor editor;\r
\r
- protected GroupedComposite selectedObject;\r
-\r
- protected Composite partComposite;\r
- protected GroupedComposite firstGroupedComposite;\r
-\r
- private Object selectedData;\r
+ private AbstractGroupedContainer selectedObject;\r
+ \r
+ private AcceptedNameContainer acceptedNameContainer;\r
\r
- protected ConversationHolder conversation;\r
+ private ConversationHolder conversation;\r
\r
private MenuManager menuManager;\r
\r
private Menu menu;\r
-\r
- /**\r
- * The object that was affected by last operation.\r
- */\r
- private CdmBase objectAffectedByLastOperation;\r
-\r
- private boolean isRedrawing;\r
\r
- private static final String ID = "eu.etaxonomy.taxeditor.taxonNameEditor";\r
-\r
- private Map<HomotypicalGroup, HomotypicalGroupComposite> homotypicGroupComposites;\r
+ private List<Tupel> heterotypicSynonymGroupTupel = new ArrayList<Tupel>();\r
\r
- private MisappliedGroupComposite misappliedGroupComposite;\r
+ private MisappliedGroup misappliedGroup;\r
\r
- private ConceptGroupComposite conceptGroupComposite;\r
+ private ConceptGroup conceptGroup;\r
\r
+ \r
private DropTarget target;\r
\r
private ISelectionService selectionService;\r
+\r
+ private ContainerFactory containerFactory;\r
+\r
+ private HomotypicalSynonymGroup homotypicalSynonymGroup;\r
+\r
+ private AbstractGroupedContainer objectAffectedByLastOperation;\r
\r
public TaxonNameEditor(MultiPageTaxonEditor editor){\r
this.editor = editor;\r
conversation = editor.getConversationHolder();\r
+ \r
+ containerFactory = ContainerFactory.getInstance();\r
}\r
\r
- public IUndoContext getUndoContext() {\r
- return editor.getUndoContext();\r
- }\r
\r
- protected void setSelection(TaxonBase taxonBase){\r
- Set<AbstractNameComposite<TaxonBase>> nameComposites = getNameComposites();\r
- \r
- if(nameComposites == null){\r
- return;\r
- }\r
- \r
- for(AbstractNameComposite nameComposite : nameComposites){\r
- if(nameComposite.getTaxonBase().equals(taxonBase)){\r
- setSelection(nameComposite);\r
- }\r
- }\r
- }\r
\r
- /**\r
- * \r
- * \r
- * @param composite\r
- */\r
- protected void setSelection(GroupedComposite composite) {\r
- \r
- // Unpaint last selection - last selection will only be unpainted\r
- // when something else on this page is selected\r
- if (this.selectedObject instanceof GroupedComposite) {\r
- GroupedComposite groupedComposite = ((GroupedComposite) this.selectedObject);\r
- groupedComposite.unpaintBorder();\r
- groupedComposite.setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
- }\r
- \r
- // Set the selection to this editor's selected object\r
- this.selectedObject = composite;\r
- \r
- if (composite instanceof Composite) {\r
- ((GroupedComposite) composite).setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_SELECTED));\r
- this.selectedData = ((Composite) composite).getData();\r
- }\r
- \r
- // set selection only if it was not set before \r
- if(composite != selectedObject){\r
- selectedObject.setFocus();\r
- }\r
- provider.setSelection(new StructuredSelection(selectedObject.getData()));\r
- \r
+ public IUndoContext getUndoContext() {\r
+ return editor.getUndoContext();\r
}\r
\r
-\r
/* (non-Javadoc)\r
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)\r
*/\r
selectionService = getSite().getWorkbenchWindow().getSelectionService();\r
selectionService.addSelectionListener(this);\r
\r
- this.partComposite = composite;\r
- \r
createManagedForm(composite);\r
+ \r
+ TaxeditorPartService.getInstance().addListener(TaxeditorPartService.PART_ACTIVATED, this);\r
}\r
\r
protected void createManagedForm(Composite composite) {\r
firePropertyChange(PROP_DIRTY);\r
}\r
public boolean setInput(Object input) {\r
- if (input instanceof GroupedComposite) {\r
- setSelection((GroupedComposite)input);\r
+ if (input instanceof AbstractGroupedContainer) {\r
+ selectedObject = (AbstractGroupedContainer) input;\r
+ provider.setSelection(new StructuredSelection(selectedObject.getData()));\r
}\r
return super.setInput(input); \r
}\r
};\r
\r
+ \r
scrolledForm = managedForm.getForm();\r
parent = scrolledForm.getBody();\r
\r
menuManager = new MenuManager();\r
ISelectionProvider selectionProvider = getSite().getSelectionProvider();\r
getSite().registerContextMenu(TaxonNameEditor.ID, menuManager, selectionProvider);\r
- \r
- menu = menuManager.createContextMenu(parent);\r
- scrolledForm.setMenu(menu);\r
\r
parent.setData(taxon);\r
\r
- parent.setLayout(new TableWrapLayout()); \r
- parent.setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
+ TableWrapLayout layout = new TableWrapLayout();\r
+ layout.leftMargin = 0;\r
+ layout.rightMargin = 0;\r
+ layout.topMargin = 0;\r
+ layout.bottomMargin = 0;\r
\r
- Taxon taxon = (Taxon) HibernateProxyHelper.deproxy(getTaxon());\r
+ layout.verticalSpacing = 0;\r
+ layout.horizontalSpacing = 0;\r
\r
- firstGroupedComposite = createAcceptedTaxon();\r
- \r
- // Draw homotypic group synonyms\r
- HomotypicalGroup homotypicGroupOfAcceptedTaxon = (HomotypicalGroup) HibernateProxyHelper.deproxy(taxon.getHomotypicGroup());\r
- \r
- if (homotypicGroupOfAcceptedTaxon != null) {\r
- List<Synonym> homotypicSynonyms = homotypicGroupOfAcceptedTaxon.getSynonymsInGroup(taxon.getSec());\r
- for (Synonym synonym : homotypicSynonyms) {\r
- createSynonym(synonym);\r
- }\r
- }\r
+ parent.setLayout(layout); \r
+ parent.setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
\r
- // Draw heterotypic synonym groups\r
- List<HomotypicalGroup> heterotypicSynonymGroups = taxon.getHeterotypicSynonymyGroups();\r
- for (HomotypicalGroup homotypicalGroup : heterotypicSynonymGroups) {\r
- \r
- List<Synonym> heterotypicSynonyms = homotypicalGroup.\r
- getSynonymsInGroup(taxon.getSec());\r
- for (Synonym synonym : heterotypicSynonyms) {\r
- createSynonym(synonym);\r
- }\r
- }\r
+ createNameComposites();\r
\r
- // Draw misapplied name elements\r
- for(Taxon misappliedName : taxon.getMisappliedNames()){\r
- createMisappliedName(misappliedName);\r
- } \r
-\r
- // Draw concept relation elements\r
- Set<TaxonRelationship> taxonRelations = taxon.getTaxonRelations();\r
- for (TaxonRelationship relationship : taxonRelations) {\r
- \r
- if (relationship.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR()) ||\r
- relationship.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {\r
- continue;\r
- }\r
- \r
- createConcept(relationship);\r
- } \r
- \r
createDragSupport();\r
\r
setFocus();\r
-\r
- // Redraw composite\r
- composite.layout();\r
}\r
\r
+ protected void createNameComposites(){\r
+ containerFactory.createAcceptedTaxonsHomotypicGroup(this);\r
+ \r
+ containerFactory.createHeterotypicSynonymGroups(this);\r
+ \r
+ containerFactory.createMisapplicationGroup(this);\r
+ \r
+ containerFactory.createConceptGroup(this);\r
+ \r
+ for(AbstractGroupedContainer container : getGroupedContainers()){\r
+ container.setMenu(getMenu());\r
+ }\r
+ // Redraw composite\r
+ managedForm.reflow(true);\r
+ }\r
+\r
public Taxon getTaxon() {\r
- return taxon;\r
+ return (Taxon) HibernateProxyHelper.deproxy(taxon);\r
}\r
\r
public void setDirty() {\r
*/\r
@Override\r
public void setFocus(){\r
-// logger.warn("Setting focus to name editor.");\r
- Object selection;\r
- \r
- if(selectedData == null){\r
- selection = (objectAffectedByLastOperation == null) ? null : objectAffectedByLastOperation;\r
- }else{\r
- selection = (objectAffectedByLastOperation == null) ? selectedData : objectAffectedByLastOperation;\r
- } \r
- \r
- // make selection by setting focus to the previosuly selected composite or to the accepted \r
- // taxons composite if nothing was selected before\r
- if (selection == null){\r
- firstGroupedComposite.setFocus();\r
- } else {\r
- selectedData = selection;\r
- \r
- for (GroupedComposite composite : getGroupedComposites()) {\r
- if (selectedData.equals(composite.getData())) {\r
- ((GroupedComposite) composite).setFocus();\r
- break;\r
- } \r
- }\r
- }\r
- \r
- // reset\r
- objectAffectedByLastOperation = null;\r
- }\r
- \r
- /**\r
- * This method returns all <code>GroupedComposite</code> controls currently attached to this editor.\r
- * \r
- * @return a <code>List</code> of <code>GroupedComposite</code> controls.\r
- */\r
- public List<GroupedComposite> getGroupedComposites(){\r
- return getGroupedCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupedComposite>());\r
- }\r
-\r
- \r
- /**\r
- * Recursively traverse the composite hierarchy and collect all <code>GroupedComposite</code> controls.\r
- * \r
- * @param composite the composite to start recursing from\r
- * @param groupedComposites a <code>List</code> the found composites are stored in \r
- * @return a <code>List</code> containing all found <code>GroupedComposite</code> controls\r
- */\r
- private List<GroupedComposite> getGroupedCompositesRecursively(Composite composite, List<GroupedComposite> groupedComposites){\r
- if(composite == null || composite.isDisposed()){\r
- return null;\r
- }\r
- \r
- for(Control child : composite.getChildren()){\r
- if(child instanceof GroupedComposite){\r
- groupedComposites.add((GroupedComposite) child);\r
- }else if(child instanceof Composite){\r
- getGroupedCompositesRecursively((Composite) child, groupedComposites);\r
- }\r
- }\r
- return groupedComposites;\r
- }\r
- \r
- /**\r
- * @return\r
- */\r
- public List<GroupComposite> getGroupComposites() {\r
- return getGroupCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupComposite>());\r
- }\r
- \r
- /**\r
- * Recursively traverse the composite hierarchy and collect all <code>GroupComposite</code> controls.\r
- * \r
- * @param composite the composite to start recursing from\r
- * @param groupComposites a <code>List</code> the found composites are stored in \r
- * @return a <code>List</code> containing all found <code>GroupComposite</code> controls\r
- */\r
- private List<GroupComposite> getGroupCompositesRecursively(Composite composite, List<GroupComposite> groupComposites){\r
- for(Control child : composite.getChildren()){\r
- if(child instanceof GroupComposite){\r
- groupComposites.add((GroupComposite) child);\r
- getGroupCompositesRecursively((Composite) child, groupComposites);\r
- }\r
- }\r
- return groupComposites;\r
+ getSelectedObject().setSelected();\r
}\r
\r
public void setInput(IEditorInput input){\r
*/\r
public boolean redraw(boolean focus) {\r
\r
- isRedrawing = true;\r
- \r
- this.selectedObject = null;\r
- managedForm.getForm().dispose();\r
- this.resetGroupComposites();\r
- createManagedForm(partComposite);\r
- \r
- setFocus();\r
- \r
- isRedrawing = false;\r
- \r
- return true;\r
+ createNameComposites();\r
+\r
+ if(focus){\r
+ setFocus();\r
+ }\r
\r
+ return true; \r
}\r
\r
- public boolean isRedrawing() {\r
- return isRedrawing;\r
+ private AbstractGroupedContainer getContainerForData(CdmBase data) {\r
+ if(data == null && (selectedObject != null && ! selectedObject.getControl().isDisposed())){\r
+ return selectedObject;\r
+ }\r
+ \r
+ List<AbstractGroupedContainer> groupedContainers = getGroupedContainers();\r
+ for(AbstractGroupedContainer container : groupedContainers){\r
+ if(container.getData().equals(data)){\r
+ return container;\r
+ }\r
+ }\r
+ return acceptedNameContainer;\r
}\r
\r
public MultiPageTaxonEditor getMultiPageTaxonEditor() {\r
*/\r
public boolean postOperation(CdmBase objectAffectedByOperation) {\r
\r
- if (isRedrawing) {\r
- return false;\r
- }\r
- \r
- if (objectAffectedByOperation == null && selectedData instanceof CdmBase) {\r
- this.objectAffectedByLastOperation = (CdmBase) selectedData; \r
- } else {\r
- this.objectAffectedByLastOperation = objectAffectedByOperation;\r
- }\r
editor.changed(objectAffectedByOperation);\r
- return redraw(); \r
+ \r
+ redraw(false);\r
+ \r
+ objectAffectedByLastOperation = getContainerForData(objectAffectedByOperation);\r
+ \r
+ return true;\r
}\r
\r
\r
+ private CdmBase getSelectedData() {\r
+ if(selectedObject != null){\r
+ return selectedObject.getData();\r
+ }\r
+ return null;\r
+ }\r
+\r
/**\r
* @return the managedForm\r
*/\r
return managedForm;\r
}\r
\r
- public Composite getTopLevelComposite() {\r
+ public Composite getControl() {\r
return this.getManagedForm().getForm().getBody();\r
}\r
\r
* @return the menu\r
*/\r
public Menu getMenu() {\r
- return menu;\r
- }\r
-\r
- /**\r
- * @return the firstGroupedComposite\r
- */\r
- public GroupedComposite getFirstGroupedComposite() {\r
- return firstGroupedComposite;\r
- }\r
- \r
- /**\r
- * \r
- */\r
- public void navigateToNextMember() {\r
- try{\r
- List<GroupedComposite> composites = getGroupedCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupedComposite>());\r
- \r
- for(int i = 0; i < composites.size(); i++){\r
- if(selectedData == composites.get(i).getData()){\r
- selectedData = composites.get(i+1).getData();\r
- break;\r
- }\r
+ if(menu == null || menu.isDisposed()){\r
+ if(menu != null && menu.isDisposed()){\r
+ logger.error("Creating new Menu because it was disposed. This should not have happened");\r
}\r
- setFocus();\r
- }catch(IndexOutOfBoundsException e){}\r
- }\r
- \r
- /**\r
- * \r
- */\r
- public void navigateToPreviousMember() {\r
- try{\r
- List<GroupedComposite> composites = getGroupedCompositesRecursively(scrolledForm.getBody(), new ArrayList<GroupedComposite>());\r
- \r
- for(int i = 0; i < composites.size(); i++){\r
- if(selectedData == composites.get(i).getData()){\r
- selectedData = composites.get(i-1).getData();\r
- break;\r
- }\r
- }\r
- setFocus();\r
- }catch(IndexOutOfBoundsException e){}\r
+ menu = menuManager.createContextMenu(parent);\r
+ }\r
+ return menu;\r
}\r
\r
/**\r
* @return true if there are empty names\r
*/\r
public boolean checkForEmptyNames() {\r
- for(AbstractNameComposite nameComposite : getNameComposites()){\r
- if(nameComposite.getName() == null || nameComposite.getName().getTitleCache().equals("")){\r
+ for(AbstractGroupedContainer container : getGroupedContainers()){\r
+ if(container.getName() == null || container.getName().getTitleCache().equals("")){\r
MessageDialog.openWarning(EditorUtil.getShell(), "No Name Specified", "An attempt was made to save a taxon or synonym with " +\r
"an empty name. Operation was cancelled.");\r
return true;\r
@Override\r
public void doSave(IProgressMonitor monitor) {\r
\r
- // Start the main progress monitor. The number of steps is set to the number of objects to be saved.\r
- IProgressMonitor newMonitor = EditorUtil.startMainMonitor(monitor,"Saving", getNameComposites().size());\r
+ monitor.beginTask("Saving names", getGroupedContainers().size());\r
\r
try {\r
// check for empty names\r
- for(AbstractNameComposite nameComposite : getNameComposites()){\r
-// newMonitor.subTask("- step X");\r
- nameComposite.persistName();\r
+ for(AbstractGroupedContainer container : getGroupedContainers()){\r
+ \r
+ monitor.subTask("Saving composite: " + container.getTaxonBase().getTitleCache());\r
+ container.persistName();\r
\r
// In case the progress monitor was canceled throw an exception.\r
- if (newMonitor.isCanceled()) {\r
+ if (monitor.isCanceled()) {\r
throw new OperationCanceledException();\r
}\r
\r
// Otherwise declare this step as done.\r
- newMonitor.worked(1);\r
+ monitor.worked(1);\r
}\r
}\r
finally {\r
\r
// Stop the progress monitor.\r
- newMonitor.done();\r
+ monitor.done();\r
}\r
\r
}\r
// Listen for names being dragged outside of existing homotypic groups -\r
// user wants to create a new group\r
Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()};\r
- int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
+ int operations = DND.DROP_MOVE;\r
if(target == null){\r
target = new DropTarget(parent, operations);\r
target.setTransfer(types);\r
- target.addDropListener(new NameEditorDropTargetListener());\r
+ target.addDropListener(new NameEditorDropTargetListener(this));\r
} \r
}\r
\r
- public AcceptedNameComposite getAcceptedName() {\r
- if(firstGroupedComposite instanceof AcceptedNameComposite){\r
- return (AcceptedNameComposite) firstGroupedComposite;\r
- }\r
- throw new RuntimeException("The accepted name should always reside in firstGroupedComposite");\r
+ public AcceptedNameContainer getAcceptedNameContainer() {\r
+ return acceptedNameContainer;\r
}\r
-\r
- /**\r
- * @return\r
- */\r
- private Map<HomotypicalGroup, HomotypicalGroupComposite> getHomotypicGroups() {\r
- if(homotypicGroupComposites == null){\r
- homotypicGroupComposites = new HashMap<HomotypicalGroup, HomotypicalGroupComposite>();\r
- }\r
- return homotypicGroupComposites;\r
- }\r
- \r
- public HomotypicalGroupComposite getHomotypicGroup(HomotypicalGroup group) {\r
- return getHomotypicGroups().get(group);\r
- }\r
-\r
\r
- public Composite getMisappliedGroup() {\r
- if (misappliedGroupComposite == null) {\r
- misappliedGroupComposite = createMisappliedGroup();\r
+ public HomotypicalSynonymGroup getSynonymGroup(HomotypicalGroup homotypicalGroup) {\r
+ if(getHomotypicSynonymGroup() != null && getHomotypicSynonymGroup().getGroup().equals(homotypicalGroup)){\r
+ return getHomotypicSynonymGroup();\r
}\r
- return misappliedGroupComposite;\r
- }\r
-\r
- \r
- public Composite getMisappliedName(Taxon misappliedName) {\r
- for(Control child : getMisappliedGroup().getChildren()){\r
- if(child instanceof MisapplicationComposite){\r
- return (MisapplicationComposite) child;\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- \r
- public Composite getSynonym(Synonym synonym) {\r
- \r
- GroupComposite groupComposite = getHomotypicGroup(synonym.getHomotypicGroup());\r
\r
- for (Control child : groupComposite.getChildren()){\r
- if(child instanceof SynonymComposite \r
- && synonym.equals(((SynonymComposite) child).getSynonym())){\r
- return (SynonymComposite) child;\r
+ for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+ if(tupel.homotypicalGroup.equals(homotypicalGroup)){\r
+ return tupel.group;\r
}\r
}\r
\r
return null;\r
}\r
-\r
- \r
- public Composite getConceptGroup() {\r
- if (conceptGroupComposite == null) {\r
- conceptGroupComposite = createConceptGroup();\r
- }\r
- return conceptGroupComposite;\r
- }\r
-\r
\r
- public Composite getConcept(Taxon relatedConcept) {\r
- for (Control child : getConceptGroup().getChildren()){\r
- if(child instanceof ConceptComposite \r
- && relatedConcept.equals \r
- (((ConceptComposite) child).getRelatedTaxon())){\r
- return (ConceptComposite) child;\r
- }\r
- }\r
-\r
- return null;\r
+ public ConceptGroup getConceptGroup() {\r
+ return conceptGroup;\r
}\r
\r
/**\r
* @return a Set containing all composites that have been edited\r
*/\r
- public Set<AbstractNameComposite<TaxonBase>> getDirtyNames(){\r
- Set<AbstractNameComposite<TaxonBase>> dirtyNames = new HashSet<AbstractNameComposite<TaxonBase>>();\r
+ public Set<AbstractGroupedContainer> getDirtyNames(){\r
+ Set<AbstractGroupedContainer> dirtyNames = new HashSet<AbstractGroupedContainer>();\r
\r
- for(AbstractNameComposite composite : getNameComposites()){\r
+ for(AbstractGroupedContainer composite : getGroupedContainers()){\r
if(composite.isDirty()){\r
dirtyNames.add(composite);\r
}\r
return dirtyNames;\r
}\r
\r
- public Set<AbstractNameComposite<TaxonBase>> getNameComposites(){\r
- Set<AbstractNameComposite<TaxonBase>> nameComposites = new HashSet<AbstractNameComposite<TaxonBase>>();\r
- \r
- List<GroupedComposite> groupedComposites = getGroupedComposites();\r
+ public List<AbstractGroupedContainer> getGroupedContainers(){\r
+ List<AbstractGroupedContainer> groupedComposites = new ArrayList<AbstractGroupedContainer>();\r
\r
- if(groupedComposites == null){\r
- return null;\r
+ for(AbstractGroup group : getAllGroups()){\r
+ groupedComposites.addAll(group.getGroupedContainers());\r
}\r
\r
- for(GroupedComposite composite : groupedComposites){\r
- if(composite instanceof AbstractNameComposite){\r
- nameComposites.add((AbstractNameComposite) composite);\r
- }\r
- }\r
- \r
- return nameComposites;\r
- }\r
- \r
- /***********************************************************************/\r
- \r
- private GroupedComposite createAcceptedTaxon() {\r
- // Create a homotypic group composite for the accepted taxon\r
- HomotypicalGroup group = (HomotypicalGroup) HibernateProxyHelper.deproxy(getTaxon().getHomotypicGroup());\r
- Assert.isNotNull(group, "Taxon does not have a homotypic group");\r
- \r
- createHomotypicalGroup(group);\r
- \r
- // Create a name composite for the accepted taxon\r
- return new AcceptedNameComposite(this, getHomotypicGroup(group));\r
+ return groupedComposites;\r
}\r
\r
- private HomotypicalGroupComposite createHomotypicalGroup(HomotypicalGroup group) {\r
-\r
- // Create the group composite\r
- HomotypicalGroupComposite groupComposite = new HomotypicalGroupComposite(this, getTopLevelComposite(), group);\r
- \r
- groupComposite.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);\r
- getManagedForm().getToolkit().paintBordersFor(groupComposite.getParent());\r
+ public List<AbstractGroup> getAllGroups(){\r
+ List<AbstractGroup> allGroups = new ArrayList<AbstractGroup>();\r
\r
- getHomotypicGroups().put(group, groupComposite);\r
+ allGroups.add(getHomotypicSynonymGroup());\r
\r
- return groupComposite;\r
- }\r
-\r
-\r
- private Composite createSynonym(Synonym synonym) { \r
- // Get the synonym's homotypical group\r
- HomotypicalGroup group = (HomotypicalGroup) HibernateProxyHelper.deproxy(synonym.getHomotypicGroup());\r
- Assert.isNotNull(group, "Synonym does not have a homotypic group");\r
- \r
- // If the group doesn't yet have a composite, create one and add it to the repository\r
- HomotypicalGroupComposite groupComposite = getHomotypicGroup(group);\r
- if (groupComposite == null) {\r
- groupComposite = createHomotypicalGroup(group);\r
- }\r
+ allGroups.addAll(getHeterotypicSynonymGroups());\r
\r
- // Create a synonym composite in the homotypical group\r
- Composite synonymComposite = new SynonymComposite(this, groupComposite, synonym);\r
- \r
- return synonymComposite;\r
- }\r
- \r
- public Composite createMisappliedName(Taxon misappliedName) {\r
- \r
- // If there is no composite for misapplied names, \r
- // create one and add it to the repository\r
- Composite groupComposite = getMisappliedGroup();\r
- \r
- // Create the name's composite\r
- Composite composite = new MisapplicationComposite(this, groupComposite, misappliedName);\r
- \r
- return composite;\r
- }\r
- \r
- \r
- public MisappliedGroupComposite createMisappliedGroup() {\r
- // Create the group composite\r
- misappliedGroupComposite = new MisappliedGroupComposite(this, this.getTopLevelComposite());\r
- misappliedGroupComposite.addFocusListener(new CompositeBorderDecorator(misappliedGroupComposite, this.getManagedForm()));\r
- \r
- // Put the group composite before concept group composite, if any\r
- if (conceptGroupComposite != null) {\r
- misappliedGroupComposite.moveAbove(conceptGroupComposite);\r
+ if(misappliedGroup != null){\r
+ allGroups.add(misappliedGroup);\r
}\r
\r
- return misappliedGroupComposite;\r
- }\r
- \r
- \r
- public Composite createConcept(TaxonRelationship relationship) { \r
- // If there is no composite for misapplied names, \r
- // create one and add it to the repository\r
- Composite groupComposite = this.getConceptGroup();\r
- \r
- // Create the name's composite\r
- Composite composite = ConceptComposite.getNewInstance(this, groupComposite, relationship);\r
- \r
- return composite;\r
- }\r
-\r
- \r
- public ConceptGroupComposite createConceptGroup() {\r
- // Create the group composite\r
- conceptGroupComposite = new ConceptGroupComposite(this, this.getTopLevelComposite());\r
- conceptGroupComposite.addFocusListener(new CompositeBorderDecorator(conceptGroupComposite, this.getManagedForm()));\r
- \r
- // Put the group composite after misapplied group composite, if any\r
- if (misappliedGroupComposite != null) {\r
- conceptGroupComposite.moveBelow(misappliedGroupComposite);\r
+ if(conceptGroup != null){\r
+ allGroups.add(conceptGroup);\r
}\r
\r
- return conceptGroupComposite;\r
-\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.taxeditor.editor.AbstractTaxonEditor#resetGroupComposites()\r
- */\r
- protected void resetGroupComposites() {\r
- conceptGroupComposite = null;\r
- misappliedGroupComposite = null;\r
- homotypicGroupComposites = null;\r
- target = null;\r
+ return allGroups;\r
}\r
\r
/* (non-Javadoc)\r
*/\r
@Override\r
public boolean isDirty() {\r
- return false;\r
+ return editor.isDirty();\r
}\r
\r
/* (non-Javadoc)\r
return false;\r
}\r
\r
- private class NameEditorDropTargetListener extends DropTargetAdapter{\r
- private GroupedComposite composite;\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)\r
+ */\r
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
+ \r
+ }\r
\r
- public void drop(DropTargetEvent event) {\r
- Assert.isTrue(event.data instanceof CdmBase);\r
- \r
- composite = (GroupedComposite) getNameComposite(event.data);\r
- if (composite != null && composite.getDragSource() != null) {\r
- // Execute operations at end of drag event\r
- composite.getDragSource().addListener(DND.DragEnd, new DragListener());\r
- }\r
- } \r
+ public void removeContainer(AbstractGroupedContainer container) {\r
+ container.remove();\r
+ }\r
+\r
+ public void addCompositeForTaxonBase(TaxonBase taxonBase, IDropTargetable target) {\r
\r
- private class DragListener implements Listener{\r
- public void handleEvent(Event event) {\r
- IUndoableOperation operation = null;\r
- \r
- // Synonym being dropped\r
- if(composite instanceof SynonymComposite){\r
- Synonym synonym = ((SynonymComposite)composite).getSynonym();\r
- operation = new ChangeHomotypicGroupOperation\r
- ("change type", getUndoContext(), \r
- getTaxon(), synonym, HomotypicalGroup.NewInstance(), TaxonNameEditor.this);\r
- }\r
- \r
- // Misapplied name being dropped\r
- if(composite instanceof MisapplicationComposite){\r
- Taxon misapplication = ((MisapplicationComposite)composite).getMisappliedName();\r
- operation = new ChangeConceptToSynonymOperation\r
- ("change misapplied name to synonym", getUndoContext(), \r
- getTaxon(), misapplication, HomotypicalGroup.NewInstance(), TaxonNameEditor.this); \r
- }\r
- \r
- // Execute operation if it has been initiated\r
- if (operation == null) {\r
- logger.warn("User unsuccessfully tried to drop " + composite.getClass());\r
- } else {\r
- EditorUtil.executeOperation(operation);\r
- }\r
- }\r
+// if(target instanceof AbstractGroup){\r
+// ((AbstractGroup) target).redraw();\r
+// }else if(target instanceof TaxonNameEditor){\r
+// if(taxonBase instanceof Synonym){\r
+// Synonym synonym = (Synonym) taxonBase;\r
+// HomotypicalSynonymGroup group = new HomotypicalSynonymGroup(this, synonym.getHomotypicGroup());\r
+// ContainerFactory.getInstance().createHeterotypicSynonymGroup(this, group);\r
+// }\r
+// }\r
+ \r
+// if(taxonBase instanceof Synonym && target instanceof HomotypicalSynonymGroup){\r
+// new SynonymContainer(this, (HomotypicalSynonymGroup) target, (Synonym) taxonBase);\r
+// }else if(taxonBase instanceof Synonym && target instanceof TaxonNameEditor){\r
+// Synonym synonym = (Synonym) taxonBase;\r
+// HomotypicalSynonymGroup group = new HomotypicalSynonymGroup(this, synonym.getHomotypicGroup());\r
+// \r
+// new SynonymContainer(this, group, (Synonym) taxonBase);\r
+// }\r
+ \r
+ \r
+ \r
+// else if(target instanceof MisappliedGroup){\r
+// Taxon taxon = (Taxon) taxonBase;\r
+// \r
+// if (taxon.isMisapplication()){\r
+// containerFactory.createMisapplication(this, taxon);\r
+// }else if(! taxon.equals(this.taxon)){\r
+// throw new RuntimeException("Unsupported operands");\r
+// }\r
+// }\r
+ }\r
+\r
+ public TaxonNameEditor getNameEditor() {\r
+ return this;\r
+ }\r
+\r
+ public AbstractGroupedContainer getSelectedObject(){\r
+ if(selectedObject == null){\r
+ return acceptedNameContainer;\r
+ }else{\r
+ return selectedObject;\r
}\r
}\r
+ \r
+ public void dragEntered() {\r
+ // TODO change this\r
+ getControl().setBackground(EditorUtil.getColor(Resources.COLOR_DRAG_ENTER));\r
+ }\r
+\r
+ public void dragLeft() {\r
+ getControl().setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));\r
+ }\r
+\r
+ public void setConceptGroup(ConceptGroup conceptGroup) {\r
+ this.conceptGroup = conceptGroup;\r
+ }\r
+\r
+ public void setMisapplicationsGroup(MisappliedGroup misappliedGroup) {\r
+ this.misappliedGroup = misappliedGroup;\r
+ }\r
\r
/*\r
* (non-Javadoc)\r
- * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)\r
+ * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#isRedrawing()\r
*/\r
- public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
- \r
+ public boolean isRedrawing() {\r
+ return false;\r
}\r
\r
- public AbstractNameComposite getSelectedNameComposite(){\r
- if(selectedObject instanceof AbstractNameComposite)\r
- return (AbstractNameComposite) selectedObject;\r
- return null;\r
+ public FormToolkit getToolkit() {\r
+ return managedForm.getToolkit();\r
+ }\r
+\r
+ public List<HomotypicalSynonymGroup> getHeterotypicSynonymGroups(){\r
+ List<HomotypicalSynonymGroup> list = new ArrayList<HomotypicalSynonymGroup>(heterotypicSynonymGroupTupel.size());\r
+ \r
+ for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+ list.add(tupel.group);\r
+ }\r
+ \r
+ return list;\r
}\r
\r
- public AbstractNameComposite getNameComposite(Object data){\r
- if(data instanceof TaxonBase){\r
- for (AbstractNameComposite composite : getNameComposites()){\r
- if(composite.getData() == data){\r
- return composite;\r
- }\r
- }\r
+ public Map<HomotypicalGroup, HomotypicalSynonymGroup> getHeterotypicSynonymGroupsMap(){\r
+ Map<HomotypicalGroup, HomotypicalSynonymGroup> map = new HashMap<HomotypicalGroup, HomotypicalSynonymGroup>(heterotypicSynonymGroupTupel.size());\r
+ \r
+ for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+ map.put(tupel.homotypicalGroup, tupel.group);\r
}\r
- return null;\r
+ \r
+ return map;\r
}\r
\r
- public TaxonBase getSelectedData() {\r
- if(selectedData instanceof TaxonBase){\r
- return (TaxonBase) selectedData;\r
- }else{\r
- logger.error("Selected data is not an instance of TaxonBase, but: " + selectedData.getClass().getName());\r
+ public void clearHeterotypicSynonymGroups(){\r
+ heterotypicSynonymGroupTupel.clear();\r
+ }\r
+\r
+ public void addHeterotypicSynonymGroup(HomotypicalSynonymGroup group) {\r
+ heterotypicSynonymGroupTupel.add(new Tupel(group.getGroup(), group));\r
+ }\r
+ \r
+ public void removeHeterotypicSynonymGroup(HomotypicalGroup group) {\r
+ Tupel shouldBeRemoved = null;\r
+ for(Tupel tupel : heterotypicSynonymGroupTupel){\r
+ if(tupel.group.equals(group)){\r
+ shouldBeRemoved = tupel;\r
+ break;\r
+ } \r
+ }\r
+ \r
+ if(shouldBeRemoved != null){\r
+ heterotypicSynonymGroupTupel.remove(shouldBeRemoved);\r
}\r
- return null;\r
}\r
+\r
+\r
+\r
+ public HomotypicalSynonymGroup getHomotypicSynonymGroup() {\r
+ return homotypicalSynonymGroup;\r
+ }\r
+\r
+\r
+\r
+ public void setHomotypicSynonymGroup(\r
+ HomotypicalSynonymGroup homotypicalSynonymGroup) {\r
+ this.homotypicalSynonymGroup = homotypicalSynonymGroup;\r
+ }\r
+\r
+ public void setAcceptedNameContainer(\r
+ AcceptedNameContainer acceptedNameContainer) {\r
+ this.acceptedNameContainer = acceptedNameContainer; \r
+ }\r
+\r
+ public MisappliedGroup getMisappliedGroup() {\r
+ return misappliedGroup;\r
+ }\r
+\r
+ // TODO not very useful at the moment\r
+ public boolean isActive(){\r
+ \r
+ \r
+ IWorkbenchPart activePart = EditorUtil.getActivePart();\r
+ return editor.equals(activePart);\r
+ }\r
+\r
+ public boolean onComplete() {\r
+ objectAffectedByLastOperation.setSelected();\r
+ return true;\r
+ }\r
+\r
+\r
+\r
+ public void partChanged(Integer eventType, IWorkbenchPartReference partRef) {\r
+ if(! partRef.getPart(false).equals(editor)){\r
+ getSelectedObject().colorSelected(AbstractGroupedContainer.SELECTED_NO_FOCUS);\r
+ }\r
+ }\r
+\r
}
\ No newline at end of file
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.IHandler;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
+import org.eclipse.swt.widgets.Display;\r
import org.eclipse.ui.PartInitException;\r
import org.eclipse.ui.handlers.HandlerUtil;\r
\r
List<UUID> excludeTaxa = new ArrayList<UUID>();\r
excludeTaxa.add(oldAcceptedTaxonNode.getUuid());\r
TaxonNode newAcceptedTaxonNode = FilteredTaxonNodeSelectionDialog.selectTaxonNode(HandlerUtil.getActiveShell(event), "Choose the accepted taxon", excludeTaxa, null);\r
- \r
- newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();\r
- \r
+\r
if (newAcceptedTaxonNode == null) {\r
return null;\r
}\r
\r
+ newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();\r
+ \r
try {\r
operation = new ChangeAcceptedTaxonToSynonymOperation(event.getCommand().getName(), \r
editor.getUndoContext(), oldAcceptedTaxonNode, newAcceptedTaxonNode, this, editor);\r
* @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)\r
*/\r
public boolean postOperation(CdmBase objectAffectedByOperation) {\r
- EditorUtil.close(editor.getMultiPageTaxonEditor());\r
- \r
- try {\r
- MultiPageTaxonEditor possibleOpenEditor = (MultiPageTaxonEditor) EditorUtil.findEditorByTaxonNodeUuid(newAcceptedTaxonNodeUuid);\r
- if(possibleOpenEditor != null){\r
- EditorUtil.close(possibleOpenEditor);\r
+ Display.getDefault().asyncExec(new Runnable(){\r
+\r
+ public void run() {\r
+ EditorUtil.close(editor.getMultiPageTaxonEditor());\r
+ \r
+ try {\r
+ MultiPageTaxonEditor possibleOpenEditor = (MultiPageTaxonEditor) EditorUtil.findEditorByTaxonNodeUuid(newAcceptedTaxonNodeUuid);\r
+ if(possibleOpenEditor != null){\r
+ EditorUtil.close(possibleOpenEditor);\r
+ }\r
+ EditorUtil.openTaxonNode(newAcceptedTaxonNodeUuid);\r
+ } catch (PartInitException e) {\r
+ logger.error(e);\r
+ throw new RuntimeException(e);\r
+ }\r
}\r
- EditorUtil.openTaxonNode(newAcceptedTaxonNodeUuid);\r
- } catch (PartInitException e) {\r
- logger.error(e);\r
- throw new RuntimeException(e);\r
- }\r
+ \r
+ });\r
+ \r
\r
return true;\r
+ }\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
} \r
}
\ No newline at end of file
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Event;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
/**
TaxonRelationshipType type = (TaxonRelationshipType) ((Event)event.getTrigger()).data;
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
operation = new ChangeConceptRelationshipTypeOperation(event.getCommand().getName(),
editor.getUndoContext(), editor.getTaxon(), selectedElement, type, editor);
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.ChangeSynonymToAcceptedTaxonOperation;
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
// apply confirmation dialog
// FIXME with this implementation we can not create a taxonNode that is a direct child of the classification node
- IUndoableOperation operation = new ChangeSynonymToAcceptedTaxonOperation("Change synonym to accepted taxon", EditorUtil.getUndoContext(),
+ AbstractPostOperation operation = new ChangeSynonymToAcceptedTaxonOperation("Change synonym to accepted taxon", EditorUtil.getUndoContext(),
taxon, newParentNode, synonym, null, this, editor); //$NON-NLS-1$
EditorUtil.executeOperation(operation);
}
* CdmStore.getTaxonService().getTaxonNodeByUuid(taxonNodeUuid);
* doesn't work yet.
*/
- IEditorPart newEditor = EditorUtil.openTaxonNode(newNode.getUuid());
+ EditorUtil.openTaxonNode(newNode.getUuid());
} catch (PartInitException e) {
// TODO Auto-generated catch block
}
return true;
}
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.swt.widgets.Event;
import eu.etaxonomy.cdm.model.taxon.Synonym;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
import eu.etaxonomy.taxeditor.operations.ChangeSynonymToConceptOperation;
TaxonRelationshipType type = (TaxonRelationshipType) ((Event)event.getTrigger()).data;
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
if(taxonBase instanceof Synonym){
Synonym synonym = (Synonym) taxonBase;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import eu.etaxonomy.cdm.model.taxon.Synonym;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.ChangeConceptRelationshipTypeOperation;
import eu.etaxonomy.taxeditor.operations.ChangeSynonymToMisapplicationOperation;
Object selectedElement = EditorUtil.getSelection(event).getFirstElement();
- IUndoableOperation operation = null;
+ AbstractPostOperation operation = null;
try {
if(selectedElement instanceof Taxon){
operation = new ChangeConceptRelationshipTypeOperation(event.getCommand().getName(),
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.ChangeConceptToSynonymOperation;
/**
Taxon concept = (Taxon) EditorUtil.getSelection(event).getFirstElement();
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
operation = new ChangeConceptToSynonymOperation(event.getCommand().getName(),
editor.getUndoContext(), editor.getTaxon(), concept, null, editor);
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.swt.widgets.Event;
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.CreateConceptRelationOperation;
import eu.etaxonomy.taxeditor.parser.ParseHandler;
TaxonRelationshipType type = (TaxonRelationshipType) ((Event)event.getTrigger()).data;
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
operation = new CreateConceptRelationOperation(event.getCommand().getName(),
editor.getUndoContext(), editor.getTaxon(), concept, type, editor);
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.IHandler;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.Page;\r
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.CreateSynonymInNewGroupOperation;\r
import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
\r
\r
TaxonNameBase newSynonymName = ParseHandler.createEmptyName();\r
\r
- IUndoableOperation operation;\r
+ AbstractPostOperation operation;\r
try {\r
operation = new CreateSynonymInNewGroupOperation(event.getCommand().getName(), \r
editor.getUndoContext(), editor.getTaxon(), newSynonymName, editor);\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.IHandler;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
\r
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.Page;\r
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.CreateSynonymInExistingHomotypicalGroupOperation;\r
import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
-import eu.etaxonomy.taxeditor.parser.ParseHandler;\r
\r
/**\r
* @author n.hoffmann\r
HomotypicalGroup group = taxon.getHomotypicGroup();\r
TaxonNameBase newSynonymName = ParseHandler.createEmptyName();\r
\r
- IUndoableOperation operation;\r
+ AbstractPostOperation operation;\r
try {\r
operation = new CreateSynonymInExistingHomotypicalGroupOperation(event.getCommand().getName(), \r
editor.getUndoContext(), taxon, group, newSynonymName, editor);\r
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.CreateConceptRelationOperation;
import eu.etaxonomy.taxeditor.parser.ParseHandler;
TaxonRelationshipType type = TaxonRelationshipType.MISAPPLIED_NAME_FOR();
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
operation = new CreateConceptRelationOperation(event.getCommand().getName(),
editor.getUndoContext(), editor.getTaxon(), concept, type, editor);
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.cdm.model.taxon.Synonym;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
-import eu.etaxonomy.taxeditor.editor.name.SynonymComposite;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.CreateSynonymInExistingHomotypicalGroupOperation;
import eu.etaxonomy.taxeditor.parser.ParseHandler;
TaxonNameBase newSynonymName = ParseHandler.createEmptyName();
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
operation = new CreateSynonymInExistingHomotypicalGroupOperation(event.getCommand().getName(), editor.getUndoContext(),
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.IHandler;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
\r
import eu.etaxonomy.cdm.model.taxon.Synonym;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.Page;\r
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
+import eu.etaxonomy.taxeditor.operations.DeleteConceptRelationOperation;\r
import eu.etaxonomy.taxeditor.operations.DeleteMisapplicationOperation;\r
import eu.etaxonomy.taxeditor.operations.DeleteSynonymOperation;\r
\r
\r
Object selectedElement = EditorUtil.getSelection(event).getFirstElement();\r
\r
- IUndoableOperation operation = null;\r
+ AbstractPostOperation operation = null;\r
String commandName = null;\r
\r
\r
if(selectedElement instanceof Synonym){\r
operation = new DeleteSynonymOperation(commandName, editor.getUndoContext(), editor.getTaxon(), (Synonym) selectedElement, editor);\r
}\r
- \r
// misapplication\r
- if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isMisappliedName()){\r
+ else if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isMisappliedName()){\r
operation = new DeleteMisapplicationOperation(commandName, editor.getUndoContext(), editor\r
.getTaxon(), (Taxon) selectedElement, editor);\r
}\r
- \r
// concept relation\r
- // TODO\r
-// if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isRelatedConcept()){\r
-// operation = new DeleteConceptRelationOperation(commandName, editor.getUndoContext(), editor.getTaxon(), (Taxon) selectedElement, editor);\r
-// }\r
+ else if(selectedElement instanceof Taxon && ((Taxon) selectedElement).isRelatedConcept()){\r
+ operation = new DeleteConceptRelationOperation(commandName, editor.getUndoContext(), editor.getTaxon(), (Taxon) selectedElement, editor);\r
+ }\r
+ else {\r
+ throw new IllegalArgumentException("Element has to be Synonym, Misapplication or Concept");\r
+ }\r
\r
EditorUtil.executeOperation(operation);\r
\r
}
private boolean isAccepted(Object selectedElement) {
- return (selectedElement instanceof Taxon) ? true : false;
+ return (selectedElement instanceof Taxon && ! ((Taxon) selectedElement).isRelatedConcept() && ! ((Taxon) selectedElement).isMisapplication()) ? true : false;
}
}
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
-import eu.etaxonomy.cdm.model.taxon.Synonym;
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.RemoveHomotypicalGroupBasionymOperation;
/**
TaxonBase selectedTaxonBase = (TaxonBase) selection.getFirstElement();
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
operation = new RemoveHomotypicalGroupBasionymOperation(event.getCommand().getName(), editor.getUndoContext(),
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.Page;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.ChangeHomotypicalGroupBasionymOperation;
/**
TaxonBase selectedTaxonBase = (TaxonBase) selection.getFirstElement();
- IUndoableOperation operation;
+ AbstractPostOperation operation;
try {
operation = new ChangeHomotypicalGroupBasionymOperation(event.getCommand().getName(), editor.getUndoContext(),
}
};
-
createFormFactory();
formFactory.addPropertyChangeListener(this);
selectionService.addSelectionListener(this);
pageBook = new PageBook(parent, SWT.NULL);
-
createViewerComposite(pageBook);
createViewer(viewerComposite);
import eu.etaxonomy.cdm.model.common.VersionableEntity;
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer;
import eu.etaxonomy.taxeditor.forms.AbstractFormSection;
import eu.etaxonomy.taxeditor.forms.ICdmFormElement;
import eu.etaxonomy.taxeditor.section.ITaxonDetailSection;
@Override
public boolean setFormInput(Object input) {
+ if(input instanceof AbstractGroupedContainer){
+ input = ((AbstractGroupedContainer) input).getData();
+ }
if(input instanceof VersionableEntity){
logger.trace("Setting input for section: " + formSection.getClass().getSimpleName());
if((input instanceof TaxonBase) && (formSection instanceof ITaxonDetailSection)){
protected Object getInitialInput() {
return getEditor().getEditorInput();
}
+
+
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
import org.eclipse.core.commands.ExecutionEvent;\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
import org.eclipse.ui.IWorkbenchPart;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.CreateTaxonDescriptionOperation;\r
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
\r
IEditorInput input = editor.getEditorInput();\r
if (input instanceof TaxonEditorInput) {\r
Taxon taxon = ((TaxonEditorInput) input).getTaxon(); \r
- IUndoableOperation operation;\r
+ AbstractPostOperation operation;\r
try {\r
// TODO use undo context specific to editor\r
operation = new CreateTaxonDescriptionOperation(event.getCommand().getName(), \r
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.CreateDescriptionElementOperation;
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
Feature feature = (Feature) ((Event)event.getTrigger()).data;
- IUndoableOperation operation = null;
+ AbstractPostOperation operation = null;
try {
// TODO use undo context specific to editor
operation = new CreateDescriptionElementOperation(event.getCommand().getName(),
package eu.etaxonomy.taxeditor.editor.view.descriptive.handler;
-import java.util.Iterator;
-
import org.apache.log4j.Logger;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import eu.etaxonomy.cdm.model.description.TaxonDescription;
import eu.etaxonomy.cdm.model.media.Media;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.DeleteDescriptionElementOperation;
import eu.etaxonomy.taxeditor.operations.DeleteMediaOperation;
import eu.etaxonomy.taxeditor.operations.DeleteTaxonDescriptionOperation;
for(Object object : selection.toArray()){
- IUndoableOperation operation = null;
+ AbstractPostOperation operation = null;
if(object instanceof TaxonDescription){
operation = new DeleteTaxonDescriptionOperation(label, undoContext, (TaxonDescription) object, postOperationEnabled);
package eu.etaxonomy.taxeditor.editor.view.detail;
import org.apache.log4j.Logger;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.EditorPart;
-import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
import eu.etaxonomy.taxeditor.editor.Page;
MultiPageTaxonEditor editor = (MultiPageTaxonEditor) part;
if(editor != null){
TaxonNameEditor page = (TaxonNameEditor) editor.getPage(Page.NAME);
- page.getSelectedNameComposite().refresh();
+ page.getSelectedObject().refresh();
}
}
}
@Override
protected Object getInitialInput() {
- return selectionService.getSelection();
+ return ((IStructuredSelection) selectionService.getSelection()).getFirstElement();
}
@Override
super.dispose();
selectionService.removePostSelectionListener(this);
}
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.Section;
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
-import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
import eu.etaxonomy.cdm.model.agent.Person;
import eu.etaxonomy.cdm.model.agent.Team;
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
import eu.etaxonomy.taxeditor.editor.Page;
-import eu.etaxonomy.taxeditor.editor.name.AbstractNameComposite;
+import eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer;
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
import eu.etaxonomy.taxeditor.editor.view.AbstractCdmDataViewer;
import eu.etaxonomy.taxeditor.editor.view.AbstractCdmViewPart;
import eu.etaxonomy.taxeditor.forms.AbstractFormSection;
-import eu.etaxonomy.taxeditor.forms.RootElement;
import eu.etaxonomy.taxeditor.forms.CdmFormFactory.DetailType;
import eu.etaxonomy.taxeditor.forms.CdmFormFactory.EntityDetailType;
+import eu.etaxonomy.taxeditor.forms.RootElement;
/**
* @author n.hoffmann
private ISelection selection;
- private AbstractNameComposite sourceNameComposite;
+ private AbstractGroupedContainer sourceContainer;
/**
* @param parent
MultiPageTaxonEditor editor = EditorUtil.getActiveMultiPageTaxonEditor();
if(editor != null){
TaxonNameEditor page = (TaxonNameEditor) editor.getPage(Page.NAME);
- for(AbstractNameComposite nameComposite : page.getNameComposites()){
- if(nameComposite.getTaxonBase() == getInput()){
- sourceNameComposite = nameComposite;
+ for(AbstractGroupedContainer container : page.getGroupedContainers()){
+ if(container.getData() == getInput()){
+ sourceContainer = container;
}
}
}
protected Object getInitialInput() {
return getEditor().getEditorInput();
}
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
import org.eclipse.core.commands.ExecutionEvent;\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
import org.eclipse.ui.IWorkbenchPart;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.CreateTaxonDescriptionOperation;\r
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
\r
IEditorInput input = editor.getEditorInput();\r
if (input instanceof TaxonEditorInput) {\r
Taxon taxon = ((TaxonEditorInput) input).getTaxon(); \r
- IUndoableOperation operation;\r
+ AbstractPostOperation operation;\r
try {\r
// TODO use undo context specific to editor\r
operation = new CreateTaxonDescriptionOperation(event.getCommand().getName(), \r
import org.eclipse.core.commands.ExecutionEvent;\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.TreePath;\r
import org.eclipse.jface.viewers.TreeSelection;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.AddMediaToImageGalleryOperation;\r
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
\r
}\r
}\r
\r
- IUndoableOperation operation = null;\r
+ AbstractPostOperation operation = null;\r
try {\r
// TODO use undo context specific to editor\r
operation = new AddMediaToImageGalleryOperation(event.getCommand().getName(), \r
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.operations.RemoveImageFromDescriptionElementOperation;
}
ImageFile image = (ImageFile) paths[0].getLastSegment();
- IUndoableOperation operation = null;
+ AbstractPostOperation operation = null;
try {
// TODO use undo context specific to editor
operation = new RemoveImageFromDescriptionElementOperation(event.getCommand().getName(),
import org.eclipse.core.commands.ExecutionEvent;\r
import org.eclipse.core.commands.ExecutionException;\r
import org.eclipse.core.commands.common.NotDefinedException;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.TreePath;\r
import org.eclipse.jface.viewers.TreeSelection;\r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
import eu.etaxonomy.taxeditor.editor.view.descriptive.handler.CreateDescriptionElementHandler;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
import eu.etaxonomy.taxeditor.operations.MoveMediaInListOperation;\r
\r
}\r
} \r
Media media = (Media) paths[0].getLastSegment();\r
- IUndoableOperation operation = null;\r
+ AbstractPostOperation operation = null;\r
try {\r
// TODO use undo context specific to editor\r
operation = new MoveMediaInListOperation(event.getCommand().getName(), \r
import eu.etaxonomy.taxeditor.editor.EditorUtil;\r
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;\r
import eu.etaxonomy.taxeditor.editor.view.descriptive.handler.CreateDescriptionElementHandler;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
import eu.etaxonomy.taxeditor.operations.MoveMediaInListOperation;\r
\r
}\r
} \r
Media media = (Media) paths[0].getLastSegment();\r
- IUndoableOperation operation = null;\r
+ AbstractPostOperation operation = null;\r
try {\r
// TODO use undo context specific to editor\r
operation = new MoveMediaInListOperation(event.getCommand().getName(), \r
@Override
protected Object getInitialInput() {
- return ((TaxonEditorInput) getEditor().getEditorInput()).getTaxon();
+ return ((IStructuredSelection) selectionService.getSelection()).getFirstElement();
+ }
+
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
}
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
import eu.etaxonomy.cdm.model.common.VersionableEntity;
import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;
+import eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer;
import eu.etaxonomy.taxeditor.editor.view.AbstractCdmDataViewer;
import eu.etaxonomy.taxeditor.editor.view.AbstractCdmViewPart;
import eu.etaxonomy.taxeditor.editor.view.detail.DetailsViewer;
@Override
protected void showParts() {
- if(getInput() instanceof IdentifiableMediaEntity){
+ Object input;
+
+ if(getInput() instanceof AbstractGroupedContainer){
+ input = ((AbstractGroupedContainer) getInput()).getData();
+ }else{
+ input = getInput();
+ }
+
+ if(input instanceof IdentifiableMediaEntity){
if(currentViewPart != VIEW_PART.IdentifiableMediaEntity){
currentViewPart = VIEW_PART.IdentifiableMediaEntity;
createIdentifiableMediaSections(rootElement);
}
- }else if(getInput() instanceof IdentifiableEntity){
+ }else if(input instanceof IdentifiableEntity){
if(currentViewPart != VIEW_PART.IdentifiableEntity){
currentViewPart = VIEW_PART.IdentifiableEntity;
createIdentifiableSections(rootElement);
}
- }else if(getInput() instanceof AnnotatableEntity){
+ }else if(input instanceof AnnotatableEntity){
if(currentViewPart != VIEW_PART.AnnotatableEntity){
currentViewPart = VIEW_PART.AnnotatableEntity;
createAnnotationSections(rootElement);
}
- }else if(getInput() instanceof VersionableEntity){
+ }else if(input instanceof VersionableEntity){
if(currentViewPart != VIEW_PART.VersionableEntity){
currentViewPart = VIEW_PART.VersionableEntity;
createHeadlineSection(rootElement);
public void dispose() {
if (boldFont != null) {
- FormFonts.getInstance().markFinished(boldFont);
+ FormFonts.getInstance().markFinished(boldFont, getColors().getDisplay());
boldFont = null;
}
}
}
public void setIrrelevant(boolean irrelevant) {
- String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
+ String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
Color color = EditorUtil.getColor(colorId);
text.setBackground(color);
version="0.0.0"
unpack="false"/>
- <plugin
- id="org.eclipse.core.resources.compatibility"
- download-size="0"
- install-size="0"
- version="0.0.0"
- fragment="true"
- unpack="false"/>
-
<plugin
id="org.eclipse.core.runtime"
download-size="0"
version="0.0.0"
unpack="false"/>
- <plugin
- id="org.eclipse.pde.source"
- download-size="0"
- install-size="0"
- version="0.0.0"
- unpack="false"/>
-
<plugin
id="org.eclipse.swt"
download-size="0"
version="0.0.0"
unpack="false"/>
- <plugin
- id="org.junit4"
- download-size="0"
- install-size="0"
- version="0.0.0"/>
-
<plugin
id="org.eclipse.update.core.win32"
os="win32"
version="0.0.0"
unpack="false"/>
- <plugin
- id="org.eclipse.equinox.p2.exemplarysetup"
- download-size="0"
- install-size="0"
- version="0.0.0"
- unpack="false"/>
-
<plugin
id="org.eclipse.equinox.simpleconfigurator"
download-size="0"
fragment="true"
unpack="false"/>
+ <plugin
+ id="org.junit"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.compare"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.ltk.core.refactoring"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.ltk.ui.refactoring"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.team.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.team.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
</feature>
<?xml version="1.0" encoding="UTF-8"?>
<?pde version="3.5"?>
-<product name="%productName" id="eu.etaxonomy.taxeditor.application.product" application="eu.etaxonomy.taxeditor.application.application" version="2.1.2.qualifier" useFeatures="true" includeLaunchers="true">
+<product name="%productName" uid="eu.etaxonomy.taxeditor" id="eu.etaxonomy.taxeditor.application.product" application="eu.etaxonomy.taxeditor.application.application" version="2.1.2.qualifier" useFeatures="true" includeLaunchers="true">
<aboutInfo>
<text>
<extension
point="org.eclipse.ui.navigator.navigatorContent">
<navigatorContent
- contentProvider="eu.etaxonomy.taxeditor.navigation.navigator.TaxonomicTreeContentProvider"
+ contentProvider="eu.etaxonomy.taxeditor.navigation.navigator.ClassificationContentProvider"
id="eu.etaxonomy.taxeditor.navigation.taxonomictreecontent"
- labelProvider="eu.etaxonomy.taxeditor.navigation.navigator.TaxonomicTreeLabelProvider"
+ labelProvider="eu.etaxonomy.taxeditor.navigation.navigator.ClassificationLabelProvider"
name="Taxonomic Tree">
<triggerPoints>
<instanceof
contentProvider="eu.etaxonomy.taxeditor.navigation.navigator.SynonymContentProvider"
id="eu.etaxonomy.taxeditor.navigation.synonymcontent"
labelProvider="eu.etaxonomy.taxeditor.navigation.navigator.SynonymLabelProvider"
- name="Synonyms"
+ name="Synonyms (experimental)"
priority="highest">
<triggerPoints>
<and>
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.core.commands.operations.UndoContext;
import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
* @param element
* @param parentElement
*/
- public static void selectInNavigator(Object element, Object parentElement) {
- TaxonNavigator navigator = showNavigator();
- if (navigator != null) {
- CommonViewer viewer = navigator.getCommonViewer();
- if (viewer != null) {
- if (parentElement != null) {
- viewer.setExpandedState(parentElement, true);
+ public static void selectInNavigator(final Object element, final Object parentElement) {
+ Display.getDefault().asyncExec(new Runnable(){
+
+ public void run() {
+ TaxonNavigator navigator = showNavigator();
+
+ if (navigator != null) {
+ CommonViewer viewer = navigator.getCommonViewer();
+ if (viewer != null) {
+ if (parentElement != null) {
+ viewer.setExpandedState(parentElement, true);
+ }
+ viewer.setSelection(new StructuredSelection((TaxonNode) element));
+ }
}
- viewer.setSelection(new StructuredSelection((TaxonNode) element));
}
- }
+
+ });
}
/**
public static TaxonNavigator getNavigator(boolean restore) {
return (TaxonNavigator) getView(TaxonNavigator.ID, restore);
}
+
+ public static Set<IEditorPart> getOpenEditors() {
+ return EditorUtil.getOpenEditors();
+ }
}
\ No newline at end of file
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMemento;
return;
}
- ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(NavigationUtil.getShell());
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
};
try {
- progressMonitorDialog.run(false, true, runnable);
+ NavigationUtil.run(false, true, runnable);
} catch (InvocationTargetException e) {
logger.error("InvocationTargetException when trying to restore open editors", e);
} catch (InterruptedException e) {
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.DeleteTreeNodeOperation;
/**
treeNodes.add((ITreeNode) object);
}
- IUndoableOperation operation = null;
+ AbstractPostOperation operation = null;
try {
operation = new DeleteTreeNodeOperation(event.getCommand().getName(), NavigationUtil.getUndoContext(), treeNodes, taxonNavigator, taxonNavigator);
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
+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.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.cdm.model.common.CdmBase;
ISelection selection = HandlerUtil.getCurrentSelection(event);//navigator.getSelection();
if(selection instanceof StructuredSelection){
- StructuredSelection structuredSelection = (StructuredSelection) selection;
+ final StructuredSelection structuredSelection = (StructuredSelection) selection;
if(structuredSelection.size() == 1 && structuredSelection.getFirstElement() instanceof TaxonomicTree){
}
else{
- for(Object selectedObject : structuredSelection.toArray()){
+
+ Job job = new Job("Opening editor") {
- if(selectedObject instanceof CdmBase){
- // let the openEditor() method handle everything from now on
- NavigationUtil.openEditor((CdmBase) selectedObject);
- }else{
- throw new IllegalArgumentException("selectedObject is not of type CdmBase");
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ for(final Object selectedObject : structuredSelection.toArray()){
+
+ if(selectedObject instanceof CdmBase){
+ // let the openEditor() method handle everything from now on
+ Display.getDefault().asyncExec(new Runnable(){
+
+ public void run() {
+ NavigationUtil.openEditor((CdmBase) selectedObject);
+ }
+
+ });
+ }else{
+ throw new IllegalArgumentException("selectedObject is not of type CdmBase");
+ }
+ }
+ return Status.OK_STATUS;
}
- }
+ };
+
+ job.schedule();
}
}
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.taxeditor.dialogs.filteredSelection.FilteredTaxonNodeSelectionDialog;
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.operations.MoveTaxonOperation;
return null;
}
- IUndoableOperation operation = new MoveTaxonOperation
+ AbstractPostOperation operation = new MoveTaxonOperation
("Move taxon to new parent", NavigationUtil.getUndoContext(),
taxonNodes, parentTaxonNode, this, taxonNavigator); //$NON-NLS-1$
NavigationUtil.executeOperation(operation);
public boolean postOperation(CdmBase objectAffectedByOperation) {
return true;
}
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
\ No newline at end of file
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
-import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
-
/**
* @author n.hoffmann
* @created 17.06.2009
* @version 1.0
*/
-public class TaxonomicTreeContentProvider implements ITreeContentProvider {
+public class ClassificationContentProvider implements ITreeContentProvider {
private static final Logger logger = Logger
- .getLogger(TaxonomicTreeContentProvider.class);
+ .getLogger(ClassificationContentProvider.class);
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
if (parentElement instanceof Root) {
return ((Root) parentElement).getParentBeans().toArray();
}
-
-// if(parentElement instanceof TaxonomicTree) {
-// return ((TaxonomicTree) parentElement).getRootNodes().toArray();
-// }
-
+
return new Object[0];
}
* @created 17.06.2009
* @version 1.0
*/
-public class TaxonomicTreeLabelProvider extends ColumnLabelProvider
+public class ClassificationLabelProvider extends ColumnLabelProvider
implements ILabelProvider, IDescriptionProvider, IStyledLabelProvider {
private static final Logger logger = Logger
- .getLogger(TaxonomicTreeLabelProvider.class);
+ .getLogger(ClassificationLabelProvider.class);
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
*/\r
public void restore(final IMemento memento) {\r
\r
- ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(NavigationUtil.getShell());\r
IRunnableWithProgress runnable = new IRunnableWithProgress() {\r
\r
public void run(IProgressMonitor monitor) throws InvocationTargetException,\r
};\r
\r
try {\r
- progressMonitorDialog.run(false, true, runnable);\r
+ NavigationUtil.run(false, true, runnable);\r
} catch (InvocationTargetException e) {\r
logger.error("InvocationTargetException when trying to restore navigator", e);\r
} catch (InterruptedException e) {\r
logger.error("An exception occured while trying to open a selection", e);\r
}\r
}\r
- // Pass the double click up to the super-class so it can expand/collapse trees\r
- super.handleDoubleClick(anEvent);\r
+ // If the double click is passed up to the super-class it will expand/collapse trees.\r
+ // We do not want that\r
+ //super.handleDoubleClick(anEvent);\r
+ }\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
}\r
}
\ No newline at end of file
import java.util.Set;
import org.apache.log4j.Logger;
+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.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
-import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.ITreeNode;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
import eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour;
import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;
+import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
/**
* @author n.hoffmann
for(CdmDataChangeEvent event : events.getAllEvents()){
EventType eventType = event.getEventType();
- // react on everything except load
- if(eventType == EventType.INSERT || eventType == EventType.UPDATE || eventType == EventType.DELETE){
- relevant = true;
- CdmBase entity = event.getEntity();
- if((entity instanceof TaxonNameBase)
- || (entity instanceof Taxon)
- || (entity instanceof Synonym)){
- staleObjects.add(entity);
+ CdmBase eventEntity = event.getEntity();
+
+ // all tree node changes are relevant
+ if((eventType == EventType.INSERT || eventType == EventType.DELETE || eventType == EventType.UPDATE)
+ && event.getEntity() instanceof ITreeNode){
+ return true;
+ }
+
+ // name updates of the accepted taxon of open editors are relevant
+ if(eventType == EventType.UPDATE){
+ TaxonNameBase name = null;
+ if(eventEntity instanceof TaxonNameBase){
+ name = (TaxonNameBase) eventEntity;
+ }else if(eventEntity instanceof Taxon){
+ name = ((Taxon) eventEntity).getName();
+ }else{
+ continue;
+ }
+
+ Set<IEditorPart> openEditors = NavigationUtil.getOpenEditors();
+ for(IEditorPart editor : openEditors){
+
+ if(name.equals(((TaxonEditorInput) editor.getEditorInput()).getTaxon().getName())){
+ return true;
+ }
}
}
+
+
+// if(eventType == EventType.UPDATE){
+// relevant = true;
+// CdmBase entity = event.getEntity();
+// if((entity instanceof TaxonNameBase)
+// || (entity instanceof Taxon)
+// || (entity instanceof Synonym)){
+// staleObjects.add(entity);
+// }
+// }
}
- return relevant;
+ return false;
// @deprecated
// react on everything except load
public void reactOnDataChange(CdmDataChangeMap events) {
if(isRelevant(events)){
- // FIXME @see #1365
-
- source.getConversationHolder().bind();
+ final Display display = Display.getCurrent();
+ Job job = new Job("Updating Taxon Navigator") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ monitor.beginTask("Updating Taxon Navigator", 3);
+ source.getConversationHolder().bind();
+ monitor.worked(1);
+
+ // clear the session completely
+ monitor.subTask("Clearing Taxon Navigators session");
+ source.getConversationHolder().clear();
+ // FIXME completely clearing the session is a brute force approach.
+// // It would be much more elegant to clear only those elements that have been changed.
+// // I could not get that to work but we should consider workin on this because we might
+// // run into serious performance issues, especially when it comes to large trees
+ //
+ // at least, we moved this to a job so it can run in a background thred
+ // seems to improve the situation but not sure if final solution
+ monitor.worked(1);
+
+ monitor.subTask("Refreshing viewer");
+
+ display.asyncExec(new Runnable() {
+ public void run() {
+ source.refresh();
+ }
+ });
+
+
+
+ monitor.worked(1);
+ logger.info("DataStore update caused a refresh of the taxonomic tree");
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
- // clear the session completely
- source.getConversationHolder().clear();
+ job.setPriority(Job.SHORT);
+ job.schedule();
- // FIXME completely clearing the session is a brute force approach.
- // It would be much more elegant to clear only those elements that have been changed.
- // I could not get that to work but we should consider workin on this because we might
- // run into serious performance issues, especially when it comes to large trees
- //
- // detach all changed objects from the session cache so that they have to be reloaded
-// for (CdmBase staleObject : staleObjects){
-// source.getConversationHolder().evict(staleObject);
-// }
-
- source.refresh();
- logger.info("DataStore update caused a refresh of the taxonomic tree");
}
}
}
}\r
\r
public boolean hasChildren(Object element) {\r
- return this.getChildren(element).length > 0;\r
+ if(element instanceof TaxonNode){\r
+ return ((TaxonNode) element).getCountChildren() > 0;\r
+ }\r
+ return getChildren(element).length > 0;\r
}\r
\r
public Object[] getElements(Object inputElement) {\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.core.commands.operations.IUndoContext;\r
-import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.core.runtime.IStatus;\r
import org.eclipse.core.runtime.Status;\r
import org.eclipse.jface.dialogs.MessageDialog;\r
import eu.etaxonomy.cdm.model.taxon.ITreeNode;\r
import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;\r
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;\r
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;\r
import eu.etaxonomy.taxeditor.operations.MoveTaxonOperation;\r
\r
return Status.CANCEL_STATUS;\r
}\r
\r
- IUndoableOperation operation = new MoveTaxonOperation\r
+ AbstractPostOperation operation = new MoveTaxonOperation\r
("Move Taxon", workspaceUndoContext, taxonNodes, targetITreeNode, this, taxonNavigator);\r
NavigationUtil.executeOperation(operation); \r
\r
public boolean postOperation(CdmBase objectAffectedByOperation) {\r
return true;\r
}\r
+\r
+ public boolean onComplete() {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
}\r
package eu.etaxonomy.taxeditor.wizard;
import org.apache.log4j.Logger;
-import org.eclipse.core.commands.operations.AbstractOperation;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.SaveTaxonomicTreeOperation;
/**
TaxonNavigator taxonNavigator;
taxonNavigator = (TaxonNavigator) NavigationUtil.showView(TaxonNavigator.ID);
- AbstractOperation operation = new SaveTaxonomicTreeOperation("Save Classification",
+ AbstractPostOperation operation = new SaveTaxonomicTreeOperation("Save Classification",
NavigationUtil.getUndoContext(), page.getClassification(),
taxonNavigator, taxonNavigator);
NavigationUtil.executeOperation(operation);
package eu.etaxonomy.taxeditor.wizard;
import org.apache.log4j.Logger;
-import org.eclipse.core.commands.operations.AbstractOperation;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.CreateTaxonNodeOperation;
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
if(page.getTaxonName() == null || page.getTaxonName().getFullTitleCache().length() == 0){
openEmptyEditor = true;
}else{
- AbstractOperation operation = new CreateTaxonNodeOperation("Create Taxon",
+ AbstractPostOperation operation = new CreateTaxonNodeOperation("Create Taxon",
NavigationUtil.getUndoContext(), page.getParentNode(), page.getTaxonName(), this, taxonNavigator);
NavigationUtil.executeOperation(operation);
return true;
}
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
label="Global Text Color"
value="0,0,0">
</colorDefinition>
+ <colorDefinition
+ categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory"
+ id="eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeBackground"
+ label="Global Color Composite Background"
+ value="255,255,255">
+ </colorDefinition>
<colorDefinition
categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory"
id="eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeIrrelevant"
</themeElementCategory>
<colorDefinition
categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
- id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeBackground"
- label="Composite Background"
- value="250, 250, 250">
+ id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerBackground"
+ label="Container Background"
+ value="220, 220, 220">
+ </colorDefinition>
+ <colorDefinition
+ categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
+ id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelectedFocus"
+ label="Container Selected Focus"
+ value="181,213,255">
</colorDefinition>
<colorDefinition
categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
- id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeSelected"
- label="Composite Selected"
+ id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelected"
+ label="Container Selected"
value="210, 210, 210">
</colorDefinition>
+ <colorDefinition
+ categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
+ id="eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerDragEnter"
+ label="Container Drag Enter"
+ value="185,255,133">
+ </colorDefinition>
<fontDefinition
categoryId="eu.etaxonomy.taxeditor.preferences.themeElementCategory.nameEditor"
id="eu.etaxonomy.taxeditor.preferences.fontDefinition.nameEditor.accepted"
import org.apache.log4j.Logger;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.IUndoableOperation;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
+import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
/**
}
public static IWorkbenchPage getActivePage(){
+
return TaxeditorStorePlugin.getDefault().getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
}
+ public static IWorkbenchPart getActivePart(){
+ return getActivePage().getActivePart();
+ }
+
+ public static ApplicationWindow getWorkbenchWindow(){
+ if(TaxeditorStorePlugin.getDefault().getWorkbench().getWorkbenchWindowCount() > 1){
+ throw new IllegalStateException("More than one workbench window");
+ }
+ return (ApplicationWindow) TaxeditorStorePlugin.getDefault().getWorkbench().getWorkbenchWindows()[0];
+ }
+
public static IViewPart showView(String id){
try {
return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(id);
warningDialog("Not yet implemented", "This functionality is not yet implemented.");
}
- public static void informationDialog(String title, String message){
- MessageDialog.openInformation(getShell(), title, message);
+ public static void informationDialog(final String title, final String message){
+ Display.getDefault().asyncExec(new Runnable(){
+
+ public void run() {
+ MessageDialog.openInformation(getShell(), title, message);
+ }
+ });
}
- public static void warningDialog(String title, String message){
- MessageDialog.openWarning(getShell(), title, message);
+ public static void warningDialog(final String title, final String message){
+ Display.getDefault().asyncExec(new Runnable(){
+
+ public void run() {
+ MessageDialog.openWarning(getShell(), title, message);
+ }
+ });
}
- public static void errorDialog(String title, String message){
- MessageDialog.openError(getShell(), title, message);
+ public static void errorDialog(final String title, final String message){
+ Display.getDefault().asyncExec(new Runnable(){
+
+ public void run() {
+ MessageDialog.openError(getShell(), title, message);
+ }
+ });
}
public static boolean confirmDialog(String title, String message) {
return MessageDialog.openQuestion(getShell(), title, message);
}
- public static IStatus executeOperation(IUndoableOperation operation){
+ public static IStatus executeOperation(final AbstractPostOperation operation){
if(getOperationHistory() == null){
throw new IllegalArgumentException("There is no operation history for this context");
}
- // Start the main progress monitor.
- IProgressMonitor newMonitor = startMainMonitor(getMonitor(),operation.getLabel(), 100);
-
- // Check whether operation was canceled and do some steps.
- workedChecked(newMonitor, 10);
-
- try {
- IStatus status = getOperationHistory().execute(operation, newMonitor,
- WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
-
- // Check whether operation was canceled and do some steps.
- workedChecked(newMonitor, 30);
-
- String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled";
- setStatusLine(operation.getLabel() + " " + statusString + ".");
-
- return status;
- } catch (ExecutionException e) {
- logger.error("Error executing operation: " + operation.getLabel(), e);
- errorDialog("Error executing operation: " + operation.getLabel(), "Please refer to the error log.");
+ final IAdaptable uiInfoAdapter = WorkspaceUndoUtil.getUIInfoAdapter(getShell());
+
+
+
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException,
+ InterruptedException {
+ monitor.beginTask(operation.getLabel(), 100);
+ IStatus status;
+ try {
+ status = getOperationHistory().execute(operation, monitor, uiInfoAdapter);
+ } catch (ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ monitor.done();
+ String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled";
+ setStatusLine(operation.getLabel() + " " + statusString + ".");
+
+ }
+ };
+
+ try {
+ runInUI(runnable, null);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(e);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
}
- finally {
-
- // Stop the progress monitor.
- newMonitor.done();
- }
- return null;
+
+// // Start the main progress monitor.
+// IProgressMonitor newMonitor = startMainMonitor(getMonitor(),operation.getLabel(), 100);
+//
+// // Check whether operation was canceled and do some steps.
+// workedChecked(newMonitor, 10);
+//
+// try {
+// IStatus status = getOperationHistory().execute(operation, newMonitor,
+// WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
+//
+// // Check whether operation was canceled and do some steps.
+// workedChecked(newMonitor, 30);
+//
+// String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled";
+// setStatusLine(operation.getLabel() + " " + statusString + ".");
+//
+// return status;
+// } catch (ExecutionException e) {
+// logger.error("Error executing operation: " + operation.getLabel(), e);
+// errorDialog("Error executing operation: " + operation.getLabel(), "Please refer to the error log.");
+// }
+// finally {
+//
+// // Stop the progress monitor.
+// newMonitor.done();
+// }
+
+ IPostOperationEnabled postOperationEnabled = operation.getPostOperationEnabled();
+ postOperationEnabled.onComplete();
+ return Status.OK_STATUS;
}
public static IOperationHistory getOperationHistory(){
getOperationSupport().getOperationHistory();
}
- public static void setStatusLine(String message) {
- statusLineManager.setMessage(message);
+ public static void setStatusLine(final String message) {
+ Display.getDefault().asyncExec(new Runnable(){
+
+ public void run() {
+ statusLineManager.setMessage(message);
+ }
+
+ });
+
}
protected static IProgressMonitor getMonitor() {
* Present a progress dialog to the user. This dialog will block the UI
*
* @param runnable an implementation of {@link IRunnableWithProgress}
+ * @throws InterruptedException
+ * @throws InvocationTargetException
*/
- public static void busyCursorWhile(IRunnableWithProgress runnable){
- IWorkbench workbench = PlatformUI.getWorkbench();
- IProgressService progressService = workbench.getProgressService();
- try {
- progressService.busyCursorWhile(runnable);
- } catch (InvocationTargetException e) {
- logger.error("InvocationTargetException while running busy cursor", e);
- } catch (InterruptedException e) {
- logger.error("InterruptedException while running busy cursor", e);
- }
+ public static void busyCursorWhile(IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException{
+ getProgressService().busyCursorWhile(runnable);
+ }
+
+ public static void runInUI(IRunnableWithProgress runnable, ISchedulingRule rule) throws InvocationTargetException, InterruptedException{
+ getProgressService().runInUI(getWorkbenchWindow(), runnable, rule);
+ }
+
+ public static void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException{
+ getProgressService().run(fork, cancelable, runnable);
}
- public static void runAsynchroneously(IRunnableWithProgress runnable){
+ public static IProgressService getProgressService(){
IWorkbench workbench = PlatformUI.getWorkbench();
- IProgressService progressService = workbench.getProgressService();
-
- try {
- progressService.run(true, false, runnable);
- } catch (InvocationTargetException e) {
- logger.error("InvocationTargetException while running busy cursor", e);
- } catch (InterruptedException e) {
- logger.error("InterruptedException while running busy cursor", e);
- }
+ return workbench.getProgressService();
}
}
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.model;
+
+import org.eclipse.ui.IWorkbenchPartReference;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public interface IPartChangeListener {
+
+ public void partChanged(Integer eventType, IWorkbenchPartReference partRef);
+
+}
--- /dev/null
+/**
+ *
+ */
+package eu.etaxonomy.taxeditor.model;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class TaxeditorPartService implements IPartListener2{
+
+ public static final int PART_ACTIVATED = 10;
+ public static final int PART_BROUGHT_TO_TOP = 20;
+ public static final int PART_CLOSED = 30;
+ public static final int PART_DEAVTICATED = 40;
+ public static final int PART_HIDDEN = 50;
+ public static final int PART_INPUT_CHANGED = 60;
+ public static final int PART_OPENED = 70;
+ public static final int PART_VISIBLE = 80;
+
+ public static TaxeditorPartService instance = new TaxeditorPartService();
+
+ private IPartService partService;
+
+ private Map<Integer, Set<IPartChangeListener>> listenerMap = new HashMap<Integer, Set<IPartChangeListener>>();
+
+ private TaxeditorPartService() {
+ partService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService();
+ partService.addPartListener(this);
+ }
+
+ public static TaxeditorPartService getInstance(){
+ return instance;
+ }
+
+ public void addListener(Integer eventType, IPartChangeListener listener){
+ Set<IPartChangeListener> partChangeListeners = listenerMap.get(eventType);
+
+ if(partChangeListeners == null){
+ partChangeListeners = new HashSet<IPartChangeListener>();
+ listenerMap.put(eventType, partChangeListeners);
+ }
+
+ partChangeListeners.add(listener);
+ }
+
+ public void removeListener(Integer eventType, IPartChangeListener listener){
+ Set<IPartChangeListener> partChangeListeners = listenerMap.get(eventType);
+
+ if(partChangeListeners == null){
+ return;
+ }
+
+ partChangeListeners.remove(listener);
+ }
+
+ private void notifyListeners(Integer eventType, IWorkbenchPartReference partRef){
+ Set<IPartChangeListener> partChangeListeners = listenerMap.get(eventType);
+
+ if(partChangeListeners == null){
+ return;
+ }
+
+ for(IPartChangeListener listener : partChangeListeners){
+ listener.partChanged(eventType, partRef);
+ }
+ }
+
+
+ public void partActivated(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_ACTIVATED, partRef);
+ }
+
+ public void partBroughtToTop(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_BROUGHT_TO_TOP, partRef);
+ }
+
+ public void partClosed(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_CLOSED, partRef);
+ }
+
+ public void partDeactivated(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_DEAVTICATED, partRef);
+ }
+
+ public void partOpened(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_OPENED, partRef);
+ }
+
+ public void partHidden(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_HIDDEN, partRef);
+ }
+
+ public void partVisible(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_VISIBLE, partRef);
+ }
+
+ public void partInputChanged(IWorkbenchPartReference partRef) {
+ notifyListeners(PART_INPUT_CHANGED, partRef);
+ }
+}
/**\r
* \r
*/\r
- protected IPostOperationEnabled postOperationEnabled;\r
+ private IPostOperationEnabled postOperationEnabled;\r
\r
/** \r
* A reference to the taxon the concrete operation is working on \r
}\r
return Status.OK_STATUS;\r
}\r
+ \r
+ public IPostOperationEnabled getPostOperationEnabled() {\r
+ return postOperationEnabled;\r
+ }\r
}\r
this.oldRelationshipType = taxonRelationship.getType();\r
\r
this.concept = concept;\r
- this.homotypicalGroup = homotypicalGroup;\r
+ this.homotypicalGroup = homotypicalGroup != null ? homotypicalGroup : HomotypicalGroup.NewInstance();\r
}\r
\r
/* (non-Javadoc)\r
monitor.worked(20);\r
\r
// Add name to new homotypic group\r
- HomotypicalGroup.NewInstance().addTypifiedName(synonymName);\r
+ homotypicalGroup.addTypifiedName(synonymName);\r
monitor.worked(40);\r
\r
// Create a new synonym for the taxon\r
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.store.StoreUtil;\r
\r
}\r
\r
this.oldHomotypicalGroup = synonym.getHomotypicGroup();\r
- this.newHomotypicalGroup = newHomotypicalGroup;\r
+ this.newHomotypicalGroup = newHomotypicalGroup != null ? newHomotypicalGroup : HomotypicalGroup.NewInstance();\r
}\r
\r
/* (non-Javadoc)\r
@Override\r
public IStatus execute(IProgressMonitor monitor, IAdaptable info)\r
throws ExecutionException {\r
-\r
+ \r
// Get synonym name\r
- TaxonNameBase<?, ?> synonymName = this.synonym.getName();\r
+ TaxonNameBase<?, ?> synonymName = synonym.getName();\r
monitor.worked(20);\r
\r
// TODO pass in homotypical group's taxon in case we are dragging from one editor to another\r
\r
newHomotypicalGroup.addTypifiedName(synonymName);\r
\r
+ if(! synonym.getAcceptedTaxa().contains(taxon)){\r
+ for(Taxon acceptedTaxon : synonym.getAcceptedTaxa()){\r
+ acceptedTaxon.removeSynonym(synonym);\r
+ }\r
+ \r
+ SynonymRelationshipType type = SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF();\r
+ if(newHomotypicalGroup.getTypifiedNames().contains(taxon.getName())){\r
+ type = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
+ }\r
+ \r
+ taxon.addSynonym(synonym, type);\r
+ }\r
+ \r
// Redraw editor if it exists\r
return postExecute(synonym);\r
}\r
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
import eu.etaxonomy.taxeditor.store.StoreUtil;\r
\r
/**\r
\r
// make misapplied name with synonym name\r
misapplication = Taxon.NewInstance(synonymName, null);\r
+ CdmStore.getTaxonService().saveOrUpdate(misapplication);\r
monitor.worked(20);\r
\r
// store synonymRelationshipType for later undo operations\r
* @return true the method executed succesfully
*/
public boolean postOperation(CdmBase objectAffectedByOperation);
+
+ /**
+ * This method will get called after the execution took place and occasional cleanups
+ * were performed. This is typically the last thing to happen.
+ * @return
+ */
+ public boolean onComplete();
}
/* ***************************************************************************************
COLORS
************************************************************************************** */
- public static final String COLOR_COMPOSITE_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeBackground";
- public static final String COLOR_COMPOSITE_SELECTED = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorCompositeSelected";
+ public static final String COLOR_CONTROL_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerBackground";
+ public static final String COLOR_CONTROL_SELECTED = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelected";
+ public static final String COLOR_CONTROL_SELECTED_FOCUS = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerSelectedFocus";
+
+ public static final String COLOR_COMPOSITE_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeBackground";
public static final String COLOR_COMPOSITE_IRRELEVANT = "eu.etaxonomy.taxeditor.preferences.colorDefinition.colorCompositeIrrelevant";
public static final String SEARCH_VIEW_FOREGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.searchView.foreground";
public static final String COLOR_TEXT_DISABLED = "eu.etaxonomy.taxeditor.preferences.colorDefinition.textDisabled";
public static final String COLOR_TEXT_DISABLED_BACKGROUND = "eu.etaxonomy.taxeditor.preferences.colorDefinition.textBackgroundDisabled";
+ public static final String COLOR_DRAG_ENTER = "eu.etaxonomy.taxeditor.preferences.colorDefinition.nameEditor.colorContainerDragEnter";
+
}
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.security.authentication.ProviderManager;
if (datasource.testConnection()) {
cdmDatasource = datasource;
- ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(StoreUtil.getShell());
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
}
message += "'" + cdmDatasource.getName() + "'";
- monitor.beginTask("Establishing connection to" + message, 10);
+ monitor.beginTask("Establishing connection to" + message + ". \nThis might take while.", 10);
// TODO get real feedback from CDMStore initialisation process
monitor.worked(3);
}
};
- progressMonitorDialog.run(false, false, runnable);
+ StoreUtil.run(false, false, runnable);
if (!getCommonService().isDatabaseSchemaCompatible()) {
close();
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.etaxonomy.cdm.model.common.User;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.ToggleUserEnablementOperation;
import eu.etaxonomy.taxeditor.store.StoreUtil;
import eu.etaxonomy.taxeditor.user.view.UserManagerView;
// TODO refresh the list -> set postOperationEnabled to the real deal
UserManagerView userManagerView = (UserManagerView) HandlerUtil.getActivePart(event);
- IUndoableOperation operation = null;
+ AbstractPostOperation operation = null;
try {
operation = new ToggleUserEnablementOperation(event.getCommand().getName(),
StoreUtil.getUndoContext(), user, userManagerView, userManagerView);
}
return true;
}
+
+ public boolean onComplete() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
import org.eclipse.jface.wizard.Wizard;
import eu.etaxonomy.cdm.model.common.User;
+import eu.etaxonomy.taxeditor.operations.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operations.CreateUserOperation;
import eu.etaxonomy.taxeditor.operations.EditUserOperation;
import eu.etaxonomy.taxeditor.store.StoreUtil;
@Override
public boolean performFinish() {
- IUndoableOperation operation;
+ AbstractPostOperation operation;
if(createMode){
operation = new CreateUserOperation("Create User",
StoreUtil.getUndoContext(), page.getUser(), view, view);
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
import eu.etaxonomy.cdm.model.name.NonViralName;
import eu.etaxonomy.cdm.model.taxon.Synonym;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
import eu.etaxonomy.cdm.model.name.NonViralName;
import eu.etaxonomy.cdm.model.taxon.Synonym;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
import eu.etaxonomy.cdm.model.taxon.Synonym;
import eu.etaxonomy.cdm.model.taxon.Taxon;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.name.NonViralName;
import eu.etaxonomy.cdm.model.taxon.Synonym;
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.name.NonViralName;
import eu.etaxonomy.cdm.model.taxon.Synonym;
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
import eu.etaxonomy.taxeditor.operations.DeleteConceptRelationOperation;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.operations.DeleteMisapplicationOperation;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {
import org.junit.BeforeClass;
import org.junit.Test;
-import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.model.description.TaxonDescription;
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
import eu.etaxonomy.cdm.model.name.NonViralName;
}
/**
- * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(CdmBase)}.
+ * Test method for {@link eu.etaxonomy.taxeditor.operations.AbstractPostOperation#postExecute(ICdmBase)}.
*/
@Test
public void testPostExecute() {