WebLauncher0.0.2リリース
マニア向け軽量サーブレットコンテナWinstoneを起動出来るeclipseプラグインWebLauncher0.0.2をリリースしました。昨日。
この辺からインストールできるます。
今回のリリースでは、メニューバーとツールバー辺りをコチャコチャと弄っていたのですけれど、
かなり細かい単位で、ボタンが押せたり押せなかったりするます。
例えば、パッケージエクスプローラで、選択中のリソースを含むプロジェクトが、
WebLauncherを使える様に設定済みの場合だけ、ボタンがenable状態になるます。
エディタで開いているリソースも同じ。そのリソースを含むプロジェクトが、WebLauncherを…(ry
リリース済みのものは、かなり納得しているものの、
それまでは、ボタンの状態が全然イメージ通りに変化しなくて、凄く苦労しました。
結局の所、イベントリスナを幾つか実装する事で、それっぽく動作する様にはなりましてん。
- org.eclipse.ui.IWindowListener
これは、まぁ、名前の通り、ウィンドウそのものに対するシステムコールをトラップできるイベントリスナ。
/** * 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が、クセモノで、デバッグ中でもイベント飛んできます。
つまり
- デバッガでeclipse起動
- ウィンドウがアクティブになる
- イベントが来たので、ブレークポイントが有効になり、元のeclipseのウィンドウがアクティブに。
- テキトーに処理を進める
- デバッガで起動したeclipseのウィンドウをアクティブに…
- 勿論、ブレークポイントが有効になり、元のeclipseのウィンドウが…(ry
どうしろと?まぁ、ウィンドウ周りを直接触ると大変デスヨ。と、そういう事です。
- org.eclipse.ui.IPartListener2
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:まぁ、僕にはワカラナイケドネ