Project

General

Profile

Download (20.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.navigator.e4;
11

    
12
import java.util.ArrayList;
13
import java.util.Arrays;
14
import java.util.Comparator;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.Observable;
20
import java.util.Observer;
21
import java.util.Set;
22
import java.util.UUID;
23

    
24
import javax.annotation.PostConstruct;
25
import javax.annotation.PreDestroy;
26
import javax.inject.Inject;
27

    
28
import org.eclipse.core.commands.operations.UndoContext;
29
import org.eclipse.core.runtime.IAdaptable;
30
import org.eclipse.core.runtime.IProgressMonitor;
31
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
32
import org.eclipse.e4.core.contexts.IEclipseContext;
33
import org.eclipse.e4.core.di.annotations.Optional;
34
import org.eclipse.e4.ui.di.Focus;
35
import org.eclipse.e4.ui.di.UIEventTopic;
36
import org.eclipse.e4.ui.di.UISynchronize;
37
import org.eclipse.e4.ui.model.application.MApplication;
38
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
39
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
40
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
41
import org.eclipse.e4.ui.model.application.ui.menu.impl.HandledToolItemImpl;
42
import org.eclipse.e4.ui.services.EMenuService;
43
import org.eclipse.e4.ui.workbench.modeling.EModelService;
44
import org.eclipse.e4.ui.workbench.modeling.EPartService;
45
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
46
import org.eclipse.jface.util.LocalSelectionTransfer;
47
import org.eclipse.jface.viewers.IElementComparer;
48
import org.eclipse.jface.viewers.ISelection;
49
import org.eclipse.jface.viewers.ISelectionChangedListener;
50
import org.eclipse.jface.viewers.IStructuredSelection;
51
import org.eclipse.jface.viewers.StructuredSelection;
52
import org.eclipse.jface.viewers.TreePath;
53
import org.eclipse.jface.viewers.TreeViewer;
54
import org.eclipse.swt.SWT;
55
import org.eclipse.swt.dnd.DND;
56
import org.eclipse.swt.dnd.Transfer;
57
import org.eclipse.swt.layout.FillLayout;
58
import org.eclipse.swt.widgets.Composite;
59
import org.eclipse.swt.widgets.Tree;
60
import org.eclipse.ui.IMemento;
61

    
62
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
63
import eu.etaxonomy.cdm.api.application.CdmChangeEvent;
64
import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
65
import eu.etaxonomy.cdm.api.application.ICdmChangeListener;
66
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
67
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
68
import eu.etaxonomy.cdm.api.service.IClassificationService;
69
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
70
import eu.etaxonomy.cdm.model.common.CdmBase;
71
import eu.etaxonomy.cdm.model.common.ICdmBase;
72
import eu.etaxonomy.cdm.model.taxon.Classification;
73
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
74
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
75
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoByNameComparator;
76
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoByRankAndNameComparator;
77
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoNaturalComparator;
78
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
79
import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
80
import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
81
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
82
import eu.etaxonomy.taxeditor.model.AbstractUtility;
83
import eu.etaxonomy.taxeditor.model.DataChangeBridge;
84
import eu.etaxonomy.taxeditor.model.IContextListener;
85
import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;
86
import eu.etaxonomy.taxeditor.navigation.AppModelId;
87
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
88
import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
89
import eu.etaxonomy.taxeditor.navigation.navigator.EmptyRoot;
90
import eu.etaxonomy.taxeditor.navigation.navigator.Root;
91
import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNodeNavigatorComparator;
92
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
93
import eu.etaxonomy.taxeditor.preference.NavigatorOrderEnum;
94
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
95
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
96
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
97
import eu.etaxonomy.taxeditor.store.CdmStore;
98
import eu.etaxonomy.taxeditor.store.LoginManager;
99
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
100
import eu.etaxonomy.taxeditor.workbench.part.ICollapsableExpandable;
101

    
102
/**
103
 *
104
 * @author pplitzner
105
 * @since Sep 7, 2017
106
 *
107
 */
108
public class TaxonNavigatorE4 implements
109
		IPostOperationEnabled, IConversationEnabled, Observer,
110
		ICdmEntitySessionEnabled, ICdmChangeListener, IContextListener,
111
		ICollapsableExpandable {
112

    
113
    private static final String RESTORING_TAXON_NAVIGATOR = Messages.TaxonNavigator_RESTORE;
114

    
115
	private static final String TREE_PATH = "treepath"; //$NON-NLS-1$
116

    
117
	private static final String TREE_PATHS = "treepaths"; //$NON-NLS-1$
118

    
119
	private final int dndOperations = DND.DROP_MOVE;
120

    
121
	private ConversationHolder conversation;
122

    
123
	private ICdmEntitySession cdmEntitySession;
124

    
125
	private IDataChangeBehavior dataChangeBehavior;
126

    
127
	private Root root;
128

    
129
	private TreeViewer viewer;
130

    
131
    @Inject
132
    private ESelectionService selService;
133

    
134
    @Inject
135
    private UISynchronize sync;
136

    
137
    private ISelectionChangedListener selectionChangedListener;
138

    
139
    private UndoContext undoContext;
140

    
141
    @Inject
142
    private MApplication application;
143

    
144
    @Inject
145
    private EModelService modelService;
146

    
147
    @Inject
148
    private EPartService partService;
149

    
150
    private boolean linkWithTaxon = false;
151

    
152
    @Inject
153
    public TaxonNavigatorE4() {
154
	    undoContext = new UndoContext();
155
	    CdmStore.getContextManager().addContextListener(this);
156
    }
157

    
158
	@PostConstruct
159
	private void create(Composite parent, EMenuService menuService, IEclipseContext context){
160
	    FillLayout layout = new FillLayout();
161
	    layout.marginHeight = 0;
162
	    layout.marginWidth = 0;
163
	    layout.type = SWT.VERTICAL;
164

    
165
	    parent.setLayout(layout);
166
	    viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI));
167
	    viewer.getControl().setLayoutData(LayoutConstants.FILL());
168

    
169
	    viewer.setContentProvider(new TaxonNavigatorContentProviderE4());
170
        viewer.setLabelProvider(new TaxonNavigatorLabelProviderE4());
171
        viewer.addDoubleClickListener(event->{
172
            ISelection selection = event.getSelection();
173
            if(selection instanceof IStructuredSelection){
174
                Object firstElement = ((IStructuredSelection) selection).getFirstElement();
175
                if(firstElement instanceof ICdmBase){
176
                    NavigationUtil.openEditor((ICdmBase) firstElement, viewer.getControl().getShell(), modelService, partService, application);
177
                }
178
                if(firstElement instanceof TaxonNodeDto){
179
                    NavigationUtil.openEditor((TaxonNodeDto) firstElement, viewer.getControl().getShell(), modelService, partService, application);
180
                }
181
            }
182
        });
183

    
184
        //propagate selection
185
        selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
186
        viewer.addSelectionChangedListener(selectionChangedListener);
187

    
188
        //create context menu
189
        menuService.registerContextMenu(viewer.getControl(), AppModelId.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_NAVIGATOR_POPUPMENU_TAXONNAVIGATOR );
190

    
191
        //add drag'n'drop support
192
        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer()};
