読者です 読者をやめる 読者になる 読者になる

LG3DHOME が設定されてなければ、プロジェクトを作れないようにする

LG3DHOME が設定されていないと、lg3d-core.jar を CLASSPATH に正しく設定することができません。実行時だけに使用する JAR であれば実行するまでに設定しておいてもらえばいいのですが、コンパイル時にも必要なので事前に設定してもらう必要があるのです。

だから、LG3DHOME が設定していなければ、「設定していただけないでしょうか」とダイアログを表示させて、プロジェクトを作成させないようにしたいのです。

というわけで、調べなければいけないのはプロジェクトの種類を選択した後に [Next >] を押したときに LG3DProjectWizard オブジェクトのどのメソッドがコールされるかということと、そこから再びプロジェクトの種類選択ダイアログに戻ることができるかということです。

で、調べてみると

1. [Next >] をクリック
2. LG3DProjectWizard を new する
3. init
3. addPages

という順序で呼ばれているようです。でも、どれも戻り値は void。つまり、どこかで失敗したということは返せないようです。さて、どうしたものか。

なるべく例外は投げたくないのですが...

で、いろいろ考えた結果、LG3DHOME を設定していなかったら、addPages メソッドの中で次のページを addPage しないということにしてみました。

その前に、LG3D を実行するときに LG3DHOME が設定されていないとダイアログを出すようにしていましたが、それを WRPEPlugin クラスに移して誰でもコールできるようにしないと。

    public boolean checkLG3DHome() {
        IPreferenceStore store = getPreferenceStore();
        String home = store.getString(LG3D_PREF_HOME_KEY);
        if (home == null || home.equals("")) {
            WrpePlugin.log("Can't launch LG3D because of unsetting home property.");
            MessageDialog.openWarning(
                    getShell(),
                    "LG3D WRPE Plug-in",
                    "You must set LG3D home property.");
            
            return false;
        } else {
            return true;
        }
    }

そして、LG3DProjectWizard クラスの addPages メソッドは次のようにしました。

    public void addPages() {
        if (!WrpePlugin.getDefault().checkLG3DHome()) {
            return;
        }

        creationPage = new WizardNewProjectCreationPage("LG3D Project");
        creationPage.setTitle("Configuration of New LG3D Project");
        creationPage.setDescription("Input project name and location."); 
        addPage(creationPage);
        
        javaPage = new JavaCapabilityConfigurationPage() {
            public void setVisible(boolean visible) {
                if (visible) {
                    project = creationPage.getProjectHandle();
                    javaProject = JavaCore.create(project);
                                
                    init(javaProject, null, null, true);
                } else {
                }
                super.setVisible(visible);
            }
        };
        
        addPage(javaPage);
    }

これで実行してみると、LG3DHOME が設定していないと、ダイアログが表示されて、[Next >] を押されても次にいけないようになりました。

でも、ダイアログが表示されるのは 1 回だけなんです。一回、[Next >] を押されると LG3DProjectWizard オブジェクトはそのまま参照が残ってしまうようです。だから、addPages も呼ばれなくなってしまいます。結果的に、ダイアログは表示されない。

まぁ、いいか。

それよりも、もっと重要なことに気がつきました。それが何かはまた明日。