minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

Preferenceについて

EclipseにはPreferenceという概念があります。
わかりやすく言えば、Eclipseの設定(オプション)とでも言いましょうか。

もう少し詳細に言うと、Preferenceは「ワークスペース単位」の設定と言えます。
Eclipseでは、ファイル/フォルダ/プロジェクト等様々な単位で設定を行えますが
その最も大きな単位がワークスペースということになります。
まぁほとんどの人はワークスペースを切り替えたりはしないでしょうから
Eclipse全体の設定と思ってもらえばいいと思います。

まずは設定ファイル

独自のPreferenceを追加するには、plugin.xmlにextensionを追加します。

<extension
      point="org.eclipse.ui.preferencePages">
   <page
         name="SamplePreference"
         class="sample.SamplePreferencePage"
         id="sample.SamplePreferencePage">
   </page>
</extension>

このように、org.eclipse.ui.preferencePages のextensionを使います。
複数のPreferenceを追加したい場合は、page要素を複数記述することになります。

name

実際にPreferenceツリーに表示される名称です。

class

Preferenceページを実装したJavaクラス名を指定します。

id

Preferenceページ固有のIDを指定します。classと同じ値にしておけば間違いは無いです。

Preferenceページを作る

実装クラスは、org.eclipse.jface.preference.PreferencePage の派生クラスにする必要があります。
ここでは、いくつかの実装を持った FieldEditorPreferencePage クラスから派生させることにします。
PreferencePage > FieldEditorPreferencePage > MyPreferencePage という派生構成になります。

コンストラクタ内で、レイアウトとストアの定義をします。

public MyPreferencePage() {
    super(GRID);
    setPreferenceStore(MyPlugin.getDefault().getPreferenceStore());
}

さて、ここで突然「ストア」という単語が出てきましたが
これは簡単に言えば「設定内容を格納する場所」ということです。
このように、MyPlugin から取得できます。
レイアウトの GRID は、FieldEditorPreferencePage で定義されています。
フラットレイアウトにしたい場合は FLAT を使用します。

Preferenceページをレイアウトする

Preferenceページのレイアウトは createContents() メソッドで行います。
ここでは、2つの設定項目を持つ簡単なレイアウトを作成してみます。

@Override
protected Control createContents(Composite parent) {
    Composite comp = new Composite(parent, SWT.NULL);
    comp.setLayout(new GridLayout());
    
    StringFieldEditor stringField = new StringFieldEditor(
            "keySampleText",
            "Sample Text : ", comp);
    addField(stringField);
    
    BooleanFieldEditor booleanField = new BooleanFieldEditor(
            "keySampleCheck",
            "Sample Check", comp);
    addField(booleanField);
    
    initialize();
    return comp;
}

フィールドを作成して addField() を呼び出し、最後に initialize() を呼び出します。
ここらへんは全て FieldEditorPreferencePage が実装しています。

StringFieldEditor は文字列用の設定項目、
BooleanFieldEditor はチェックボックス用の設定項目に使います。
他にも FieldEditor の派生クラスがいくつか用意されていますので
これらを使うことが出来ます。

FieldEditor のコンストラクタに渡す値は、先頭から
「Preference用キー」「画面表示用文言」「SWTの親コンポーネント」となります。
Preference用キーはストア内でユニークである必要があります。
定数化しておいた方が良いでしょう。

実際の表示内容はこんな感じになります。
画面レイアウト

デフォルト値を設定する

設定にデフォルト値を持たせたい場合は、以下のようにします。

public MyPreferencePage() {
    super(GRID);
    setPreferenceStore(MyPlugin.getDefault().getPreferenceStore());
    initializeDefaults();
}
private void initializeDefaults() {
    IPreferenceStore store = getPreferenceStore();
    store.setDefault("keySampleText", "default value");
    store.setDefault("keySampleCheck", true);
}

このように、コンストラクタ内に処理を追加します。
setDefaultの第1引数には「Preference用キー」を、第2引数にはデフォルト値を指定します。