193
        viewer.addDragSupport(dndOperations, transfers, new TreeNodeDragListenerE4(viewer));
194
        TreeNodeDropAdapterE4 dropAdapter = new TreeNodeDropAdapterE4(this);
195
        ContextInjectionFactory.inject(dropAdapter, context);
196
        viewer.addDropSupport(dndOperations, transfers, dropAdapter);
197

    
198
        updateSyncButton();
199

    
200

    
201

    
202
	    init();
203
	}
204

    
205
    protected void updateSyncButton() {
206
        MPart viewPart = partService.findPart(AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_NAVIGATION_NAVIGATOR);
207
        if(viewPart!=null){
208
            MToolBar toolBar = viewPart.getToolbar();
209

    
210
            List<MToolBarElement> toolBarElements = toolBar.getChildren();
211

    
212
            MToolBarElement upperHandledMenuItem = toolBarElements.get(1);
213
            if (upperHandledMenuItem instanceof HandledToolItemImpl){
214
                ((HandledToolItemImpl)upperHandledMenuItem).setSelected(linkWithTaxon);
215
            }
216
        }
217
    }
218

    
219
	/** {@inheritDoc} */
220
	protected IAdaptable getInitialInput() {
221
		Comparator<TaxonNodeDto> comparator;
222
		NavigatorOrderEnum orderValue = NavigatorOrderEnum.RankAndNameOrder;
223
		try{
224
		    orderValue = PreferencesUtil.getSortNodes();
225
		}catch(IllegalArgumentException e){
226

    
227
		}
228

    
229
		if (orderValue.equals(NavigatorOrderEnum.NaturalOrder)){
230
			comparator = new TaxonNodeDtoNaturalComparator();
231
		} else if (orderValue.equals(NavigatorOrderEnum.AlphabeticalOrder)){
232
			comparator = new TaxonNodeDtoByNameComparator();
233
		}else {
234
			comparator = new TaxonNodeDtoByRankAndNameComparator();
235
		}
236

    
237
		TaxonNodeNavigatorComparator viewerComparator = new TaxonNodeNavigatorComparator(comparator);
238
		viewer.setComparator(viewerComparator);
239
		viewer.setComparer(new IElementComparer() {
240

    
241
	        @Override
242
            public int hashCode(Object element) {
243
	            if (element instanceof TaxonNodeDto){
244
    	            TaxonNodeDto nodeDto = (TaxonNodeDto)element;
245

    
246
    	            String s = nodeDto.getUuid().toString();
247
    	            if (s != null) {
248
    	                return s.hashCode();
249
    	            }
250
    	            return element.hashCode();
251
	            }else{
252
	                return element.toString().hashCode();
253
	            }
254
	        }
255

    
256
            @Override
257
            public boolean equals(Object element1, Object element2) {
258
                if (element1 instanceof TaxonNodeDto && element2 instanceof TaxonNodeDto){
259
                    TaxonNodeDto node1 = (TaxonNodeDto)element1;
260
                    TaxonNodeDto node2 = (TaxonNodeDto)element2;
261
                    return (node1.getUuid().equals(node2.getUuid()));
262
                }else {
263
                    return element1.equals(element2);
264
                }
265
            }
266
		}
267
		);
268

    
269
		if (CdmStore.isActive()) {
270

    
271
			// TODO when closing and reopening the taxon navigator
272
			// we do not preserve state. Closing the view, in contrary to
273
			// closing the whole application
274
			// should be handled by the state manager too
275
		    root = new Root(conversation);
276

    
277
			return root;
278
		}
279
		return new EmptyRoot();
280
	}
