連載
» 2006年02月18日 10時00分 公開

作って覚えるEclipseプラグイン(4):プラグインの設定を保存するには (1/2)

[竹添直樹, 岡本隆史,NTTデータ]

 プラグインでは必要に応じて設定内容を保存しておかなければならない場合があります。また、ユーザーの好みに合わせて設定を変更できるようなカスタマイズ機能を提供したい場合も同様です。今回は第3回で作成したXMLエディタプラグインを題材に、プラグインでの設定内容の保存方法を解説したいと思います。

プリファレンスストアを使用する

 プラグインの設定を行う方法として最も一般的な方法はEclipseのメニューから[ウィンドウ]→[設定]で開く設定ダイアログでしょう。ここでの設定内容はプリファレンスストアに保存され、ワークスペース全体で共有されます。プリファレンスストアの内容はワークスペース配下の.metadata/plugins/org.eclipse.core.runtime/.settingsフォルダにプラグインごとにプラグインID.prefs というファイル名で保存されていますので興味のある方はのぞいてみてください。

図1 Eclipseの設定ダイアログ 図1 Eclipseの設定ダイアログ

 このプリファレンスストアを使用して、エディタでの強調表示に使用する色を設定できるようにしてみます。

プリファレンスストアの利用方法

 プリファレンスストアはプラグインクラスのgetPreferenceStore()メソッドで取得することができます。また、取得したプリファレンスストアに対してsetValue()メソッドで値の保存、getInt()やgetString()などのメソッドで値の取得を行うことができます。使用例を以下に示します。

// プリファレンスストアの取得
IPreferenceStore store = XMLEditorPlugin.getDefault().getPreferenceStore();
// 値を保存
store.setValue("PREF_KEY", 10);
// 値を取得
int value = store.getInt("PREF_KEY");

  値としてはプリミティブ型およびString型を扱うことができます。それ以外のオブジェクトを保存したい場合は文字列に変更する必要があります。プリミティブ型のラッパクラスや文字列型の配列、org.eclipse.swt.graphicsパッケージに含まれているRGB、FontData、Point、Rectangle といったデータ型に関してはorg.eclipse.jface.resource.StringConverterクラスに文字列とオブジェクトの相互変換を行うユーティリティメソッドが提供されていますので、必要に応じて利用するとよいでしょう。

初期値の設定

 プリファレンスストアの利用に当たっては、まずプリファレンスの初期値を指定しておく必要があります。初期値の指定はプリファレンスイニシャライザ(org.eclipse.core.runtime.preferences.AbstractPreferenceInitializerを継承したクラス)で行います。

public class XMLEditorPreferenceInitializer
  extends AbstractPreferenceInitializer {
    public void initializeDefaultPreferences() {
        IPreferenceStore store =
           XMLEditorPlugin.getDefault().getPreferenceStore();
        store.setDefault(PreferenceConstants.COLOR_TAG,
            StringConverter.asString(IXMLColorConstants.TAG));
        store.setDefault(PreferenceConstants.COLOR_COMMENT, 
            StringConverter.asString(IXMLColorConstants.XML_COMMENT));
        store.setDefault(PreferenceConstants.COLOR_STRING,
            StringConverter.asString(IXMLColorConstants.STRING));
        store.setDefault(PreferenceConstants.COLOR_PROC,
            StringConverter.asString(IXMLColorConstants.PROC_INSTR));
        store.setDefault(PreferenceConstants.COLOR_DEFAULT,
            StringConverter.asString(IXMLColorConstants.DEFAULT));
    }
}

 なお、プリファレンスのキーについては以下のように別クラスで定義するようにしました。プリファレンスストアへの値の保存や取得に関してはこのキーを使用することになります。

public class PreferenceConstants {
    public static final String COLOR_TAG = "XMLEditor.Color.Tag";
    public static final String COLOR_COMMENT = "XMLEditor.Color.Comment";
    public static final String COLOR_STRING = "XMLEditor.Color.String";
    public static final String COLOR_PROC = "XMLEditor.Color.Proc";
    public static final String COLOR_DEFAULT = "XMLEditor.Color.Default";
}

 プリファレンスイニシャライザは、以下のようにplugin.xmlに登録しておきます。

<extension point="org.eclipse.core.runtime.preferences">
<initializer class="jp.sf.amateras.xmleditor.preferences.
XMLEditorPreferenceInitializer"/>
</extension>

 以上で初期値の設定は完了です。

