|
|
Line 1: |
Line 1: |
− | Storing view state is done in two commons ways, depending
| |
− | on whether you want to store settings between
| |
− | workbench sessions or across invocations of your view. The first of these
| |
− | facilities is found directly on <tt>IViewPart</tt>. When the workbench
| |
− | is shut down, the method <tt>saveState</tt> is called on all open views.
| |
− | The parameter to this method is an <tt>IMemento</tt>, a simple
| |
− | data structure that stores hierarchies of nodes containing numbers
| |
− | and strings. Here is an example from the recipe application in the FAQ
| |
− | examples, where a view is persisting the current selection of a list viewer
| |
− | in a memento:
| |
− | <pre>
| |
− | private static final String STORE_SELECTION =
| |
− | "ShoppingList.SELECTION";
| |
− | public void saveState(IMemento memento) {
| |
− | super.saveState(memento);
| |
− | ISelection sel = viewer.getSelection();
| |
− | IStructuredSelection ss = (IStructuredSelection) sel;
| |
− | StringBuffer buf = new StringBuffer();
| |
− | for (Iterator it = ss.iterator(); it.hasNext();) {
| |
− | buf.append(it.next());
| |
− | buf.append(',');
| |
− | }
| |
− | memento.putString(STORE_SELECTION, buf.toString());
| |
− | }
| |
− | </pre>
| |
| | | |
− |
| |
− | When the workbench is reopened, the method
| |
− | <tt>init(IViewSite, IMemento)</tt> is called the first time each view
| |
− | becomes visible. The <tt>IMemento</tt> will contain all the information
| |
− | that was added to it when the workbench was shut down. Note that
| |
− | <tt>init</tt> is called before the <tt>createPartControl</tt> method,
| |
− | so you will not be able to restore widget state directly from the
| |
− | <tt>init</tt> method. You can store the <tt>IMemento</tt> instance in a field
| |
− | and restore state later on when your widgets have been created. Continuing
| |
− | this example, here is the code for restoring the viewer selection
| |
− | when the view is reopened:
| |
− | <pre>
| |
− | private IMemento memento;
| |
− | ...
| |
− | public void init(IViewSite site, IMemento memento)
| |
− | throws PartInitException {
| |
− | super.init(site, memento);
| |
− | this.memento = memento;
| |
− | }
| |
− | public void createPartControl(Composite parent) {
| |
− | //create widgets ...
| |
− | if (memento == null) return;
| |
− | String value = memento.getString(STORE_SELECTION);
| |
− | if (value == null) return;
| |
− | IStructuredSelection ss = new StructuredSelection(
| |
− | value.split(","));
| |
− | viewer.setSelection(ss);
| |
− | }
| |
− | </pre>
| |
− | Note that the <tt>IMemento</tt> instance can be <tt>null</tt> if the view state
| |
− | was not saved from a previous session: for example, when the view
| |
− | is first created.
| |
− |
| |
− |
| |
− | Another mechanism for persisting view state is the JFace
| |
− | <tt>IDialogSettings</tt> facility. The advantage of dialog settings
| |
− | over the view <tt>save</tt>/<tt>init</tt> mechanism is that you can control when
| |
− | settings are persisted. The <tt>saveState</tt> method is called only
| |
− | if your view is open when the workbench shuts down, so
| |
− | it is not useful for storing view state when the view is closed by
| |
− | the user. Dialog settings, on the other hand, can be changed
| |
− | and persisted whenever you want.
| |
− |
| |
− |
| |
− | Views commonly use a combination of both dialog settings and
| |
− | a memento for persisting view state. Important settings, such as
| |
− | filters, sorters, and other view preferences, will be stored as
| |
− | dialog settings; more transient attributes, such as selection
| |
− | and expansion state, will be stored in the memento only when
| |
− | the workbench is being shut down.
| |
− |
| |
− |
| |
− | == See Also: ==
| |
− |
| |
− | [[FAQ_How_do_I_save_settings_for_a_dialog_or_a_wizard%3F]]
| |
− |
| |
− | <hr><font size=-2>This FAQ was originally published in [http://www.eclipsefaq.org Official Eclipse 3.0 FAQs]. Copyright 2004, Pearson Education, Inc. All rights reserved. This text is made available here under the terms of the [http://www.eclipse.org/legal/epl-v10.html Eclipse Public License v1.0].</font>
| |