テキストを加工してエディタに表示する
訳あって、シリアライズされたファイルを扱うことがあったから、何とかデシリアライズして見れないものかと思って、調べてみた。
以下、最小構成
依存関係
plugin.xml
<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.4"?> <plugin> <extension point="org.eclipse.ui.editors"> <editor class="DeserializeEditor" default="false" extensions="properties" icon="icons/sample.gif" id="DeserializeViewer.editor1" name="name"> </editor> </extension> </plugin>
ここでとりあえず大事なのはclass指定くらいかな?
extensionsは対象の拡張子。
iconはなにげに必須。
ソース
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.IVerticalRuler; import org.eclipse.jface.text.source.projection.ProjectionSupport; import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.editors.text.FileDocumentProvider; import org.eclipse.ui.editors.text.TextEditor; public class DeserializeEditor extends TextEditor { public DeserializeEditor() { super(); setDocumentProvider(new FileDocumentProvider(){ @Override protected IDocument createDocument(Object element) throws CoreException { // このメソッドで返したIDocumentの値が表示される IDocument document = super.createDocument(element); if (document != null) { document.set("Hello Editor"); } return document; } @Override protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException { // 保存処理 } }); } @Override protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) { ISourceViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(), styles); getSourceViewerDecorationSupport(viewer); return viewer; } @Override public void createPartControl(Composite parent) { super.createPartControl(parent); ProjectionViewer viewer = (ProjectionViewer) getSourceViewer(); ProjectionSupport projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors()); projectionSupport.install(); } }
実行すると、どんなporpertiesファイルを開いても"Hello Editor"と表示される。
FileDocumentProvider#createDocument()で返すのは表示する文字列。elementに元のデータが入っている。
FileDocumentProvider#doSaveDocument()は保存時の処理。
表示内容と、生データが異なるので上手いこと保存しろってことだと思う(後で調べる)
DeserializeEditor()→コンストラクタ内でDocumentProviderをセット
DeserializeEditor#createSourceViewer()→ViewerにProjectionViewerを使うことを教えてる?(後で調べる)
DeserializeEditor#createPartControl()→よくわかんない(あとで調べる)
まとめ
英語力の無さに泣けてきた。
ざっくりとしかわからないのがつらい。