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

第8回 画面の作成(3)

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

フィールドの詳細の表示

まずテーブルで選択されたときにイベントを実行する必要があります。これはTableViewerクラスのaddSelectionChangedListener()メソッドでリスナーを登録することで実行することができます。addSelectionChangedListener()メソッドの引数としてISelectionChangedListenerオブジェクトを渡します。ISelectionChangedListenerインタフェースではselectionChanged()メソッドが定義されており,このメソッドがテーブル選択時に実行されます。さらにこのメソッドの引数SelectionChangedEventオブジェクトから選択されたFieldオブジェクトを取得することが可能です。

次に選択されたFieldオブジェクトを通知するために,第6回で説明したManagedFormクラスを使用します。このクラスのfireSelectionChanged()メソッドを呼び出すことでページで管理しているフォームパートに対してイベントを通知することができます。

テーブルビューアーに選択時リスナーを登録する

protected void createMasterPart(
                final IManagedForm managedForm,
                Composite parent) {
    ...            
    TableViewer viewer = new TableViewer(table);
    viewer.setContentProvider(new ArrayContentProvider());
    viewer.setLabelProvider(new ITableLabelProvider() {
        ...
    });
    final SectionPart part = new SectionPart(section);
    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
        public void selectionChanged(SelectionChangedEvent event) {
            managedForm.fireSelectionChanged(
                            part,  
                            event.getSelection());
        }
    });

    Composite buttons = toolkit.createComposite(composite);
    ...
}

fireSelectionChanged()メソッドは引数に通知元フォームパートが必要なので,SectionPartを事前に生成し,それを指定します。また無名クラスでmanagedFormを使用するためにcreateMasterPart()メソッドの引数managedFormにfinalを指定しています。それでは実行してみましょう。フィールド一覧でフィールドを選択すると Details(詳細)にフィールドの詳細画面が表示されます。しかし,まだDetails(詳細)に配置したウィジェットにFieldオブジェクトの情報を表示する実装を行っていないので,何も表示されません。

Details(詳細)のウィジェットは表示されるが,Fieldオブジェクトの情報はまだ表示されない

Details(詳細)のウィジェットは表示されるが,Fieldオブジェクトの情報はまだ表示されない

それでは通知されたFieldオブジェクトを取得し,Details(詳細)の各ウィジェットに表示してみましょう。fireSelectionChanged()メソッドによる通知はselectionChanged()メソッドで受け取るので,このメソッドを実装します。

通知されたFieldオブジェクトを取得し,各ウィジェットに表示する

protected void registerPages(DetailsPart detailsPart) {
    IDetailsPage detailsPage = new IDetailsPage() {
        ...
        public void selectionChanged(IFormPart part,
                                     ISelection selection) {
            fNameText.setText("");
            fDescriptionText.setText("");
            fRequiredYesButton.setSelection(false);
            fRequiredNoButton.setSelection(false);
            fMessageText.setText("");

            Field field = 
                (Field) ((IStructuredSelection) selection).getFirstElement();
            fNameText.setText(field.getName());
            fDescriptionText.setText(field.getDescription());
            fRequiredYesButton.setSelection(field.isRequired());
            fRequiredNoButton.setSelection(!field.isRequired());
            fMessageText.setText(field.getMessage());
        }
    };
    detailsPart.registerPage(Field.class, detailsPage);
}

それでは実行してみましょう。選択したフィールドの情報がDetails(詳細)に表示されます。

Details(詳細)にFieldオブジェクトの情報が表示されました

Details(詳細)にFieldオブジェクトの情報が表示されました

おわりに

今回は画面のウィジェットの配置を行い,Master(一覧)とDetails(詳細)の連携を実装しました。注目すべき点は,データのやりとりが Fieldオブジェクトを介して行われているという点です。これによって,データとウィジェットの関連部分が局所化され,見やすいコードになっています。

次回は[追加]⁠⁠削除]⁠⁠上へ]⁠⁠下へ]ボタンの実装と,Details(詳細)での変更をFieldオブジェクトに反映する実装を行います。

著者プロフィール

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

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