import org.eclipse.core.commands.operations.IUndoContext;\r
import org.eclipse.core.commands.operations.OperationHistoryFactory;\r
import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.Status;\r
import org.eclipse.jface.action.IStatusLineManager;\r
import org.eclipse.swt.graphics.Color;\r
import org.eclipse.swt.widgets.Shell;\r
return openEditor(input, MultiPageTaxonEditor.ID);\r
}\r
\r
+ /**\r
+ * Redraws an open editor if it exists for the given taxon\r
+ * \r
+ * @param taxon\r
+ * @return\r
+ */\r
+ public static boolean redrawEditor(Taxon taxon){\r
+ \r
+ TaxonNameEditor editor = UiUtil.getTaxonNameEditor(taxon);\r
+ \r
+ if(editor == null || editor.redraw()){\r
+ \r
+ // Mark editor as changed and unsaved\r
+ editor.setDirty();\r
+ \r
+ return true; \r
+ } \r
+ return false;\r
+ }\r
+ \r
/**\r
* @param taxon\r
* @param save\r
import java.util.Set;\r
\r
import org.apache.log4j.Logger;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.core.commands.operations.IOperationHistory;\r
+import org.eclipse.core.commands.operations.IUndoContext;\r
+import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.core.databinding.observable.set.IObservableSet;\r
+import org.eclipse.core.runtime.IStatus;\r
import org.eclipse.jface.action.Action;\r
import org.eclipse.jface.action.IMenuListener;\r
import org.eclipse.jface.action.IMenuManager;\r
import org.eclipse.swt.widgets.Shell;\r
import org.eclipse.swt.widgets.Tree;\r
import org.eclipse.swt.widgets.TreeItem;\r
+import org.eclipse.ui.PartInitException;\r
\r
import eu.etaxonomy.cdm.model.name.NonViralName;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
+import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
import eu.etaxonomy.taxeditor.UiUtil;\r
import eu.etaxonomy.taxeditor.actions.TaxonTransfer;\r
import eu.etaxonomy.taxeditor.actions.cdm.DeleteTaxonAction;\r
import eu.etaxonomy.taxeditor.model.CdmUtil;\r
import eu.etaxonomy.taxeditor.model.ICdmTaxonSetListener;\r
import eu.etaxonomy.taxeditor.model.TaxonomicTreeContentProvider;\r
+import eu.etaxonomy.taxeditor.operations.MoveTaxonOperation;\r
+import eu.etaxonomy.taxeditor.operations.name.RemoveSynonymOperation;\r
\r
/**\r
* Taxon tree viewer which responds to events within individual taxa.\r
private ContextMenu contextMenu;\r
\r
private boolean quickAddMode;\r
+ \r
+ private IOperationHistory operationHistory;\r
+ private IUndoContext undoContext;\r
\r
private boolean initialized = false;\r
\r
// SW.VIRTUAL causes nodes to be loaded on-demand, improving performance\r
super(parent, SWT.VIRTUAL);\r
\r
+ operationHistory = UiUtil.getOperationHistory();\r
+ undoContext = UiUtil.getWorkbenchUndoContext();\r
+ \r
tree = this.getTree();\r
tree.setLinesVisible(false);\r
tree.setHeaderVisible(false);\r
}\r
}\r
\r
- new MoveTaxonAction(taxon, parentTaxon).run();\r
+ String text = "Move taxon"; //$NON-NLS-1$\r
+ \r
+ IUndoableOperation operation = new MoveTaxonOperation\r
+ (text, undoContext, taxon, parentTaxon);\r
+ try {\r
+ IStatus status = operationHistory.execute(operation, null, null);\r
+ } catch (ExecutionException e) {\r
+ logger.error("Error moving taxon", e);\r
+ } \r
}\r
});\r
}\r
\r
private void removeQuicklyAddedTaxon() {\r
if (quickAddTaxon != null) {\r
+ // TODO move the whole delete code to another place\r
new DeleteTaxonAction(quickAddTaxon).run();\r
// if above doesn't work, do remove session taxon but also w remove children\r
// TaxEditorPlugin.getDefault().removeSessionTaxon(quickAddTaxon);\r
NonViralName name = (NonViralName) quickAddTaxon.getName();\r
CdmParserController.parseFullReference(name, trimmedValue);\r
\r
- new SaveTaxonAction(quickAddTaxon).run();\r
+// new SaveTaxonAction(quickAddTaxon).run();\r
+ CdmSessionDataRepository.getDefault().saveTaxon(quickAddTaxon);\r
+ \r
quickAddTaxon = null;\r
}\r
}\r
Object element = ((StructuredSelection) event\r
.getSelection()).getFirstElement();\r
if (element instanceof Taxon) {\r
- new OpenTaxonEditorAction((Taxon) element).run();\r
+// new OpenTaxonEditorAction((Taxon) element).run();\r
+ try {\r
+ UiUtil.openTaxonEditor((Taxon) element);\r
+ } catch (PartInitException e) {\r
+ logger.error("Error opening taxon editor", e);\r
+ }\r
}\r
}\r
}\r
if (!(selection instanceof Taxon)) {\r
return;\r
}\r
- Taxon taxon = (Taxon) selection;\r
-\r
+ final Taxon taxon = (Taxon) selection;\r
+ \r
+ // Open new taxon editor window \r
Action openEditorAction = new OpenTaxonEditorAction(taxon);\r
manager.add(openEditorAction);\r
\r
+ // Open new editor with new child taxon. The taxon will not appear in the tree until saved\r
Action openNewChildEditorAction = new OpenNewChildNameEditorAction(\r
taxon);\r
manager.add(openNewChildEditorAction);\r
\r
+ // Create a new node in the tree to enter taxon name directly in the tree.\r
Action openQuickNameAction = new AddQuickNameAction(taxon);\r
manager.add(openQuickNameAction);\r
openQuickNameAction\r
});\r
\r
manager.add(new Separator());\r
-\r
+ \r
+ // Remove taxon from tree\r
Action deleteTaxonAction = new DeleteTaxonAction(taxon);\r
manager.add(deleteTaxonAction);\r
}\r
\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.UiUtil;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
\r
/**\r
* @author p.ciardelli\r
* @version 1.0\r
*/\r
public abstract class AbstractEditorOperation extends AbstractOperation {\r
+ \r
+ @SuppressWarnings("unused")\r
private static final Logger logger = Logger\r
.getLogger(AbstractEditorOperation.class);\r
\r
+ /** \r
+ * A reference to the taxon the concrete operation is working on \r
+ */\r
protected Taxon taxon;\r
\r
public AbstractEditorOperation(String label, IUndoContext undoContext,\r
this.taxon = taxon;\r
}\r
\r
- protected IStatus redrawOpenEditor() {\r
- \r
- // Redraw editor if exists\r
- TaxonNameEditor editor = UiUtil.getTaxonNameEditor(taxon);\r
- if(editor == null || editor.redraw()){\r
- \r
- // Mark editor as changed and unsaved\r
- editor.setDirty();\r
- \r
- return Status.OK_STATUS; \r
- } \r
- return Status.CANCEL_STATUS;\r
+ /**\r
+ * \r
+ * @return\r
+ */\r
+ protected IStatus redrawOpenEditor() { \r
+ return UiUtil.redrawEditor(taxon) ? Status.OK_STATUS : Status.CANCEL_STATUS;\r
}\r
}\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.core.commands.ExecutionException;\r
-import org.eclipse.core.commands.operations.AbstractOperation;\r
import org.eclipse.core.commands.operations.IUndoContext;\r
import org.eclipse.core.runtime.IAdaptable;\r
import org.eclipse.core.runtime.IProgressMonitor;\r
import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
\r
/**\r
+ * Delete a taxon from the model.\r
+ * \r
+ * TODO: Currently all data in session data repository has to be saved before deleting \r
+ * a taxon and the whole logic is happening here. This way we would have to implement \r
+ * the same logic in another place if we want to delete outside of an operation context\r
+ * (NOT undoable). Therefore it is desirable to have the logic implemented in another \r
+ * place and merely call a method here.\r
+ * \r
* @author n.hoffmann\r
* @created 16.01.2009\r
* @version 1.0\r
*/\r
public class DeleteTaxonOperation extends AbstractEditorOperation {\r
+ \r
+ @SuppressWarnings("unused")\r
private static Logger logger = Logger.getLogger(DeleteTaxonOperation.class);\r
\r
+ /**\r
+ * The taxonomical parent of the taxon to be deleted.\r
+ */\r
private Taxon parentTaxon;\r
+ \r
public DeleteTaxonOperation(String text, IUndoContext undoContext,\r
Taxon taxon) {\r
super(text, undoContext, taxon);\r
import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
\r
/**\r
+ * Change the taxonomic parent of a given taxon.\r
+ * \r
* @author n.hoffmann\r
* @created 16.01.2009\r
* @version 1.0\r
*/\r
public class MoveTaxonOperation extends AbstractEditorOperation {\r
\r
-\r
- private static Logger logger = Logger.getLogger(MoveTaxonOperation.class);\r
+ @SuppressWarnings("unused")\r
+ private static final Logger logger = Logger.getLogger(MoveTaxonOperation.class);\r
+ /**\r
+ * A reference to the new taxonomical parent.\r
+ */\r
private Taxon newParentTaxon;\r
+ /**\r
+ * A reference to the former taxonomical parent\r
+ */\r
private Taxon oldParentTaxon;\r
\r
public MoveTaxonOperation(String label, IUndoContext undoContext,\r
import org.eclipse.core.runtime.IAdaptable;\r
import org.eclipse.core.runtime.IProgressMonitor;\r
import org.eclipse.core.runtime.IStatus;\r
-import org.eclipse.core.runtime.Status;\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.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.UiUtil;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
import eu.etaxonomy.taxeditor.operations.AbstractEditorOperation;\r
\r
+/**\r
+ * Change a the homotypical group for a given synonym.\r
+ * \r
+ * @author n.hoffmann\r
+ * @created 19.01.2009\r
+ * @version 1.0\r
+ */\r
public class ChangeHomotypicGroupOperation extends AbstractEditorOperation {\r
\r
+ @SuppressWarnings("unused")\r
private static final Logger logger = Logger\r
.getLogger(ChangeHomotypicGroupOperation.class);\r
\r
+ /**\r
+ * The synonym to be moved.\r
+ */\r
private Synonym synonym; \r
+ /**\r
+ * The former homotypical group the synonym belonged to\r
+ */\r
private HomotypicalGroup oldHomotypicalGroup;\r
+ /**\r
+ * The homotypical group the synonym is to be moved to\r
+ */\r
private HomotypicalGroup newHomotypicalGroup;\r
\r
public ChangeHomotypicGroupOperation(String label, IUndoContext undoContext, \r
this.newHomotypicalGroup = newHomotypicalGroup;\r
}\r
\r
-\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)\r
+ */\r
@Override\r
public IStatus execute(IProgressMonitor monitor, IAdaptable info)\r
throws ExecutionException {\r
return redrawOpenEditor();\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)\r
+ */\r
@Override\r
public IStatus redo(IProgressMonitor monitor, IAdaptable info)\r
throws ExecutionException {\r
return execute(monitor, info);\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)\r
+ */\r
@Override\r
public IStatus undo(IProgressMonitor monitor, IAdaptable info)\r
throws ExecutionException {\r
// Add new taxon to tree\r
CdmSessionDataRepository.getDefault().addTaxon(newAcceptedTaxon);\r
\r
- // Open editor for new taxon\r
- new OpenTaxonEditorAction(newAcceptedTaxon).run();\r
-\r
+ // Open editor for new accepted taxon\r
+ try {\r
+ UiUtil.openTaxonEditor(newAcceptedTaxon);\r
+ } catch (PartInitException e) {\r
+ e.printStackTrace();\r
+ }\r
// Remove old taxon from recent names list\r
RecentNamesView.addRecentName(taxon);\r
\r