這邊主要說明的是IPreferenceChangeListener(類別)與propertyChange(方法)的使用,它們皆
與Preferences相關,假設您建置一個Preferences page,若只是內部的元件值有變動時,要監
聽此元件可透過propertyChange來達到! 若您內部的元件值有變動並儲存時,要觸發其他頁
面定義的IPreferenceChangeListener來達到對這個page監聽的話,就可以定義此Listener!
關於Preferences相關的詳細介紹可以參考
http://www.vogella.com/tutorials/EclipsePreferences/article.html
通常我們使用它的目的可作為一個設定頁面並且儲存相關設定值,它的範圍為一workspace,
因此當您切換成不同workspace時就會重新再開始新的設定!
範例說明如下:
這邊會建立兩個Preferences pages,當page 1勾選選項後並做了Apply,Eclipse console會印出
相關訊息,但前提是page2已經初始化了!
這兩個Preferences page分別為不同的plugin,如下
1. PLUGIN_ID => com.bin.practice.prefs
2. PLUGIN_ID => com.bin.practice.ui
以com.bin.practice.prefs來說明plugin.xml如何設定建置Preferences
與Preferences相關,假設您建置一個Preferences page,若只是內部的元件值有變動時,要監
聽此元件可透過propertyChange來達到! 若您內部的元件值有變動並儲存時,要觸發其他頁
面定義的IPreferenceChangeListener來達到對這個page監聽的話,就可以定義此Listener!
關於Preferences相關的詳細介紹可以參考
http://www.vogella.com/tutorials/EclipsePreferences/article.html
通常我們使用它的目的可作為一個設定頁面並且儲存相關設定值,它的範圍為一workspace,
因此當您切換成不同workspace時就會重新再開始新的設定!
範例說明如下:
這邊會建立兩個Preferences pages,當page 1勾選選項後並做了Apply,Eclipse console會印出
相關訊息,但前提是page2已經初始化了!
這兩個Preferences page分別為不同的plugin,如下
1. PLUGIN_ID => com.bin.practice.prefs
2. PLUGIN_ID => com.bin.practice.ui
以com.bin.practice.prefs來說明plugin.xml如何設定建置Preferences
定義頁面
定義初始頁面
1. InitializePreference.java
用在第一次進入Preferences page帶入相關元件的預設值
public class InitializePreference extends AbstractPreferenceInitializer{
@Override
public void initializeDefaultPreferences() {
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
System.out.println("initialize...CTest Preference");
store.setDefault("testcheckbox", true);
}
}
首先,先Demo這個page執行的過程,來了解一下儲存過程
checkbox default值為true (配合InitializePreference),因此會自動勾選起來
此時,當您去追蹤儲存的檔案時,路徑如下
C:\runtime-EclipseApplication\.metadata\.plugins\org.eclipse.core.runtime\.settings\
com.bin.practice.prefs.prefs
會發現該檔案並不存在,但是當您取消勾選後進行存檔,這個檔案就會生成,且內容如下
eclipse.preferences.version=1
testcheckbox=false
如此看來,假設您是使用Preferences packages下定義FieldEditor,除了可設定預設值外,當與
預設值吻合的情況下.pref檔案不會產生! 算是一個考慮周到的機制!
2. TPreferencePage.java
public class TPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage{
Button btn;
@Override
public void init(IWorkbench workbench) {
// TODO Auto-generated method stub
}
@Override
protected void createFieldEditors() {
// TODO Auto-generated method stub
Composite parent = getFieldEditorParent();
BooleanFieldEditor testCheckBox =
new BooleanFieldEditor("testcheckbox", "Test CheckBox", parent);
addField(testCheckBox);
btn = new Button(parent, SWT.NONE);
btn.setText("Test Button");
IEclipsePreferences otherPreferences = InstanceScope.INSTANCE.getNode("com.bin.practice.ui");
IPreferenceChangeListener otherPreferencesListener = new IPreferenceChangeListener() {
@Override
public void preferenceChange(PreferenceChangeEvent event) {
String k = event.getKey();
System.out.println(k+" changed..."+event.getNewValue()+"...."+event.getOldValue());
}
};
otherPreferences.addPreferenceChangeListener(otherPreferencesListener);
parent.pack();
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if ((event.getSource() instanceof BooleanFieldEditor) && event.getNewValue() != event.getOldValue()) {
btn.setEnabled((Boolean) event.getNewValue());
}
super.propertyChange(event);
}
}
首先必須override這兩個method,createFieldEditors內可以建置page要使用的項目
在這邊使用的是preferences相關的BooleanFieldEditor => checkbox + label
使用preferences的元件好處是我們繼承的父類別會自動幫你在按下OK or Apply的按鈕時幫
你儲存資料(InstanceScope),而您不必再去處理這一塊! 前提是要做addField動作!
PS. 儲存檔為一.prefs,裡面的格式為key = value關係
先說明propertyChange,在這邊應用在當checkbox做勾選時來改變button狀態!
而IPreferenceChangeListener的定義就比較複雜,在此將會監聽com.bin.practice.ui plugin的
Preferences page(CA Preference)若有值的變動且存檔的話就會觸發! 前提是CTest Preference
要初始化過才行!
下圖是CA Preference內的元件做變動並且Apply之後,CTest Preference內的preferenceChange
就會帶出該元件的name與相關value!
雖然CTest Preference若沒有初始化的話就無法監聽CA Preference的變化,但是當它第一次切
換到CTest時,CTest可以去讀取CA's .pref檔案,一樣可以得到CA最新的變化,前提是CA已
經做過儲存的動作!
PS. 在此CA Preference的相關code在此就不列出了,跟CTest Preference類似!
補充
關於runtime-EclipseApplication就是你執行plugin後會產生另一Eclipse,這個資料夾就是模擬
你新Open的Eclipse的workspace,當你在run configuration時就可以定義! 而InstanceScope綁定
的是workspace的範圍! 也就是你換了另一個workspace後,原本的設定就會讀不到(當然,不
同目錄壓)! 因此你可以設定儲存的該筆資料範圍是ConfigurationScope,因此就不會因為換了
workspace而讀不到該設定資料,因為它跨越了不同workspace的限制!
若你是存ConfigurationScope則須至org.eclipse.pde.core內而不是org.eclipse.core.runtime
留言
張貼留言