プリファレンスページの実装

 次に実際に設定を行うためのインターフェイスを実装します。Eclipseの設定ダイアログの各ページはプリファレンスページと呼ばれており、org.eclipse.jface.preference.PreferencePageを継承し、さらにorg.eclipse.ui.IWorkbenchPreferencePage インターフェイスを実装する必要があります。基本的な実装は以下のようになります。

public class XMLEditorPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
    public XMLEditorPreferencePage() {
        super("タイトル");
        setPreferenceStore(
          XMLEditorPlugin.getDefault().getPreferenceStore());
    }
    /** ユーザーインターフェイスの作成 */
    protected Control createContents(Composite parent) {
       Composite composite = new Composite(parent, SWT.NULL);
       ……
       return composite;
    }
    /** 「適用」「OK」ボタンが押されたときの処理 */
    public boolean performOk() {
        // ここでプリファレンスの保存を行います
       IPreferenceStore store = getPreferenceStore();
       ……
       return true;
    }
    /** 「デフォルトの復元」ボタンが押されたときの処理 */
   protected void performDefaults() {
         // ここでUIにデフォルト値を反映させます
         ……
   }
   public void init(IWorkbench workbench) {
   }
}

 createContents()メソッドでユーザーインターフェイスを作成し、performOk()およびperformDefaults()メソッドにそれぞれボタンが押されたときの処理を記述するわけです。「キャンセル」ボタンが押されたときに呼び出されるperformCancel()というメソッドもありますが、キャンセル時は何もせずに設定ダイアログが閉じるため、通常はオーバーライドする必要はないでしょう。

 なお、EclipseのプリファレンスAPIにはorg.eclipse.jface.preference.FieldEditorPreferencePage というクラスが用意されており、このクラスを継承することで簡単なプリファレンスページであれば非常に容易に作成することができます。今回はエディタの色を指定するだけなので、FieldEditorPreferencePageを使ってみることにします。この場合の実装は以下のようになります。

public class XMLEditorPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
    public XMLEditorPreferencePage() {
       super(GRID);
       setPreferenceStore(XMLEditorPlugin.getDefault().getPreferenceStore());
    }
    protected void createFieldEditors() {
        addField(new ColorFieldEditor(
PreferenceConstants.COLOR_TAG,"タグの色",getFieldEditorParent()));
        addField(new ColorFieldEditor(
PreferenceConstants.COLOR_COMMENT,"コメントの色",getFieldEditorParent()));
        addField(new ColorFieldEditor(
PreferenceConstants.COLOR_STRING,"文字列の色",getFieldEditorParent()));
        addField(new ColorFieldEditor(
PreferenceConstants.COLOR_PROC,"XML宣言の色",getFieldEditorParent()));
        addField(new ColorFieldEditor(
PreferenceConstants.COLOR_DEFAULT,"デフォルトの色",getFieldEditorParent()));
        }
    public void init(IWorkbench workbench) {
    }
}

 FieldEditorPreferencePageではcreateFieldEditors()メソッドをオーバーライドしaddField()メソッドでフィールドエディタを追加するだけで、ユーザーインターフェイスの作成やプリファレンスの保存といった処理は自動的に行ってくれます。ここでは色の指定を行うのでColorFieldEditorを使用していますが、このほかにもorg.eclipse.jface.preferenceパッケージには以下のようなフィールドエディタが用意されています。もちろんフィールドエディタを自作することも可能です。

クラス名 説明
BooleanFieldEditor チェックボックスで真偽値を入力
IntegerFieldEditor テキストフィールドで数値を入力
StringFieldEditor テキストフィールドで文字列を入力
RadioGroupFieldEditor ラジオボタンで項目を選択
ColorFieldEditor 色を選択
FontFieldEditor フォントを選択
DirectoryFieldEditor ファイルシステム上のディレクトリを選択
FileFieldEditor ファイルシステム上のファイルを選択
PathEditor ファイルシステム上の複数のパスを選択

 以上でプリファレンスページが完成しました。plugin.xmlには以下のようにして登録しておきます。

<extension
point="org.eclipse.ui.preferencePages">
<page
class="jp.sf.amateras.xmleditor.preferences.XMLEditorPreferencePage"
id="jp.sf.amateras.xmleditor.page"
name="Sample XML Editor"/>
</extension>

 ランタイムワークベンチを起動し、設定ダイアログに「Sample XML Editor」が追加されていることを確認しておきましょう。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。