2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.navigation
;
13 import java
.util
.UUID
;
15 import org
.eclipse
.core
.commands
.ExecutionException
;
16 import org
.eclipse
.core
.commands
.NotEnabledException
;
17 import org
.eclipse
.core
.commands
.NotHandledException
;
18 import org
.eclipse
.core
.commands
.common
.NotDefinedException
;
19 import org
.eclipse
.core
.commands
.operations
.IUndoContext
;
20 import org
.eclipse
.core
.commands
.operations
.UndoContext
;
21 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
22 import org
.eclipse
.swt
.widgets
.Display
;
23 import org
.eclipse
.swt
.widgets
.Shell
;
24 import org
.eclipse
.ui
.IEditorPart
;
25 import org
.eclipse
.ui
.IEditorReference
;
26 import org
.eclipse
.ui
.IWorkbenchWindow
;
27 import org
.eclipse
.ui
.PartInitException
;
28 import org
.eclipse
.ui
.handlers
.IHandlerService
;
29 import org
.eclipse
.ui
.navigator
.CommonViewer
;
31 import eu
.etaxonomy
.cdm
.model
.common
.ICdmBase
;
32 import eu
.etaxonomy
.cdm
.model
.common
.UuidAndTitleCache
;
33 import eu
.etaxonomy
.cdm
.model
.description
.PolytomousKey
;
34 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
35 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
36 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
37 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
38 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
39 import eu
.etaxonomy
.taxeditor
.editor
.EditorUtil
;
40 import eu
.etaxonomy
.taxeditor
.editor
.OpenEditorConfiguration
;
41 import eu
.etaxonomy
.taxeditor
.editor
.TaxonEditorInput
;
42 import eu
.etaxonomy
.taxeditor
.editor
.internal
.TaxeditorEditorPlugin
;
43 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
44 import eu
.etaxonomy
.taxeditor
.navigation
.internal
.TaxeditorNavigationPlugin
;
45 import eu
.etaxonomy
.taxeditor
.navigation
.navigator
.TaxonNavigator
;
48 * <p>NavigationUtil class.</p>
54 public class NavigationUtil
extends AbstractUtility
{
55 private static IUndoContext defaultUndoContext
;
58 * <p>executeEditHandler</p>
60 public static void executeEditHandler(){
62 String commandId
= "eu.etaxonomy.taxeditor.navigation.command.editSelection";
64 IHandlerService handlerService
= (IHandlerService
) NavigationUtil
.getService(IHandlerService
.class);
66 handlerService
.executeCommand(commandId
, null);
67 } catch (ExecutionException e
) {
68 NavigationUtil
.error(NavigationUtil
.class, e
);
69 } catch (NotDefinedException e
) {
70 NavigationUtil
.error(NavigationUtil
.class, e
);
71 } catch (NotEnabledException e
) {
72 NavigationUtil
.error(NavigationUtil
.class, e
);
73 } catch (NotHandledException e
) {
74 NavigationUtil
.error(NavigationUtil
.class, e
);
81 * @param selectedObject a {@link eu.etaxonomy.cdm.model.common.CdmBase} object.
83 public static void openEditor(ICdmBase selectedObject
){
84 UUID entityUuid
= selectedObject
.getUuid();
86 if(selectedObject
instanceof TaxonNode
){
87 EditorUtil
.openTaxonNode(entityUuid
);
88 }else if(selectedObject
instanceof TaxonBase
){
89 EditorUtil
.openTaxonBase(entityUuid
);
90 }else if(selectedObject
instanceof TaxonNameBase
){
91 // TODO open bulk editor
92 warningDialog("Not implemented yet", NavigationUtil
.class, "You tried to open a name. This is not handled by the software yet.");
93 }else if(selectedObject
instanceof PolytomousKey
){
94 EditorUtil
.openPolytomousKey(entityUuid
);
96 warningDialog("Unsupported Type", NavigationUtil
.class, "No editor exists for the current selection: " + selectedObject
);
98 } catch (PartInitException e
) {
99 NavigationUtil
.error(NavigationUtil
.class, "Error opening the editor", e
);
100 } catch (Exception e
) {
101 EditorUtil
.warningDialog("Could not create Taxon", NavigationUtil
.class, e
.getMessage());
105 public static void openEditor(Object selectedObject
){
106 if (selectedObject
instanceof UuidAndTitleCache
){
107 Class type
= ((UuidAndTitleCache
) selectedObject
).getType();
108 if(type
== Taxon
.class || type
== Synonym
.class){
110 EditorUtil
.openTaxonBase(((UuidAndTitleCache
) selectedObject
).getUuid());
111 } catch (PartInitException e
) {
112 NavigationUtil
.error(NavigationUtil
.class, "Error opening the editor", e
);
115 }else if(selectedObject
instanceof ICdmBase
){
116 openEditor((ICdmBase
) selectedObject
);
118 NavigationUtil
.error(NavigationUtil
.class, new IllegalArgumentException("Selected object is not supported: " + selectedObject
));
125 * @param parentNodeUuid a {@link java.util.UUID} object.
127 public static void openEmpty(UUID parentNodeUuid
) {
129 EditorUtil
.openEmpty(parentNodeUuid
);
130 } catch (PartInitException e
) {
131 NavigationUtil
.error(NavigationUtil
.class, "Error opening the editor", e
);
138 * @return a {@link org.eclipse.swt.widgets.Shell} object.
140 public static Shell
getShell() {
141 return getActiveWindow().getShell();
145 * <p>getActiveWindow</p>
147 * @return a {@link org.eclipse.ui.IWorkbenchWindow} object.
149 public static IWorkbenchWindow
getActiveWindow() {
150 return TaxeditorNavigationPlugin
.getDefault().getWorkbench().
151 getActiveWorkbenchWindow();
155 * <p>getWorkbenchUndoContext</p>
157 * @return a {@link org.eclipse.core.commands.operations.IUndoContext} object.
159 public static IUndoContext
getWorkbenchUndoContext() {
160 return TaxeditorEditorPlugin
.getDefault().getWorkbench().
161 getOperationSupport().getUndoContext();
165 * <p>getUndoContext</p>
167 * @return a {@link org.eclipse.core.commands.operations.IUndoContext} object.
169 public static IUndoContext
getUndoContext() {
170 // FIXME this has to be more specific. Every widget has to have its own undo context
171 // return IOperationHistory.GLOBAL_UNDO_CONTEXT;
173 // Plug-ins that wish their operations to be undoable from workbench views
174 // such as the Navigator or Package Explorer should assign the workbench
175 // undo context to their operations.
176 if (defaultUndoContext
== null) {
177 defaultUndoContext
= new UndoContext();
179 return defaultUndoContext
;
183 * Whether a taxonNode has unsaved changes.
185 * @param taxonNode a {@link eu.etaxonomy.cdm.model.taxon.TaxonNode} object.
188 public static boolean isDirty(TaxonNode taxonNode
){
190 for (IEditorReference reference
: getActivePage().getEditorReferences()) {
193 if (reference
.getEditorInput() instanceof TaxonEditorInput
) {
194 TaxonEditorInput editorInput
= (TaxonEditorInput
) reference
.getEditorInput();
195 if(editorInput
.getTaxonNode().equals(taxonNode
) && reference
.isDirty()){
199 } catch (PartInitException e
) {
200 NavigationUtil
.error(NavigationUtil
.class, e
.getMessage(), e
);
201 throw new RuntimeException(e
);
209 * <p>selectInNavigator</p>
211 * @param element a {@link java.lang.Object} object.
212 * @param parentElement a {@link java.lang.Object} object.
214 public static void selectInNavigator(final Object element
, final Object parentElement
) {
215 Display
.getDefault().asyncExec(new Runnable(){
218 TaxonNavigator navigator
= showNavigator();
220 if (navigator
!= null) {
221 CommonViewer viewer
= navigator
.getCommonViewer();
222 if (viewer
!= null) {
223 if (parentElement
!= null) {
224 viewer
.setExpandedState(parentElement
, true);
226 viewer
.setSelection(new StructuredSelection((TaxonNode
) element
));
237 * @param selection a {@link java.lang.Object} object.
239 public static void openSearch(Object selection
) {
240 if(selection
instanceof Taxon
){
241 Taxon taxon
= (Taxon
) selection
;
243 handleOpeningOfMultipleTaxonNodes(taxon
.getTaxonNodes());
245 }else if(selection
instanceof Synonym
){
246 Synonym synonym
= (Synonym
) selection
;
248 handleOpeningOfMultipleTaxa(synonym
.getAcceptedTaxa());
251 warningDialog("Not implemented yet", NavigationUtil
.class, "You chose to open a name that has no connection to a taxon. The Editor does not support editing of such a content type at the moment.");
256 private static void handleOpeningOfMultipleTaxa(Set
<Taxon
> acceptedTaxa
) {
257 if(acceptedTaxa
.size() == 1){
258 openEditor(acceptedTaxa
.iterator().next());
259 }else if(acceptedTaxa
.size() > 1){
260 // FIXME implement a dialog that shows all possible taxa and let the user choose which he wants to open.
261 warningDialog("Not implemented yet", NavigationUtil
.class, "The accepted taxon is in multiple taxonomic trees. We currently do not know which one you want to open." +
262 " This case is not handled yet by the software.");
263 }else if(acceptedTaxa
.size() == 0){
264 // this is an undesired state
265 warningDialog("Not implemented yet", NavigationUtil
.class, "This taxon is not connected to a classification. Currently editing of such taxa is not supported yet.");
272 private static void handleOpeningOfMultipleTaxonNodes(
273 Set
<TaxonNode
> taxonNodes
) {
275 if(taxonNodes
.size() == 1){
276 openEditor(taxonNodes
.iterator().next());
277 }else if(taxonNodes
.size() > 1){
278 // FIXME implement a dialog that shows all possible taxa and let the user choose which he wants to open.
279 warningDialog("Not implemented yet", NavigationUtil
.class, "The accepted taxon is in multiple taxonomic trees. We currently do not know which one you want to open." +
280 " This case is not handled yet by the software.");
281 }else if(taxonNodes
.size() == 0){
282 // this is an undesired state
283 warningDialog("Incorrect state", NavigationUtil
.class, "The accepted taxon is not in a taxonomic view. This should not have happened.");
288 * <p>showNavigator</p>
290 * @return the TaxonNavigator instance if present
292 public static TaxonNavigator
showNavigator() {
293 return (TaxonNavigator
) showView(TaxonNavigator
.ID
);
297 * <p>getNavigator</p>
299 * @param restore a boolean.
300 * @return a {@link eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator} object.
302 public static TaxonNavigator
getNavigator(boolean restore
) {
303 return (TaxonNavigator
) getView(TaxonNavigator
.ID
, restore
);
307 * <p>getOpenEditors</p>
309 * @return a {@link java.util.Set} object.
311 public static Set
<IEditorPart
> getOpenEditors() {
312 return EditorUtil
.getOpenEditors();
318 * @return a {@link java.lang.String} object.
320 protected static String
getPluginId(){
321 return TaxeditorNavigationPlugin
.PLUGIN_ID
;