#topicpath
----
org.eclipse.ui.IWorkbenchPreferencePage はウィンドウ >> 設定 にある設定ダイアログを表すインターフェースです。

**設定ページ [#q24fd585]
org.eclipse.ui.IWorkbenchPreferencePage はウィンドウ >> 設定 にある設定ページを表すインターフェースです。
#ref(preference.png)

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


#contents

***拡張ポイント [#p618a200]
***設定ページの拡張ポイント [#p618a200]
 org.eclipse.ui.preferencePages

***plugin.xmlのサンプル [#n4e5a3ab]
 <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>


***ソース [#i47c9138]
キー値の定数クラス
 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) {
   }
 }

***ポイント [#b70ee4ff]
***設定値にアクセスする [#kb155f3c]
上のようにクラスを定義しておくと、実際に設定ページで設定した値には以下のようにアクセスすることができます。         
 String port = HsqldbUIPlugin.getDefault().getPreferenceStore()
                .getString(IConstants.PORT);

***初期値を設定する [#f70f3dea]
さて、初期値(画面の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");
   }
 }


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





***ポイント [#d07fd6dc]
使い方は
-フィールドに定数を定義
 public static final String P_TARGET = "stringPreference";
-createFieldEditorsをオーバーライドして、設定画面を作成する
 addField(new StringFieldEditor
   (P_TARGET, "&Target:", getFieldEditorParent()));
-initializeDefaultsをオーバーライドして、初期値を指定する。
 private void initializeDefaults() {
     IPreferenceStore store = getPreferenceStore();
     store.setDefault(P_TARGET, "hoge");
 }
これで以下のようなダイアログが作成されます。簡単ですね。
#ref(preference.png)


設定した値へのアクセス方法は、設定値を用いたい箇所でそれぞれ、
 String target = SamplePlugin.getDefault().getPreferenceStore()
                .getString(ExplorerPreferencePage.P_TARGET);
とすればよいようです。ながい。。

このままだと一度設定を開かないとデフォルト値が反映されないので、どこかで値を設定するためにインスタンスを生成しないといけないのですが、フックできるメソッドはプラグインクラスにありました。AbstractUIPluginのサブクラスで、
 protected void initializeDefaultPreferences(IPreferenceStore store) {
     ExplorerPreferencePage pref = new ExplorerPreferencePage();
     <-コンストラクタ内で初期値をセットするようコーディングした。
     store = pref.getPreferenceStore();
     super.initializeDefaultPreferences(store);
 }
としておけばOKです。

**TIPS [#l7191b19]

***OKボタンを押したときに、なんかやる [#xb3a575c]
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();
 }



***Eclipse3.0では [#nf9a4027]
このメソッド(initializeDefaultPreferences)はEclipse3.0からdeprecatedになりました。初期値の設定はプラグインで行うのではなく、拡張ポイント
 org.eclipse.core.runtime.preferences
を使用します。この拡張ポイントに登録したクラスはプラグインの起動時にロードされ、その中で初期値をセットすればよいわけです。

***TIPS [#l7191b19]
***StringFieldEditor の他のエディタ [#d5eaed71]
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()));

#ref(01.png)

***StringFieldEditorなどエディタクラスを自作する [#x8107e97]






***関連リンク [#k5a0e849]
-[[Preference Dialogのサンプル:http://jssst03.c.u-tokyo.ac.jp/~ichiyama/cgi-bin/hiki/hiki.cgi?PreferenceDialog]]
-[[プラグインの設定を保存するには:http://www.atmarkit.co.jp/fjava/rensai3/eclipsepde04/eclipsepde04_1.html]]



----
この記事は
#vote(おもしろかった,そうでもない)
-このままだと一度設定を開かないとデフォルト値が反映されないなぁ -- [[きの]] &new{2004-12-20 (月) 11:43:06};
-initializeDefaultPreferencesを呼ぶんですね -- [[きの]] &new{2004-12-27 (月) 00:14:49};
-%%このままだと一度設定を開かないとデフォルト値が反映されないなぁ -- [[きの]] &new{2004-12-20 (月) 11:43:06};%%
-%%initializeDefaultPreferencesを呼ぶんですね -- [[きの]] &new{2004-12-27 (月) 00:14:49};%%
-Eclipse2.1のときのはなしです。これ↑ -- [[きの]] &new{2006-03-11 15:48:11 (土)};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS