Top / Eclipse / プラグイン開発のTIPS集 / org.eclipse.ui.IWorkbenchPreferencePage(設定ページ)

設定ページ

org.eclipse.ui.IWorkbenchPreferencePage? はウィンドウ >> 設定 にある設定ページを表すインターフェースです。

preference.png

実際はorg.eclipse.jface.preference.FieldEditorPreferencePage? をextendsして使うのが多いようです。

設定ページの拡張ポイント

org.eclipse.ui.preferencePages

plugin.xmlのサンプル

<extension point="org.eclipse.ui.preferencePages">
 <page
   class="nu.mine.kino.plugin.hsqldb.ui.HsqldbPreferencePage"
   id="nu.mine.kino.plugin.hsqldb.ui.HsqldbPreferencePage"
   name="Hsqldb設定"/>
</extension>

ソース

キー値の定数クラス

public interface IConstants {
    public static final String USER_ID = "user_id";
    public static final String PASSWORD = "password";
    public static final String PORT = "port";
}

画面クラス

package nu.mine.kino.plugin.hsqldb.ui;

import org.apache.log4j.Logger;

import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

/**
 * @author Masatomi KINO
 * @version $Revision$
 */
public class HsqldbPreferencePage extends FieldEditorPreferencePage implements
    IWorkbenchPreferencePage {
  /**
   * Logger for this class
   */
  private static final Logger logger = Logger
      .getLogger(HsqldbPreferencePage.class);

  public HsqldbPreferencePage() {
    super(FieldEditorPreferencePage.GRID);
    setDescription("Hsqldbに接続するための設定を行います。設定を変更した場合、
                    起動しているサーバは停止されます。");
    setPreferenceStore(HsqldbUIPlugin.getDefault().getPreferenceStore());
    ↑ プラグインの IPreferenceStore フィールドと関連づけ
  }

  protected void createFieldEditors() {
    {
      addField(new StringFieldEditor(IConstants.USER_ID, "&UserID",
          getFieldEditorParent()));
     ↑キー値と画面のフィールドを関連づけ
    }
    {
      addField(new StringFieldEditor(IConstants.PASSWORD, "&Password",
          getFieldEditorParent()));
     ↑キー値と画面のフィールドを関連づけ
    }
    {
      addField(new StringFieldEditor(IConstants.PORT, "P&ort番号",
          getFieldEditorParent()));
     ↑キー値と画面のフィールドを関連づけ
    }
  }

  public void init(IWorkbench workbench) {
  }
}

設定値にアクセスする

上のようにクラスを定義しておくと、実際に設定ページで設定した値には以下のようにアクセスすることができます。

String port = HsqldbUIPlugin.getDefault().getPreferenceStore()
               .getString(IConstants.PORT);

初期値を設定する

さて、初期値(画面のsaとか9001とか)の設定は、別の拡張ポイント

org.eclipse.core.runtime.preferences

を使用します。この拡張ポイントに登録したクラスはプラグインの活性化時にロードされるので、その中で初期値をセットすればよいわけです。

拡張ポイントは以下のように設定しました。

<extension point="org.eclipse.core.runtime.preferences">
  <initializer class="nu.mine.kino.plugin.hsqldb.ui.
                        HsqldbPreferenceInitializer"/>
</extension>

この拡張ポイントのJavaのクラスは

org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;

です。このクラスを拡張する、以下のようなクラスを作りました。

package nu.mine.kino.plugin.hsqldb.ui;

import org.apache.log4j.Logger;
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore;

public class HsqldbPreferenceInitializer extends AbstractPreferenceInitializer {
  public void initializeDefaultPreferences() {
    IPreferenceStore store = HsqldbUIPlugin.getDefault()
        .getPreferenceStore();
    store.setDefault(IConstants.USER_ID, "sa");
    store.setDefault(IConstants.PASSWORD, "");
    store.setDefault(IConstants.PORT, "9001");
  }
}

これで、プラグインが活性化されるときに上のメソッドが実行され、フィールドに初期値が設定されます。この初期値ははじめて設定ページを開いたときに表示されるのはもちろん「デフォルトの復元」などをクリックしたときもこの初期値に戻ります。

TIPS

OKボタンを押したときに、なんかやる

IPreferencePage?#performOk()をOverrideします。

public boolean performOk() {
   String port = HsqldbUIPlugin.getDefault().getPreferenceStore()
       .getString(IConstants.PORT);
   String userid = HsqldbUIPlugin.getDefault().getPreferenceStore()
       .getString(IConstants.USER_ID);
   String password = HsqldbUIPlugin.getDefault().getPreferenceStore()
       .getString(IConstants.PASSWORD);
   HsqldbUIPlugin.getDefault().stopHsqldb();
   return super.performOk();
}

StringFieldEditor? の他のエディタ

addField に渡す引数 FieldEditor?のサブクラスには StringFieldEditor?の他にも以下のようなモノがあります。

String[][] labelAndValue = new String[][] {
  new String[] { "Select 1", "1" },
  new String[] { "Select 2", "2" },
  new String[] { "Select 3", "3" }, };
addField(new RadioGroupFieldEditor("radio1", "Radio Group",
  labelAndValue.length, labelAndValue, getFieldEditorParent()));
addField(new PathEditor("HOGE", "Path", "Chooser",
  getFieldEditorParent()));
addField(new FileFieldEditor("file1", "File", true,
  getFieldEditorParent()));
addField(new DirectoryFieldEditor("directory1", "Directory",
  getFieldEditorParent()));
addField(new FontFieldEditor("font1", "Font", "Preview",
  getFieldEditorParent()));
addField(new ColorFieldEditor("color1", "Color", getFieldEditorParent()));
01.png

StringFieldEditor?などエディタクラスを自作する

例1

package nu.mine.kino.plugin.google.ui.preferences;

import nu.mine.kino.plugin.google.ui.Utility;
import org.eclipse.jface.preference.StringButtonFieldEditor;
import org.eclipse.swt.widgets.Composite;

public class GoogleKeyFieldEditor extends StringButtonFieldEditor {
    public GoogleKeyFieldEditor(String name, String labelText, Composite parent) {
        super(name, labelText, parent);
        setChangeButtonText("Key 取得");
    }

    /*
     * (非 Javadoc)
     * 
     * @see org.eclipse.jface.preference.StringButtonFieldEditor#changePressed()
     */
    protected String changePressed() {
        Utility.executeBrowser("http://www.google.com/apis/");
        // このリターンする値に、テキストボックスを変更する。
        // ただし、nullを返せば、何もしないらしい。
        return null;
    }
}
googleeditor.png

例2
たとえばURLの一覧を入力するフィールドエディタを作ってみました。既存のListEditor?をextendsして作ります。

package nu.mine.kino.plugin.javadocsearch.pages;

import java.util.ArrayList;
import java.util.StringTokenizer;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.ListEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class URLEditor extends ListEditor {
  /**
   * @param name
   *            設定を取得するためのキー
   * @param labelText
   *            このフィールドのラベル
   * @param parent
   *            親のComposite
   */
  public URLEditor(String name, String labelText, Composite parent) {
    super(name, labelText, parent);
  }

  /**
   * ユーザ入力値を受け取るメソッドです。 ダイアログをユーザ入力を受け付け、
   * 入力された文字列を返します。 キャンセルしたときなどはnullが返ります。
   * 
   * @return 入力された文字列
   * @see org.eclipse.jface.preference.ListEditor#getNewInputObject()
   */
  protected String getNewInputObject() {
    URLDialog dialog = new URLDialog(getShell());
    int ret = dialog.open();
    if (ret == IDialogConstants.OK_ID) {
      String text = dialog.getText();
      return text;
    } else if (ret == IDialogConstants.CANCEL_ID) {
      // [Cancel]ボタン押下
      return null;
    }
    return null;
  }

  /**
   * ページ内でリストを表示するときにStringからString[]に変換して表示文字列を取得するメソッド。
   * 
   * @param stringList
   *            Eclipseに保持されている文字列
   * @see org.eclipse.jface.preference.ListEditor#parseString(java.lang.String)
   */
  protected String[] parseString(String stringList) {
    StringTokenizer st = new StringTokenizer(stringList,
        "\t" + "\n\r");
    ArrayList v = new ArrayList();
    while (st.hasMoreElements()) {
      v.add(st.nextElement());
    }
    return (String[]) v.toArray(new String[v.size()]);
  }

  /**
   * プリファレンスページで保存処理が行われたときに呼ばれるメソッドです。
   * 
   * @param items
   *            表示されているリスト。
   * @see org.eclipse.jface.preference.ListEditor#createList(java.lang.String[])
   */
  protected String createList(String[] items) {
    StringBuffer path = new StringBuffer("");

    for (int i = 0; i < items.length; i++) {
      path.append(items[i]);
      //        path.append(File.pathSeparator);
      path.append("\t");
    }
    return path.toString();
  }

  private class URLDialog extends Dialog {
    /**
     * ダイアログでユーザが入力している文字列(URL) <code>text</code> のコメント
     */
    private String text;

    public URLDialog(Shell parent) {
      super(parent);
    }

    protected Point getInitialSize() {
      return new Point(400, 150);
    }

    protected void configureShell(Shell newShell) {
      super.configureShell(newShell);
      newShell.setText("URLダイアログ");
    }

    /**
     * URLを入力するダイアログを描画します。
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected Control createDialogArea(Composite parent) {
      Composite composite = (Composite) super.createDialogArea(parent);
      //      Text textBox = new Text(composite, SWT.MULTI | SWT.V_SCROLL
      //          | SWT.BORDER | SWT.WRAP);
      Label label = new Label(composite, SWT.NONE);
      label.setText("URLを入力してください。");
      Text textBox = new Text(composite, SWT.SINGLE | SWT.BORDER);
      textBox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
      textBox.setText("");
      textBox.addModifyListener(new ModifyListener() {
        public void modifyText(ModifyEvent e) {
          Text source = (Text) e.getSource();
          text = source.getText();
        }
      });
      return composite;
    }

    public String getText() {
      return text;
    }
  }

}
urleditor.png

設定画面の変更をリスナに通知したい。

設定画面で値を変更すると、イベントが発生します。そのイベントをListenするリスナーは

org.eclipse.jface.util.IPropertyChangeListener

です。イベントを発生させるクラス*1

org.eclipse.jface.preference.IPreferenceStore

です。従って、以下のようなコーディングで設定画面をListenすることができます。

HogePlugin.getDefault().getPreferenceStore().addPropertyChangeListener(
 new IPropertyChangeListener() {
     public void propertyChange(PropertyChangeEvent event) {
         System.out.println(event.getSource());
         System.out.println(event.getNewValue());
         System.out.println(event.getOldValue());
     }
 });

HogePlugin?は設定画面を作成したときに、

setPreferenceStore(HogePlugin.getDefault().getPreferenceStore());

というように、その設定画面と関連づけられたプラグインクラスです。

発生したイベントのクラスは

org.eclipse.jface.util.PropertyChangeEvent

というモノで、このイベントクラスからは

  • event.getSource():イベントを発生させたモノ
  • event.getNewValue?():変更後の値
  • event.getOldValue?():変更前の値
  • event.getProperty():変更したフィールドのキー値

などのようにデータを取り出すことができます。

ちなみにこのイベントは、フィールドごとに発生します。つまり、複数のフィールドの値を変更して保存した場合は、そのフィールド数分イベントが発生します。

設定画面左上のフィルタを使う

設定画面の左上にテキストでフィルタする機能は、org.eclipse.ui.keywords 拡張ポイントを使用します。

<extension point="org.eclipse.ui.keywords">
  <keyword id="nu.mine.kino.plugin.google.ui.keywords.sitesearch" label="ほげ hoge fuga" />
</extension>

というようにフィルタ文字列を羅列した拡張ポイントを定義して、

<extension point="org.eclipse.ui.preferencePages">
  <page class="nu.mine.kino.plugin.google.ui.preferences.MainPreferencePage"
    id="nu.mine.kino.plugin.google.ui.preferences.MainPreferencePage" name="設定画面。">
    <keywordReference id="nu.mine.kino.plugin.google.ui.keywords.sitesearch" />
  </page>          ↑keyword拡張ポイントのid
</extension>

として設定画面に関連づけします。この場合はフィルタ入力欄に ほげ とか hoge とか fuga とか入れてフィルタすることができます。

関連リンク


この記事は

選択肢 投票
おもしろかった 16  
そうでもない 0  
  • このままだと一度設定を開かないとデフォルト値が反映されないなぁ -- きの? 2004-12-20 (月) 11:43:06
  • initializeDefaultPreferences?を呼ぶんですね -- きの? 2004-12-27 (月) 00:14:49
  • Eclipse2.1のときのはなしです。これ↑ -- きの? 2006-03-11 15:48:11 (土)

Top / Eclipse / プラグイン開発のTIPS集 / org.eclipse.ui.IWorkbenchPreferencePage(設定ページ)

現在のアクセス:21925


*1 つまり上のリスナをaddしたい先

添付ファイル: filegoogleeditor.png 1053件 [詳細] fileurleditor.png 1036件 [詳細] filepreference.png 1082件 [詳細] file01.png 998件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-09-02 (月) 20:11:42 (21d)