2012-04-30 9 views
1

私のeclipseプラグインでは、内部(および可能であれば外部の)Eclipseブラウザで開かれたすべてのURLをトラッキングしたいと思います。内部Eclipseブラウザにフックする方法は?

これまでのところ私は

org.eclipse.swt.browser.Browser; 

addLocationListener(...) 

を使用しかし、私はそれが内部Eclipseのブラウザのためにも機能することを好むだろう。それをどうすれば実現できますか?

答えて

2

Eclipse内部ブラウ​​ザの1つの解決策は、IStartup拡張機能を登録するEclipseプラグインを作成することです。 earlyStartup()メソッドでは、workbenchPageにIPartListenerを登録します。次に、内部ブラウ​​ザ部分が作成されると、WebBrowserEditor(またはWebBrowserView)への参照を含むコールバックを受け取ります。直接的なAPIがないので、内部のSWT Browserインスタンスを取得するためにちょっとハックしてリフレクションを使用する必要があります。これを済ませたら、ロケーションリスナーを追加することができます。

起動時にアクティブなWorkbenchウィンドウがまだ存在しないため、既存のすべてのワークベンチウィンドウ(通常は1つ)とそれぞれのワークベンチページをループしてパーツリスナーを追加する必要があります。

ここに、earlyStartup()ルーチンのコードスニペットがあります。私は、ウィンドウ/ページの処理中にリスナーのクリーンアップを省略しているので、まだ実行する必要があることに注意してください。このコードスニペットについて

//Add this code to an IStartup.earlyStartup() method 
final IPartListener partListener = new IPartListener() { 
    @Override 
    public void partOpened(IWorkbenchPart part) { 
     if (part instanceof WebBrowserEditor) 
     { 
      WebBrowserEditor editor = (WebBrowserEditor) part; 

      try { 
       Field webBrowser = editor.getClass().getDeclaredField("webBrowser"); 
       webBrowser.setAccessible(true); 
       BrowserViewer viewer = (BrowserViewer)webBrowser.get(editor); 

       Field browser = viewer.getClass().getDeclaredField("browser"); 
       browser.setAccessible(true); 
       Browser swtBrowser = (Browser) browser.get(viewer); 

       swtBrowser.addLocationListener(new LocationListener() { 
        @Override 
        public void changed(LocationEvent event) { 
         System.out.println(event.location); 
        } 
       }); 
      } catch (Exception e) { 
      } 
     } 
     else if (part instanceof WebBrowserView) 
     { 
      WebBrowserView view = (WebBrowserView) part; 

      try { 
       Field webBrowser = editor.getClass().getDeclaredField("viewer"); 
       webBrowser.setAccessible(true); 
       BrowserViewer viewer = (BrowserViewer)webBrowser.get(view); 

       Field browser = viewer.getClass().getDeclaredField("browser"); 
       browser.setAccessible(true); 
       Browser swtBrowser = (Browser) browser.get(viewer); 

       swtBrowser.addLocationListener(new LocationListener() { 
        @Override 
        public void changed(LocationEvent event) { 
         System.out.println(event.location); 
        } 
       }); 
      } catch (Exception e) { 
      } 
     } 
    } 
    ... 
}; 

final IPageListener pageListener = new IPageListener() { 
    @Override 
    public void pageOpened(IWorkbenchPage page) { 
     page.addPartListener(partListener); 
    } 
    ... 
}; 

final IWindowListener windowListener = new IWindowListener() { 
    @Override 
    public void windowOpened(IWorkbenchWindow window) { 
     window.addPageListener(pageListener); 
    } 
    ... 
}; 


IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 

if (activeWindow != null) 
{ 
    IWorkbenchPage activePage = activeWindow.getActivePage(); 

    if (activePage != null) 
    { 
     activePage.addPartListener(partListener); 
    } 
    else 
    { 
     activeWindow.addPageListener(pageListener); 
    } 
} 
else 
{ 
    for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) 
    { 
     for (IWorkbenchPage page : window.getPages()) { 
      page.addPartListener(partListener); 
     } 
     window.addPageListener(pageListener); 
    } 

    PlatformUI.getWorkbench().addWindowListener(windowListener); 
}  

一つの細部は、それがWebBrowserEditorクラスへのアクセス権を持っているorg.eclipse.ui.browserプラグインへの依存性を必要とすることです。

+0

ありがとう、それは素晴らしいとそれは大丈夫に見えます。私には1つの問題があります。開いている部分はWebBrowserEditorではなくWebBrowserViewです。 – RoflcoptrException

+0

私は自分で問題を解決することができました.WebBrowserViewにはビューアと呼ばれるフィールドがあり、Reflection呼び出しで使用できます。あなたはあなたの答えにそれを加えたいかもしれません http://www.cct.lsu.edu/~rguidry/ecl31docs/api/org/eclipse/ui/internal/browser/WebBrowserView.html – RoflcoptrException

+0

ありがとう、私は追加します答えにWebBrowserViewのケース。 – gamerson

関連する問題