Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between pages "FAQ How do I choose my own compiler?" and "FAQ How does a view persist its state between sessions?"

(Difference between pages)
 
 
Line 1: Line 1:
The JDT compiler is tightly integrated with the rest of the JDT. Extracting
+
Storing view state is done in two commons ways, depending
the compiler out of the JDT and properly integrating a different compiler
+
on whether you want to store settings between
is not trivial. A quick approach is to disable the Java builder from the
+
workbench sessions or across invocations of your view. The first of these
project’s '''Builders''' property page, and replace it with an Ant
+
facilities is found directly on <tt>IViewPart</tt>. When the workbench
task that calls <tt>javac</tt> or another compiler. However, we
+
is shut down, the method <tt>saveState</tt> is called on all open views.
strongly advise you to go with the installed compiler. It knows
+
The parameter to this method is an <tt>IMemento</tt>, a simple
exactly how to interact with the rest of Eclipse&#151;for instance, by assisting in the
+
data structure that stores hierarchies of nodes containing numbers
creation of tasks, quick fixes, and source decorators. It
+
and strings. Here is an example from the recipe application in the FAQ
is one of the fastest, most complete Java compilers available. Finally, the
+
examples, where a view is persisting the current selection of a list viewer
JDT compiler can generate class files even when the source contains compilation
+
in a memento:
errors.
+
<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.
  
By activating '''Window &gt; Preferences &gt; Java &gt; Compiler''', you have
 
full control over the reporting style of the compiler, severity of error
 
conditions, what to do with unused code, and how to treat javadoc comments.
 
 
 
 
 
Using the Preference page, you can also select the JDK compliance
 
level of the compiler, the version of generated class files, and
 
whether the compiler should generate debugging symbols.
 
  
 +
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: ==
 
== See Also: ==
  
 
+
[[FAQ_How_do_I_save_settings_for_a_dialog_or_a_wizard%3F]]
[[FAQ_Why_can%26%23146%3Bt_my_Ant_build_find_%3Ctt%3Ejavac%3C%2Ftt%3E%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>
 
<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>

Revision as of 16:24, 14 March 2006

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 IViewPart. When the workbench is shut down, the method saveState is called on all open views. The parameter to this method is an IMemento, 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:

   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());
   }


When the workbench is reopened, the method init(IViewSite, IMemento) is called the first time each view becomes visible. The IMemento will contain all the information that was added to it when the workbench was shut down. Note that init is called before the createPartControl method, so you will not be able to restore widget state directly from the init method. You can store the IMemento 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:

   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);
   }

Note that the IMemento instance can be null 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 IDialogSettings facility. The advantage of dialog settings over the view save/init mechanism is that you can control when settings are persisted. The saveState 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?


This FAQ was originally published in Official Eclipse 3.0 FAQs. Copyright 2004, Pearson Education, Inc. All rights reserved. This text is made available here under the terms of the Eclipse Public License v1.0.

Back to the top