2012-04-30 2 views
1

Для моего плагина eclipse Я хочу отслеживать каждый URL-адрес, который открывается с помощью внутреннего (и, если возможно, внешнего) браузера Eclipse.Как подключиться к внутреннему браузеру Eclipse?

До сих пор я использую

org.eclipse.swt.browser.Browser; 

и

addLocationListener(...) 

Но я предпочел бы, что она работает и для внутреннего браузера Eclipse. Как я могу это достичь?

ответ

2

Одним из возможных решений для внутреннего браузера Eclipse является создание плагина eclipse, который регистрирует расширение IStartup. В вашем методе earlyStartup() вы должны зарегистрировать IPartListener на странице workbenchPage. Затем, когда создается внутренняя часть браузера, вы получите обратный вызов со ссылкой на WebBrowserEditor (или WebBrowserView). Поскольку прямого API нет, вам придется немного взломать и использовать отражение, чтобы захватить внутренний экземпляр SWT-браузера. После этого вы можете добавить своего слушателя.

Иногда во время раннего запуска нет активного окна Workbench, поэтому вам нужно прокручивать все существующие окна рабочего стола (как правило, только одно) и каждую из страниц их рабочих мест, чтобы добавить слушателей деталей.

Описание Вот фрагмент кода для процедуры 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); 
}  

Одна последняя деталь этого фрагмента кода является то, что он требует зависимость от org.eclipse.ui.browser плагин, чтобы иметь доступ к классу WebBrowserEditor.

+0

Спасибо, что отлично выглядит, и все выглядит нормально. У меня есть одна проблема. Открытая часть не является WebBrowserEditor, а WebBrowserView. – RoflcoptrException

+0

Я смог решить проблему самостоятельно, у WebBrowserView есть поле, называемое viewer, которое затем может использоваться в ваших вызовах Reflection. Возможно, вы хотите добавить это к своему ответу http://www.cct.lsu.edu/~rguidry/ecl31docs/api/org/eclipse/ui/internal/browser/WebBrowserView.html – RoflcoptrException

+0

Спасибо, я добавлю дело WebBrowserView для ответа. – gamerson