さて、ここまでの内容でEclipseの設定ダイアログから強調表示に使用する色を設定できるようになったわけですが、肝心のエディタ側で設定内容を読み込むようにしないと設定内容が反映されません。前回作成したXMLエディタに手を加えて設定内容が反映されるようにしてみます。まずはColorManagerを修正し、プリファレンスストアからColorオブジェクトを取得するためのメソッドを追加します(追加した部分を赤字にしてあります)。
public class ColorManager {
protected Map fColorTable = new HashMap(10);
protected IPreferenceStore store;
public ColorManager() {
this.store = XMLEditorPlugin.getDefault().getPreferenceStore();;
}
public void dispose() {
Iterator e = fColorTable.values().iterator();
while (e.hasNext())
((Color) e.next()).dispose();
}
public Color getColor(RGB rgb) {
Color color = (Color) fColorTable.get(rgb);
if (color == null) {
color = new Color(Display.getCurrent(), rgb);
fColorTable.put(rgb, color);
}
return color;
}
public Color getColor(String prefKey){
String colorName = store.getString(prefKey);
RGB rgb = StringConverter.asRGB(colorName);
return getColor(rgb);
}
} |
図2 作成したプリファレンスページ
後はColorManagerからColorオブジェクトを取得している部分を修正していきます。修正が必要なのはXMLConfiguration、XMLScanner、XMLTagScannerの3つのクラスです。例えばXMLScannerの場合は以下のように修正します。これまではIXMLColorConstantsで定義されていたRGBオブジェクトを基にColorオブジェクトを取得していたわけですが、その部分をコメントアウトし、PreferenceConstantsで定義されているプリファレンスのキーを指定してColorオブジェクトを取得するようにしています(変更部分を赤字にしてあります)。
public class XMLScanner extends RuleBasedScanner {
public XMLScanner(ColorManager manager) {
IToken procInstr =
new Token(
new TextAttribute(
manager.getColor(PreferenceConstants.COLOR_PROC)));
//manager.getColor(IXMLColorConstants.PROC_INSTR)));
IRule[] rules = new IRule[2];
//Add rule for processing instructions
rules[0] = new SingleLineRule("<?", "?>",
procInstr);
// Add generic whitespace rule.
rules[1] = new WhitespaceRule(new XMLWhitespaceDetector());
setRules(rules);
}
} |
これで設定した色がXMLエディタに反映されるようになります。設定ダイアログで色を変更したら、一度エディタを閉じてから開き直してみてください。強調表示に使用される色が変更されているはずです。
前節まででプリファレンスストアへの設定内容の保存と読み込みを行いましたが、設定した色を反映させるためにはエディタを一度閉じて開き直す必要がありました。プリファレンスストアにIPropertyChangeListenerを登録しておくと設定が変更された場合に変更内容を検知することができますので、これを利用してリアルタイムに設定を反映させることも可能です。これを実装したエディタクラスは以下のようになります(追加した部分を赤字にしてあります)。
public class XMLEditor extends TextEditor implements IPropertyChangeListener
{
private ColorManager colorManager;
public XMLEditor() {
super();
colorManager = new ColorManager();
setSourceViewerConfiguration(new XMLConfiguration(colorManager));
setDocumentProvider(new XMLDocumentProvider());
// 設定の変更通知を受け取るためのリスナを登録
XMLEditorPlugin.getDefault().getPreferenceStore(
).addPropertyChangeListener(this);
// …(1)
}
public void dispose() {
colorManager.dispose();
super.dispose();
// 設定の変更通知を受け取るためのリスナを削除
XMLEditorPlugin.getDefault().getPreferenceStore(
).removePropertyChangeListener(this);
//…(2)
}
public void propertyChange(PropertyChangeEvent event) { // …(3)
// 設定の変更を通知
XMLConfiguration config = (XMLConfiguration)getSourceViewerConfiguration();
config.updatePreferences();
// テキストエディタを再描画
getSourceViewer().invalidateTextPresentation();
}
} |
(1)でエディタ自身を変更通知を受け取るリスナとして登録し、(2)でエディタの廃棄と同時にリスナを削除しています。実際に設定の変更時に呼び出されるのは(3)のpropertyChange()メソッドになります。この中でXMLConfigurationに設定が変更されたことを通知した後、エディタのプレゼンテーションを再描画しています。実際に色の再設定を行っているのはXMLConfiguration クラスの内部での処理になりますが、そちらの実装についてはサンプルのソースコードをご覧ください。
今回作成したサンプルはここからダウンロードすることが可能です。ダウンロードしたファイルをそのままEclipseにプロジェクトとしてインポートしてご利用ください。本稿では詳しく解説できなかった部分もありますので、ぜひソースコードをのぞいてみてください。
さて、次回はウィザードの作成方法を解説する予定です。せっかくXMLエディタを作りましたので、XMLファイルを新規作成するウィザードを作ってみたいと思います。お楽しみに。