(no commit message)
[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.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;
28
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.model.DataChangeBridge;
34 import eu.etaxonomy.taxeditor.model.IDataChangeBehavior;
35 import eu.etaxonomy.taxeditor.store.CdmStore;
36
37 /**
38 * Taxonomic tree implementation using Common Navigator Framework.
39 *
40 * @author p.ciardelli
41 * @created 02.06.2009
42 * @version 1.0
43 */
44 public class TaxonNavigator extends CommonNavigator implements IConversationEnabled {
45 private static final Logger logger = Logger
46 .getLogger(TaxonNavigator.class);
47
48 public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator"; //$NON-NLS-1$
49
50 private static final String TREE_PATHS = "treepaths";
51 private static final String TREE_PATH = "treepath";
52
53 private ConversationHolder conversation;
54
55 private IDataChangeBehavior dataChangeBehavior;
56
57 private IMemento memento;
58
59 /* (non-Javadoc)
60 * @see org.eclipse.ui.navigator.CommonNavigator#getInitialInput()
61 */
62 @Override
63 protected IAdaptable getInitialInput() {
64 conversation = CdmStore.NewTransactionalConversation();
65 conversation.registerForDataStoreChanges(this);
66 this.getCommonViewer().refresh();
67 return new NavigatorRoot();
68 }
69
70 public void init(IViewSite site, IMemento memento)
71 throws PartInitException {
72 super.init(site, memento);
73
74 this.memento = memento;
75 }
76
77 /**
78 * Restores state from a tree path memento using space-separated
79 * Taxon UUIDs.
80 *
81 * @param memento
82 */
83 private void restoreState(IMemento memento) {
84 if (memento == null) {
85 return;
86 }
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);
96 }
97 }
98 }
99 }
100 if (treePaths.size() > 0) {
101 TreePath[] treePathsArray = (TreePath[]) treePaths.toArray(new TreePath[treePaths.size()]);
102 this.getCommonViewer().setExpandedTreePaths(treePathsArray);
103 }
104 }
105
106 /**
107 * @param string
108 * @return
109 */
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));
114 if (taxon == null) {
115 return null;
116 }
117 pathList.add(taxon);
118 }
119 return new TreePath(pathList.toArray());
120 }
121
122 /* (non-Javadoc)
123 * @see org.eclipse.ui.navigator.CommonNavigator#saveState(org.eclipse.ui.IMemento)
124 */
125 public void saveState(IMemento memento) {
126
127 super.saveState(memento);
128
129 memento = memento.createChild(TREE_PATHS);
130 TreePath[] treePaths = this.getCommonViewer().getExpandedTreePaths();
131 for (TreePath treePath : treePaths) {
132 int pathLength = treePath.getSegmentCount();
133 String path = "";
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() + " ";
138 } else {
139 logger.warn("Non-taxon tree path segment " + segment);
140 }
141 }
142 logger.info("Creating memento child for path " + path.trim());
143 memento.createChild(TREE_PATH, path.trim());
144 }
145 }
146
147 /* (non-Javadoc)
148 * @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse.swt.widgets.Composite)
149 */
150 public void createPartControl(Composite aParent) {
151 super.createPartControl(aParent);
152 ViewerComparator comparator = getCommonViewer().getComparator();
153 restoreState(memento);
154 }
155
156
157 /* (non-Javadoc)
158 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
159 */
160 public ConversationHolder getConversationHolder() {
161 return conversation;
162 }
163
164 /* (non-Javadoc)
165 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
166 */
167 public void update(CdmDataChangeMap changeEvents) {
168 if(dataChangeBehavior == null){
169 dataChangeBehavior = new TaxonNavigatorDataChangeBehavior(this);
170 }
171 DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
172 }
173
174 protected String getFrameToolTipText(Object element) {
175 if (element instanceof NavigatorRoot) {
176 return "Taxonomic Tree";
177 }
178 return super.getFrameToolTipText(element);
179 }
180 }