Project

General

Profile

Download (17.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.handlers.HandlerUtil;
31

    
32
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
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.cdm.persistence.dto.TaxonNodeDto;
40
import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.DescriptiveDataSetEditor;
41
import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrixPart;
42
import eu.etaxonomy.taxeditor.editor.e4.TaxonEditorInputE4;
43
import eu.etaxonomy.taxeditor.editor.group.authority.CdmAuthorityEditorInput;
44
import eu.etaxonomy.taxeditor.editor.group.authority.e4.CdmAuthorityEditorE4;
45
import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
46
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
47
import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
48
import eu.etaxonomy.taxeditor.editor.view.checklist.e4.DistributionEditorPart;
49
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
50
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput;
51
import eu.etaxonomy.taxeditor.model.AbstractUtility;
52
import eu.etaxonomy.taxeditor.model.MessagingUtils;
53
import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
54

    
55
/**
56
 * Utility for the editor package
57
 *
58
 * @author n.hoffmann
59
 * @created 20.01.2009
60
 * @version 1.0
61
 */
62
public class EditorUtil extends AbstractUtility {
63

    
64
    private static final String NAME_EDITOR_ID = "eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4";
65

    
66
    public static void openDescriptiveDataSetEditor(UUID descriptiveDataSetUuid, EModelService modelService, EPartService partService, MApplication application){
67
        Collection<MPart> parts = partService.getParts();
68
        for (MPart part : parts) {
69
            if(part.getObject() instanceof DescriptiveDataSetEditor
70
                && ((DescriptiveDataSetEditor) part.getObject()).getDescriptiveDataSet().getUuid().equals(descriptiveDataSetUuid)){
71
                partService.showPart(part, PartState.ACTIVATE);
72
                return;
73
            }
74
        }
75
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVEDATASET_DESCRIPTIVEDATASETEDITOR;
76
        MPart part = showPart(partId, modelService, partService, application);
77
        DescriptiveDataSetEditor editor = (DescriptiveDataSetEditor) part.getObject();
78
        editor.init(descriptiveDataSetUuid);
79
    }
80

    
81
    public static void openCharacterMatrix(UUID descriptiveDataSetUuid, EModelService modelService, EPartService partService, MApplication application){
82
        Collection<MPart> parts = partService.getParts();
83
        for (MPart part : parts) {
84
            if(part.getObject() instanceof CharacterMatrixPart
85
                && ((CharacterMatrixPart) part.getObject()).getDescriptiveDataSet().getUuid().equals(descriptiveDataSetUuid)){
86
                partService.showPart(part, PartState.ACTIVATE);
87
                return;
88
            }
89
        }
90
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_DESCRIPTIVEDATASET_MATRIX_CHARACTERMATRIXPART;
91
        MPart part = showPart(partId, modelService, partService, application);
92
        CharacterMatrixPart editor = (CharacterMatrixPart) part.getObject();
93
        editor.init(descriptiveDataSetUuid, true);
94
    }
95

    
96
    public static void openDistributionEditor(UUID parentTaxonUuid, EModelService modelService, EPartService partService, MApplication application){
97
        Collection<MPart> parts = partService.getParts();
98
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_CHECKLIST_E4_DISTRIBUTIONEDITORPART;
99
        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4;
100
        String partIdMedia = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4;
101
        closePart(partIdMedia, partService);
102
        closePart(partIdFactualData, partService);
103
        MPart part = showPart(partId, modelService, partService, application);
104
        DistributionEditorPart editor = (DistributionEditorPart) part.getObject();
105
        editor.init(parentTaxonUuid);
106
    }
107

    
108

    
109
    public static void openSpecimenEditor(DerivateViewEditorInput input, EModelService modelService, EPartService partService, MApplication application){
110
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DERIVATE_DERIVATEVIEW;
111
        MPart part = showPart(partId, modelService, partService, application);
112
        DerivateView derivateView = (DerivateView) part.getObject();
113
        derivateView.init(input);
114
    }
115

    
116
    public static void openRightsEditor(CdmAuthorityEditorInput input, EModelService modelService, EPartService partService, MApplication application){
117
        Collection<MPart> parts = partService.getParts();
118
        for (MPart part : parts) {
119
            if(part.getObject() instanceof CdmAuthorityEditorE4
120
                && ((CdmAuthorityEditorE4) part.getObject()).getInput().getGroup().equals(input.getGroup())){
121
                partService.showPart(part, PartState.ACTIVATE);
122
                return;
123
            }
124
        }
125
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_GROUP_AUTHORITY_E4_CDMAUTHORITYEDITORE4;
126
        MPart part = showPart(partId, modelService, partService, application);
127
        CdmAuthorityEditorE4 authorityView = (CdmAuthorityEditorE4) part.getObject();
128
        authorityView.init(input);
129
    }
130

    
131
    public static MPart showPart(String partId, EModelService modelService, EPartService partService, MApplication application){
132
        MPart part = partService.findPart(partId);
133
        if(part==null || modelService.getPartDescriptor(partId).isAllowMultiple()){
134
            part = partService.createPart(partId);
135
        }
136
        MPartStack editorAreaPartStack = WorkbenchUtility.getEditorAreaPartStack(application, modelService);
137
        if(editorAreaPartStack!=null){
138
            editorAreaPartStack.getChildren().add(part);
139
        }
140
        return partService.showPart(part, PartState.ACTIVATE);
141
    }
142

    
143
    public static MPart showPart(String partId, EModelService modelService, EPartService partService){
144
        MPart part = partService.findPart(partId);
145
        if(part==null || modelService.getPartDescriptor(partId).isAllowMultiple()){
146
            part = partService.createPart(partId);
147
            partService.activate(part);
148
        }else{
149
            partService.activate(part);
150
        }
151

    
152
       return part;
153
    }
154

    
155
	public static void openTaxonNodeE4(UUID taxonNodeUuid, EModelService modelService, EPartService partService, MApplication application) {
156
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(taxonNodeUuid);
157
	    openNameEditor_internal(input, modelService, partService, application);
158
	}
159

    
160
	public static void openTaxonBaseE4(UUID taxonBaseUuid, EModelService modelService, EPartService partService, MApplication application) {
161
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
162
	    openNameEditor_internal(input, modelService, partService, application);
163
	}
164

    
165
    public static void openTaxonBaseE4(UUID taxonBaseUuid) {
166
        //FIXME E4 this can probably be removed when fully migrated
167
        TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
168

    
169
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
170
        EModelService modelService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EModelService.class);
171
        openNameEditor_internal(input, modelService, partService, null);
172
    }
173

    
174
    private static void openNameEditor_internal(TaxonEditorInputE4 input, EModelService modelService, EPartService partService, MApplication application) {
175
        TaxonBase taxonBase = input.getTaxon();
176
        if(taxonBase==null){
177
            return;
178
        }
179
        if (taxonBase.isOrphaned()) {
180
            if(taxonBase.isInstanceOf(Synonym.class)){
181
                MessagingUtils.warningDialog(Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON, TaxonEditorInputE4.class, Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON_MESSAGE);
182
                return;
183
            }
184
            else{
185
                MessagingUtils.warningDialog(Messages.EditorUtil_ORPHAN_TAXON, TaxonEditorInputE4.class, Messages.EditorUtil_ORPHAN_TAXON_MESSAGE);
186
                return;
187
            }
188
        }
189

    
190
        Collection<MPart> parts = partService.getParts();
191
        //check if part is already opened
192
        for (MPart part : parts) {
193
        	if(part.getObject() instanceof TaxonNameEditorE4
194
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
195
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(input.getTaxon().getUuid())){
196
        	    if (part.isDirty()){
197
        	        forceUserSaveE4Editor(((TaxonNameEditorE4) part.getObject()), getShell());
198
        	    }
199
                partService.hidePart(part);
200
                break;
201
            }
202
        }
203
        MPart part = showPart(NAME_EDITOR_ID, modelService, partService, application);
204

    
205
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
206
        editor.init(input);
207
        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4;
208
        String partIdMedia = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4;
209
        showPart(partIdMedia, modelService, partService);
210
        showPart(partIdFactualData, modelService, partService);
211
        editor.setFocus();
212
    }
213

    
214
    public static MPart checkForChanges(UUID taxonUUID, EPartService partService ){
215
        Collection<MPart> parts = partService.getParts();
216
        //check if part is already opened
217
        boolean isDirty = false;
218
        for (MPart part : parts) {
219
            if(part.getObject() instanceof TaxonNameEditorE4
220
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
221
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(taxonUUID)){
222
                if (part.isDirty()){
223
                    return part;
224
                }
225

    
226
                break;
227
            }
228
        }
229
        return null;
230
    }
231

    
232
	/**
233
	 * An uninitialized taxon is one that hasn't been saved yet. As such, it
234
	 * should appear in neither the list of recent names nor in the taxonomic
235
	 * tree when opened.
236
	 *
237
	 * @param parentNodeUuid
238
	 *            a {@link java.util.UUID} object.
239
	 */
240
	public static void openEmptyE4(UUID parentNodeUuid) {
241
		TaxonEditorInputE4 input = TaxonEditorInputE4
242
				.NewEmptyInstance(parentNodeUuid);
243
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
244
        MPart part = partService.createPart(NAME_EDITOR_ID);
245
        part = partService.showPart(part, PartState.ACTIVATE);
246
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
247
        editor.init(input);
248
	}
249

    
250
	/**
251
	 * <p>
252
	 * getUndoContext
253
	 * </p>
254
	 *
255
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext}
256
	 *         object.
257
	 */
258
	public static IUndoContext getUndoContext() {
259
		return IOperationHistory.GLOBAL_UNDO_CONTEXT;
260
	}
261

    
262
	/**
263
	 * <p>
264
	 * forceUserSave
265
	 * </p>
266
	 *
267
	 * @param editor
268
	 *            a {@link org.eclipse.ui.IEditorPart} object.
269
	 * @param shell
270
	 *            a {@link org.eclipse.swt.widgets.Shell} object.
271
	 * @return a boolean.
272
	 */
273
	public static boolean forceUserSave(IEditorPart editor, Shell shell) {
274
		if (editor.isDirty()) {
275

    
276
			boolean doSave = MessageDialog
277
					.openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
278
							Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
279

    
280
			if (!doSave) {
281
				return false;
282
			}
283

    
284
			editor.doSave(AbstractUtility.getMonitor());
285
		}
286
		return true;
287
	}
288

    
289
	public static boolean forceUserSaveE4Editor(TaxonNameEditorE4 editor, Shell shell) {
290
	    if (editor.isDirty()) {
291

    
292
	        boolean doSave = MessageDialog
293
	                .openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
294
	                        Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
295

    
296
	        if (!doSave) {
297
	            return false;
298
	        }
299

    
300
	        editor.save(AbstractUtility.getMonitor());
301
	    }
302
	    return true;
303
	}
304

    
305
	/**
306
	 * <p>
307
	 * getSelection
308
	 * </p>
309
	 *
310
	 * @param event
311
	 *            a {@link org.eclipse.core.commands.ExecutionEvent} object.
312
	 * @return a {@link org.eclipse.jface.viewers.IStructuredSelection} object.
313
	 */
314
	public static IStructuredSelection getSelection(ExecutionEvent event) {
315
		IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
316

    
317
		return (IStructuredSelection) activeEditor.getSite()
318
				.getSelectionProvider().getSelection();
319
	}
320

    
321
	/**
322
	 * <p>
323
	 * getPluginId
324
	 * </p>
325
	 *
326
	 * @return a {@link java.lang.String} object.
327
	 */
328
	public static String getPluginId() {
329
		return TaxeditorEditorPlugin.PLUGIN_ID;
330
	}
331

    
332
	/**
333
	 * Iterates recursively over all originals having the given specimen as a derivate.
334
	 * The first {@link DerivedUnit} with no more originals or the first {@link FieldUnit} is returned
335
	 * @param specimen the start element for which the originals are iterated recursively
336
	 * @return either a FieldUnit or a the topmost DerivedUnit (which can be itself)
337
	 */
338
	public static SpecimenOrObservationBase<?> getTopMostDerivate(SpecimenOrObservationBase<?> specimen){
339
	    if(specimen==null){
340
	        return null;
341
	    }
342
	    if(specimen.isInstanceOf(FieldUnit.class)){
343
	        return specimen;
344
	    }
345
	    else if(specimen.isInstanceOf(DerivedUnit.class)){
346
	        DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(specimen, DerivedUnit.class);
347
	        if(derivedUnit.getOriginals()!=null
348
	                && !(derivedUnit.getOriginals().isEmpty())){
349
	            for(SpecimenOrObservationBase<?> original:((DerivedUnit) specimen).getOriginals()){
350
	                return getTopMostDerivate(original);
351
	            }
352
	        }
353
	    }
354
	    return specimen;
355
	}
356

    
357
    /**
358
     * If the current selection is a single {@link TreeNode} it will be returned.
359
     * @param selection the selection to check
360
     * @return the selected TreeNode or <code>null</code> if no TreeNode selected
361
     */
362
    public static TreeNode getTreeNodeOfSelection(ISelection selection){
363
        if(selection instanceof IStructuredSelection
364
                && ((IStructuredSelection) selection).size()==1
365
                && ((IStructuredSelection) selection).getFirstElement() instanceof TreeNode){
366
            return (TreeNode) ((IStructuredSelection) selection).getFirstElement();
367

    
368
        }
369
        return null;
370
    }
371

    
372
    public static void closeObsoleteEditor(TaxonNodeDto taxonNode, EPartService partService){
373
        String treeIndex = taxonNode.getTreeIndex();
374
        Collection<MPart> parts = partService.getParts();
375
        for (MPart part : parts) {
376
            Object object = part.getObject();
377
            if(object instanceof TaxonNameEditorE4){
378
                TaxonNameEditorE4 taxonEditor = (TaxonNameEditorE4)object;
379
                TaxonNode node = taxonEditor.getEditorInput().getTaxonNode();
380
                if (node.treeIndex()!= null){
381
	                if(node.treeIndex().startsWith(treeIndex)){
382
	                    if (part.isDirty()){
383
	                        forceUserSaveE4Editor(taxonEditor, getShell());
384
	                    }
385
	                    partService.hidePart(part);
386
	                }
387
                }else{
388
                	logger.debug("The taxonnode of taxon " + node.getTaxon().getTitleCache() + " uuid: " + node.getUuid() + " has no treeindex");;
389
                }
390
            }
391
        }
392
    }
393

    
394

    
395
    public static void closePart(String partID, EPartService partService){
396

    
397
        Collection<MPart> parts = partService.getParts();
398
        for (MPart part : parts) {
399
            String elementId = part.getElementId();
400
            if (elementId.equals(partID)){
401
                partService.hidePart(part);
402
            }
403
        }
404
    }
405

    
406
    public static void updateEditor(TaxonNode taxonNode, TaxonNameEditorE4 editor){
407
        String treeIndex = taxonNode.treeIndex();
408
        TaxonNode node = editor.getEditorInput().getTaxonNode();
409
        if(node.treeIndex().equals(treeIndex)){
410
        	TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(node.getUuid());
411
        	editor.init(input);
412

    
413

    
414
        }
415
    }
416
}
(5-5/9)