// 下階層用テンプレート
#topicpath
----
org.eclipse.ui.IViewPart はパースペクティブ内のひとつのビュー(コンソールとか、パッケージエクスプローラとかの)を表すインターフェースです。このインターフェースを実装することによって、自作のビューを作成することが出来ます。

#contents

***拡張ポイント [#bf717681]
 org.eclipse.ui.views

***plugin.xmlのサンプル [#w6c2dfc7]
 <extension point="org.eclipse.ui.views">
   <category
     name="サンプルMyView"   <- viewが属するカテゴリ名
     id="com.samples.myview"> <- カテゴリのID
   </category>
   <view
     name="シンプルView"   <- viewのバーのタイトル
     category="com.samples.myview"   <- viewが属するカテゴリID
     class="com.samples.myview.SimpleView"    <- viewを実装するクラス名
     id="com.samples.myview.simpleview">      <- viewのID
   </view>
 </extension>


***ポイント [#tf595522]
plugin.xmlを開いているときのプロパティビューより、classを選択すると対応するクラス(ここではcom.samples.myview.SimpleView)のスケルトンをウィザードが作ってくれます。


ビューを画面に描画するとき((ウィンドウ >> ビューでこのビューを選ぶ時))createPartControlが呼ばれるので、このメソッド内でウィジェットを配置していきます。




**TIPS [#bba1b972]
***選択されたときに起動するメソッドsetFocus [#x05c0703]
自分が選択されたときに、ビュー内を更新したいときなどに使用します。
 public void setFocus() {
  ウィジェットの更新処理
 }
など

***ISelectionListenerを実装する [#m70cb5e0]
ビューは選択しているオブジェクトの情報を表示することが多いので、選択しているものが変わったときにウィジェットを更新する、というアルゴリズムにしたいことが多いと思います。その場合はISelectionListenerを実装します。
 public void selectionChanged(IWorkbenchPart part,ISelection selection){
   ウィジェットの更新処理
 }
この場合、自分(this)を IWorkbenchPageインターフェースにattachする必要がありますが、createPartControlメソッド内で
 getViewSite().getPage().addSelectionListener(this);
とすればよいでしょう。もしくはinit(IViewSite site)で
 site.getPage().addSelectionListener(this);
ですね。

このリスナですが、呼ばれるタイミングは、
-パッケージエクスプローラ内でなんかを選択した
-テキストエディタ内でドラッグした

などみたいですが、

-テキストエディタ内で文字列を入力とかした場合

は呼ばれないんですね。ようわからんです。

ちなみに引数のメソッドは
 IWorkbenchPart part  :選択されたビュー
 ISelection selection :そのビューの中で、選択されたオブジェクト
となっています。



***設定の保存とリストア [#qcaeab86]
設定の保存とリストアにはMementoパタンを用いています。たとえば
 org.eclipse.ui.views.markers.internal.TableView
の例だと

ビューの初期化時に
 public void init(IViewSite site, IMemento memento) throws PartInitException {
     super.init(site, memento);
     this.memento = memento;
 }

として、createPartControlメソッドで
 private void restoreColumnWidths(IMemento memento) {
     if (memento == null) {
         return;
     }
     columnLayouts = new ColumnLayoutData[getFields().length];
     for (int i = 0; i < columnLayouts.length; i++) {
         Integer width = memento.getInteger(TAG_COLUMN_WIDTH + i);
         if (width == null) {
             columnLayouts = null;
             break;
         } else {
             columnLayouts[i] = new ColumnPixelData(width.intValue(), true);
         }
     }
 }
とメソッドが呼ばれ、カラムの幅などが前回の値がリストアされます。

initメソッドでフィールドにセットされるmementoには、以前ビューを閉じたとき、以下のメソッドで内容が保存されます。((でそのメメントの状態が次回開くときに再現される))
 public void saveState(IMemento memento) {
     super.saveState(memento);
 
     //save column widths
     TableColumn[] columns = viewer.getTable().getColumns();
     for (int i = 0; i < columns.length; i++) {
         memento.putInteger(TAG_COLUMN_WIDTH + i, columns[i].getWidth());
     }
 
     saveSelection(memento);
 
     //save vertical position
     Scrollable scrollable = (Scrollable) viewer.getControl();
     ScrollBar bar = scrollable.getVerticalBar();
     int position = (bar != null) ? bar.getSelection() : 0;
     memento.putInteger(TAG_VERTICAL_POSITION, position);
     //save horizontal position
     bar = scrollable.getHorizontalBar();
     position = (bar != null) ? bar.getSelection() : 0;
     memento.putInteger(TAG_HORIZONTAL_POSITION, position);
 }



----
この記事は
#vote(おもしろかった,そうでもない)
#vote(おもしろかった[8],そうでもない[0])
-保存とリストアについてですが、IMementoとorg.eclipse.jface.dialogs.IDialogSettings との使い分けが...ようわからんですね。 -- [[きの]] &new{2005-05-12 11:41:07 (木)};
-RCPやってて気づいたのですが、デフォルトではこの機構はOFFになってるみたいです。自分でRCP作るときはWorkbenchAdvisor#initialize(IWorkbenchConfigurer configurer)内でconfigurer.setSaveAndRestore(true);をしないとダメです。 -- [[きの]] &new{2006-03-22 23:31:25 (水)};
- IMementoはView用、DialogSettingsはDialog用 と理解してます。それぞれ、必要なデータ(ダイアログなら位置とサイズとか)を保持してリストアする機構が内部に組み込まれていたので。。。 -- [[YOU]] &new{2007-03-22 (木) 11:17:37};
- ところで、このinitとsaveStateをオーバーライドしても×ボタンでViewを閉じたときなどは呼ばれないのですが何か必要なのでしょうか?Eclipse終了保存のタイミングでしか動作しないです。。。 -- [[YOU]] &new{2007-03-22 (木) 11:19:04};
- saveStateはあくまで状態を保存するメソッドなので、Viewを閉じたときなどは(状態を保存する必要がないから)呼ばれないのではないでしょうか。再度ビューを開いたときは初期状態になるわけなので。 -- [[きの]] &new{2007-07-16 (月) 01:42:25};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS