1
2
3
4
5
6
7
8
9
10
11 package de.jaret.util.ui.table.addon;
12
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 import org.eclipse.ui.IMemento;
19
20 import de.jaret.util.ui.table.JaretTable;
21 import de.jaret.util.ui.table.model.IColumn;
22 import de.jaret.util.ui.table.model.IHierarchicalJaretTableModel;
23 import de.jaret.util.ui.table.model.IHierarchicalTableViewState;
24 import de.jaret.util.ui.table.model.IRow;
25 import de.jaret.util.ui.table.model.ITableNode;
26 import de.jaret.util.ui.table.model.ITableViewState;
27
28 /***
29 * Implementation of an IViewstateSaver. This implementation saves and restores
30 * <ul>
31 * <li>column position and visibility</li>
32 * <li>row height and height mode</li>
33 * <li>node visibility in case of a hierarchical model</li>
34 * <li>autofilter enablement</li>
35 * </ul>
36 * It does <b>not</b> alter
37 * <ul>
38 * <li>fixed columns and rows</li>
39 * </ul>
40 * This viewstate saver can be used as a singleton and is imlemented as one.
41 *
42 * @author Peter Kliem
43 * @version $Id: ViewstateSaver.java 354 2007-04-09 13:53:45Z olk $
44 */
45 public class ViewstateSaver implements IViewstateSaver {
46 /*** singleton instance. */
47 private static ViewstateSaver _instance = new ViewstateSaver();
48 /*** key for the columns. */
49 private static final String COLUMNS = "columns";
50 /*** key for the rows. */
51 private static final String ROWS = "rows";
52 /*** key for the nodes. */
53 private static final String NODES = "nodes";
54 /*** key for the autofilter. */
55 private static final String AUTOFILTERENABLED = "autofilterenabled";
56
57 /***
58 * Get the singleton instance.
59 *
60 * @return singleton instance
61 */
62 public static ViewstateSaver getInstance() {
63 return _instance;
64 }
65
66 IMemento createOrGetChild(IMemento memento, String name) {
67 IMemento m = memento.getChild(name);
68 if (m == null) {
69 m = memento.createChild(name);
70 }
71 return m;
72 }
73
74 /***
75 * {@inheritDoc}
76 */
77 public void saveViewstate(JaretTable jaretTable, String additionalId, IMemento memento) {
78 if (additionalId != null) {
79 memento = createOrGetChild(memento, additionalId);
80 }
81 if (jaretTable.getHierarchicalModel() != null) {
82
83 IMemento nodeMemento = createOrGetChild(memento, NODES);
84 saveNodeStates(jaretTable, nodeMemento);
85 }
86 IMemento colMemento = createOrGetChild(memento, COLUMNS);
87 saveColumnState(jaretTable, colMemento);
88 IMemento rowMemento = createOrGetChild(memento, ROWS);
89 saveRowState(jaretTable, rowMemento);
90
91
92 memento.putInteger(AUTOFILTERENABLED, jaretTable.getAutoFilterEnable() ? 1:0);
93
94 }
95
96 /***
97 * {@inheritDoc}
98 */
99 public void restoreViewstate(JaretTable jaretTable, String additionalId, IMemento memento) {
100 if (additionalId != null) {
101 memento = createOrGetChild(memento, additionalId);
102 }
103 IMemento nodeMemento = memento.getChild(NODES);
104 if (nodeMemento != null) {
105 readNodeState(jaretTable, nodeMemento);
106 }
107
108 IMemento colMemento = memento.getChild(COLUMNS);
109 if (colMemento != null) {
110 readColumnState(jaretTable, colMemento);
111 }
112
113 IMemento rowMemento = memento.getChild(ROWS);
114 if (rowMemento != null) {
115 readRowState(jaretTable, rowMemento);
116 }
117
118
119 Integer i = memento.getInteger(AUTOFILTERENABLED);
120 boolean afenable = i != null && i.intValue()==1;
121 jaretTable.setAutoFilterEnable(afenable);
122
123 }
124
125 private void saveNodeStates(JaretTable jaretTable, IMemento nodeMemento) {
126 IHierarchicalTableViewState viewstate = (IHierarchicalTableViewState) jaretTable.getTableViewState();
127 IHierarchicalJaretTableModel model = jaretTable.getHierarchicalModel();
128 ITableNode root = model.getRootNode();
129 saveNodeState(viewstate, root, nodeMemento);
130 }
131
132 private void saveNodeState(IHierarchicalTableViewState viewstate, ITableNode node, IMemento nodeMemento) {
133 nodeMemento.putInteger("expanded" + node.getId(), viewstate.isExpanded(node) ? 1 : 0);
134 for (ITableNode n : node.getChildren()) {
135 saveNodeState(viewstate, n, nodeMemento);
136 }
137 }
138
139 private void readNodeState(JaretTable jaretTable, IMemento nodeMemento) {
140 IHierarchicalTableViewState viewstate = (IHierarchicalTableViewState) jaretTable.getTableViewState();
141 IHierarchicalJaretTableModel model = jaretTable.getHierarchicalModel();
142 ITableNode root = model.getRootNode();
143 readNodeState(viewstate, root, nodeMemento);
144 }
145
146 private void readNodeState(IHierarchicalTableViewState viewstate, ITableNode node, IMemento nodeMemento) {
147 Integer state = nodeMemento.getInteger("expanded" + node.getId());
148 if (state != null) {
149 boolean expanded = state.intValue() == 1;
150 viewstate.setExpanded(node, expanded);
151 }
152 for (ITableNode n : node.getChildren()) {
153 readNodeState(viewstate, n, nodeMemento);
154 }
155 }
156
157 private void saveRowState(JaretTable jaretTable, IMemento rowMemento) {
158 ITableViewState viewstate = jaretTable.getTableViewState();
159 for (int i = 0; i < jaretTable.getTableModel().getRowCount(); i++) {
160 IRow row = jaretTable.getTableModel().getRow(i);
161 ITableViewState.RowHeightMode heightMode = viewstate.getRowHeigthMode(row);
162 rowMemento.putString("heightMode" + row.getId(), heightMode.name());
163 int height = viewstate.getRowHeight(row);
164 rowMemento.putInteger("height" + row.getId(), height);
165 }
166 }
167
168 private void readRowState(JaretTable jaretTable, IMemento rowMemento) {
169 ITableViewState viewstate = jaretTable.getTableViewState();
170 for (int i = 0; i < jaretTable.getTableModel().getRowCount(); i++) {
171 IRow row = jaretTable.getTableModel().getRow(i);
172 String modeString = rowMemento.getString("heightMode" + row.getId());
173 if (modeString != null) {
174 ITableViewState.RowHeightMode heightMode = ITableViewState.RowHeightMode.valueOf(modeString);
175 viewstate.setRowHeightMode(heightMode);
176 if (heightMode != ITableViewState.RowHeightMode.OPTIMAL) {
177 Integer height = rowMemento.getInteger("height" + row.getId());
178 if (height != null) {
179 viewstate.setRowHeight(row, height.intValue());
180 }
181 }
182 }
183 }
184 }
185
186 private void saveColumnState(JaretTable jaretTable, IMemento colMemento) {
187 ITableViewState viewstate = jaretTable.getTableViewState();
188 for (int i = 0; i < jaretTable.getTableModel().getColumnCount(); i++) {
189 IColumn col = jaretTable.getTableModel().getColumn(i);
190 int width = viewstate.getColumnWidth(col);
191 colMemento.putInteger("width" + col.getId(), width);
192 colMemento.putInteger("visible" + col.getId(), viewstate.getColumnVisible(col) ? 1 : 0);
193 colMemento.putInteger("pos" + col.getId(), viewstate.getSortedColumns().indexOf(col));
194 }
195 }
196
197 private void readColumnState(JaretTable jaretTable, IMemento colMemento) {
198 Map<Integer, IColumn> colsOrdered = new HashMap<Integer, IColumn>();
199
200 ITableViewState viewstate = jaretTable.getTableViewState();
201 for (int i = 0; i < jaretTable.getTableModel().getColumnCount(); i++) {
202 IColumn col = jaretTable.getTableModel().getColumn(i);
203 Integer width = colMemento.getInteger("width" + col.getId());
204 if (width != null) {
205 viewstate.setColumnWidth(col, width.intValue());
206 }
207 Integer visible = colMemento.getInteger("visible" + col.getId());
208 if (visible != null) {
209 viewstate.setColumnVisible(col, visible.intValue() == 1);
210 }
211 Integer pos = colMemento.getInteger("pos" + col.getId());
212 if (pos != null && pos.intValue() != -1) {
213 colsOrdered.put(pos, col);
214 }
215 }
216 List<IColumn> colList = new ArrayList<IColumn>();
217 for (int i = 0; i < jaretTable.getTableModel().getColumnCount(); i++) {
218 IColumn c = colsOrdered.get(i);
219 if (c != null) {
220 colList.add(c);
221 }
222 }
223
224 for (int i = 0; i < jaretTable.getTableModel().getColumnCount(); i++) {
225 IColumn c = jaretTable.getTableModel().getColumn(i);
226 if (!colList.contains(c)) {
227 colList.add(c);
228 }
229 }
230
231 if (colList.size() > 0) {
232 viewstate.setSortedColumns(colList);
233 }
234 }
235 }