281

    
282
	public void init() {
283
		if (CdmStore.isActive() && conversation == null) {
284
			conversation = CdmStore.createConversation();
285
			conversation.registerForDataStoreChanges(TaxonNavigatorE4.this);
286
		}
287
		if (CdmStore.isActive()) {
288
		    cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
289
		    CdmApplicationState.getCurrentDataChangeService().register(this);
290
		    viewer.setInput(getInitialInput());
291
		}
292
		CdmStore.getLoginManager().addObserver(this);
293

    
294
	}
295

    
296
	//Link with taxon selection
297
	@Inject
298
	@Optional
299
	public void updateCurrentTaxon(@UIEventTopic(WorkbenchEventConstants.CURRENT_ACTIVE_EDITOR)ITaxonEditor editor){
300
	    if(linkWithTaxon && editor!=null){
301
	        viewer.refresh();
302
	        TaxonNodeDto taxonNode = null;
303
	        if(editor.getTaxon()!=null && editor.getTaxon().getTaxonNodes()!=null){
304
	            if (editor instanceof TaxonNameEditorE4){
305
	                taxonNode = new TaxonNodeDto( ((TaxonNameEditorE4)editor).getEditorInput().getTaxonNode());
306
	            }else{
307
	                if (editor.getTaxon().getTaxonNodes() != null && !editor.getTaxon().getTaxonNodes().isEmpty()){
308
	                    taxonNode = new TaxonNodeDto(editor.getTaxon().getTaxonNodes().iterator().next());
309
	                }
310
	            }
311
                if (taxonNode != null){
312
                    viewer.reveal(taxonNode);
313
                    viewer.setSelection(new StructuredSelection(taxonNode));
314
                }else{
315
                    //TODO: show message in status bar
316
                }
317

    
318
	        }
319
	    }
320
	}
