【问题标题】:Eclipse plugin - add mouse listener to an editor everytime its openedEclipse 插件 - 每次打开时将鼠标侦听器添加到编辑器
【发布时间】:2019-01-15 03:40:33
【问题描述】:

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

到目前为止,我正在使用 org.eclipse.ui.IStartup 接口并在实现它的类中使用它:

@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);
        }
    };
}

所以我基本上在通用工作台上注册了一个监听器,目的是在新打开的编辑器上注册一个新的 MouseListener - 我保存坐标的地方。

但是,这仅在整个 Eclipse 窗口被最小化/最大化时才有效,因为此侦听器绑定到主窗口。如果打开一个新的编辑器,什么都不会发生(因为它可能应该可以工作)。

我想在每次打开/激活/单击新编辑器时注册新的 MouseListener - 这样我就可以在打开新编辑器时将它们注册到编辑器。如何订阅/收听与编辑器相关的任何事件(主要是激活/打开新编辑器),然后我可以将 MouseListener 订阅到编辑器并获取鼠标单击的当前 X 和 Y 轴?

感谢您的任何建议。

【问题讨论】:

  • 您已经通过多次调用来访问活动编辑器,您是否认为您还需要其他侦听器来实际通知您编辑器正在打开和关闭?检查iWorkbenchWindow、IWorkbenchPage 及其超级接口以查找添加侦听器的位置。 那么这个鼠标监听器有什么用? 像这样的“全局”监听器非常具有侵入性,而且你还没有解释你要解决什么问题。
  • 此鼠标侦听器用于检索单击的 X 和 Y 坐标。这些在我进行操作可用性(显示/隐藏操作)过滤时存储和使用 - 我希望我的操作仅在函数声明名称上发生右键单击时出现。我已经设法使用 X 和 Y 坐标来做到这一点,但到目前为止,在没有最小化/最大化整个应用程序的情况下无法获得正确的 X 和 Y 坐标。

标签: eclipse eclipse-plugin mouseevent eclipse-cdt


【解决方案1】:

使用IPartListener 在工作台窗口中监听部件事件:

IPartService partService = window.getPartService();

partService.addPartListener(listener);

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

在早期启动方法中,工作台窗口尚不可用。使用Display.asyncExec 延迟运行代码,直到 UI 初始化完成:

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

     ......
   }
 });

【讨论】:

  • 感谢您的建议,但我还有一个关于何时调用此方法的问题。如果我在 IStartup 接口实现类中执行此操作,则方法 earlyStartup 会为这段代码返回一个空指针异常:ActiveWorkbenchWindow 部分上的IPartService partService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService();。您能否建议何时添加此侦听器?我的想法是在启动时执行此操作,因此使用了 IStartup 接口。
  • 只是测试和 windowOpened 不起作用 - 所以使用 Display.asyncExec - 查看更新的答案。
猜你喜欢
  • 2014-08-26
  • 2012-08-01
  • 1970-01-01
  • 2012-07-19
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多