Eclipse RAP multi-window/tab

Eclipse RAP multi-window/tab

我想要一个 multi-tab/windowed Eclipse RAP 应用程序。

我可以使用

打开第二个 window
UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class);
launcher.openURL("/gasf?foo=other_perspective");

我在哪里使用 foo 参数 select 我想要的透视图。但是,使用此方法将创建一个单独的 http 会话,因此各种侦听器等不会与我的第一个 window.

进行通信

我还尝试使用

打开第二个window/page

PlatformUI.getWorkbench().getActiveWorkbenchWindow().openPage("other_perspective" , null);

但这只会改变当前的 window 视角,而不会在我的浏览器中打开第二个 window 或选项卡。

有没有人通过在选项卡之间工作 selectionlisteners 实现了多选项卡 RAP 应用程序?

感谢您提供的任何帮助

编辑: 非常感谢 ralfstx,正如您所指出的,我可以使用共享 HTTP 会话共享监听器或任何东西,到目前为止一切顺利。现在下一步是能够根据外部事件更新选项卡。

为了尝试从另一个选项卡刷新我的想法,我做了一个虚拟计时器,它在 2 秒后执行某些操作(即模拟从另一个选项卡触发的操作):

final ServerPushSession pushSession = new ServerPushSession();
pushSession.start();   
Display display = Display.getDefault();
NavigationView navigationView = ((NavigationView) window.getActivePage().findView(NavigationView.ID));
timer.schedule(new TimerTask() {
  @Override
  public void run() {
    display.asyncExec(new Runnable() {
      public void run() {
        navigationView.doSomething();
      }
    });
  }
}, 2000);

这有效! pushSession.start() 强制 UI 在没有任何用户交互的情况下刷新。所以现在一旦达到 2 秒,就会在 navigationView 上执行操作 doSomething()

我唯一担心的是这会给服务器带来多少负载,但这至少是一个合理的解决方案。我验证了你的答案。

编辑2: 为了完整起见,为了确保不会出现无效的线程访问错误,因为我们正在从另一个显示器更新显示器,在 doSomething() 方法中,我们必须使用 display.asyncExec:

执行操作
Display display = Display.getCurrent();
public void doSomething() { 
    display.asyncExec(new Runnable() {
        public void run() {
            treeViewer.refresh();
        }
    });
}

使用当前的 RAP 体系结构,您无法 workbench windows 分布在不同的浏览器选项卡上。每个新浏览器都会启动一个新的 UISession,这意味着另一个 Display(参见 Scopes in RAP)。

但是,HttpSession 应该是相同的(除非您关闭了 cookie),因此您可以将其用作不同浏览器选项卡之间的通信方式。