321

    
322
    public void setLinkWithTaxon(boolean linkWithTaxon) {
323
        this.linkWithTaxon = linkWithTaxon;
324
    }
325

    
326
    public boolean isLinkWithTaxon() {
327
        return linkWithTaxon;
328
    }
329

    
330
	/**
331
	 * Refresh this navigators viewer
332
	 */
333
	public void refresh() {
334
		if(getConversationHolder() != null){
335
			getConversationHolder().bind();
336
			//FIXME : Need to make sure this is a stable fix (ticket 3822)
337
			if(!getConversationHolder().isCompleted()){
338
			    getConversationHolder().commit();
339
			}
340
		}
341
		if(!viewer.getTree().isDisposed()){
342
		    if (CdmStore.isActive()){
343
		        viewer.setInput(getInitialInput());
344
		    }
345
		    viewer.refresh();
346
		}
347

    
348
		updateSyncButton();
349
	}
350

    
351
	/**
352
     * Refresh this navigators viewer
353
     */
354
    public void refresh(Set<?> objects) {
355
        for(Object obj : objects) {
356
            viewer.refresh(obj);
357
        }
358
        updateSyncButton();
359
    }
360

    
361
    /**
362
     * Refresh this navigators viewer
363
     */
364
    public void refresh(Object object) {
365
        viewer.refresh(object);
366
        updateSyncButton();
367
    }
368

    
369
	/**
370
	 * Removes all content
371
	 */
372
	public void clear() {
373
	    viewer.setInput(new EmptyRoot());
374
	}
375

    
376
	private void restore(IMemento memento, IProgressMonitor monitor) {
377
	    root = new Root(conversation);
378
		if (memento == null) {
379
		    viewer.setInput(root);
380
			return;
381
		}
382
		int mementoWork = 0;
383
		Set<TreePath> treePaths = new HashSet<TreePath>();
384
		IMemento[] treePathMementos = null;
385

    
386
		IMemento treePathsMemento = memento.getChild(TREE_PATHS);
387

    
388
		if (treePathsMemento != null) {
389
			treePathMementos = treePathsMemento.getChildren(TREE_PATH);
390
			mementoWork = treePathMementos.length;
391
		}
392
		// begin the monitor with steps for all tree paths and steps for
393
		// creating
394
		// conversation s.o., refreshing the tree and setting the paths
395
		IProgressMonitor subProgressMonitor = AbstractUtility
396
				.getSubProgressMonitor(monitor, 1);
397

    
398
		subProgressMonitor.beginTask(RESTORING_TAXON_NAVIGATOR,
399
				1 + mementoWork + 5);
400
		subProgressMonitor.subTask(RESTORING_TAXON_NAVIGATOR);
401
		subProgressMonitor.worked(1);
402

    
403
		conversation = CdmStore.createConversation();
404
		subProgressMonitor.worked(1);
405
		conversation.registerForDataStoreChanges(TaxonNavigatorE4.this);
406
		subProgressMonitor.worked(1);
407
		viewer.setInput(root);
408
		subProgressMonitor.worked(1);
409
		viewer.refresh();
410
		subProgressMonitor.worked(1);
411

    
412
		if (treePathMementos != null && treePathMementos.length > 0) {
413
			for (IMemento treePathMemento : treePathMementos) {
414
				TreePath treePath = createTreePathFromString(treePathMemento
415
						.getID());
416
				if (!subProgressMonitor.isCanceled() && treePath != null) {
417
					treePaths.add(treePath);
418
					subProgressMonitor.worked(1);
419
				}
420
			}
421
		}
422
		if (treePaths.size() > 0) {
423
			TaxonNavigatorE4.this.viewer.setExpandedTreePaths(
424
					treePaths.toArray(new TreePath[0]));
425
			subProgressMonitor.worked(1);
426
		}
427
		subProgressMonitor.done();
428
	}
