« ステータスバーへのアクセス | トップページ | UIスレッドでのタイマー実行 »

2005.11.24

ステータスバーへのコンポーネント登録と削除

ステータスバーへのアイコン登録

今回は,Eclipseのワークベンチウィンドウに配置されているステータスバーへアイコン表示コンポーネントを登録する方法を紹介する。アイコンはSWTのLabelコンポーネントを使うので,実質上はSWTコンポーネントのステータスバーへの登録方法となる。

まず,普通にエディタがアクティブなときのステータスバーを見てみると,以下のような感じになっている。

status0

編集モードやキャレットの位置などが,セパレータで区切られて表示されている。もちろん,自分のプラグインの領域を確保したいので,セパレータの登録も是非やっておきたい一つだろう。

まずはワークベンチウィンドウから,ステータスバーマネージャを取得する。この方法は,「ステータスバーへのアクセス」で紹介した手順で行えばよい。基本的には,得られたIStatusLineManagerオブジェクトのaddメソッドを使って,コンポーネントやアクションをステータスバーに登録する。例えば,アクションを登録するには以下のような感じになる。

  IStatusLineManager manager = ...; // ステータスバーオブジェクトの取得
  manager.add(new Action("アクション") {});

status1

SWTのコンポーネントをステータスバーに登録するためには,IContributionItemインタフェースを実装したクラスのオブジェクトが必要となるが,ControlContributionクラスを使用することが一般的だろう。

  manager.add(new ControlContribution("my_id") {
    protected Control createControl(Composite parent) {
      new Label(parent, SWT.SEPARATOR); // セパレータの登録
      Label l = new Label(parent, SWT.NONE); // アイコンの登録
      ImageDescriptor desc = ...;
      l.setImage(desc.createImage());
      return parent;
    }
  });

登録するIContributionItemオブジェクトには,IDが必要となる。このIDは,ステータスバーからオブジェクトを取得したり削除する際に使用できる。上記では,ControlContributionクラスのコンストラクタにIDを渡している。

セパレータは,Labelクラスのコンストラクタの第2引数にSWT.SEPARATORを渡すことで登録できる。上記の例では,その後にイメージを持つLabelオブジェクトを登録している。createControlメソッドに渡されるCompositeオブジェクトは,レイアウトとしてStatusLine$StatusLineLayoutクラスが適用されていて,コンポーネントの生成順に左から配置してくれるようになっている。

これを実行すると,以下のような感じになる。アイコンは,IP Messengerのものを使用してみた。

status2

登録したIContributionItemオブジェクトを削除するためには,以下のようにすればよい。

  IContributionItem item = manager.find("my_id");
  manager.remove(item);
  manager.update(true);

findメソッドにIDを渡してIContributionItemオブジェクトを取得し,それをremoveメソッドに渡して削除する。その後,updateメソッドを呼び出して,削除したことをステータスバーの表示に反映させる。

上記のIContributionItem系の扱いは,ツールバーやメニューバーに関しても同じなので,覚えておくと応用が利くだろう。

|

« ステータスバーへのアクセス | トップページ | UIスレッドでのタイマー実行 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/7289788

この記事へのトラックバック一覧です: ステータスバーへのコンポーネント登録と削除:

« ステータスバーへのアクセス | トップページ | UIスレッドでのタイマー実行 »