2016-02-02 4 views
2

Я хотел бы иметь приложение EAP для Eclipse с несколькими вкладками/окнами.Eclipse RAP multi-window/tab

Я могу открыть второе окно с помощью

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

Где использовать Foo для параметра Я выбрать perspetive я хочу. Однако использование этого метода создаст промежуточный сеанс http, поэтому различные слушатели и т. Д. Не будут связываться с моим первым окном. .

Я также попытался открытия второго окна/страницы с помощью

PlatformUI.getWorkbench() getActiveWorkbenchWindow() openPage ("other_perspective", NULL).

Но это просто изменяет текущую перспективу окна, но не открывает второе окно или вкладку в моем браузере.

Кто-нибудь достигло приложения с несколькими вкладками RAP с рабочими выборами между вкладками?

Спасибо за любую помощь вы можете предоставить

EDIT: БЛАГОДАРЯ много 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() заставляет пользовательский интерфейс обновляться без какого-либо взаимодействия с пользователем. Итак, теперь действие doSomething() выполняется на навигационном экране, как только достигнуты 2 секунды.

Моя единственная оставшаяся проблема - сколько нагрузки это ставит на сервер, но ее разумное решение по крайней мере. Я подтвердил ваш ответ.

EDIT2: Просто чтобы быть полными, чтобы убедиться, что не врезаться в недопустимом доступе Thread, поскольку мы обновляем дисплей с другого дисплея, в doSomething() методы мы должны выполнить действия, используя display.asyncExec:

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

ответ

1

С текущей архитектурой RAP вы не можете распространять окна рабочего стола на разных вкладках браузера. Каждый новый браузер запускает новый UISession, который подразумевает другой Display (см. Scopes in RAP).

Однако HttpSession должен быть таким же (если вы не отключили cookies), поэтому вы можете использовать это как средство для обмена данными между различными вкладками браузера.

+0

Спасибо за разъяснение, хорошо, что это хорошая отправная точка, поэтому мой последующий вопрос будет состоять в том, можно ли инициировать событие на пользовательском интерфейсе одной вкладки без какого-либо щелчка пользователем. Моя идея здесь состоит в том, чтобы события из другой вкладки вызывали обновление (или что-то еще) на вкладке? – Jarod

+0

Отредактировал мой вопрос, который отвечает на мой вопрос: Спасибо! – Jarod

+0

Да, использование ServerPush - единственный способ обновить пользовательский интерфейс без взаимодействия с пользователем. На сервере он закрывает окно запроса, поэтому да, есть некоторые накладные расходы, а некоторые прокси не любят длительные запросы. Вот почему мы рекомендуем активному SP только тогда, когда это необходимо (например, чтобы показать прогресс для запуска операции и т. Д.) – ralfstx