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