#topicpath
----
//ここにコンテンツを記述します。
#contents



** ワークベンチ以下の関連
プラグイン開発で、いろいろなUIにアクセスしたいわけですが、それぞれのUIがどのような関連になっているのかをまとめてみました。
#ref(workbench_decomposed.gif)

***WorkBench window
ワークベンチ(ワークベンチ・ウィンドウ)とは、大ざっぱに言うと、「プラットフォームの始動時に開くウィンドウ」のことです。
-クラス名:IWorkbenchWindow
-取得方法:
 IWorkbench workbench = PlatformUI.getWorkbench();
 IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IWorkbench を取得するために AbstractUIPlugin#getWorkbench()てのもありますが
 This method exists as a convenience for plugin implementors.
 The workbench can also be accessed by invoking PlatformUI.getWorkbench(). 
なので同じなんですね。ソースを見ても
 public IWorkbench getWorkbench() { <-AbstractUIPlugin#getWorkbench()
   return PlatformUI.getWorkbench();
 }
でした。

ちなみに
 IWorkbench workbench = PlatformUI.getWorkbench();
 IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
で IWorkbenchWindow の配列が取得できますが、この配列はEclipseで
ウィンドウ >> 新規ウィンドウ で開いているウィンドウたちです。


***Page
ワークベンチ・ウィンドウの内部には、パーツを含む 1 つのページがあります。ページは、パーツをグループ化するためのインプリメンテーション・メカニズムです。
-クラス名:IWorkbenchPage
で、ページって何だろうなって思って、
 IWorkbench workbench = PlatformUI.getWorkbench();
 workbench.getActiveWorkbenchWindow().getActivePage().close();
ってやったら、すべてのパースペクティブが閉じてしまいました。
#ref(close.png)

単純にパースペクティブと1対1でもないんでしょうか((どうも WorkbenchWindow -> IWorkbenchPage -> IViewPart となっているようだ))。

また、
 workbench.getActiveWorkbenchWindow().getActivePage().getLabel());
としたら、ワークスペース - J2EEってのが表示されました。やっぱ、パースペクティブだよなぁ。

*** アクティブなエディタへの参照の取得
 // ワークベンチの取得
 IWorkbench workbench = PlatformUI.getWorkbench();
 IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
 
 //アクティブなエディタの取得
 IEditorPart editor = window.getActivePage().getActiveEditor();
 AbstractTextEditor aEditor = (AbstractTextEditor) editor;

*** エディタ内のドキュメントを取得
 IDocument document =
   aEditor.getDocumentProvider().getDocument(editor.getEditorInput());

***プラグインのディレクトリを取得する
Log4jの初期化のためにlog4j.xmlを読み込むなど、プラグインディレクトリのパスを取得する場面は結構ありますが、その方法です。
  String pluginDirectory = Platform
     .resolve(getDefault().getDescriptor().getInstallURL()).getPath();
で取得できます。
ちなみにLog4jの初期化などはAbstractUIPluginのサブクラス(勝手に作られるヤツ)で
 public void startup() throws CoreException {
  super.startup();
 
  String pluginDirectory = null;
  try {
   pluginDirectory =
    Platform
     .resolve(getDefault().getDescriptor().getInstallURL())
     .getPath();
  } catch (IOException e) {
   e.printStackTrace();
  }
 
  DOMConfigurator.configure(new File(pluginDirectory, "lib/log4j.xml").toString());
 }
などとstartup()をOverrideすればよいでしょうか。

***外部のライブラリを使用する
プラグインディレクトリにlibディレクトリなどを作成しておいて、plugin.xmlで
 <runtime>
   <library name="hoge.jar"/>
   <library name="lib/fuga.jar"/> <-外部ライブラリ
 </runtime>
とすればOKです。


