連載
» 2005年12月22日 00時00分 公開

作って覚えるEclipseプラグイン(2):ツリー表示プラグインを作成する (2/2)

[竹添直樹, 岡本隆史,NTTデータ]
前のページへ 1|2       

ビューのツールバーとプルダウンメニュー

 さて、ここまででファイルシステムの内容を表示するエクスプローラ・ビューが完成したわけですが、以降では、このビューに対してアクションを追加することで機能を拡張する方法を解説します。すべてのビューにはツールバーとプルダウンメニュー領域があり、ここにアクションを追加することができます。

 例として、エクスプローラ・ビューの内容をリフレッシュするアクションを作成してみましょう。ExplorerViewをリスト5のように修正します。これで図7のようにツールバーとプルダウンメニューにアクションを組み込むことができます。

図7 ビューのツールバーとプルダウンメニュー 図7 ビューのツールバーとプルダウンメニュー
   リスト5
public class ExplorerView extends ViewPart {
  …
  private IAction refreshAction;

  public void createPartControl(Composite parent) {
    …
    createActions();
    createToolBar();
    createMenuBar();
  }

  /** アクションを作成 */
  private void createActions(){
    // アイコンを取得
    ImageDescriptor icon =     ViewPlugin.getImageDescriptor("icons/refresh.gif");
    // アクションを作成
    refreshAction = new Action("リフレッシュ", icon){
      public void run(){
        viewer.refresh();
      }
    };
  }

  /** ツールバーにアクションを追加 */
  private void createToolBar(){
    IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
    mgr.add(refreshAction);
  }

  /** メニューバーにアクションを追加 */
  private void createMenuBar(){
    IMenuManager mgr = getViewSite().getActionBars().getMenuManager();
    mgr.add(refreshAction);
  }
  …
}

ビューへのアクション・コントリビューション

 拡張ポイントを利用してアクションを追加(コントリビュート)することも可能です。拡張ポイントを用いることで、既存のビューに対してアクションを追加することが可能になります。アクションをコントリビュート可能な拡張ポイントとして以下のようなものがあります。

拡張 場所
org.eclipse.actionSets ワークベンチのメニューバー、ツールバー
org.eclipse.viewActions ビューのプルダウンメニュー、ツールバー
org.eclipse.editorActions ワークベンチのメニューバー、ツールバー(エディタがアクティブな場合)
org.eclipse.ui.popupMenus エディタ、ビュー、ビューオブジェクトのコンテクストメニュー
表1 アクションをコントリビュート可能な拡張ポイント

 このうちビューに関連するのはorg.eclipse.ui.viewActionsとorg.eclipse.ui.popupMenusになります。本節ではこれらの拡張ポイントを使ってビューを拡張する方法を解説します。ここではエクスプローラ・ビューで選択したファイルを削除するためにリスト6のようなアクションを作成しました。

   リスト6

public class DeleteAction implements IViewActionDelegate {
    
    private ExplorerView view;
    private IStructuredSelection sel;
    
    public void init(IViewPart view) {
        this.view = (ExplorerView)view;
    }

    public void selectionChanged(IAction action, ISelection selection) {
        sel = (IStructuredSelection)selection;
    }
    
    public void run(IAction action) {
        TreeViewer viewer = (TreeViewer)view.getSite().getSelectionProvider();
        Object[] files = sel.toArray();
        if(files.length > 0){
            StringBuffer sb = new StringBuffer("以下のファイルを削除してよろしいですか?\n\n");
            for(int i=0;i<files.length;i++){
                sb.append(((File)files[i]).getName()+ "\n");
            }
            if(MessageDialog.openQuestion(
                    view.getSite().getShell(),"ファイルの削除",sb.toString())){
                for(int i=0;i<files.length;i++){
                    File file = (File)files[i];
                    if(file.isDirectory()){
                        deleteFolder(file);
                    } else {
                        file.delete();
                    }
                    viewer.refresh(file.getParentFile()); …(
1)
                }
            }
        }
    }
    
    private void deleteFolder(File file){
        …// ディレクトリを再帰的に削除
    }
}


 ビューに追加するアクションはIViewActionDelegateインターフェイスを実装する必要があります。実際の処理はrun()メソッドで実装されており、削除確認のダイアログで[OK]が選択された場合に削除処理を実行するようになっています。

 削除処理そのものは特筆すべき点はありませんが、削除されたファイルをビューに反映するため(1)でツリービューアのrefresh()メソッドを呼び出している点に注意してください。では、このアクションをエクスプローラ・ビューにコントリビュートしてみましょう。

org.eclipse.ui.viewActions

 org.eclipse.ui.viewActionsはビューのプルダウンメニュー、ツールバーに対してアクションをコントリビュートするための拡張ポイントです。plugin.xmlはリスト7のようになります。

   リスト7
<extension
      point="org.eclipse.ui.viewActions">
   <viewContribution
         id="jp.sf.amateras.view.viewContribution1"
         targetID="jp.sf.amateras.view.explorerView"> …(1)
      <action
            class="jp.sf.amateras.view.DeleteAction"
            enablesFor="+" …(2)
            icon="icons/delete.gif"
            id="jp.sf.amateras.view.deleteAction"
            label="ファイルの削除"
            menubarPath="additions"
            style="push"
            toolbarPath="additions">
      </action>
   </viewContribution>
</extension>

 (1)のtargetID属性でビューのidを指定します。[ファイルの削除]アクションはファイルまたはディレクトリが1つ以上選択された場合のみ有効になればよいので(2)のenablesFor属性に[+]を指定しています。ビューの表示イメージは図8のようになります。

図8 org.eclipse.ui.viewActions 図8 org.eclipse.ui.viewActions

org.eclipse.ui.popupMenus

 org.eclipse.ui.popupMenusはエディタもしくはビューのポップアップメニューにアクションをコントリビュートするための拡張ポイントです。この拡張ポイントを利用するには、ビュー側から拡張可能なポップアップメニューを提供しておく必要があります。まず、ExplororViewをリスト8のように修正します。

   リスト8
public class ExplorerView extends ViewPart {
    …
    private Menu popupMenu;
    
    public void createPartControl(Composite parent) {
        …
        createActions();
        createToolBar();
        createMenuBar();
        createPopupMenu();
    }
    
    /** ポップアップメニューを作成 */
    private void createPopupMenu(){
        MenuManager menuMgr= new MenuManager("#PopupMenu");
        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        popupMenu = menuMgr.createContextMenu(viewer.getTree());
        viewer.getTree().setMenu(popupMenu);
        getSite().registerContextMenu(menuMgr, viewer);
    }
    
    public void dispose(){
        popupMenu.dispose();
        super.dispose();
    }
    …
}

 これで拡張ポイントを利用してポップアップメニューにアクションを追加できるようになります。plugin.xmlはリスト9のようになります。

   リスト9
<extension
      point="org.eclipse.ui.popupMenus">
   <viewerContribution
         id="jp.sf.amateras.view.viewerContribution1"
         targetID="jp.sf.amateras.view.explorerView"> …(1)
      <action
            class="jp.sf.amateras.view.DeleteAction"
            enablesFor="+"
            icon="icons/delete.gif"
            id="jp.sf.amateras.view.deleteAction"
            label="ファイルの削除"
            menubarPath="additions"/>
   </viewerContribution>
</extension>

 (1)のtargetID属性では、基本的にビューのidを指定しますが、1つのビューが複数のポップアップメニューを持っている場合はそれぞれのポップアップメニューに別々のidが割り当てられている場合もあります。それ以外の点についてはorg.eclipse.ui.viewActionsの場合と同じです。表示イメージは図9のようになります。

図9 org.eclipse.ui.popupMenus 図9 org.eclipse.ui.popupMenus

 このほかにもファイル、ディレクトリの作成や変更を行えるようにしたり、選択したファイルをEclipse上のエディタで開けるようにするといったアクションを追加することでより実用的なビューに発展させることができるでしょう。

 以上、駆け足ではありますが、ビューの実装方法および拡張方法について解説しました。本稿で作成したサンプルはここからダウンロード可能です。展開したディレクトリをプロジェクトとしてEclipseにインポートし、ランタイム・ワークベンチを起動すれば動作を確認することができます(ランタイム・ワークベンチの起動方法については第1回「いちばん簡単なEclipseプラグイン」を参照してください)。

 次回はプラグイン開発のトピックの中でも1、2を争う大物であるエディタの基本について解説する予定です。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。