テキストを加工してエディタに表示する

訳あって、シリアライズされたファイルを扱うことがあったから、何とかデシリアライズして見れないものかと思って、調べてみた。

以下、最小構成

依存関係

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()→よくわかんない(あとで調べる)

まとめ

英語力の無さに泣けてきた。
ざっくりとしかわからないのがつらい。