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
.events
.FocusEvent
;
23 import org
.eclipse
.swt
.events
.FocusListener
;
24 import org
.eclipse
.swt
.widgets
.Composite
;
25 import org
.eclipse
.ui
.IMemento
;
26 import org
.eclipse
.ui
.IViewSite
;
27 import org
.eclipse
.ui
.PartInitException
;
28 import org
.eclipse
.ui
.navigator
.CommonNavigator
;
29 import org
.eclipse
.ui
.navigator
.CommonViewer
;
31 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
32 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
33 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
34 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
35 import eu
.etaxonomy
.taxeditor
.model
.DataChangeBridge
;
36 import eu
.etaxonomy
.taxeditor
.model
.IDataChangeBehavior
;
37 import eu
.etaxonomy
.taxeditor
.operations
.IPostOperationEnabled
;
38 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
41 * Taxonomic tree implementation using Common Navigator Framework.
47 public class TaxonNavigator
extends CommonNavigator
implements IPostOperationEnabled
, IConversationEnabled
{
48 private static final Logger logger
= Logger
49 .getLogger(TaxonNavigator
.class);
51 public static final String ID
= "eu.etaxonomy.taxeditor.navigation.navigator"; //$NON-NLS-1$
53 private static final String TREE_PATHS
= "treepaths";
54 private static final String TREE_PATH
= "treepath";
56 private ConversationHolder conversation
;
58 private IDataChangeBehavior dataChangeBehavior
;
60 private IMemento memento
;
63 * @see org.eclipse.ui.navigator.CommonNavigator#getInitialInput()
66 protected IAdaptable
getInitialInput() {
67 conversation
= CdmStore
.NewTransactionalConversation();
68 conversation
.registerForDataStoreChanges(this);
69 this.getCommonViewer().refresh();
73 public void init(IViewSite site
, IMemento memento
)
74 throws PartInitException
{
75 super.init(site
, memento
);
77 this.memento
= memento
;
81 * Refresh this navigators viewer
83 public void refresh(){
84 this.getCommonViewer().refresh();
89 * Restores state from a tree path memento using space-separated
94 private void restoreState(IMemento memento
) {
95 if (memento
== null) {
98 Set
<TreePath
> treePaths
= new HashSet
<TreePath
>();
99 memento
= memento
.getChild(TREE_PATHS
);
100 if (memento
!= null) {
101 IMemento
[] treePathMementos
= memento
.getChildren(TREE_PATH
);
102 if (treePathMementos
.length
> 0) {
103 for (IMemento treePathMemento
: treePathMementos
) {
104 TreePath treePath
= createTreePathFromString(treePathMemento
.getID());
105 if (treePath
!= null) {
106 treePaths
.add(treePath
);
111 if (treePaths
.size() > 0) {
112 this.getCommonViewer().setExpandedTreePaths(treePaths
.toArray(new TreePath
[0]));
120 private TreePath
createTreePathFromString(String string
) {
122 List
<CdmBase
> pathList
= new ArrayList
<CdmBase
>();
124 if(string
.length() == 0) return null;
126 for (String uuid
: string
.split(" ")) {
127 CdmBase cdmBaseObject
= CdmStore
.getTaxonTreeService().getTaxonNodeByUuid(UUID
.fromString(uuid
));
128 if (cdmBaseObject
== null) {
129 // is this a tree uuid?
130 cdmBaseObject
= CdmStore
.getTaxonTreeService().getTaxonomicTreeByUuid(UUID
.fromString(uuid
));
132 if(cdmBaseObject
== null) return null;
134 pathList
.add(cdmBaseObject
);
136 return new TreePath(pathList
.toArray());
140 * @see org.eclipse.ui.navigator.CommonNavigator#saveState(org.eclipse.ui.IMemento)
142 public void saveState(IMemento memento
) {
144 super.saveState(memento
);
146 memento
= memento
.createChild(TREE_PATHS
);
147 TreePath
[] treePaths
= this.getCommonViewer().getExpandedTreePaths();
148 for (TreePath treePath
: treePaths
) {
149 int pathLength
= treePath
.getSegmentCount();
151 for (int i
= 0; i
< pathLength
; i
++) {
152 Object segment
= treePath
.getSegment(i
);
153 if (segment
instanceof CdmBase
) {
154 path
+= ((CdmBase
) segment
).getUuid().toString() + " ";
156 logger
.warn("Non-taxon tree path segment " + segment
);
159 logger
.info("Creating memento child for path " + path
.trim());
160 memento
.createChild(TREE_PATH
, path
.trim());
165 * @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse.swt.widgets.Composite)
167 public void createPartControl(Composite aParent
) {
168 super.createPartControl(aParent
);
169 restoreState(memento
);
174 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
176 public ConversationHolder
getConversationHolder() {
181 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
183 public void update(CdmDataChangeMap changeEvents
) {
184 if(dataChangeBehavior
== null){
185 dataChangeBehavior
= new TaxonNavigatorDataChangeBehavior(this);
188 DataChangeBridge
.handleDataChange(changeEvents
, dataChangeBehavior
);
191 public String
getFrameToolTipText(Object element
) {
192 if (element
instanceof Root
) {
193 return "Taxonomic Tree";
195 return super.getFrameToolTipText(element
);
199 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
202 public void dispose() {
204 dataChangeBehavior
= null;
205 if(conversation
!= null){
206 conversation
.unregisterForDataStoreChanges(this);
208 conversation
.close();
212 * @see org.eclipse.ui.navigator.CommonNavigator#setFocus()
215 public void setFocus() {
217 getConversationHolder().bind();
221 * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
223 public boolean postOperation(CdmBase objectAffectedByOperation
) {
224 // nothing to do here