Search code examples
eclipsetabswindowrcpeclipse-rap

Eclipse RAP multi-window/tab


I would like to have a multi-tab/windowed Eclipse RAP application.

I am able to open a second window using

UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class);
launcher.openURL("/gasf?foo=other_perspective");

Where I use the foo paramter to select the perspetive I want. However using this method will create a speparate http session, thus the various listeners and so on won't communicate with my first window.

I also tried opening a second window/page using

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

But this merely changes the current window perspective but does not open a second window or tab in my browser.

Has anyone achieved a multi-tab RAP application with working selectionlisteners between the tabs?

Thanks for any help you can provide

EDIT: THANKS a lot ralfstx, as you pointed out, I can share the listeners or anything using the shared HTTP session, so far so good. Now the next step is to be able to update a tab based on an external event.

To try my idea of refresh from another tab, I did a dummy timer that does something 2 seconds later (i.e. simulate something triggered from another tab) with:

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

This works! The pushSession.start() forces the UI to refresh without any user interaction. So now the action doSomething() is executed on the navigationView as soon as the 2 seconds are reached.

My only remaining concern is how much load this puts on the server, but its a reasonable solution at least. I validated your answer.

EDIT2: Just to be complete, to make sure not bump in an invalid Thread access error since we are updating a display from another display, in the doSomething() method we must execute actions using display.asyncExec:

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

Solution

  • With the current architecture of RAP, you can't spread workbench windows over different browser tabs. Every new browser starts a new UISession which implies another Display (see Scopes in RAP).

    However, the HttpSession should be the same (unless you have cookies turned off), so you could use this as a means of communicating between different browser tabs.