429

    
430
	private TreePath createTreePathFromString(String string) {
431

    
432
		List<CdmBase> pathList = new ArrayList<CdmBase>();
433

    
434
		if (string.length() == 0) {
435
            return null;
436
        }
437

    
438
		for (String uuid : string.split(" ")) { //$NON-NLS-1$
439
			CdmBase cdmBaseObject = CdmStore.getService(
440
					ITaxonNodeService.class).find(
441
					UUID.fromString(uuid));
442
			if (cdmBaseObject == null) {
443
				// is this a tree uuid?
444
				cdmBaseObject = CdmStore.getService(
445
						IClassificationService.class).load(
446
						UUID.fromString(uuid));
447

    
448
				if (cdmBaseObject == null) {
449
                    return null;
450
                }
451
			}
452
			pathList.add(cdmBaseObject);
453
		}
454
		return new TreePath(pathList.toArray());
455
	}
456

    
457
	/**
458
	 * {@inheritDoc}
459
	 */
460
	@Override
461
	public void collapse() {
462
	    viewer.collapseAll();
463
	}
464

    
465
	/**
466
	 * {@inheritDoc}
467
	 */
468
	@Override
469
	public void expand() {
470
	    viewer.expandAll();
471
	}
472

    
473
	@Override
474
	public ConversationHolder getConversationHolder() {
475
		return conversation;
476
	}
477

    
478
	/** {@inheritDoc} */
479
	@PreDestroy
480
	public void dispose() {
481
		dataChangeBehavior = null;
482
		if (conversation != null) {
483
			conversation.unregisterForDataStoreChanges(this);
484
			conversation.close();
485
		}
486
		if(cdmEntitySession != null) {
487
		    cdmEntitySession.dispose();
488
		    cdmEntitySession = null;
489
		}
490
		if(CdmApplicationState.getCurrentDataChangeService() != null) {
491
		    CdmApplicationState.getCurrentDataChangeService().unregister(this);
492
		}
493
	}
494

    
495
	/** {@inheritDoc} */
496
	@Focus
497
	public void setFocus() {
498
		if (getConversationHolder() != null) {
499
			getConversationHolder().bind();
500
		}
501
		if(cdmEntitySession != null) {
502
		    cdmEntitySession.bind();
503
		}
504
	}
505

    
506
    public UISynchronize getSync() {
507
        return sync;
508
    }
509

    
510
    public TreeViewer getViewer() {
511
        return viewer;
512
    }
513

    
514
    public UndoContext getUndoContext() {
515
        return undoContext;
516
    }
517

    
518
	/** {@inheritDoc} */
519
	@Override
520
	public boolean postOperation(Object objectAffectedByOperation) {
521
	    viewer.refresh();
522
		return true;
523
	}
524

    
525
	@Override
526
	public boolean onComplete() {
527
		return true;
528
	}
529

    
530
	@Override
