Project

General

Profile

Download (18.9 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.HashSet;
14
import java.util.UUID;
15

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

    
33
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
34
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
35
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
36
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
37
import eu.etaxonomy.cdm.model.taxon.Synonym;
38
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
39
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
40
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
41
import eu.etaxonomy.taxeditor.bulkeditor.e4.BulkEditorE4;
42
import eu.etaxonomy.taxeditor.bulkeditor.input.TaxonEditorInput;
43
import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.DescriptiveDataSetEditor;
44
import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrixPart;
45
import eu.etaxonomy.taxeditor.editor.e4.TaxonEditorInputE4;
46
import eu.etaxonomy.taxeditor.editor.group.authority.CdmAuthorityEditorInput;
47
import eu.etaxonomy.taxeditor.editor.group.authority.e4.CdmAuthorityEditorE4;
48
import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
49
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
50
import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
51
import eu.etaxonomy.taxeditor.editor.view.checklist.e4.DistributionEditorPart;
52
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
53
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput;
54
import eu.etaxonomy.taxeditor.model.AbstractUtility;
55
import eu.etaxonomy.taxeditor.model.MessagingUtils;
56
import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
57
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
58

    
59
/**
60
 * Utility for the editor package
61
 *
62
 * @author n.hoffmann
63
 * @created 20.01.2009
64
 * @version 1.0
65
 */
66
public class EditorUtil extends AbstractUtility {
67

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

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

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

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

    
112

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

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

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

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

    
156
       return part;
157
    }
158

    
159
	public static void openTaxonNodeE4(UUID taxonNodeUuid, EModelService modelService, EPartService partService, MApplication application) {
160
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(taxonNodeUuid);
161
	    openNameEditor_internal(input, modelService, partService, application);
162
	}
163

    
164
	public static void openTaxonBaseE4(UUID taxonBaseUuid, EModelService modelService, EPartService partService, MApplication application) {
165
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
166
	    openNameEditor_internal(input, modelService, partService, application);
167
	}
168

    
169
    public static void openTaxonBaseE4(UUID taxonBaseUuid) {
170
        //FIXME E4 this can probably be removed when fully migrated
171
        TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
172

    
173
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
174
        EModelService modelService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EModelService.class);
175
        openNameEditor_internal(input, modelService, partService, null);
176
    }
177

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

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

    
209
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
210
        editor.init(input);
211
        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4;
212
        String partIdMedia = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4;
213
        showPart(partIdMedia, modelService, partService);
214
        showPart(partIdFactualData, modelService, partService);
215
        editor.setFocus();
216
    }
217

    
218
    public static Collection<MPart> checkForChanges(UUID taxonUUID, EPartService partService ){
219
        Collection<MPart> parts = partService.getParts();
220
        Collection<MPart> dirtyParts = new HashSet();
221
        //check if part is already opened
222
        boolean isDirty = false;
223
        for (MPart part : parts) {
224
            if(part.getObject() instanceof TaxonNameEditorE4
225
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
226
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(taxonUUID)){
227
                if (part.isDirty()){
228
                    dirtyParts.add(part);
229
                }
230

    
231
                break;
232
            }else if (taxonUUID == null){
233
                if (part.isDirty()){
234
                    dirtyParts.add(part);
235
                }
236
            }
237
        }
238
        return dirtyParts;
239
    }
240

    
241
    public static Collection<IE4SavablePart> checkForTaxonChanges(UUID taxonUUID, EPartService partService ){
242
        Collection<MPart> parts = partService.getParts();
243
        Collection<IE4SavablePart> dirtyParts = new HashSet<>();
244
        //check if part is already opened
245
        for (MPart part : parts) {
246
            if(part.getObject() instanceof TaxonNameEditorE4
247
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
248
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(taxonUUID)){
249
                if (part.isDirty()){
250
                    dirtyParts.add((IE4SavablePart) part);
251
                }
252

    
253
                break;
254
            }else if (taxonUUID == null){
255
                if (part.isDirty() && (part.getObject() instanceof TaxonNameEditorE4 || (part.getObject() instanceof BulkEditorE4 && ((BulkEditorE4)part.getObject()).getEditorInput() instanceof TaxonEditorInput))){
256
                    dirtyParts.add((IE4SavablePart) part);
257
                }
258
            }
259
        }
260
        return dirtyParts;
261
    }
262

    
263
	/**
264
	 * An uninitialized taxon is one that hasn't been saved yet. As such, it
265
	 * should appear in neither the list of recent names nor in the taxonomic
266
	 * tree when opened.
267
	 *
268
	 * @param parentNodeUuid
269
	 *            a {@link java.util.UUID} object.
270
	 */
271
	public static void openEmptyE4(UUID parentNodeUuid) {
272
		TaxonEditorInputE4 input = TaxonEditorInputE4
273
				.NewEmptyInstance(parentNodeUuid);
274
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
275
        MPart part = partService.createPart(NAME_EDITOR_ID);
276
        part = partService.showPart(part, PartState.ACTIVATE);
277
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
278
        editor.init(input);
279
	}
280

    
281
	/**
282
	 * <p>
283
	 * getUndoContext
284
	 * </p>
285
	 *
286
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext}
287
	 *         object.
288
	 */
289
	public static IUndoContext getUndoContext() {
290
		return IOperationHistory.GLOBAL_UNDO_CONTEXT;
291
	}
