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    *  This program is free software; you can redistribute it and/or modify
7    *  it under the terms of the GNU General Public License as published by
8    *  the Free Software Foundation; either version 2 of the License, or
9    *  (at your option) any later version.
10   *
11   *  This program is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   *  GNU General Public License for more details.
15   *
16   *  You should have received a copy of the GNU General Public License
17   *  along with this program; if not, write to the Free Software
18   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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          // vertical scroll position
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          // horizontal = startDate
87          String startDateString = memento.getString(STARTDATE);
88          if (startDateString != null) {
89              JaretDate d = new JaretDate(startDateString);
90              timeBarViewer.setStartDate(d);
91          }
92          
93          // for hierarchical models try to restore expanded states
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         // create child for the given id if the id is not null
116         if (id != null) {
117             memento = memento.createChild(id);
118         }
119 
120         // vertical scroll position
121         memento.putInteger(FIRSTROW, timeBarViewer.getFirstRowDisplayed());
122         memento.putInteger(FIRSTROWOFFSET, timeBarViewer.getFirstRowOffset());
123         // horizontal = startDate
124         memento.putString(STARTDATE, timeBarViewer.getStartDate().toString());
125         
126         // save expanded state for every node
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 //                System.out.println("NODE ID "+nodeId);
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 }