雖然 AbstractUIPlugin#getPreferenceStore()
提供的 IPreferenceStore 的格式尚未改變,
但我們已經更新 IPreferenceStore 的規格,
以明確地定義我們已提供的規則。
PropertyChangeEvents 的輸入
任何自 IPreferenceStore 的內容變更事件在同一個類型中都必須有舊的和新的值, 並且與產生其值的 setValue 呼叫一致。
比方說,如果您呼叫 IPreferenceStore#setValue(String name, long
value)
,從這個方法產生的 PropertyChangeEvent 中的值
都會屬於 java.lang.Long
類型。
putValue
對 #putValue
的呼叫將不會產生 PropertyChangedEvent
。
對不同的 #setValue
方法進行的呼叫則會產生。
OSGI 喜好設定和 IPreferenceStore 之間的關係
AbstractUIPlugin#getPreferenceStore()
提供的 IPreferenceStore
是 ScopedPreferenceStore
的實例,它使用 org.osgi.service.prefs.Preferences
作為後端。org.osgi.service.prefs.Preferences
只會將變更事件當作「字串」來傳送。
ScopedPreferenceStore
會將 IPreferenceStore#setValue(String name, String value)
產生的 OSGI 事件以及其中一個本身的 PropertyChangeEvents
封套在一起,然後將該事件轉遞至其接聽器。
對於 IPreferenceStore#setValue
的其他實作,ScopedPreferenceStore
將會建立自己的正確類型事件,而不會從 OSGI 喜好設定來傳送事件。
對於變更事件中的 typed 和 String 值,都應該準備 ScopedPreferenceStore
的接聽器,
因為仍然可能會透過 OSGI 喜好設定來取得事件(例如,在匯入喜好設定期間)。OSGI 事件的類型一律是
java.lang.String
。
永遠都可能從 Eclipse SDK 的現有 IWorkbenchWindows 中,取得空值的 org.eclipse.swt.widgets.Shell。我們現在明確定義何時會發生此事件:即尚未建立 Shell 時,或已關閉 IWorkbenchWindow 時。