Project

General

Profile

Download (12.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.editor;
11

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

    
15
import org.eclipse.core.commands.ExecutionEvent;
16
import org.eclipse.core.commands.operations.IOperationHistory;
17
import org.eclipse.core.commands.operations.IUndoContext;
18
import org.eclipse.e4.ui.model.application.MApplication;
19
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
20
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
21
import org.eclipse.e4.ui.workbench.modeling.EModelService;
22
import org.eclipse.e4.ui.workbench.modeling.EPartService;
23
import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
24
import org.eclipse.jface.dialogs.MessageDialog;
25
import org.eclipse.jface.viewers.ISelection;
26
import org.eclipse.jface.viewers.IStructuredSelection;
27
import org.eclipse.jface.viewers.TreeNode;
28
import org.eclipse.swt.widgets.Shell;
29
import org.eclipse.ui.IEditorPart;
30
import org.eclipse.ui.PartInitException;
31
import org.eclipse.ui.handlers.HandlerUtil;
32

    
33
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
34
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
35
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
36
import eu.etaxonomy.cdm.model.taxon.Synonym;
37
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
38
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
39
import eu.etaxonomy.taxeditor.editor.e4.TaxonEditorInputE4;
40
import eu.etaxonomy.taxeditor.editor.group.authority.CdmAuthorityEditorInput;
41
import eu.etaxonomy.taxeditor.editor.group.authority.e4.CdmAuthorityEditorE4;
42
import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
43
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
44
import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
45
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
46
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput;
47
import eu.etaxonomy.taxeditor.model.AbstractUtility;
48
import eu.etaxonomy.taxeditor.model.MessagingUtils;
49
import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
50

    
51
/**
52
 * Utility for the editor package
53
 *
54
 * @author n.hoffmann
55
 * @created 20.01.2009
56
 * @version 1.0
57
 */
58
public class EditorUtil extends AbstractUtility {
59

    
60
    private static final String NAME_EDITOR_ID = "eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4";
61
    private static boolean isSaving = false;
62

    
63
	/**
64
	 * Opens a new {@link DataImportEditor} for the given input
65
	 * @param input a {@link DataImportEditorInput}
66
	 * @throws PartInitException
67
	 */
68
//	public static void open(DataImportEditorInput<?> input)
69
//	        throws PartInitException {
70
//	    if(input instanceof BioCaseEditorInput){
71
//	        open(input, SpecimenImportEditor.ID);
72
//	    }
73
//	    else if(input instanceof GbifImportEditorInput){
74
//	        open(input, GbifImportEditor.ID);
75
//	    }
76
//	}
77

    
78
    public static void openSpecimenEditor(DerivateViewEditorInput input, EModelService modelService, EPartService partService, MApplication application){
79
        MPart part = partService.createPart(AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DERIVATE_DERIVATEVIEW);
80
        MPartStack editorAreaPartStack = WorkbenchUtility.getEditorAreaPartStack(application, modelService);
81
        if(editorAreaPartStack!=null){
82
            editorAreaPartStack.getChildren().add(part);
83
        }
84
        part = partService.showPart(part, PartState.ACTIVATE);
85
        DerivateView derivateView = (DerivateView) part.getObject();
86
        derivateView.init(input);
87
    }
88

    
89
	public static void openTaxonNodeE4(UUID taxonNodeUuid, EModelService modelService, EPartService partService, MApplication application) {
90
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(taxonNodeUuid);
91
	    openNameEditor_internal(input, modelService, partService, application);
92
	}
93

    
94
	public static void openTaxonBaseE4(UUID taxonBaseUuid, EModelService modelService, EPartService partService, MApplication application) {
95
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
96
	    openNameEditor_internal(input, modelService, partService, application);
97
	}
98

    
99
    public static void openTaxonBaseE4(UUID taxonBaseUuid) {
100
        //FIXME E4 this can probably be removed when fully migrated
101
        TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
102

    
103
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
104
        EModelService modelService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EModelService.class);
105
        openNameEditor_internal(input, modelService, partService, null);
106
    }
107

    
108
    private static void openNameEditor_internal(TaxonEditorInputE4 input, EModelService modelService, EPartService partService, MApplication application) {
109
        TaxonBase taxonBase = input.getTaxon();
110
        if(taxonBase==null){
111
            return;
112
        }
113
        if (taxonBase.isOrphaned()) {
114
            if(taxonBase.isInstanceOf(Synonym.class)){
115
                MessagingUtils.warningDialog(Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON, TaxonEditorInputE4.class, Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON_MESSAGE);
116
                return;
117
            }
118
            else{
119
                MessagingUtils.warningDialog(Messages.EditorUtil_ORPHAN_TAXON, TaxonEditorInputE4.class, Messages.EditorUtil_ORPHAN_TAXON_MESSAGE);
120
                return;
121
            }
122
        }
123

    
124
        Collection<MPart> parts = partService.getParts();
125
        //check if part is already opened
126
        for (MPart part : parts) {
127
            if(part.getObject() instanceof TaxonNameEditorE4
128
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
129
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().equals(input.getTaxon())){
130
                //close part to invoke refresh for new part
131
                partService.hidePart(part);
132
                break;
133
            }
134
        }
135
        MPart part = partService.createPart(NAME_EDITOR_ID);
136

    
137
        MPartStack editorAreaPartStack = WorkbenchUtility.getEditorAreaPartStack(application, modelService);
138
        if(editorAreaPartStack!=null){
139
            editorAreaPartStack.getChildren().add(part);
140
        }
141
        part = partService.showPart(part, PartState.ACTIVATE);
142

    
143
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
144
        editor.init(input);
145
    }
146
    public static void openRightsEditor(CdmAuthorityEditorInput input, EModelService modelService, EPartService partService, MApplication application){
147
        MPart part = partService.createPart("eu.etaxonomy.taxeditor.editor.group.authority.e4.CdmAuthorityEditorE4");
148
        MPartStack editorAreaPartStack = WorkbenchUtility.getEditorAreaPartStack(application, modelService);
149
        if(editorAreaPartStack!=null){
150
            editorAreaPartStack.getChildren().add(part);
151
        }
152
        part = partService.showPart(part, PartState.ACTIVATE);
153
        CdmAuthorityEditorE4 authorityView = (CdmAuthorityEditorE4) part.getObject();
154
        authorityView.init(input);
155
    }
156

    
157
	/**
158
	 * An uninitialized taxon is one that hasn't been saved yet. As such, it
159
	 * should appear in neither the list of recent names nor in the taxonomic
160
	 * tree when opened.
161
	 *
162
	 * @param parentNodeUuid
163
	 *            a {@link java.util.UUID} object.
164
	 */
165
	public static void openEmptyE4(UUID parentNodeUuid) {
166
		TaxonEditorInputE4 input = TaxonEditorInputE4
167
				.NewEmptyInstance(parentNodeUuid);
168
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
169
        MPart part = partService.createPart(NAME_EDITOR_ID);
170
        part = partService.showPart(part, PartState.ACTIVATE);
171
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
172
        editor.init(input);
173
	}
174

    
175
	/**
176
	 * <p>
177
	 * setSaving
178
	 * </p>
179
	 *
180
	 * @param isSaving
181
	 *            a boolean.
182
	 */
183
	public static void setSaving(boolean isSaving) {
184
		EditorUtil.isSaving = isSaving;
185
	}
186

    
187
	/**
188
	 * <p>
189
	 * isSaving
190
	 * </p>
191
	 *
192
	 * @return a boolean.
193
	 */
194
	public static boolean isSaving() {
195
		return isSaving;
196
	}
197

    
198
	/**
199
	 * <p>
200
	 * getUndoContext
201
	 * </p>
202
	 *
203
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext}
204
	 *         object.
205
	 */
206
	public static IUndoContext getUndoContext() {
207
		return IOperationHistory.GLOBAL_UNDO_CONTEXT;
208
	}
209

    
210
	/**
211
	 * <p>
212
	 * forceUserSave
213
	 * </p>
214
	 *
215
	 * @param editor
216
	 *            a {@link org.eclipse.ui.IEditorPart} object.
217
	 * @param shell
218
	 *            a {@link org.eclipse.swt.widgets.Shell} object.
219
	 * @return a boolean.
220
	 */
221
	public static boolean forceUserSave(IEditorPart editor, Shell shell) {
222
		if (editor.isDirty()) {
223

    
224
			boolean doSave = MessageDialog
225
					.openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
226
							Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
227

    
228
			if (!doSave) {
229
				return false;
230
			}
231

    
232
			editor.doSave(AbstractUtility.getMonitor());
233
		}
234
		return true;
235
	}
236

    
237
	public static boolean forceUserSaveE4Editor(TaxonNameEditorE4 editor, Shell shell) {
238
	    if (editor.isDirty()) {
239

    
240
	        boolean doSave = MessageDialog
241
	                .openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
242
	                        Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
243

    
244
	        if (!doSave) {
245
	            return false;
246
	        }
247

    
248
	        editor.save(AbstractUtility.getMonitor());
249
	    }
250
	    return true;
251
	}
252

    
253
	/**
254
	 * <p>
255
	 * getSelection
256
	 * </p>
257
	 *
258
	 * @param event
259
	 *            a {@link org.eclipse.core.commands.ExecutionEvent} object.
260
	 * @return a {@link org.eclipse.jface.viewers.IStructuredSelection} object.
261
	 */
262
	public static IStructuredSelection getSelection(ExecutionEvent event) {
263
		IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
264

    
265
		return (IStructuredSelection) activeEditor.getSite()
266
				.getSelectionProvider().getSelection();
267
	}
268

    
269
	/**
270
	 * <p>
271
	 * getPluginId
272
	 * </p>
273
	 *
274
	 * @return a {@link java.lang.String} object.
275
	 */
276
	public static String getPluginId() {
277
		return TaxeditorEditorPlugin.PLUGIN_ID;
278
	}
279

    
280
	/**
281
	 * Iterates recursively over all originals having the given specimen as a derivate.
282
	 * The first {@link DerivedUnit} with no more originals or the first {@link FieldUnit} is returned
283
	 * @param specimen the start element for which the originals are iterated recursively
284
	 * @return either a FieldUnit or a the topmost DerivedUnit (which can be itself)
285
	 */
286
	public static SpecimenOrObservationBase<?> getTopMostDerivate(SpecimenOrObservationBase<?> specimen){
287
	    if(specimen.isInstanceOf(FieldUnit.class)){
288
	        return specimen;
289
	    }
290
	    else if(specimen instanceof DerivedUnit
291
	            && ((DerivedUnit) specimen).getOriginals()!=null
292
	            && !((DerivedUnit) specimen).getOriginals().isEmpty()){
293
	        for(SpecimenOrObservationBase<?> original:((DerivedUnit) specimen).getOriginals()){
294
	            return getTopMostDerivate(original);
295
	        }
296
	        //needed to add this for compilation although this is unreachable
297
	        return specimen;
298
	    }
299
	    else{
300
	        return specimen;
301
	    }
302
	}
303

    
304
    /**
305
     * If the current selection is a single {@link TreeNode} it will be returned.
306
     * @param selection the selection to check
307
     * @return the selected TreeNode or <code>null</code> if no TreeNode selected
308
     */
309
    public static TreeNode getTreeNodeOfSelection(ISelection selection){
310
        if(selection instanceof IStructuredSelection
311
                && ((IStructuredSelection) selection).size()==1
312
                && ((IStructuredSelection) selection).getFirstElement() instanceof TreeNode){
313
            return (TreeNode) ((IStructuredSelection) selection).getFirstElement();
314

    
315
        }
316
        return null;
317
    }
318

    
319
    public static void closeObsoleteEditor(TaxonNode taxonNode, EPartService partService){
320
        String treeIndex = taxonNode.treeIndex();
321
        Collection<MPart> parts = partService.getParts();
322
        for (MPart part : parts) {
323
            Object object = part.getObject();
324
            if(object instanceof TaxonNameEditorE4){
325
                TaxonNameEditorE4 taxonEditor = (TaxonNameEditorE4)object;
326
                TaxonNode node = taxonEditor.getEditorInput().getTaxonNode();
327
                if(node.treeIndex().startsWith(treeIndex)){
328
                    partService.hidePart(part, true);
329
                }
330
            }
331
        }
332
    }
333
}
(4-4/11)