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

第10回 画面の作成(5)

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

前回でMaster(一覧)とDetails(詳細)の連携が完了しました。今回からはバリデータ定義フォームの実装です。これは実装が複雑なため,詳細をひとつひとつ解説するのではなく,ポイントを絞って解説していきます。

プラグインプロジェクトのダウンロード

今回はポイントを絞って解説するために,完成したプラグインプロジェクトを用意しました。バリデータ定義フォームを実装したプラグインプロジェクトを下記のリンクからダウンロードし,お使いのワークスペースにインポートしてください。前回の連載までに実装されたプラグインプロジェクトはインポート前にリネームすることで残しておくことができます。

画面とクラスの関係

今回の実装でフォームデザイナーの画面が完成しました。画面とそれを実装しているクラスの関係を示します。なお,バリデータ定義フォームは設計時は一覧と詳細を横に並べていましが,画面に表示しきれない場合があるので,縦に並べるように変更しました。

フォームデザイナーのクラスと画面の関係

フォームデザイナーのクラスと画面の関係

Details(詳細)の入力項目定義フォーム,バリデータ定義フォームをそれぞれ実装しているFieldDetailsGeneralSectionクラス, FieldDetailsValidatorSectionクラスはAbstractFieldDetailsSectionクラスを継承しています。Details(詳細)を管理するFieldDetailsPageクラスでは,各フォームをListオブジェクトとして管理し,ウィジェットの生成・イベント通知を抽象的に行うことができます。

以下のソースコードはFieldDetailsPageクラスのselectionChanged()メソッドです。この実装ではフィールドが選択された場合に,入力項目定義フォーム,バリデータ定義フォームのウィジェットを再生成するようにしています。その後,各フォームに変更を通知するようにしています。

FieldDetailsPageクラスのselectionChanged()メソッド

public class FieldDetailsPage implements IDetailsPage {
    ...
    public void selectionChanged(IFormPart part,
                                 ISelection selection) {
        boolean fieldChange = true;
        if (fSections != null) {
            for (AbstractFieldDetailsSection section : fSections) {
                if (section.getSectionPart() == part) {
                    fieldChange = false;
                }
            }
        }

        if (fieldChange) {
            if (fSections != null) {
                for (AbstractFieldDetailsSection section : fSections) {
                    section.getSectionPart().getSection().dispose();
                }
                fSections.removeAll(
                        new ArrayList<AbstractFieldDetailsSection>());
            }

            fSections = new ArrayList<AbstractFieldDetailsSection>();
            fSections.add(new FieldDetailsGeneralSection());
            fSections.add(new FieldDetailsValidatorSection());

            for (AbstractFieldDetailsSection section : fSections) {
                section.createContents(
                        fManagedForm.getToolkit().createSection(
                                fParent, Section.TITLE_BAR),
                                fManagedForm);
            }
            fParent.pack();
        }

        for (AbstractFieldDetailsSection section : fSections) {
            section.selectionChanged(part, selection);
        }
    }
}

定義されたバリデータを表すDefinedValidatorクラス

フォームデザイナーはPHPのバリデーションフレームワークPiece_Rightのバリデーション定義ファイルを編集するためのエディターです。従って,Piece_Rightによって定義されているバリデータしか設定できないようにしなければなりません。そこで,新たにmodel.definedパッケージを追加し,そこにDefinedValidatorクラス,DefinedRuleクラスを作成しました。

ひとつのバリデータ定義にはひとつ以上のルールを設定する必要があります。例えば,メールアドレスかどうかを検証するEmailバリデータではアットマークより前にドットが入ることを許可するかを決定するルール(allowDotBeforeAtmark)を設定する必要があります。 EmailバリデータのDefinedValidator, DefinedRulesオブジェクトの生成は以下のようになります。

Emailバリデータの定義

List<DefinedRule> emailRules = new ArrayList<DefinedRule>();
emailRules.add(new DefinedRule(
                        "allowDotBeforeAtmark", 
                        DefinedRule.WidgetType.YesNo, 
                        "false"));

DefinedValidator emailValidator = new DefinedValidator(
                                            "Email",
                                            "メールアドレス",
                                            emailRules));

DefinedValidatorクラスはコンストラクタをプライベートとして定義し,インスタンスはstatic初期化子でのみ生成しています。このようにすることで,外部で不正なインスタンスが生成されることを防いでいます。

Piece_Rightでは多くのバリデータを提供していますが,今回はCompare, Date, Emailの3つだけ定義しています。

著者プロフィール

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

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

コメント

コメントの記入