editor version 2.0.0.v20090805-1724
[taxeditor.git] / taxeditor-navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / navigator / TaxonNavigator.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10
11 package eu.etaxonomy.taxeditor.navigation.navigator;
12
13 import java.util.ArrayList;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Set;
17 import java.util.UUID;
18
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;
27
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;
35
36 /**
37 * Taxonomic tree implementation using Common Navigator Framework.
38 *
39 * @author p.ciardelli
40 * @created 02.06.2009
41 * @version 1.0
42 */
43 public class TaxonNavigator extends CommonNavigator implements IConversationEnabled {
44 private static final Logger logger = Logger
45 .getLogger(TaxonNavigator.class);
46
47 public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator"; //$NON-NLS-1$
48
49 private static final String TREE_PATHS = "treepaths";
50 private static final String TREE_PATH = "treepath";
51
52 private ConversationHolder conversation;
53
54 private IDataChangeBehavior dataChangeBehavior;
55
56 private IMemento memento;
57
58 /* (non-Javadoc)
59 * @see org.eclipse.ui.navigator.CommonNavigator#getInitialInput()
60 */
61 @Override
62 protected IAdaptable getInitialInput() {
63 conversation = CdmStore.NewTransactionalConversation();
64 conversation.registerForDataStoreChanges(this);
65 this.getCommonViewer().refresh();
66 return new Root();
67 }
68
69 public void init(IViewSite site, IMemento memento)
70 throws PartInitException {
71 super.init(site, memento);
72
73 this.memento = memento;
74 }
75
76 /**
77 * Restores state from a tree path memento using space-separated
78 * Taxon UUIDs.
79 *
80 * @param memento
81 */
82 private void restoreState(IMemento memento) {
83 if (memento == null) {
84 return;
85 }
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);
95 }
96 }
97 }
98 }
99 if (treePaths.size() > 0) {
100 this.getCommonViewer().setExpandedTreePaths(treePaths.toArray(new TreePath[0]));
101 }
102 }
103
104 /**
105 * @param string
106 * @return
107 */
108 private TreePath createTreePathFromString(String string) {
109
110 List<CdmBase> pathList = new ArrayList<CdmBase>();
111
112 if(string.length() == 0) return null;
113
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));
119
120 if(cdmBaseObject == null) return null;
121 }
122 pathList.add(cdmBaseObject);
123 }
124 return new TreePath(pathList.toArray());
125 }
126
127 /* (non-Javadoc)
128 * @see org.eclipse.ui.navigator.CommonNavigator#saveState(org.eclipse.ui.IMemento)
129 */
130 public void saveState(IMemento memento) {
131
132 super.saveState(memento);
133
134 memento = memento.createChild(TREE_PATHS);
135 TreePath[] treePaths = this.getCommonViewer().getExpandedTreePaths();
136 for (TreePath treePath : treePaths) {
137 int pathLength = treePath.getSegmentCount();
138 String path = "";
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() + " ";
143 } else {
144 logger.warn("Non-taxon tree path segment " + segment);
145 }
146 }
147 logger.info("Creating memento child for path " + path.trim());
148 memento.createChild(TREE_PATH, path.trim());
149 }
150 }
151
152 /* (non-Javadoc)
153 * @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse.swt.widgets.Composite)
154 */
155 public void createPartControl(Composite aParent) {
156 super.createPartControl(aParent);
157 restoreState(memento);
158 }
159
160
161 /* (non-Javadoc)
162 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
163 */
164 public ConversationHolder getConversationHolder() {
165 return conversation;
166 }
167
168 /* (non-Javadoc)
169 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
170 */
171 public void update(CdmDataChangeMap changeEvents) {
172 if(dataChangeBehavior == null){
173 dataChangeBehavior = new TaxonNavigatorDataChangeBehavior(this);
174 }
175
176 DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
177 }
178
179 protected String getFrameToolTipText(Object element) {
180 if (element instanceof Root) {
181 return "Taxonomic Tree";
182 }
183 return super.getFrameToolTipText(element);
184 }
185
186 /* (non-Javadoc)
187 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
188 */
189 @Override
190 public void dispose() {
191 conversation.commit();
192 conversation.unregisterForDataStoreChanges(this);
193
194 super.dispose();
195 }
196 }