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
.swt
.widgets
.Composite
;
23 import org
.eclipse
.ui
.IMemento
;
24 import org
.eclipse
.ui
.IViewSite
;
25 import org
.eclipse
.ui
.PartInitException
;
26 import org
.eclipse
.ui
.navigator
.CommonNavigator
;
28 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
29 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
30 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
31 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
32 import eu
.etaxonomy
.taxeditor
.model
.DataChangeBridge
;
33 import eu
.etaxonomy
.taxeditor
.model
.IDataChangeBehavior
;
34 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
37 * Taxonomic tree implementation using Common Navigator Framework.
43 public class TaxonNavigator
extends CommonNavigator
implements IConversationEnabled
{
44 private static final Logger logger
= Logger
45 .getLogger(TaxonNavigator
.class);
47 public static final String ID
= "eu.etaxonomy.taxeditor.navigation.navigator"; //$NON-NLS-1$
49 private static final String TREE_PATHS
= "treepaths";
50 private static final String TREE_PATH
= "treepath";
52 private ConversationHolder conversation
;
54 private IDataChangeBehavior dataChangeBehavior
;
56 private IMemento memento
;
59 * @see org.eclipse.ui.navigator.CommonNavigator#getInitialInput()
62 protected IAdaptable
getInitialInput() {
63 conversation
= CdmStore
.NewTransactionalConversation();
64 conversation
.registerForDataStoreChanges(this);
65 this.getCommonViewer().refresh();
69 public void init(IViewSite site
, IMemento memento
)
70 throws PartInitException
{
71 super.init(site
, memento
);
73 this.memento
= memento
;
77 * Restores state from a tree path memento using space-separated
82 private void restoreState(IMemento memento
) {
83 if (memento
== null) {
86 Set
<TreePath
> treePaths
= new HashSet
<TreePath
>();
87 memento
= memento
.getChild(TREE_PATHS
);
88 if (memento
!= null) {
89 IMemento
[] treePathMementos
= memento
.getChildren(TREE_PATH
);
90 if (treePathMementos
.length
> 0) {
91 for (IMemento treePathMemento
: treePathMementos
) {
92 TreePath treePath
= createTreePathFromString(treePathMemento
.getID());
93 if (treePath
!= null) {
94 treePaths
.add(treePath
);
99 if (treePaths
.size() > 0) {
100 this.getCommonViewer().setExpandedTreePaths(treePaths
.toArray(new TreePath
[0]));
108 private TreePath
createTreePathFromString(String string
) {
110 List
<CdmBase
> pathList
= new ArrayList
<CdmBase
>();
112 if(string
.length() == 0) return null;
114 for (String uuid
: string
.split(" ")) {
115 CdmBase cdmBaseObject
= CdmStore
.getTaxonService().getTaxonNodeByUuid(UUID
.fromString(uuid
));
116 if (cdmBaseObject
== null) {
117 // is this a tree uuid?
118 cdmBaseObject
= CdmStore
.getTaxonService().getTaxonomicTreeByUuid(UUID
.fromString(uuid
));
120 if(cdmBaseObject
== null) return null;
122 pathList
.add(cdmBaseObject
);
124 return new TreePath(pathList
.toArray());
128 * @see org.eclipse.ui.navigator.CommonNavigator#saveState(org.eclipse.ui.IMemento)
130 public void saveState(IMemento memento
) {
132 super.saveState(memento
);
134 memento
= memento
.createChild(TREE_PATHS
);
135 TreePath
[] treePaths
= this.getCommonViewer().getExpandedTreePaths();
136 for (TreePath treePath
: treePaths
) {
137 int pathLength
= treePath
.getSegmentCount();
139 for (int i
= 0; i
< pathLength
; i
++) {
140 Object segment
= treePath
.getSegment(i
);
141 if (segment
instanceof CdmBase
) {
142 path
+= ((CdmBase
) segment
).getUuid().toString() + " ";
144 logger
.warn("Non-taxon tree path segment " + segment
);
147 logger
.info("Creating memento child for path " + path
.trim());
148 memento
.createChild(TREE_PATH
, path
.trim());
153 * @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse.swt.widgets.Composite)
155 public void createPartControl(Composite aParent
) {
156 super.createPartControl(aParent
);
157 restoreState(memento
);
162 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
164 public ConversationHolder
getConversationHolder() {
169 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
171 public void update(CdmDataChangeMap changeEvents
) {
172 if(dataChangeBehavior
== null){
173 dataChangeBehavior
= new TaxonNavigatorDataChangeBehavior(this);
176 DataChangeBridge
.handleDataChange(changeEvents
, dataChangeBehavior
);
179 protected String
getFrameToolTipText(Object element
) {
180 if (element
instanceof Root
) {
181 return "Taxonomic Tree";
183 return super.getFrameToolTipText(element
);
187 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
190 public void dispose() {
191 conversation
.commit();
192 conversation
.unregisterForDataStoreChanges(this);