2012年8月19日日曜日

Eclipse 4 アプリケーションの作成 (6) プリファレンス

ビデオ一覧を取得するフォルダはユーザー環境にあわせて自由に設定できる必要があります。 プリファレンスを使って、ユーザーが設定したビデオフォルダの位置を保存できるようにします。

設定ダイアログの作成
まず、ビデオフォルダを設定するダイアログを作成します:
public class PreferenceDialog extends TitleAreaDialog {

    private String fRootDir;
    private DirectoryFieldEditor fRootDirFld;
    private FieldEditorPreferencePage fPage;

    /**
     * ダイアログの作成.
     * @param parentShell
     */
    public PreferenceDialog(Shell parentShell) {
        super(parentShell);
    }

    /**
     * ダイアログ・コンテンツの作成
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        getShell().setText("マイビデオ設定");
        setTitle("マイビデオ設定");
        setMessage("ご使用の環境にあわせて設定してください");
        
        Composite area = (Composite) super.createDialogArea(parent);
        GridLayout layout = (GridLayout) area.getLayout();
        layout.marginTop = 10;
        layout.marginBottom = 10;
        layout.marginLeft = 10;
        layout.marginRight = 10;
        area.layout();

        Preferences pref = ConfigurationScope.INSTANCE.getNode("com.itrane.myvideo");
        fRootDir = pref.get("root.dir", "c:/$mydoc/video/music");

        fPage = new FieldEditorPreferencePage(FieldEditorPreferencePage.GRID) {
            @Override
            public void createControl(Composite parent) {
                noDefaultAndApplyButton();
                super.createControl(parent);
            }
            
            @Override
            protected void createFieldEditors() {
                fRootDirFld = new DirectoryFieldEditor("root.dir",
                        "ビデオルートディレクトリ:", getFieldEditorParent());
                fRootDirFld.setStringValue(fRootDir);
                addField(fRootDirFld);
            }
            
            @Override
            protected void updateApplyButton() {
                updateButtons(isValid()); 
                super.updateApplyButton();
            }
        };
        fPage.createControl(area);
        Control pageControl = fPage.getControl();
        pageControl.setLayoutData(new GridData(GridData.FILL_BOTH));
        return area;
    }

    /**
     * ボタン・バーの作成
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
                true);
        createButton(parent, IDialogConstants.CANCEL_ID,
                IDialogConstants.CANCEL_LABEL, false);
        updateButtons(fPage.isValid());
    }

    /** ダイアログの初期サイズ */
    @Override
    protected Point getInitialSize() {
        return new Point(450, 350);
    }

    @Override
    protected void okPressed() {
        Preferences pref = ConfigurationScope.INSTANCE.getNode("com.itrane.myvideo");
        pref.put("root.dir", fRootDirFld.getStringValue());
        try {
            pref.flush();
            super.okPressed();
        } catch (BackingStoreException e) {
        }
    }
    
    private void updateButtons(boolean isValid) {
        Button okButton = getButton(IDialogConstants.OK_ID);
        if (okButton != null) {
            okButton.setEnabled(isValid);
        }
    }
}

OK ボタンが押されたとき、Prefences#put メソッドにより、キー "root.dir" に対してビデオフォルダを設定します。 Prefences#flush メソッドを実行して、プリファレンス・ストアに保存します。

設定ダイアログを開くためのコマンド、ハンドラ、メニューの追加
前回投稿のテーマ変更の場合と同じように、Application.e4xmi を開いて、コマンド(Id: command.openPreference)、ハンドラ(Command: openPreference) を追加します。 このハンドラを実行するメニュー項目(Label: 設定, Command: openPreference) も追加します(下図):

さらに、変更したディレクトリの内容でギャラリーを更新する必要があります。 GalleryView に次のメソッドを追加します:
    public void initGallery() {
        fGallery.clearAll();
        initData();
        fGallery.setItemCount(fGalleryGroups.size());
    }

追加したハンドラの "Class UI" をクリックして、com.itrane.myvideo.handlers パッケージに、次の内容の OpenPreferenceHandler クラスを作成します:
public class OpenPreferenceHandler {
    @Execute
    public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell,
            EPartService partService) {
        PreferenceDialog dlg = new PreferenceDialog(shell);
        int result = dlg.open();
        if (result==Window.OK) {
            MPart part = (MPart)partService.findPart("com.itrane.myvideo.GalleryPart");
            if (part!=null) {
                if (part.getObject() instanceof GalleryView) {
                    GalleryView view = (GalleryView)part.getObject();
                    view.initGallery();
                }
            }
        }
    }
}

これで、ビデオディレクトリを変更すれば、変更されたビデオディレクトリのビデオ一覧でギャラリーの内容も更新されます。 最後に、GalleyView の initData メソッドを次のように修正して、起動時に、プリファレンスの設定内容を取得して、このディレクトリからビデオ一覧を取得するようにします:
    private void initData() {
        String root = "C:/$mydoc/video/music";
        Preferences pref = ConfigurationScope.INSTANCE.getNode("com.itrane.myvideo");
        if (pref!=null) {
            root = pref.get("root.dir", "C:/$mydoc/video/music");
        }
        fVideoHome = zVideoHomeFactory.createHome(
                root,
                new String[] {"mp4", "divx", "flv", "avi", "wmv"});
        // ...
    }
アプリケーションを起動して、メニューからウィンドウ > 設定を選択すれば、次の設定ダイアログが表示されます。

ディレクトリを変更してOKを押せば、設定が保存され、変更ディレクトリの内容にギャラリーが更新されます。 そして、次回起動時は保存されたディレクトリのビデオ一覧が表示されます。

0 件のコメント: