About

About

Die Preferences Page - eigene Benutzereinstellungen

Seitenübersicht

» Preferences Store

» Menüeintrag

» Preferences Page anlegen

» Defaultwerte setzen

» Auf Preferenzen zugreifen

» Einträge entfernen

Info

Der Artikel basiert auf Eclipse 3.5.1

» www.eclipse.org

Zum Speichern von Benutzereinstellungen einer Anwendung bietet Eclipse den Preferences Store an. Zum Verwalten der Benutzerwerte dient der Preferences Dialog. Jedes Plugin kann dort seine eigene Seite hinzufügen. Die Benutzereinstellungen werden beim Beenden der Anwendung gespeichert und stehen somit beim erneuten Start wieder zur Verfügung.

Es sind nur wenige Schritte nötig um eine eigene Preferences Page zum Preferences Dialog von Eclipse hinzuzufügen.

Preferences Store verwenden

Um den Preferences Store zu nutzen muss der Activator des Plugins from AbstractUIPlugin ableiten:

/**
 * The activator class controls the plug-in life cycle
 */
public class Activator extends AbstractUIPlugin {

Damit ist steht der Preferences Store bereit. Die Implementierung der Methode initializeDefaultPluginPreferences ist nicht mehr nötig. Das » Setzen der Defaultwerte wurde durch den AbstractPreferenceInitializer abgelöst.

Der Zugriff auf den Preference Store des Plugins kann von überall erfolgen:

Activator.getDefault().getPreferenceStore()

Preferences Action zum Menü hinzufügen

Um den Preferences Dialog in einer eigenen Anwendung aufrufen zu können, muss die entsprechende Action im ApplicationActionBarAdvisor erzeugt und registiert werden:

   private IWorkbenchAction preferencesAction;

   protected void makeActions(final IWorkbenchWindow window) {
      preferencesAction = ActionFactory.PREFERENCES.create(window);
      register(preferencesAction);
   }

Anschliessend kann sie zu einem Menü hinzugefügt werden:

