Project

General

Profile

Download (10.4 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy 
4
* http://www.e-taxonomy.eu
5
* 
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.
8
*/
9

    
10
package eu.etaxonomy.taxeditor.navigation;
11

    
12
import java.util.Set;
13
import java.util.UUID;
14

    
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;
30

    
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;
46

    
47
/**
48
 * <p>NavigationUtil class.</p>
49
 *
50
 * @author n.hoffmann
51
 * @created 24.03.2009
52
 * @version 1.0
53
 */
54
public class NavigationUtil extends AbstractUtility{
55
	private static IUndoContext defaultUndoContext;
56
		
57
	/**
58
	 * <p>executeEditHandler</p>
59
	 */
60
	public static void executeEditHandler(){
61

    
62
		String commandId = "eu.etaxonomy.taxeditor.navigation.command.editSelection";
63
		
64
		IHandlerService handlerService = (IHandlerService) NavigationUtil.getService(IHandlerService.class); 
65
		try {
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);
75
		}
76
	}
77
	
78
	/**
79
	 * <p>openEditor</p>
80
	 *
81
	 * @param selectedObject a {@link eu.etaxonomy.cdm.model.common.CdmBase} object.
82
	 */
83
	public static void openEditor(ICdmBase selectedObject){
84
		UUID entityUuid = selectedObject.getUuid();	
85
		try {	
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);
95
			}else{
96
				warningDialog("Unsupported Type", NavigationUtil.class, "No editor exists for the current selection: " + selectedObject);
97
			}
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());
102
		}
103
	}
104
	
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){
109
				try {
110
					EditorUtil.openTaxonBase(((UuidAndTitleCache) selectedObject).getUuid());
111
				} catch (PartInitException e) {
112
					NavigationUtil.error(NavigationUtil.class, "Error opening the editor", e);
113
				}
114
			}
115
		}else if(selectedObject instanceof ICdmBase){
116
			openEditor((ICdmBase) selectedObject); 
117
		}else{
118
			NavigationUtil.error(NavigationUtil.class, new IllegalArgumentException("Selected object is not supported: " + selectedObject));
119
		}
120
	}
121
	
122
	/**
123
	 * <p>openEmpty</p>
124
	 *
125
	 * @param parentNodeUuid a {@link java.util.UUID} object.
126
	 */
127
	public static void openEmpty(UUID parentNodeUuid) {
128
		try {
129
			EditorUtil.openEmpty(parentNodeUuid);
130
		} catch (PartInitException e) {
131
			NavigationUtil.error(NavigationUtil.class, "Error opening the editor", e);
132
		}
133
	}
134
	
135
	/**
136
	 * <p>getShell</p>
137
	 *
138
	 * @return a {@link org.eclipse.swt.widgets.Shell} object.
139
	 */
140
	public static Shell getShell() {
141
		return getActiveWindow().getShell();
142
	}
143

    
144
	/**
145
	 * <p>getActiveWindow</p>
146
	 *
147
	 * @return a {@link org.eclipse.ui.IWorkbenchWindow} object.
148
	 */
149
	public static IWorkbenchWindow getActiveWindow() {
150
		return TaxeditorNavigationPlugin.getDefault().getWorkbench().
151
				getActiveWorkbenchWindow();
152
	}
153
	
154
	/**
155
	 * <p>getWorkbenchUndoContext</p>
156
	 *
157
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext} object.
158
	 */
159
	public static IUndoContext getWorkbenchUndoContext() {
160
		return TaxeditorEditorPlugin.getDefault().getWorkbench().
161
					getOperationSupport().getUndoContext();
162
	}
163

    
164
	/**
165
	 * <p>getUndoContext</p>
166
	 *
167
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext} object.
168
	 */
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;
172
		
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();
178
		}
179
		return defaultUndoContext;
180
	}
