1

私の Eclipse プラグインでは、内部 (および可能であれば外部) Eclipse ブラウザーで開かれるすべての URL を追跡したいと考えています。

これまでのところ私は使用しています

org.eclipse.swt.browser.Browser;

addLocationListener(...)

しかし、内部の Eclipse ブラウザーでも機能することを望みます。どうすればそれを達成できますか?

4

1 に答える 1

2

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

初期の起動時にアクティブなワークベンチ ウィンドウがまだない場合があるため、既存のすべてのワークベンチ ウィンドウ (通常は 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 プラグインに依存する必要があることです。

于 2012-05-03T02:24:08.323 に答える