S-JIS[2013-02-24] 変更履歴

EclipseプラグインFormEditorクラス

Eclipseプラグイン開発のフォームエディターについて。


概要

FormEditorは、タブによってページを切り替えることの出来るエディター。
各ページは普通のエディター(テキストエディターとか)やラベルやテキスト等の部品を組み合わせたフォームにすることが出来る。

依存プラグインは「org.eclipse.ui.forms」。


テキストエディターとフォームページを1つずつ扱う例。
主たるデータはテキストエディターが持ち、フォームページはサンプルとして適当な文言を表示するだけとする。

DMDLMultiPageEditor.java

import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
public class DMDLMultiPageEditor extends FormEditor {

	private DMDLEditor editor;
	@Override
	protected void addPages() {
		editor = new DMDLEditor();
		MyFormPage page1 = new MyFormPage(this);
		try {
			int n0 = addPage(editor, getEditorInput());
			setPageText(n0, "editor");

			int n1 = addPage(page1);
			setPageText(n1, "table");
		} catch (PartInitException e) {
			throw new IllegalStateException(e);
		}
		setPartName(editor.getTitle());
	}

addPage()によって各ページを追加していく。
エディター(IEditorPart)を追加する場合はaddPage(IEditorPart editor, IEditorInput input)を、
ページ(IFormPage)を追加する場合はaddPage(IFormPage page)を使用する。

	@Override
	public void doSave(IProgressMonitor monitor) {
		editor.doSave(monitor);
	}

	@Override
	public void doSaveAs() {
		editor.doSaveAs();
	}

	@Override
	public boolean isSaveAsAllowed() {
		return editor.isSaveAsAllowed();
	}
}

その他にも保存系のメソッドを実装する必要がある。
今回の例では保存すべき情報はDMDLEditorが持っているものだけなので、DMDLEditorに委譲している。


FormPageの例。

MyFormPage.java

import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
public class MyFormPage extends FormPage {
	public MyFormPage(FormEditor formEditor) {
		super(formEditor, "MyForm_ID", "my form title");
	}
	@Override
	protected void createFormContent(IManagedForm managedForm) {
		FormToolkit kit = managedForm.getToolkit();

		ScrolledForm form = managedForm.getForm();
		Composite body = form.getBody();
		body.setLayout(new GridLayout(2, false));
		body.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));

		kit.createLabel(parent, "test:");
		Text text = kit.createText(parent, "value");
	}
}

createFormContent()でフォームの本体を実装する。

通常のSWTだとnew Lebel(parent, style)new Text(parent, style)で部品を作るが、
FormPageの場合はFormToolKitというクラスで作れるので、少しだけ便利。


スタックオーバーフロー例外

addPage()の使い方を間違えるとスタックオーバーフローが起きる。

	at org.eclipse.ui.forms.editor.FormEditor$FormEditorSelectionProvider.getSelection(FormEditor.java:89)
	at org.eclipse.ui.forms.editor.FormEditor$FormEditorSelectionProvider.getSelection(FormEditor.java:89)
	at org.eclipse.ui.forms.editor.FormEditor$FormEditorSelectionProvider.getSelection(FormEditor.java:89)
…

FormPageはIFormPageを実装している他にEditorPartを継承しているので、
addPage(IEditorPart editor, IEditorInput input)addPage(IFormPage page)
どちらでも呼ぶことが出来る。
が、前者の呼び方でページ追加すると上記の様な例外が発生する。後者なら大丈夫。

	int n = addPage(new MyFormPage(), getEditorInput());
↓
	int n = addPage(new MyFormPage());

参考: eclipse BUGSのBug 283039 - FormEditor SelectionProvider Stack Overflow


Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま