Project

General

Profile

Download (23.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
package eu.etaxonomy.taxeditor.editor;
10

    
11
import java.util.Collection;
12
import java.util.HashSet;
13
import java.util.List;
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.description.DescriptiveDataSet;
35
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
36
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
37
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
38
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
39
import eu.etaxonomy.cdm.model.taxon.Synonym;
40
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
41
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
42
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
43
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
44
import eu.etaxonomy.taxeditor.bulkeditor.e4.BulkEditor;
45
import eu.etaxonomy.taxeditor.bulkeditor.input.TaxonEditorInput;
46
import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.DescriptiveDataSetEditor;
47
import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrixPart;
48
import eu.etaxonomy.taxeditor.editor.e4.TaxonEditorInputE4;
49
import eu.etaxonomy.taxeditor.editor.group.authority.CdmAuthorityEditorInput;
50
import eu.etaxonomy.taxeditor.editor.group.authority.e4.CdmAuthorityEditorE4;
51
import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
52
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
53
import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
54
import eu.etaxonomy.taxeditor.editor.view.checklist.e4.DistributionEditorPart;
55
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
56
import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput;
57
import eu.etaxonomy.taxeditor.model.AbstractUtility;
58
import eu.etaxonomy.taxeditor.model.MessagingUtils;
59
import eu.etaxonomy.taxeditor.security.RequiredPermissions;
60
import eu.etaxonomy.taxeditor.store.CdmStore;
61
import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
62
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
63

    
64
/**
65
 * Utility for the editor package
66
 *
67
 * @author n.hoffmann
68
 * @created 20.01.2009
69
 */
70
public class EditorUtil extends AbstractUtility {
71

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

    
74
    private static boolean factsVisible = true;
75

    
76
    private static boolean mediaVisible = true;
77

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

    
93
    public static void openCharacterMatrix(UUID descriptiveDataSetUuid, EModelService modelService, EPartService partService, MApplication application){
94
        Collection<MPart> parts = partService.getParts();
95
        for (MPart part : parts) {
96
            if(part.getObject() instanceof CharacterMatrixPart
97
                && ((CharacterMatrixPart) part.getObject()).getDescriptiveDataSet().getUuid().equals(descriptiveDataSetUuid)){
98
                partService.showPart(part, PartState.ACTIVATE);
99
                return;
100
            }
101
        }
102
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_DESCRIPTIVEDATASET_MATRIX_CHARACTERMATRIXPART;
103
        MPart part = showPart(partId, modelService, partService, application);
104
        CharacterMatrixPart editor = (CharacterMatrixPart) part.getObject();
105
        editor.init(descriptiveDataSetUuid, true);
106
    }
107

    
108
    public static void openDistributionEditor(List<UuidAndTitleCache<ITaxonTreeNode>> parentTaxonUuidList, EModelService modelService, EPartService partService, MApplication application){
109
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_CHECKLIST_E4_DISTRIBUTIONEDITORPART;
110
        checkAndCloseFactsAndMediaParts(partService);
111
        MPart part = showPart(partId, modelService, partService, application);
112
        DistributionEditorPart editor = (DistributionEditorPart) part.getObject();
113
        editor.init(parentTaxonUuidList);
114
    }
115

    
116
    public static void checkAndCloseFactsAndMediaParts(EPartService partService) {
117
        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4;
118
        String partIdMedia = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4;
119
        MPart part1 = partService.findPart(AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4);
120
        if (factsVisible || (part1!=null && part1.getWidget() != null && partService.isPartVisible(part1))){
121
            factsVisible = true;
122
        }else{
123
            factsVisible = false;
124
        }
125
        part1 = partService.findPart(AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4);
126
        if (mediaVisible || (part1!=null && part1.getWidget() != null && partService.isPartVisible(part1))){
127
            mediaVisible = true;
128
        }else{
129
            mediaVisible = false;
130
        }
131
        closePart(partIdMedia, partService);
132
        closePart(partIdFactualData, partService);
133
    }
134

    
135

    
136
    public static void openSpecimenEditor(DerivateViewEditorInput input, EModelService modelService, EPartService partService, MApplication application){
137
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DERIVATE_DERIVATEVIEW;
138
        MPart part = showPart(partId, modelService, partService, application);
139
        DerivateView derivateView = (DerivateView) part.getObject();
140
        derivateView.init(input);
141
    }
142

    
143
    public static void openRightsEditor(CdmAuthorityEditorInput input, EModelService modelService, EPartService partService, MApplication application){
144
        Collection<MPart> parts = partService.getParts();
145
        for (MPart part : parts) {
146
            if(part.getObject() instanceof CdmAuthorityEditorE4
147
                && ((CdmAuthorityEditorE4) part.getObject()).getInput().getGroup().equals(input.getGroup())){
148
                partService.showPart(part, PartState.ACTIVATE);
149
                return;
150
            }
151
        }
152
        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_GROUP_AUTHORITY_E4_CDMAUTHORITYEDITORE4;
153
        MPart part = showPart(partId, modelService, partService, application);
154
        CdmAuthorityEditorE4 authorityView = (CdmAuthorityEditorE4) part.getObject();
155
        authorityView.init(input);
156
    }
157

    
158
    public static MPart showPart(String partId, EModelService modelService, EPartService partService, MApplication application){
159
        MPart part = partService.findPart(partId);
160
        if(part==null || modelService.getPartDescriptor(partId).isAllowMultiple()){
161
            part = partService.createPart(partId);
162
        }
163
        MPartStack editorAreaPartStack = WorkbenchUtility.getEditorAreaPartStack(application, modelService);
164
        if(editorAreaPartStack!=null){
165
            editorAreaPartStack.getChildren().add(part);
166
        }
167

    
168
        return partService.showPart(part, PartState.ACTIVATE);
169

    
170
    }
171

    
172
    public static MPart showPart(String partId, EModelService modelService, EPartService partService){
173
        MPart part = partService.findPart(partId);
174
        if(part==null || modelService.getPartDescriptor(partId).isAllowMultiple()){
175
            part = partService.createPart(partId);
176
            partService.activate(part);
177
        }else{
178
            partService.activate(part);
179
        }
180

    
181
       return part;
182
    }
183

    
184
	public static void openTaxonNodeE4(UUID taxonNodeUuid, EModelService modelService, EPartService partService, MApplication application) {
185
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(taxonNodeUuid);
186
	    openNameEditor_internal(input, modelService, partService, application);
187
	}
188

    
189
	public static void openTaxonBaseE4(UUID taxonBaseUuid, EModelService modelService, EPartService partService, MApplication application) {
190
	    TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
191
	    openNameEditor_internal(input, modelService, partService, application);
192
	}
193

    
194
    public static void openTaxonBaseE4(UUID taxonBaseUuid) {
195
        //FIXME E4 this can probably be removed when fully migrated
196
        TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstanceFromTaxonBase(taxonBaseUuid);
197

    
198
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
199
        EModelService modelService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EModelService.class);
200
        openNameEditor_internal(input, modelService, partService, null);
201
    }
202

    
203
    private static void openNameEditor_internal(TaxonEditorInputE4 input, EModelService modelService, EPartService partService, MApplication application) {
204
        TaxonBase<?> taxonBase = input.getTaxon();
205
        TaxonNode node = input.getTaxonNode();
206
        if(taxonBase==null){
207
            return;
208
        }
209
        boolean hasPermission = false;
210
//        if (node != null){
211
            hasPermission = CdmStore.currentAuthentiationHasPermission(node, RequiredPermissions.TAXON_EDIT);
212
//        }
213
//        if (!hasPermission){
214
//            MessagingUtils.warningDialog(Messages.EditorUtil_MISSING_PERMISSION, TaxonEditorInputE4.class, Messages.EditorUtil_MISSING_PERMISSION_MESSAGE);
215
//            return;
216
//        }
217
        if (taxonBase.isOrphaned()) {
218
            if(taxonBase.isInstanceOf(Synonym.class)){
219
                MessagingUtils.warningDialog(Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON, TaxonEditorInputE4.class, Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON_MESSAGE);
220
                return;
221
            }
222
            else{
223
                MessagingUtils.warningDialog(Messages.EditorUtil_ORPHAN_TAXON, TaxonEditorInputE4.class, Messages.EditorUtil_ORPHAN_TAXON_MESSAGE);
224
                return;
225
            }
226
        }
227

    
228
        Collection<MPart> parts = partService.getParts();
229
        //check if part is already opened
230
        MPart alreadyOpenInOtherClassification = null;
231
        for (MPart part : parts) {
232
        	if(part.getObject() instanceof TaxonNameEditorE4
233
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
234
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(input.getTaxon().getUuid())){
235

    
236
        	    UUID inputNode = input.getTaxonNode().getUuid();
237
        	    UUID editorNode = ((TaxonNameEditorE4) part.getObject()).getTaxonNode().getUuid();
238
        	    if (!inputNode.equals(editorNode)){
239
        	        alreadyOpenInOtherClassification = part;
240
        	    }else{
241
        	    	((TaxonNameEditorE4) part.getObject()).init(input);
242
        	        partService.activate(part, true);
243
        	        return;
244
        	    }
245
            }
246
        }
247
        if (alreadyOpenInOtherClassification != null){
248
            boolean doSave = forceUserSaveE4Editor(((TaxonNameEditorE4) alreadyOpenInOtherClassification.getObject()), getShell());
249
            if (doSave){
250
                input = TaxonEditorInputE4.NewInstance(input.getTaxonNode().getUuid());
251
                partService.hidePart(alreadyOpenInOtherClassification);
252
            }else {
253
                return;
254
            }
255
        }
256

    
257
        MPart part = showPart(NAME_EDITOR_ID, modelService, partService, application);
258

    
259
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
260
//        editor.setDisabled();
261
        editor.init(input);
262
//        editor.setEnabled();
263
        editor.setFocus();
264
        if (factsVisible){
265
            showFacts(modelService, partService);
266
            factsVisible = false;
267
        }
268

    
269
        if (mediaVisible){
270
            showMedia(modelService, partService);
271
            mediaVisible = false;
272
        }
273
    }
274

    
275
    public static void showMedia(EModelService modelService, EPartService partService) {
276
        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4;
277
        showPart(partIdFactualData, modelService, partService);
278
    }
279

    
280
    public static void showFacts(EModelService modelService, EPartService partService) {
281
        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4;
282
        showPart(partIdFactualData, modelService, partService);
283
    }
284

    
285
    public static Collection<MPart> checkForChanges(UUID taxonUUID, EPartService partService ){
286
        Collection<MPart> parts = partService.getParts();
287
        Collection<MPart> dirtyParts = new HashSet();
288
        //check if part is already opened
289
        boolean isDirty = false;
290
        for (MPart part : parts) {
291
            if(part.getObject() instanceof TaxonNameEditorE4
292
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
293
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(taxonUUID)){
294
                if (part.isDirty()){
295
                    dirtyParts.add(part);
296
                }
297

    
298
                break;
299
            }else if (taxonUUID == null){
300
                if (part.isDirty()){
301
                    dirtyParts.add(part);
302
                }
303
            }
304
        }
305
        return dirtyParts;
306
    }
307

    
308
    public static Collection<IE4SavablePart> checkForTaxonChanges(UUID taxonUUID, EPartService partService ){
309
        Collection<MPart> parts = partService.getParts();
310
        Collection<IE4SavablePart> dirtyParts = new HashSet<>();
311
        //check if part is already opened
312
        for (MPart part : parts) {
313
            if(part.getObject() instanceof TaxonNameEditorE4
314
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
315
                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(taxonUUID)){
316
                if (part.isDirty()){
317
                    dirtyParts.add((IE4SavablePart) part);
318
                }
319

    
320
                break;
321
            }else if (taxonUUID == null){
322
                if (part.isDirty() && (part.getObject() instanceof TaxonNameEditorE4 || (part.getObject() instanceof BulkEditor && ((BulkEditor)part.getObject()).getEditorInput() instanceof TaxonEditorInput))){
323
                    dirtyParts.add((IE4SavablePart) part.getObject());
324
                }
325
            }
326
        }
327
        return dirtyParts;
328
    }
329

    
330
	/**
331
	 * An uninitialized taxon is one that hasn't been saved yet. As such, it
332
	 * should appear in neither the list of recent names nor in the taxonomic
333
	 * tree when opened.
334
	 *
335
	 * @param parentNodeUuid
336
	 *            a {@link java.util.UUID} object.
337
	 */
338
	public static void openEmptyE4(UUID parentNodeUuid) {
339
		TaxonEditorInputE4 input = TaxonEditorInputE4
340
				.NewEmptyInstance(parentNodeUuid);
341
        EPartService partService = TaxeditorEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getService(EPartService.class);
342
        MPart part = partService.createPart(NAME_EDITOR_ID);
343
        part = partService.showPart(part, PartState.ACTIVATE);
344
        TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
345
        editor.init(input);
346
	}
347

    
348
	/**
349
	 * <p>
350
	 * getUndoContext
351
	 * </p>
352
	 *
353
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext}
354
	 *         object.
355
	 */
356
	public static IUndoContext getUndoContext() {
357
		return IOperationHistory.GLOBAL_UNDO_CONTEXT;
358
	}
359

    
360
	public static boolean isFactsVisible() {
361
        return factsVisible;
362
    }
363

    
364
    public static void setFactsVisible(boolean factsVisible) {
365
        EditorUtil.factsVisible = factsVisible;
366
    }
367

    
368
    public static boolean isMediaVisible() {
369
        return mediaVisible;
370
    }
371

    
372
    public static void setMediaVisible(boolean mediaVisible) {
373
        EditorUtil.mediaVisible = mediaVisible;
374
    }
375

    
376
    /**
377
	 * <p>
378
	 * forceUserSave
379
	 * </p>
380
	 *
381
	 * @param editor
382
	 *            a {@link org.eclipse.ui.IEditorPart} object.
383
	 * @param shell
384
	 *            a {@link org.eclipse.swt.widgets.Shell} object.
385
	 * @return a boolean.
386
	 */
387
	public static boolean forceUserSave(IEditorPart editor, Shell shell) {
388
		if (editor.isDirty()) {
389

    
390
			boolean doSave = MessageDialog
391
					.openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
392
							Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
393

    
394
			if (!doSave) {
395
				return false;
396
			}
397

    
398
			editor.doSave(AbstractUtility.getMonitor());
399
		}
400
		return true;
401
	}
402

    
403
	public static boolean forceUserSaveE4Editor(IE4SavablePart editor, Shell shell) {
404
	    if (editor.isDirty()) {
405

    
406
	        boolean doSave = MessageDialog
407
	                .openConfirm(shell, Messages.EditorUtil_COMFIRM_SAVE,
408
	                        Messages.EditorUtil_CONFIRM_SAVE_MESSAGE);
409

    
410
	        if (!doSave) {
411
	            return false;
412
	        }
413

    
414
	        editor.save(AbstractUtility.getMonitor());
415
	    }
416
	    return true;
417
	}
418

    
419
	/**
420
	 * <p>
421
	 * getSelection
422
	 * </p>
423
	 *
424
	 * @param event
425
	 *            a {@link org.eclipse.core.commands.ExecutionEvent} object.
426
	 * @return a {@link org.eclipse.jface.viewers.IStructuredSelection} object.
427
	 */
428
	public static IStructuredSelection getSelection(ExecutionEvent event) {
429
		IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
430

    
431
		return (IStructuredSelection) activeEditor.getSite()
432
				.getSelectionProvider().getSelection();
433
	}
434

    
435
	/**
436
	 * <p>
437
	 * getPluginId
438
	 * </p>
439
	 *
440
	 * @return a {@link java.lang.String} object.
441
	 */
442
	public static String getPluginId() {
443
		return TaxeditorEditorPlugin.PLUGIN_ID;
444
	}
445

    
446
	/**
447
	 * Iterates recursively over all originals having the given specimen as a derivate.
448
	 * The first {@link DerivedUnit} with no more originals or the first {@link FieldUnit} is returned
449
	 * @param specimen the start element for which the originals are iterated recursively
450
	 * @return either a FieldUnit or a the topmost DerivedUnit (which can be itself)
451
	 */
452
	public static SpecimenOrObservationBase<?> getTopMostDerivate(SpecimenOrObservationBase<?> specimen){
453
	    if(specimen==null){
454
	        return null;
455
	    }
456
	    if(specimen.isInstanceOf(FieldUnit.class)){
457
	        return specimen;
458
	    }
459
	    else if(specimen.isInstanceOf(DerivedUnit.class)){
460
	        DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(specimen, DerivedUnit.class);
461
	        if(derivedUnit.getOriginals()!=null
462
	                && !(derivedUnit.getOriginals().isEmpty())){
463
	            for(SpecimenOrObservationBase<?> original:((DerivedUnit) specimen).getOriginals()){
464
	                return getTopMostDerivate(original);
465
	            }
466
	        }
467
	    }
468
	    return specimen;
469
	}
470

    
471
    /**
472
     * If the current selection is a single {@link TreeNode} it will be returned.
473
     * @param selection the selection to check
474
     * @return the selected TreeNode or <code>null</code> if no TreeNode selected
475
     */
476
    public static TreeNode getTreeNodeOfSelection(ISelection selection){
477
        if(selection instanceof IStructuredSelection
478
                && ((IStructuredSelection) selection).size()==1
479
                && ((IStructuredSelection) selection).getFirstElement() instanceof TreeNode){
480
            return (TreeNode) ((IStructuredSelection) selection).getFirstElement();
481

    
482
        }
483
        return null;
484
    }
485

    
486
    public static void closeObsoleteEditor(TaxonNodeDto taxonNode, EPartService partService){
487
        String treeIndex = taxonNode.getTreeIndex();
488
        Collection<MPart> parts = partService.getParts();
489
        for (MPart part : parts) {
490
            Object object = part.getObject();
491
            if(object instanceof TaxonNameEditorE4){
492
                TaxonNameEditorE4 taxonEditor = (TaxonNameEditorE4)object;
493
                TaxonNode node = taxonEditor.getEditorInput().getTaxonNode();
494
                if (node.treeIndex()!= null){
495
	                if(node.treeIndex().startsWith(treeIndex)){
496
	                    if (part.isDirty()){
497
	                        forceUserSaveE4Editor(taxonEditor, getShell());
498
	                    }
499
	                    partService.hidePart(part);
500
	                }
501
                }else{
502
                	logger.debug("The taxonnode of taxon " + node.getTaxon().getTitleCache() + " uuid: " + node.getUuid() + " has no treeindex");;
503
                }
504
            }
505
        }
506
    }
507

    
508
    public static void closeObsoleteEditorWithChildren(TaxonNodeDto taxonNode, EPartService partService){
509
        String treeIndex = taxonNode.getTreeIndex();
510
        Collection<MPart> parts = partService.getParts();
511
        for (MPart part : parts) {
512
            Object object = part.getObject();
513
            if(object instanceof TaxonNameEditorE4){
514
                TaxonNameEditorE4 taxonEditor = (TaxonNameEditorE4)object;
515
                TaxonNode node = taxonEditor.getEditorInput().getTaxonNode();
516
                if (node.treeIndex()!= null){
517
                    if(node.treeIndex().startsWith(treeIndex)){
518
                        if (part.isDirty()){
519
                            forceUserSaveE4Editor(taxonEditor, getShell());
520
                        }
521
                        partService.hidePart(part);
522
                    }
523
                }else{
524
                    logger.debug("The taxonnode of taxon " + node.getTaxon().getTitleCache() + " uuid: " + node.getUuid() + " has no treeindex");;
525
                }
526
            }
527
        }
528
    }
529

    
530
    public static void closeObsoleteDescriptiveDatasetEditor(UUID datasetUuid, EPartService partService){
531

    
532
        Collection<MPart> parts = partService.getParts();
533
        for (MPart part : parts) {
534
            Object object = part.getObject();
535
            if(object instanceof DescriptiveDataSetEditor){
536
                DescriptiveDataSetEditor editor = (DescriptiveDataSetEditor)object;
537
                DescriptiveDataSet descDataSet = editor.getDescriptiveDataSet();
538
                if(descDataSet.getUuid().equals(datasetUuid)){
539
                    if (part.isDirty()){
540
                        forceUserSaveE4Editor(editor, getShell());
541
                    }
542
                    partService.hidePart(part);
543
                }
544

    
545
            }
546
        }
547
    }
548

    
549
    public static void closePart(String partID, EPartService partService){
550

    
551
        Collection<MPart> parts = partService.getParts();
552
        for (MPart part : parts) {
553
            String elementId = part.getElementId();
554
            if (elementId.equals(partID)){
555
                partService.hidePart(part);
556
            }
557
        }
558
    }
559

    
560
    public static void updateEditor(TaxonNode taxonNode, TaxonNameEditorE4 editor){
561
        String treeIndex = taxonNode.treeIndex();
562
        TaxonNode node = editor.getEditorInput().getTaxonNode();
563
        if(node.treeIndex().equals(treeIndex)){
564
        	TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(node.getUuid());
565
        	editor.init(input);
566
        }
567
    }
568
}
(5-5/9)