   protected void fillMenuBar(IMenuManager menuBar) {
      MenuManager aMenu = new MenuManager("&Window",
       IWorkbenchActionConstants.M_WINDOW);
      menuBar.add(aMenu);
      aMenu.add(preferencesAction);

Das Ergebnis, für den Fall dass in der Anwendung durch kein anderes Plugin eine Preferences Page konfiguriert wurde, sieht nun so aus:

Anzeige:

Preferences Page erstellen

Um die Benutzereinstellungen editieren zu können, wird über den ExtensionPoint org.eclipse.ui.preferencePages eine eigene PreferencesPage hinzugefügt.

   <extension
         point="org.eclipse.ui.preferencePages">
      <page
            class="de.sinoz.rcp.preferences.preferences.PluginPreferencesPage"
            id="de.sinoz.rcp.preferences.preferencespage"
            name="Plugin Preferences">
      </page>
   </extension>

Es empfielt sich die FieldEditorPreferencePage mit einem GridLayout als Basis für die eigene PreferencesPage zunehmen.

public class PluginPreferencesPage extends FieldEditorPreferencePage
   implements IWorkbenchPreferencePage {

   public PreferencesPage() {
      super(GRID);
   }

Nun werden die Eingabeelemente in der createFieldEditors()-Methode erzeugt. Es gibt eine ganze Reihe bereits bestehender FieldEditor, die über die addField-Methode hinzugefügt werden. Über eine eindeutige ID wird der Eintrag im Preferences Store referenziert.

   /* (non-Javadoc)
    * @see org.eclipse.jface.preference.FieldEditorPreferencePage
    			#createFieldEditors()
    */
   @Override
   protected void createFieldEditors() {
      addField(new BooleanFieldEditor(FIELD_BOOLEAN_ID, "Boolean",
            getFieldEditorParent()));
      addField(new ColorFieldEditor(FIELD_COLOR_ID, "Color:",
            getFieldEditorParent()));
      addField(new StringFieldEditor(FIELD_STRING_ID, "String:",
            getFieldEditorParent()));
      addField(new IntegerFieldEditor(FIELD_INTEGER_ID, "Integer:",
            getFieldEditorParent()));
      addField(new DirectoryFieldEditor(FIELD_DIRECTORY_ID, "Directory:",
            getFieldEditorParent()));
      addField(new RadioGroupFieldEditor(FIELD_RADIO_GROUP_ID, "RadioGroup:", 1,
            new String[][] { { "Wahl 1", OPTION_RADIO_GROUP_1},
                  { "Wahl 2", OPTION_RADIO_GROUP_2} }, getFieldEditorParent()));
      addField(new FontFieldEditor(FIELD_FONT_ID, "Font:",
            getFieldEditorParent()));
      addField(new ScaleFieldEditor(FIELD_SCALE_ID, "Scale:",
            getFieldEditorParent(),0,100,1,1));
   }

Zum Schluss müssen wir noch dafür sorgen, dass der Preferences Store der PreferencesPage gesetzt wird. Dies geschieht in der init()-Methode. Unterbleibt dies, wird zwar die Seite mit Inhalt angezeigt, aber der "Apply"-Button bleibt deaktiviert.

   /* (non-Javadoc)
    * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
    */
   @Override
   public void init(IWorkbench workbench) {
      setPreferenceStore(Activator.getDefault().getPreferenceStore());
   }

Damit ist die Preferences Page unseres Plugins fertig implementiert und im Preferences Dialog ist der Eintrag "Plugin Preferences" sichtbar:

Defaultwerte setzen

Nun fehlt noch das Setzen der Defaultwerte. Dieses folgt in einem AbstractPreferenceInitializer, welcher über den ExtensionPoint org.eclipse.core.runtime.preferences konfiguriert wird:

   <extension
         point="org.eclipse.core.runtime.preferences">
      <initializer
            class="de.sinoz.rcp.preferences.preferences.PluginPreferenceInitializer">
      </initializer>
   </extension>

Die implementierte Klasse benötigt nur eine Methode, in welcher die Defaultwerte gesetzt werden:

public class PluginPreferenceInitializer extends AbstractPreferenceInitializer {

   /* (non-Javadoc)
    * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer
    					#initializeDefaultPreferences()
    */
   @Override
   public void initializeDefaultPreferences() {
      IEclipsePreferences node = new DefaultScope().getNode(Activator.PLUGIN_ID);
      node.putBoolean(PluginPreferencesPage.FIELD_BOOLEAN_ID, true);
      node.put(PluginPreferencesPage.FIELD_COLOR_ID, "190,190,190");
      node.put(PluginPreferencesPage.FIELD_STRING_ID, "A Text");
      node.putInt(PluginPreferencesPage.FIELD_INTEGER_ID, 3);
      node.put(PluginPreferencesPage.FIELD_DIRECTORY_ID, "C:\\");
      node.put(PluginPreferencesPage.FIELD_RADIO_GROUP_ID,
               PluginPreferencesPage.OPTION_RADIO_GROUP_2);
      node.putInt(PluginPreferencesPage.FIELD_SCALE_ID, 25);
   }
}

Wird nun der Preference Dialog das erste Mal gestartet sind die Defaultwerte gesetzt:

Anzeige:

Auf Preferenzen zugreifen

Auf die Preferenzen zugreifen lässt sich über:

      IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore();
      preferenceStore.getString(PluginPreferencesPage.FIELD_STRING_ID);

Einträge aus dem Preferences Dialog entfernen

Nicht immer sind alle Einträge im Preferences Dialog erwünscht. In einer RCP Anwendung können dazu in der postStartup() Methode des ApplicationWorkbenchAdvisor die Einträge programmatisch entfernt werden. Zu diesem Zeitpunkt sind alle Extensions eingelesen.

Die Suche nach den verwendeten IDs lässt sich abkürzen, indem sie ausgegeben werden. Im auskommentierten Teil wird zum Beispiel die Wurzeleinträge interiert:

   /* (non-Javadoc)
    * @see org.eclipse.ui.application.WorkbenchAdvisor#postStartup()
    */
   @Override
   public void postStartup() {
      PreferenceManager pm = PlatformUI.getWorkbench().getPreferenceManager();
//       See what we have
//      for (IPreferenceNode node : pm.getRootSubNodes()) {
//         System.out.println(node.getId());
//      }
      pm.remove("de.sinoz.rcp.preferences.preferencespage");
   }