*** プロジェクトへの参照を取得する
いわゆるEclipseのプロジェクトへの参照を取得する方法です。
 IWorkspaceRoot myWorkspaceRoot =
   ResourcesPlugin.getWorkspace().getRoot();
 IProject project = myWorkspaceRoot.getProject([プロジェクト名の文字列]);

***ポップアップメニューの拡張
 <extension point="org.eclipse.ui.popupMenus">
   <objectContribution
       objectClass="org.eclipse.core.resources.IResource" <- ファイルとか、フォルダだったら表示
       objectClass="org.eclipse.jdt.core.ICompilationUnit" <- いわゆるソースファイルだったら
       objectClass="org.eclipse.core.resources.IFile" <- ファイルだったら表示
       objectClass="org.eclipse.core.resources.IFolder" <- フォルダだったら表示
       id="nu.mine.kino.IResource">
      <action label="スクリプト生成(&amp;R)"
        class="nu.mine.kino.HogeAction"
        menubarPath="additions"  <- すでにあるメニューに追加
        enablesFor="1" <- 選択したファイルが1つだけの時有効
        id="nu.mine.kino.HogeAction">
      </action>
    </objectContribution>
 </extension>

***デバッグするためのダイアログを出したい
 IWorkbench workbench = PlatformUI.getWorkbench();
 IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
 Shell shell = window.getShell();
 MessageDialog.openInformation(shell, "タイトル","メッセージ");
が定番でしょう。windowオブジェクトはメソッドを記述するクラスによってはフィールドから得られたりしますが。。

***ウィンドウに配置されているViewを取得する。
 IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage();
 IViewReference[] references = page.getViewReferences();
 
 for (int i = 0; i < references.length; i++) {
   IViewPart view = references[i].getView(false); <- Viewへの参照が取得できました
   MessageDialog.openInformation(window.getShell(), "ViewのtoString()", view.toString());
 }

***プラグインのパッケージング手順
-build.propertiesに、パッケージしたいものを記述する(bin.includesにlib/hoge.jarとかicons/*とか)
-plugin.xmlの右クリック >> Antビルドファイルの作成 でbuild.xml作成
-javac要素はソースコードのエンコーディングが考慮されてないので、追加(encoding="EUC-JP"など)。
-ant zip.pluginでZIPが作成される。
-完了。

トラブル(↓メモ書き状態)
-plugin.xmlの右クリック>>Antビルドファイルの作成 は、コンパイルのエンコーディングが考慮されない(encoding="EUC-JP"などを追加する必要あり)
-build.propertiesに、パッケージしたいものを記述する(bin.includesに書く)

***[[パッケージ化するとインスタンスを生成できない。:http://groups.yahoo.co.jp/group/eclipse-ml/message/1019?expand=1]]
私も同じトラブルに遭遇しました。

プラグインをパッケージングすると、何故かエラーになってしまうというもの。ビューを開こうとすると
 インスタンスを生成できませんでした。
と言われてしまうんだけど、エラーを調べようにもどこにエラーが表示されているのかも分からないので困っていました。

そこでネットを探していたところ、同じような内容の投稿が。とりあえずこれを見て、プラグインのログは
-ウィンドウ→ビューの表示→その他→PDEランタイム→エラー・ログ で「エラーログビュー」を開く。
-エラーログビューで、該当エラーをダブルクリックし「エラーのプロパティー」を開く。
-「状況詳細」を選択します(状況詳細はない場合もあります)。→ここにStackTraceなどが表示されます。

というところまで分かりました。感謝!!

そのエラーログを見ると、xml関連のライブラリがないと。どうもプラグインをパッケージした場合と、ランタイムワークベンチで稼動しているVMのバージョンの違いが原因でした。((WebSphereStudioはJ2SE1.3だったためだ〜))
plugin.xmlに、
 <library name="lib/xercesImpl.jar"/>
 <library name="lib/xml-apis.jar"/>
を追加して、ようやく動きました。疲れた...。。。



----
この記事は
#vote(おもしろかった[5],そうでもない[0])

#comment
#topicpath


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


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS