1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package de.jaret.util.ui.timebars.addon;
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import org.eclipse.ui.IMemento;
26
27 import de.jaret.util.date.JaretDate;
28 import de.jaret.util.ui.timebars.model.HierarchicalTimeBarModel;
29 import de.jaret.util.ui.timebars.model.TimeBarNode;
30 import de.jaret.util.ui.timebars.swt.TimeBarViewer;
31
32 /***
33 * Implementation of the viewstate saver for a timebarviewer. Saves and restores
34 * <ul>
35 * <li>Expanded state for hierarchical models</li>
36 * <li>vertical scroll position</li>
37 * <li>start date</li>
38 * </ul>
39 *
40 * @author kliem
41 * @version $Id: ViewstateSaver.java 664 2007-12-10 21:40:08Z kliem $
42 */
43 public class ViewstateSaver implements IViewstateSaver {
44 /*** key for storing the first row. */
45 private static final String FIRSTROW = "firstrow";
46 /*** key for storing the first row offset. */
47 private static final String FIRSTROWOFFSET = "firstrowoffset";
48 /*** key for storing the start date. */
49 private static final String STARTDATE = "startdate";
50 /*** can be used as a singleton. */
51 private static ViewstateSaver _instance = new ViewstateSaver();
52
53 /***
54 * The ViewStateSaver can be used as a singleton.
55 *
56 * @return instance
57 */
58 public static ViewstateSaver getInstance() {
59 return _instance;
60 }
61
62 /***
63 * {@inheritDoc}
64 */
65 public void restoreViewstate(TimeBarViewer timeBarViewer, IHierarchyIdService idService, String id, IMemento memento) {
66 if (memento == null) {
67 return;
68 }
69 if (id != null) {
70 memento = memento.getChild(id);
71 }
72 if (memento == null) {
73 return;
74 }
75
76
77 Integer firstRow = memento.getInteger(FIRSTROW);
78 if (firstRow != null) {
79 timeBarViewer.setFirstRowDisplayed(firstRow);
80 }
81 Integer firstRowOffset = memento.getInteger(FIRSTROWOFFSET);
82 if (firstRowOffset != null) {
83 timeBarViewer.setFirstRowOffset(firstRowOffset);
84 }
85
86
87 String startDateString = memento.getString(STARTDATE);
88 if (startDateString != null) {
89 JaretDate d = new JaretDate(startDateString);
90 timeBarViewer.setStartDate(d);
91 }
92
93
94 if (timeBarViewer.getHierarchicalModel() != null) {
95 int nr = 0;
96 String nodeId = "x";
97 while (nodeId != null) {
98 nodeId = memento.getString("node" + nr++);
99 if (nodeId != null) {
100 boolean state = memento.getInteger(nodeId) == 1;
101 TimeBarNode node = idService.getNode(timeBarViewer.getHierarchicalModel(), nodeId);
102 if (node != null) {
103 timeBarViewer.getHierarchicalViewState().setExpanded(node, state);
104 }
105 }
106 }
107 }
108
109 }
110
111 /***
112 * {@inheritDoc}
113 */
114 public void saveViewstate(TimeBarViewer timeBarViewer, IHierarchyIdService idService, String id, IMemento memento) {
115
116 if (id != null) {
117 memento = memento.createChild(id);
118 }
119
120
121 memento.putInteger(FIRSTROW, timeBarViewer.getFirstRowDisplayed());
122 memento.putInteger(FIRSTROWOFFSET, timeBarViewer.getFirstRowOffset());
123
124 memento.putString(STARTDATE, timeBarViewer.getStartDate().toString());
125
126
127 if (timeBarViewer.getHierarchicalModel() != null) {
128 HierarchicalTimeBarModel model = timeBarViewer.getHierarchicalModel();
129 List<TimeBarNode> allNodes = getAllTimeBarNodes(timeBarViewer);
130 int nr = 0;
131 for (TimeBarNode node : allNodes) {
132 String nodeId = idService.getId(model, node);
133 memento.putString("node" + nr++, nodeId);
134
135 memento.putInteger(nodeId, timeBarViewer.getHierarchicalViewState().isExpanded(node) ? 1 : 0);
136 }
137 }
138 }
139
140 /***
141 * Retrieve all nodes in a flat list.
142 *
143 * @param tbv timebarviewer
144 * @return flat list of nodes
145 */
146 private List<TimeBarNode> getAllTimeBarNodes(TimeBarViewer tbv) {
147 List<TimeBarNode> result = new ArrayList<TimeBarNode>();
148 TimeBarNode root = tbv.getHierarchicalModel().getRootNode();
149 result.add(root);
150 collectNodes(root, result);
151 return result;
152 }
153
154 /***
155 * Collect nodes recursively.
156 *
157 * @param node node that will be added to the result and of which the children will be processed
158 * @param list resulting list
159 */
160 private void collectNodes(TimeBarNode node, List<TimeBarNode> list) {
161 for (TimeBarNode n : node.getChildren()) {
162 list.add(n);
163 collectNodes(n, list);
164 }
165 }
166
167 }