我正在创建一个RCP应用程序。我需要打开相同视图但具有不同数据的多个实例。我是通过为同一视图的不同实例设置辅助ID来实现的。具体来说,我的问题如下:请看一下
我有一个名为Views.GraphView
的图表视图。我从名为openGraphView
的命令中打开了它的不同实例,以显示不同的图形。命令如下:
page.showView("Views.GraphView", Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);
现在,我在这个TreeLayout
工具栏上有一个名为Views.GraphView
的命令,它假设要更改图形的布局,它将在每个视图实例上运行。但为此,我认为,我需要确定哪个视图实例是活动的。 TreeLayout
命令看起来像这样:
IViewPart findView = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage(). findView( "Views.GraphView"); //I think in the findView I need to give the id of the view [but how can I put the secondary id?]
GraphView view = (GraphView) findView;
view.changeLayout(); //I wrote this method in the graph view to change the layout
//I just tried to print the secondary id, but it did not print anyting
System.out.println("From treelayout command:- " + view.getViewSite().getSecondaryId());
那么如何识别当前活动的哪个视图实例并对其进行操作?
答案 0 :(得分:1)
您可以使用IWorkBenchPage.findViewReference(String viewId, String viewId) ,如果它返回null,则当前透视图中不包含viewId和viewId的视图。
如果您有ViewReference,则可以使用ViewReference.getView(boolean restore)来获取视图
所以在你的处理程序中你会得到类似的东西:
final IWorkbenchPage page = HandlerUtil.getActiveWorkbenchWindow(
event).getActivePage();
final int instanceNum = 8;//the number of instances that are created
for (int index = 0; index < instanceNum; index++) {
final IViewReference viewReference = page.findViewReference(
"Views.GraphView", Integer.toString(index));
if (viewReference != null) {
final IViewPart view = viewReference.getView(true);
if (view instanceof GraphView) {
final GraphView graphView = (GraphView) view;
graphView.changeLayout();
}
}
}
答案 1 :(得分:1)
view.getViewSite().getSecondaryId()
方法是识别辅助视图的好方法。此方法仅返回“主”视图的Null字符串:当用户单击Window - &gt;时打开的字符串。显示视图 - 您的视图。
我不明白为什么您的视图工具栏按钮必须在所有视图实例上运行。在我看来,每个视图实例工具栏中应该只有一个按钮,只能在自己的视图中操作。如果你真的需要从一个按钮操作到所有视图我认为你必须自己保持开放视图引用,因为我认为工作台不提供返回视图数组的findViews方法。
答案 2 :(得分:1)
使用以下代码,您应该能够获得当前的活动视图。
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart()
答案 3 :(得分:0)
MessageDialogbox上的活动视图和编辑器名称
public class Active_Workbench extends AbstractHandler{
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
// A part service tracks the creation and activation of parts within a workbench page.
IPartService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService();
MessageDialog.openInformation(HandlerUtil.getActiveWorkbenchWindow(
event).getShell(), "Current Workbench Window", service.getActivePart().getTitle().toString());
return null;
}
}
我希望这个答案很有用。