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);
其中 menu 通常是 Window 菜单。如果您的应用程序中还没有 Window 菜单并且想要创建一个,则可以使用以下行:
MenuManager 菜单 = 新的 MenuManager(
“&窗户”,
IWorkbenchActionConstants.M_WINDOW);
这将为您提供一个菜单项,该菜单项将以与 Eclipse IDE 中的 Window->New Window 菜单项相同的方式创建一个新窗口。
但是,这无法控制输入。第二个窗口可能打开了一组不同的视图和编辑器,并且可能有不同的透视图集,但它仍然具有相同的“输入”。例如,在 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();
请注意,“输入”是一个对象。它可以是您喜欢的任何类的对象。当您从Page::getInput() 取回它时,将其转换回适当的类。您通常不应该创建一个新类作为输入。您几乎总是可以使用现有的类。这通常是对象模型的顶级对象。 Eclipse 框架对此输入不做任何事情,除了存储它并在调用Page::getInput() 时将其传回。