Приложение Eclipse RCP - Создайте окно программно - PullRequest
3 голосов
/ 14 мая 2009

Как в приложении RCP, как я могу программно определить и открыть новое окно? Я хочу открыть несколько окон - каждое окно показывает разные данные. Как я могу установить разные входные данные для каждого окна?

Я хочу смоделировать ту же функциональность Eclipse IDE (Window -> New Window), но я хочу, чтобы каждое новое открытое окно имело различный ввод. Я пытаюсь использовать: IWorkbenchPage newPage = window.openPage (inputObject); Как я могу программно определить «inputObject», который идентифицирует данные, показанные в окне?

Ответы [ 4 ]

4 голосов
/ 21 мая 2009

Окно рабочей среды в терминологии Eclipse - это окно, которое обычно содержит меню, панель инструментов, область редактора и представления. Приложения Eclipse RCP обычно содержат одно окно, но некоторые приложения позволяют создавать несколько окон. Например, в Eclipse IDE можно открыть другое окно, выбрав «Новое окно» в меню окна. Перспективы могут быть установлены независимо в каждом окне.

Хотя несколько окон могут сбивать с толку, они также могут быть очень полезны. Например, если пользователь может работать с двумя различными источниками данных, но иметь несколько редакторов и представлений, открытых для каждого источника данных, тогда было бы полезно открыть два окна. Этого же эффекта можно достичь, открыв два экземпляра приложения RCP. Однако для этого потребовалось бы загрузить несколько копий кода и других ресурсов, потребовалась бы полная инициализация приложения для каждого источника данных и затруднилось бы перекрестное взаимодействие между окнами.

Чтобы разрешить пользователям вашего приложения RCP открывать другое окно, у вас есть два варианта.

Вы можете включить пункт меню «Новое окно» в свое приложение RCP. Это можно сделать, добавив в приложение RCP действие, предоставляемое рабочей средой. Измените свой класс ActionBarAdvisor:

добавить к объявлению поля:

private IWorkbenchAction newWindowAction;

добавить к коду, в котором вы выполняете действия (обычно это метод с именем makeActions):

newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
register(newWindowAction);

добавить к коду, в котором вы создаете меню:

menu.add (newWindowAction);

где меню, как правило, меню Окно. Если в вашем приложении нет меню Window и вы хотите его создать, будет работать следующая строка:

MenuManager menu = новый MenuManager ( "&Окно", IWorkbenchActionConstants.M_WINDOW); * * тысячу двадцать-один

Это даст вам пункт меню, который создаст новое окно так же, как пункт меню Window-> New Window в Eclipse IDE.

Однако это не дает никакого контроля над вводом. Второе окно может иметь другой набор представлений и открытых редакторов и может иметь другой набор перспектив, но оно все равно будет иметь тот же «ввод». Например, в Eclipse IDE вы можете открыть второе окно, но если вы переключите рабочие пространства, это будет применяться ко всем окнам.

Второй способ создания нового окна - это делать это программно, создавая страницы. Это позволяет вам установить «вход» в окно. Таким образом, открытие представления в одном окне может привести к отображению данных, отличных от того, если вы открыли тот же вид в другом окне.

Технически, окно не имеет ввода. Страницы имеют вход. Окно может содержать не более одной страницы. Из некоторых имен методов может показаться, что окно может иметь несколько страниц (например, getActivePage подразумевает, что есть неактивные страницы). Эти имена методов являются перенесенными с Eclipse 2.0 дней, когда было поддержано несколько страниц.

Чтобы открыть новую страницу программно:

        IWorkbenchPage newPage = window.openPage(myInput);

Этот метод создаст новую страницу в заданном окне, если окно еще не содержит страницу, в противном случае будет создано новое окно для содержания страницы.

Если вы поддерживаете несколько окон с разным вводом, тогда вы должны установить заголовок в каждом окне, который будет отличать каждое окно:

        newPage.getWorkbenchWindow().getShell().setText("My App - " + myInput.getName());

В некоторых ситуациях вы можете захотеть изменить ввод на окно. Вы не можете изменить вход на страницу, поэтому вы должны сделать это, закрыв существующую страницу и создав новую страницу. Следующий код закроет существующую страницу:

        IWorkbenchPage activePage = window.getActivePage();
        activePage.close();

Обратите внимание, что некоторые представления, предоставляемые Eclipse, используют ввод страницы. Например, представление Common Navigator будет использовать ввод страницы в качестве корневого элемента дерева навигации.

Чтобы получить доступ к вводу страницы из своего собственного просмотра, вы должны позвонить site.getPage().getInput(). Если у вас нет контекста сайта, с которого можно начать, позвонив по следующему пункту, вы получите ввод:

.. * * PlatformUI.getWorkbench одна тысяча сорок-шесть () getActiveWorkbenchWindow () getActivePage () getInput ();. * +1047 *

Обратите внимание, что «input» - это Object. Это может быть объект любого класса, который вам нравится. Когда вы вернете его из Page::getInput(), приведите его к соответствующему классу. Обычно вы не должны создавать новый класс для ввода. Вы можете почти всегда использовать существующий класс. Обычно это объект верхнего уровня вашей объектной модели. Платформа Eclipse ничего не делает с этим вводом, кроме как для его сохранения и передачи обратно при вызове Page::getInput().

2 голосов
/ 15 мая 2009

Вам необходимо понять, как реализовать представления в модели подключаемого модуля Eclipse. Это может быть достигнуто либо путем добавления точек расширения и настройки свойств, либо с помощью кода. Настройка свойств является предпочтительным подходом. Оба объяснены в:

http://www.vogella.de/articles/RichClientPlatform/article.html#views

На этом сайте есть много хороших статей по разработке Eclipse:

http://www.vogella.de/eclipse.html

В любом случае, как предложил PSU_Kardi, было бы неплохо прочитать всю статью.

1 голос
/ 15 мая 2009

Вы должны убедиться, что вы действительно хотите открыть кучу других окон. Может быть, вы могли бы достичь того же, открыв несколько новых видов или редакторов в существующем окне? Использование нескольких представлений обычно проще для пользователя, поскольку они не представлены с несколькими окнами, которые выглядят почти одинаково. Это также облегчает показ связей между представлениями.

При этом вы можете позвонить IWorkbench.openWorkbenchWindow, чтобы создать совершенно новое Окно. Хорошим примером этого является код для Window -> New Window, который находится в OpenNewWindowMenu .

1 голос
/ 14 мая 2009

Я думаю, вам нужно лучше определить «окно» для меня или кого-то еще, чтобы ответить на этот вопрос.

Создаете ли вы плагин, который хотите открывать несколько раз, и в этом случае вам может потребоваться редактор и вам нужно убедиться, что вы не используете шаблон Singleton - что вы можете указать в файле манифеста .

Или вы пытаетесь создать окно для отображения данных? Нравится вид? Если вы делаете это, вам нужно прочитать о том, как создать ViewPart и убедиться, что вы расширяете все правильно.

Могу ли я предложить посетить два моих любимых сайта RCP

http://www.vogella.de/articles/RichClientPlatform/article.html

http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm

...