Eclipseプラグインを作ってみよう!

第9回 画面の作成(4)

この記事を読むのに必要な時間:およそ 10 分

Details(詳細)のクラス化

続いて,Details(詳細)を別クラスに抽出します。このクラスはFieldsBlockクラスのregisterPages()メソッドでIDetailsPageインタフェースの無名クラスとして実装している部分をFieldDetailsPageクラスとして抽出します。

FieldDetailsPageクラス

public class FieldDetailsPage implements IDetailsPage {
   ...
   (ソースコードはFieldsBlockクラスのregisterPages()メソッドのIDetailsPageインタフェースの無名クラスをそのまま移動してきます。)
   ...
}

FieldsBlockクラス

private class FieldsBlock extends MasterDetailsBlock {
    @Override
    protected void createMasterPart(
                    final IManagedForm managedForm,
                    final Composite parent) {
        new FieldsMasterSectionPart(parent, managedForm);
    }

    @Override
    protected void createToolBarActions(IManagedForm managedForm) {
    }

    @Override
    protected void registerPages(DetailsPart detailsPart) {
        detailsPart.registerPage(Field.class, new FieldDetailsPage());
    }
}

ここまで実装できたら,実行して動作に影響がないことを確認します。

ボタンの実装

ソースコードはだいぶ整理できましたので,続いて各ボタンの実装を行います。ボタンにイベントを追加するにはaddSelectionListener ()メソッドを使用し,SelectionListenerインタフェースのインスタンスを追加します。このインタフェースにはwidgetSelected()メソッドとwidgetDefaultSelected()メソッドがあり,前者はウィジェットを選択したときに呼び出されるのに対して,後者はリストなどでダブルクリックされたときに呼び出されます。これはワンクリック時とダブルクリック時で異なる動作をさせたいときに有効です。今回はボタンですので,widgetSelected()メソッドのみを実装することにします。

[追加]ボタン

[追加]ボタンがクリックされたときの動作は,フィールド名を入力するダイアログを表示します。次にそのダイアログで入力された文字列をフィールド名としてFieldオブジェクトを生成,テーブルにその情報をセットして選択状態にします。

[追加]ボタンのイベント

private void createContents(Section section, FormToolkit toolkit) {
    ...
    final TableViewer viewer = new TableViewer(table);
    ...
    final Composite buttons = toolkit.createComposite(composite);
    ...
    Button addButton = toolkit.createButton(buttons, "追加(&A)...", SWT.PUSH);
    layoutData = new GridData();
    layoutData.horizontalAlignment = GridData.FILL;
    addButton.setLayoutData(layoutData);
    addButton.addSelectionListener(new SelectionListener() {
        public void widgetSelected(SelectionEvent e) {
            InputDialog dialog = new InputDialog(
                                    buttons.getShell(), 
                                    "フィールド名入力", 
                                    "フィールド名を入力してください。", 
                                    null, 
                                    null);
            dialog.open();

            Field field = new Field(dialog.getValue());
            viewer.add(field);
            viewer.setSelection(new StructuredSelection(field));
        }

        public void widgetDefaultSelected(SelectionEvent e) {
        }
    });
    ...
}

widgetSelected()メソッドの中でviewerとbuttonsを使用するので,これらをfinalにします。入力ダイアログは既存のInputDialogクラスを使用します。特筆すべきは生成したFieldオブジェクトをTableViewerオブジェクトにadd()メソッドで追加するだけで,テーブルに追加されているという点です。テーブルビューアーを導入したことでウィジェットとモデルの連携が簡単になっていることがわかります。

それでは実行してみましょう。⁠追加]ボタンをクリックするとダイアログが表示され,入力した文字列がフィールド名となってテーブルに追加されます。

[追加]ボタンをクリックするとフィールド名の入力を促すダイアログが表示される

[追加]ボタンをクリックするとフィールド名の入力を促すダイアログが表示される

[削除]ボタン

削除は選択されているFieldオブジェクトを取得し,それをTableViewerオブジェクトから削除することで実現できます。

[削除]ボタンのイベント

private void createContents(Section section, FormToolkit toolkit) {
    ...
    Button delButton = toolkit.createButton(buttons, "削除(&D)...", SWT.PUSH);
    layoutData = new GridData();
    layoutData.horizontalAlignment = GridData.FILL;
    delButton.setLayoutData(layoutData);
    delButton.addSelectionListener(new SelectionListener() {
        public void widgetSelected(SelectionEvent e) {
            Field field = 
                (Field) ((IStructuredSelection) viewer.getSelection())
                .getFirstElement();
            viewer.remove(field);
        }

        public void widgetDefaultSelected(SelectionEvent e) {
        }
    });
}

それでは実行してみましょう。Master(一覧)のテーブルから削除したいフィールドを選択し,⁠削除]ボタンをクリックします。これで選択したフィールドが削除されます。

著者プロフィール

松藤秀治(まつふじひではる)

Piece Frameworkのプログラマー。担当はEclipseのプラグインとして開発されているPiece Frameworkの統合開発環境Piece_IDE。2007年5月に株式会社アイテマンを設立。