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

第10回 画面の作成(5)

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

ルールごとのウィジェットの定義

ルールには先ほどEmailバリデータのallowDotBeforeAtmarkルールのように「はい」⁠いいえ」で設定するものもあれば,任意の文字列を設定するルールもあります。これらの入力インタフェースにはそれぞれラジオボタン,テキストボックスを使いたいところです。そこで DefinedRuleクラスではそのルールで使用するウィジェットを指定するWidgetTypeプロパティーを用意しました。WidgetTypeはenum型で定義されており,今回は"Text"(テキストボックス),"YesNo"(「はい」⁠いいえ」のふたつのラジオボタン)を用意しています。

バリデータ定義フォームの実装

いよいよ今回の主な機能であるバリデータ定義フォームの実装を解説します。バリデータ定義フォームは今までMaster(一覧⁠⁠, Details(詳細)で行っていたことと同様のことをフォーム内部で行いつつ,外部のMaster(一覧)であるフィールド一覧とも連携する必要があります。また,今回は選択されるバリデータごとに詳細部分のウィジェットを切り替える必要もあります。こういった仕様をどのように解決しているか,順に解説していきます。

バリデータ選択ダイアログ

まず最初に定義されたバリデータの一覧から追加するバリデータを選択するバリデータ一覧ダイアログを作成します。Eclipseでは一覧からデータを選択するためのダイアログとしてElementListSelectionDialogクラスが用意されているので,これを利用してValidatorSelectionDialogクラスを実装します。バリデータ一覧はDefinedValidatorクラスでスタティックメソッドとして定義されているgetList()メソッドから取得します。

ElementListSelectionDialogクラスを継承することで,フィルター機能を持った選択ダイアログを簡単に実装することができます。

ValidatorSelectionDialogクラス

public class ValidatorSelectionDialog extends ElementListSelectionDialog {
    public ValidatorSelectionDialog(Shell parent) {
        super(parent, new ILabelProvider() {
            public Image getImage(Object element) {
                return null;
            }

            public String getText(Object element) {
                assert (element instanceof DefinedValidator);

                return ((DefinedValidator) element).getDisplayName();
            }

            public void addListener(ILabelProviderListener listener) {
            }

            public void dispose() {
            }

            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            public void removeListener(ILabelProviderListener listener) {
            }
        });
        setTitle("バリデータ選択");
        setMessage("使用するバリデータを選択してください。");
        setHelpAvailable(false);
        setMultipleSelection(false);
        setElements(DefinedValidator.getList().toArray());
    }
}

バリデータ選択ダイアログ

バリデータ選択ダイアログ

ValidatorUIクラス

Master(一覧)のフィールド一覧テーブルではFieldオブジェクトでやりとりしましたが,バリデータ一覧テーブルではどういったオブジェクトでやりとりすればよいでしょうか。その候補として,まずDefinedValidatorオブジェクトが考えられます。しかし,このオブジェクトではメッセージや各ルールの値などを保持することができません。逆に,これらのデータを保持するVaildatorオブジェクトでは,選択されたときにどういったウィジェットを表示すればよいかがわかりません。

そこで,DefinedValidatorオブジェクトとValidatorオブジェクトの両方を保持するValidatorUIクラスを定義することにします。

DefinedValidatorオブジェクトとValidatorオブジェクトを保持するValidatorUIクラス

public class FieldDetailsValidatorSection extends AbstractFieldDetailsSection {
    private class ValidatorUI {
        private DefinedValidator fDefinedValidator;
        private Validator fValidator;

        ValidatorUI(DefinedValidator definedValidator) {
            fDefinedValidator = definedValidator;
            fValidator = fDefinedValidator.create();
        }

        ValidatorUI(Validator validator) {
            fValidator = validator;
            fDefinedValidator = DefinedValidator.getDefinedValidator(
                                    fValidator);
        }

        public DefinedValidator getDefinedValidator() {
            return fDefinedValidator;
        }

        public Validator getValidator() {
            return fValidator;
        }
    }
    ...
}

さらにこのクラスではDefinedValidatorオブジェクト,Validatorオブジェクトのそれぞれを引数とするふたつのコンストラクターを定義します。そして引数でない方のインスタンスを生成・取得することで,バリデータの新規追加,編集の両方に対応できるようになっています。

著者プロフィール

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

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