531
	public void update(Observable o, Object arg) {
532
		if(o instanceof LoginManager){
533
			refresh();
534
		}
535

    
536
	}
537
	   /** {@inheritDoc} */
538
    @Override
539
    public void update(CdmDataChangeMap changeEvents) {
540
        if (dataChangeBehavior == null) {
541
            dataChangeBehavior = new TaxonNavigatorDataChangeBehaviorE4(this);
542
        }
543

    
544
        DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
545
        updateSyncButton();
546

    
547
    }
548

    
549
    @Override
550
    public ICdmEntitySession getCdmEntitySession() {
551
       return cdmEntitySession;
552
    }
553

    
554
    @Override
555
    public List<TaxonNodeDto> getRootEntities() {
556
        if(root != null) {
557
            return root.getParentBeans();
558
        }
559
        return null;
560
    }
561

    
562
    @Override
563
    public void onChange(CdmChangeEvent event) {
564
        Object[] expandedElements = viewer.getExpandedElements();
565
        refresh();
566
        for(CdmBase cb : event.getChangedObjects()) {
567
        	if(cb instanceof TaxonNode) {
568
                TaxonNode tn = (TaxonNode)cb;
569
                if(tn.getTaxon() == null) {
570
                    viewer.refresh(tn.getClassification());
571
                } else {
572
                    viewer.refresh(cb);
573
                }
574
            } else if (cb instanceof Classification) {
575
                if ( event.getAction().equals(Action.Create)){
576
                    root.addRootNode((Classification)cb);
577
                } else if ( event.getAction().equals(Action.Delete)){
578
                    root.removeRootNode((Classification)cb);
579
                }
580
                viewer.refresh();
581
            }
582
        }
583
        viewer.setExpandedElements(expandedElements);
584
    }
585

    
586
    @Override
587
    public Map<Object, List<String>> getPropertyPathsMap() {
588
        Map<Object, List<String>> propertyPathsMap = new HashMap<Object, List<String>>();
589
        List<String> taxonNodePropertyPaths = Arrays.asList(new String[] {
590
                "taxon.name" //$NON-NLS-1$
591
        });
592
         propertyPathsMap.put("childNodes", taxonNodePropertyPaths); //$NON-NLS-1$
593
        return propertyPathsMap;
594
    }
595

    
596
    /**
597
     * {@inheritDoc}
598
     */
599
    @Override
600
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
601
        // TODO Auto-generated method stub
602

    
603
    }
604

    
605
    /**
606
     * {@inheritDoc}
607
     */
608
    @Override
609
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
610
    }
611

    
612
    /**
613
     * {@inheritDoc}
614
     */
615
    @Override
616
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
617
        if(viewer!=null && viewer.getControl()!=null && !viewer.getControl().isDisposed()){
618
            init();
619
        }
620
    }
621

    
622
    /**
623
     * {@inheritDoc}
624
     */
625
    @Override
626
    public void contextRefresh(IProgressMonitor monitor) {
627
//        viewer.refresh();
628
    }
629

    
630
    /**
631
     * {@inheritDoc}
632
     */
633
    @Override
634
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
635
    }
636

    
637
    @Inject
638
    @Optional
639
    private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_NAVIGATOR)TaxonNodeDto dto){
640
        if(dto!= null){
641
            Object[] expandedElements = viewer.getExpandedElements();
642

    
643
            refresh();
644
            viewer.setExpandedElements(expandedElements);
645
            viewer.reveal(dto);
646
            viewer.setSelection(new StructuredSelection(dto));
647

    
648
        }
649
    }
650

    
651
    @Inject
652
    @Optional
653
    private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_NAVIGATOR)boolean refresh){
654
        if(refresh){
655
            Object[] expandedElements = viewer.getExpandedElements();
656
            refresh();
657
            viewer.setExpandedElements(expandedElements);
658

    
659
        }
660
    }
661
}
(3-3/6)