181

    
182
	/**
183
	 * Whether a taxonNode has unsaved changes.
184
	 *
185
	 * @param taxonNode a {@link eu.etaxonomy.cdm.model.taxon.TaxonNode} object.
186
	 * @return a boolean.
187
	 */
188
	public static boolean isDirty(TaxonNode taxonNode){
189
		
190
		for (IEditorReference reference : getActivePage().getEditorReferences()) {
191
			
192
			try {
193
				if (reference.getEditorInput() instanceof TaxonEditorInput) {
194
					TaxonEditorInput editorInput = (TaxonEditorInput) reference.getEditorInput();
195
					if(editorInput.getTaxonNode().equals(taxonNode) && reference.isDirty()){
196
						return true;
197
					}
198
				}
199
			} catch (PartInitException e) {
200
				NavigationUtil.error(NavigationUtil.class, e.getMessage(), e);
201
				throw new RuntimeException(e);
202
			}
203
			
204
		}
205
		return false;
206
	}
207

    
208
	/**
209
	 * <p>selectInNavigator</p>
210
	 *
211
	 * @param element a {@link java.lang.Object} object.
212
	 * @param parentElement a {@link java.lang.Object} object.
213
	 */
214
	public static void selectInNavigator(final Object element, final Object parentElement) {
215
		Display.getDefault().asyncExec(new Runnable(){
216

    
217
			public void run() {
218
				TaxonNavigator navigator = showNavigator();
219

    
220
				if (navigator != null) {
221
					CommonViewer viewer = navigator.getCommonViewer();
222
					if (viewer != null) {
223
						if (parentElement != null) {
224
							viewer.setExpandedState(parentElement, true);
225
						}
226
						viewer.setSelection(new StructuredSelection((TaxonNode) element));
227
					}
228
				}
229
			}
230
			
231
		});
232
	}
233

    
234
	/**
235
	 * <p>openSearch</p>
236
	 *
237
	 * @param selection a {@link java.lang.Object} object.
238
	 */
239
	public static void openSearch(Object selection) {
240
		if(selection instanceof Taxon){
241
			Taxon taxon = (Taxon) selection;
242
			
243
			handleOpeningOfMultipleTaxonNodes(taxon.getTaxonNodes());
244
			
245
		}else if(selection instanceof Synonym){
246
			Synonym synonym = (Synonym) selection;
247
			
248
			handleOpeningOfMultipleTaxa(synonym.getAcceptedTaxa());
249
			
250
		}else{
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.");
252
		}
253
		
254
	}
255

    
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.");
266
		}
267
	}
268

    
269
	/**
270
	 * @param taxonNodes
271
	 */
272
	private static void handleOpeningOfMultipleTaxonNodes(
273
			Set<TaxonNode> taxonNodes) {
274
		
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.");
284
		}
285
	}
286

    
287
	/**
288
	 * <p>showNavigator</p>
289
	 *
290
	 * @return the TaxonNavigator instance if present
291
	 */
292
	public static TaxonNavigator showNavigator() {
293
		return (TaxonNavigator) showView(TaxonNavigator.ID);
294
	}
295

    
296
	/**
297
	 * <p>getNavigator</p>
298
	 *
299
	 * @param restore a boolean.
300
	 * @return a {@link eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator} object.
301
	 */
302
	public static TaxonNavigator getNavigator(boolean restore) {
303
		return (TaxonNavigator) getView(TaxonNavigator.ID, restore);
304
	}
305

    
306
	/**
307
	 * <p>getOpenEditors</p>
308
	 *
309
	 * @return a {@link java.util.Set} object.
310
	 */
311
	public static Set<IEditorPart> getOpenEditors() {
312
		return EditorUtil.getOpenEditors();
313
	}
314

    
315
	/**
316
	 * <p>getPluginId</p>
317
	 *
318
	 * @return a {@link java.lang.String} object.
319
	 */
320
	public static String getPluginId(){
321
		return TaxeditorNavigationPlugin.PLUGIN_ID;
322
	}
323

    
324
}
(1-1/4)