7ea32705ce996ae3a00ee163a4efb9422c44817d
[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.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;
30
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;
39
40 /**
41 * Taxonomic tree implementation using Common Navigator Framework.
42 *
43 * @author p.ciardelli
44 * @created 02.06.2009
45 * @version 1.0
46 */
47 public class TaxonNavigator extends CommonNavigator implements IPostOperationEnabled, IConversationEnabled{
48 private static final Logger logger = Logger
49 .getLogger(TaxonNavigator.class);
50
51 public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator"; //$NON-NLS-1$
52
53 private static final String TREE_PATHS = "treepaths";
54 private static final String TREE_PATH = "treepath";
55
56 private ConversationHolder conversation;
57
58 private IDataChangeBehavior dataChangeBehavior;
59
60 private IMemento memento;
61
62 /* (non-Javadoc)
63 * @see org.eclipse.ui.navigator.CommonNavigator#getInitialInput()
64 */
65 @Override
66 protected IAdaptable getInitialInput() {
67 conversation = CdmStore.NewTransactionalConversation();
68 conversation.registerForDataStoreChanges(this);
69 this.getCommonViewer().refresh();
70 return new Root();
71 }
72
73 public void init(IViewSite site, IMemento memento)
74 throws PartInitException {
75 super.init(site, memento);
76
77 this.memento = memento;
78 }
79
80 /**
81 * Refresh this navigators viewer
82 */
83 public void refresh(){
84 this.getCommonViewer().refresh();
85 }
86
87
88 /**
89 * Restores state from a tree path memento using space-separated
90 * Taxon UUIDs.
91 *
92 * @param memento
93 */
94 private void restoreState(IMemento memento) {
95 if (memento == null) {
96 return;
97 }
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);
107 }
108 }
109 }
110 }
111 if (treePaths.size() > 0) {
112 this.getCommonViewer().setExpandedTreePaths(treePaths.toArray(new TreePath[0]));
113 }
114 }
115
116 /**
117 * @param string
118 * @return
119 */
120 private TreePath createTreePathFromString(String string) {
121
122 List<CdmBase> pathList = new ArrayList<CdmBase>();
123
124 if(string.length() == 0) return null;
125
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));
131
132 if(cdmBaseObject == null) return null;
133 }
134 pathList.add(cdmBaseObject);
135 }
136 return new TreePath(pathList.toArray());
137 }
138
139 /* (non-Javadoc)
140 * @see org.eclipse.ui.navigator.CommonNavigator#saveState(org.eclipse.ui.IMemento)
141 */
142 public void saveState(IMemento memento) {
143
144 super.saveState(memento);
145
146 memento = memento.createChild(TREE_PATHS);
147 TreePath[] treePaths = this.getCommonViewer().getExpandedTreePaths();
148 for (TreePath treePath : treePaths) {
149 int pathLength = treePath.getSegmentCount();
150 String path = "";
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() + " ";
155 } else {
156 logger.warn("Non-taxon tree path segment " + segment);
157 }
158 }
159 logger.info("Creating memento child for path " + path.trim());
160 memento.createChild(TREE_PATH, path.trim());
161 }
162 }
163
164 /* (non-Javadoc)
165 * @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse.swt.widgets.Composite)
166 */
167 public void createPartControl(Composite aParent) {
168 super.createPartControl(aParent);
169 restoreState(memento);
170 }
171
172
173 /* (non-Javadoc)
174 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
175 */
176 public ConversationHolder getConversationHolder() {
177 return conversation;
178 }
179
180 /* (non-Javadoc)
181 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
182 */
183 public void update(CdmDataChangeMap changeEvents) {
184 if(dataChangeBehavior == null){
185 dataChangeBehavior = new TaxonNavigatorDataChangeBehavior(this);
186 }
187
188 DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
189 }
190
191 public String getFrameToolTipText(Object element) {
192 if (element instanceof Root) {
193 return "Taxonomic Tree";
194 }
195 return super.getFrameToolTipText(element);
196 }
197
198 /* (non-Javadoc)
199 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
200 */
201 @Override
202 public void dispose() {
203 super.dispose();
204 dataChangeBehavior = null;
205 if(conversation != null){
206 conversation.unregisterForDataStoreChanges(this);
207 }
208 conversation.close();
209 }
210
211 /* (non-Javadoc)
212 * @see org.eclipse.ui.navigator.CommonNavigator#setFocus()
213 */
214 @Override
215 public void setFocus() {
216 super.setFocus();
217 getConversationHolder().bind();
218 }
219
220 /* (non-Javadoc)
221 * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
222 */
223 public boolean postOperation(CdmBase objectAffectedByOperation) {
224 // nothing to do here
225 return true;
226 }
227 }