292

    
293
	/**
294
	 * <p>
295
	 * forceUserSave
296
	 * </p>
297
	 *
298
	 * @param editor
299
	 *            a {@link org.eclipse.ui.IEditorPart} object.
300
	 * @param shell
301
	 *            a {@link org.eclipse.swt.widgets.Shell} object.
302
	 * @return a boolean.
303
	 */
304
	public static boolean forceUserSave(IEditorPart editor, Shell shell) {
305
		if (editor.isDirty()) {
306

    
307
			boolean doSave = MessageDialog
308
					.openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
309
							Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
310

    
311
			if (!doSave) {
312
				return false;
313
			}
314

    
315
			editor.doSave(AbstractUtility.getMonitor());
316
		}
317
		return true;
318
	}
319

    
320
	public static boolean forceUserSaveE4Editor(TaxonNameEditorE4 editor, Shell shell) {
321
	    if (editor.isDirty()) {
322

    
323
	        boolean doSave = MessageDialog
324
	                .openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
325
	                        Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
326

    
327
	        if (!doSave) {
328
	            return false;
329
	        }
330

    
331
	        editor.save(AbstractUtility.getMonitor());
332
	    }
333
	    return true;
334
	}
335

    
336
	/**
337
	 * <p>
338
	 * getSelection
339
	 * </p>
340
	 *
341
	 * @param event
342
	 *            a {@link org.eclipse.core.commands.ExecutionEvent} object.
343
	 * @return a {@link org.eclipse.jface.viewers.IStructuredSelection} object.
344
	 */
345
	public static IStructuredSelection getSelection(ExecutionEvent event) {
346
		IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
347

    
348
		return (IStructuredSelection) activeEditor.getSite()
349
				.getSelectionProvider().getSelection();
350
	}
351

    
352
	/**
353
	 * <p>
354
	 * getPluginId
355
	 * </p>
356
	 *
357
	 * @return a {@link java.lang.String} object.
358
	 */
359
	public static String getPluginId() {
360
		return TaxeditorEditorPlugin.PLUGIN_ID;
361
	}
362

    
363
	/**
364
	 * Iterates recursively over all originals having the given specimen as a derivate.
365
	 * The first {@link DerivedUnit} with no more originals or the first {@link FieldUnit} is returned
366
	 * @param specimen the start element for which the originals are iterated recursively
367
	 * @return either a FieldUnit or a the topmost DerivedUnit (which can be itself)
368
	 */
369
	public static SpecimenOrObservationBase<?> getTopMostDerivate(SpecimenOrObservationBase<?> specimen){
370
	    if(specimen==null){
371
	        return null;
372
	    }
373
	    if(specimen.isInstanceOf(FieldUnit.class)){
374
	        return specimen;
375
	    }
376
	    else if(specimen.isInstanceOf(DerivedUnit.class)){
377
	        DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(specimen, DerivedUnit.class);
378
	        if(derivedUnit.getOriginals()!=null
379
	                && !(derivedUnit.getOriginals().isEmpty())){
380
	            for(SpecimenOrObservationBase<?> original:((DerivedUnit) specimen).getOriginals()){
381
	                return getTopMostDerivate(original);
382
	            }
383
	        }
384
	    }
385
	    return specimen;
386
	}
387

    
388
    /**
389
     * If the current selection is a single {@link TreeNode} it will be returned.
390
     * @param selection the selection to check
391
     * @return the selected TreeNode or <code>null</code> if no TreeNode selected
392
     */
393
    public static TreeNode getTreeNodeOfSelection(ISelection selection){
394
        if(selection instanceof IStructuredSelection
395
                && ((IStructuredSelection) selection).size()==1
396
                && ((IStructuredSelection) selection).getFirstElement() instanceof TreeNode){
397
            return (TreeNode) ((IStructuredSelection) selection).getFirstElement();
398

    
399
        }
400
        return null;
401
    }
402

    
403
    public static void closeObsoleteEditor(TaxonNodeDto taxonNode, EPartService partService){
404
        String treeIndex = taxonNode.getTreeIndex();
405
        Collection<MPart> parts = partService.getParts();
406
        for (MPart part : parts) {
407
            Object object = part.getObject();
408
            if(object instanceof TaxonNameEditorE4){
409
                TaxonNameEditorE4 taxonEditor = (TaxonNameEditorE4)object;
410
                TaxonNode node = taxonEditor.getEditorInput().getTaxonNode();
411
                if (node.treeIndex()!= null){
412
	                if(node.treeIndex().startsWith(treeIndex)){
413
	                    if (part.isDirty()){
414
	                        forceUserSaveE4Editor(taxonEditor, getShell());
415
	                    }
416
	                    partService.hidePart(part);
417
	                }
418
                }else{
419
                	logger.debug("The taxonnode of taxon " + node.getTaxon().getTitleCache() + " uuid: " + node.getUuid() + " has no treeindex");;
420
                }
421
            }
422
        }
423
    }
424

    
425

    
426
    public static void closePart(String partID, EPartService partService){
427

    
428
        Collection<MPart> parts = partService.getParts();
429
        for (MPart part : parts) {
430
            String elementId = part.getElementId();
431
            if (elementId.equals(partID)){
432
                partService.hidePart(part);
433
            }
434
        }
435
    }
436

    
437
    public static void updateEditor(TaxonNode taxonNode, TaxonNameEditorE4 editor){
438
        String treeIndex = taxonNode.treeIndex();
439
        TaxonNode node = editor.getEditorInput().getTaxonNode();
440
        if(node.treeIndex().equals(treeIndex)){
441
        	TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(node.getUuid());
442
        	editor.init(input);
443

    
444

    
445
        }
446
    }
447

    
448
}
(5-5/9)