Eclipseのプラグイン開発のフォームエディターについて。
|
FormEditorは、タブによってページを切り替えることの出来るエディター。
各ページは普通のエディター(テキストエディターとか)やラベルやテキスト等の部品を組み合わせたフォームにすることが出来る。
依存プラグインは「org.eclipse.ui.forms」。
テキストエディターとフォームページを1つずつ扱う例。
主たるデータはテキストエディターが持ち、フォームページはサンプルとして適当な文言を表示するだけとする。
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の例。
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