3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.taxeditor
.navigation
.navigator
;
13 import java
.util
.ArrayList
;
14 import java
.util
.HashSet
;
15 import java
.util
.List
;
17 import java
.util
.UUID
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.eclipse
.core
.runtime
.IAdaptable
;
21 import org
.eclipse
.jface
.viewers
.TreePath
;
22 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
23 import org
.eclipse
.swt
.widgets
.Composite
;
24 import org
.eclipse
.ui
.IMemento
;
25 import org
.eclipse
.ui
.IViewSite
;
26 import org
.eclipse
.ui
.PartInitException
;
27 import org
.eclipse
.ui
.navigator
.CommonNavigator
;
29 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
30 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
31 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
32 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
33 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
34 import eu
.etaxonomy
.taxeditor
.store
.model
.DataChangeBridge
;
35 import eu
.etaxonomy
.taxeditor
.store
.model
.IDataChangeBehavior
;
38 * Taxonomic tree implementation using Common Navigator Framework.
44 public class TaxonNavigator
extends CommonNavigator
implements IConversationEnabled
{
45 private static final Logger logger
= Logger
46 .getLogger(TaxonNavigator
.class);
48 public static final String ID
= "eu.etaxonomy.taxeditor.navigation.navigator"; //$NON-NLS-1$
50 private static final String TREE_PATHS
= "treepaths";
51 private static final String TREE_PATH
= "treepath";
53 private ConversationHolder conversation
;
55 private IDataChangeBehavior dataChangeBehavior
;
57 private IMemento memento
;
60 * @see org.eclipse.ui.navigator.CommonNavigator#getInitialInput()
63 protected IAdaptable
getInitialInput() {
64 conversation
= CdmStore
.NewTransactionalConversation();
65 conversation
.registerForDataStoreChanges(this);
66 this.getCommonViewer().refresh();
67 return new NavigatorRoot();
70 public void init(IViewSite site
, IMemento memento
)
71 throws PartInitException
{
72 super.init(site
, memento
);
74 this.memento
= memento
;
78 * Restores state from a tree path memento using space-separated
83 private void restoreState(IMemento memento
) {
84 if (memento
== null) {
87 Set
<TreePath
> treePaths
= new HashSet
<TreePath
>();
88 memento
= memento
.getChild(TREE_PATHS
);
89 if (memento
!= null) {
90 IMemento
[] treePathMementos
= memento
.getChildren(TREE_PATH
);
91 if (treePathMementos
.length
> 0) {
92 for (IMemento treePathMemento
: treePathMementos
) {
93 TreePath treePath
= createTreePathFromString(treePathMemento
.getID());
94 if (treePath
!= null) {
95 treePaths
.add(treePath
);
100 if (treePaths
.size() > 0) {
101 TreePath
[] treePathsArray
= (TreePath
[]) treePaths
.toArray(new TreePath
[treePaths
.size()]);
102 this.getCommonViewer().setExpandedTreePaths(treePathsArray
);
110 private TreePath
createTreePathFromString(String string
) {
111 List
<Taxon
> pathList
= new ArrayList
<Taxon
>();
112 for (String uuid
: string
.split(" ")) {
113 Taxon taxon
= (Taxon
) CdmStore
.getTaxonService().getTaxonByUuid(UUID
.fromString(uuid
));
119 return new TreePath(pathList
.toArray());
123 * @see org.eclipse.ui.navigator.CommonNavigator#saveState(org.eclipse.ui.IMemento)
125 public void saveState(IMemento memento
) {
127 super.saveState(memento
);
129 memento
= memento
.createChild(TREE_PATHS
);
130 TreePath
[] treePaths
= this.getCommonViewer().getExpandedTreePaths();
131 for (TreePath treePath
: treePaths
) {
132 int pathLength
= treePath
.getSegmentCount();
134 for (int i
= 0; i
< pathLength
; i
++) {
135 Object segment
= treePath
.getSegment(i
);
136 if (segment
instanceof Taxon
) {
137 path
+= ((Taxon
) segment
).getUuid().toString() + " ";
139 logger
.warn("Non-taxon tree path segment " + segment
);
142 logger
.info("Creating memento child for path " + path
.trim());
143 memento
.createChild(TREE_PATH
, path
.trim());
148 * @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse.swt.widgets.Composite)
150 public void createPartControl(Composite aParent
) {
151 super.createPartControl(aParent
);
152 ViewerComparator comparator
= getCommonViewer().getComparator();
153 restoreState(memento
);
158 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
160 public ConversationHolder
getConversationHolder() {
165 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
167 public void update(CdmDataChangeMap changeEvents
) {
168 if(dataChangeBehavior
== null){
169 dataChangeBehavior
= new TaxonNavigatorDataChangeBehavior(this);
171 DataChangeBridge
.handleDataChange(changeEvents
, dataChangeBehavior
);
174 protected String
getFrameToolTipText(Object element
) {
175 if (element
instanceof NavigatorRoot
) {
176 return "Taxonomic Tree";
178 return super.getFrameToolTipText(element
);