Eclipse 插件 - 每次打开编辑器时添加鼠标监听器

Eclipse plugin - add mouse listener to an editor everytime its opened

我正在开发一个 Eclipse 插件,我需要在 X 和 Y 轴坐标中存储点击位置。

到目前为止,我是通过使用 org.eclipse.ui.IStartup 接口并在 class 中使用它来实现它的:

@Override
public void earlyStartup() {
    IWorkbench wb = PlatformUI.getWorkbench();
    wb.addWindowListener(generateWindowListener());
}

在给定的方法中我这样做:

private IWindowListener generateWindowListener() 
{
    return new IWindowListener() {

        private MouseListener clickMouseListener = new ClickMouseListener();

        @Override
        public void windowOpened(IWorkbenchWindow window) {
            //Nothing
        }

        @Override
        public void windowDeactivated(IWorkbenchWindow window) {
            System.out.println("deactivaed");
            IWorkbenchPage activePage = window.getActivePage();
            activePage.getActiveEditor().getAdapter(org.eclipse.swt.widgets.Control.class).addMouseListener(clickMouseListener);
        }

        @Override
        public void windowClosed(IWorkbenchWindow window) {
            //Nothing
        }

        @Override
        public void windowActivated(IWorkbenchWindow window) {
            System.out.println("activated");
            IWorkbenchPage activePage = window.getActivePage();
            activePage.getActiveEditor().getAdapter(org.eclipse.swt.widgets.Control.class).addMouseListener(clickMouseListener);
        }
    };
}

所以我基本上向一般 workbench 注册了一个侦听器,目的是在新打开的编辑器上注册一个新的 MouseListener - 我在其中保存坐标。

但是,这仅在整个 eclipse window 为 minimized/maximized 时才有效,因为此侦听器绑定到主 window。如果打开一个新的编辑器,什么也不会发生(因为它可能应该工作)。

我想在每次 opened/activated/clicked 打开新编辑器时注册新的 MouseListener - 这样我就可以在打开新编辑器时立即将它们注册到编辑器。我如何才能 subscribe/listen 处理与编辑器(主要是 activated/open 新编辑器)相关的任何事件,以便我可以为编辑器订阅 MouseListener 并获取鼠标点击的当前 X 轴和 Y 轴?

感谢任何建议。

使用 IPartListener 来监听 workbench 中的部分事件 window:

IPartService partService = window.getPartService();

partService.addPartListener(listener);

这将告诉您所有正在打开、关闭、激活的编辑器(和视图),....

在早期启动方法中,workbench window 尚不可用。使用 Display.asyncExec 延迟 运行 您的代码,直到 UI 初始化完成:

Display.getDefault().asyncExec(new Runnable() {
   @Override
   public void run() {
     IPartService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService();

     ......
   }
 });