WebLauncher0.0.2リリース

マニア向け軽量サーブレットコンテナWinstoneを起動出来るeclipseプラグインWebLauncher0.0.2をリリースしました。昨日。


この辺からインストールできるます。


今回のリリースでは、メニューバーとツールバー辺りをコチャコチャと弄っていたのですけれど、
かなり細かい単位で、ボタンが押せたり押せなかったりするます。
例えば、パッケージエクスプローラで、選択中のリソースを含むプロジェクトが、
WebLauncherを使える様に設定済みの場合だけ、ボタンがenable状態になるます。
エディタで開いているリソースも同じ。そのリソースを含むプロジェクトが、WebLauncherを…(ry


リリース済みのものは、かなり納得しているものの、
それまでは、ボタンの状態が全然イメージ通りに変化しなくて、凄く苦労しました。
結局の所、イベントリスナを幾つか実装する事で、それっぽく動作する様にはなりましてん。

これは、まぁ、名前の通り、ウィンドウそのものに対するシステムコールをトラップできるイベントリスナ。

/**
 * Interface for listening to window lifecycle events.
 * <p>
 * This interface may be implemented by clients.
 * </p>
 */
public interface IWindowListener {
    /**
     * Notifies this listener that the given window has been activated.
     *
     * @param window the window that was activated
     */
    public void windowActivated(IWorkbenchWindow window);

    /**
     * Notifies this listener that the given window has been deactivated.
     *
     * @param window the window that was activated
     */
    public void windowDeactivated(IWorkbenchWindow window);

    /**
     * Notifies this listener that the given window has been closed.
     *
     * @param window the window that was closed
     * @see IWorkbenchWindow#close
     */
    public void windowClosed(IWorkbenchWindow window);

    /**
     * Notifies this listener that the given window has been opened.
     *
     * @param window the window that was opened
     * @see IWorkbench#openWorkbenchWindow
     */
    public void windowOpened(IWorkbenchWindow window);

}

見ての通り、ウィンドウを開いたり、閉じたりした時と、
ウィンドウが、一番最前面にきたりこなかったりした時に、イベントを受け取れるます。
特に、windowActivatedとwindowDeactivatedが、クセモノで、デバッグ中でもイベント飛んできます。
つまり

  1. デバッガでeclipse起動
  2. ウィンドウがアクティブになる
  3. イベントが来たので、ブレークポイントが有効になり、元のeclipseのウィンドウがアクティブに。
  4. テキトーに処理を進める
  5. デバッガで起動したeclipseのウィンドウをアクティブに…
  6. 勿論、ブレークポイントが有効になり、元のeclipseのウィンドウが…(ry

どうしろと?まぁ、ウィンドウ周りを直接触ると大変デスヨ。と、そういう事です。

eclipse3.2上だと、各Viewっつうか、パートなんだけど、パートって何かと言うと、IEditorPartとIViewPartがあるっつうか…。
eclipseを大体普通に使ってると、ウィンドウが三分割されてるですやん?
パッケージエクスプローラのある辺りと、エディタのある辺りと、コンソールログの出る辺り。
それぞれをパートと言うます。ええ、つい一昨日まで知りませんでしたよ、僕も。
んでね、こいつ自身はまぁ、別に何と言う事も無いんだけど、
大いなる謎は、こいつの実装クラスをIWorkbenchPageに追加する時ですねん。

public void init(IWorkbenchWindow window) {
    IPartListener2 listener2 = new IPartListener2() {
    // ・・・省略
    };
    window.getActivePage().addPartListener(listener2);
}

getActivePageで返ってくるのは、現時点でアクティブになってる、どっかのパートに含まれてるタブ的なアレ。
おっかしいんだよねぇ、getActivePageしてるんだから、
何かPageがActiveになるたんびにaddPartListenerしなきゃいけないと思うじゃん?違うんだなぁ…。
ActivePageってのは、何か特別なインスタンスらしい。
一度ActivePageにaddPartListenerってしたら、後のActivePageでは、全てそのIPartListener2の参照が共有されてるます。
っつうか、そもそも、クラス名に2とか、使っちゃうセンスって、どうなのさ?とかね。


勿論、IPartListenerってインターフェースは、あるますよ?
でも、引数に入ってくるインスタンスの型が違うのですよ。
IPartListenerには、IWorkbenchPartが入ってきて、
IPartListener2には、IWorkbenchPartReferenceが入ってくる。
Javaオブジェクトは全部ポインタじゃねぇの?
Referenceって何よ?とか、野暮ったい事言わないのが大人。
この絶妙な違いを、空気感的に分るようなってきたら、本物のeclipseプラグインプログラマ*1

*1:まぁ、僕にはワカラナイケドネ