View Javadoc

1   /*
2    *  File: ViewstateSaver.java 
3    *  Copyright (c) 2004-2007  Peter Kliem (Peter.Kliem@jaret.de)
4    *  A commercial license is available, see http://www.jaret.de.
5    *
6    * All rights reserved. This program and the accompanying materials
7    * are made available under the terms of the Common Public License v1.0
8    * which accompanies this distribution, and is available at
9    * http://www.eclipse.org/legal/cpl-v10.html
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              // hierarchical model
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          // autofilter
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         // autofilter
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         // add cols that are not in the memento
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 }