如何从另一个视图或处理程序以编程方式添加和定位新的ViewPart?

时间:2014-01-19 19:57:26

标签: java eclipse view eclipse-plugin eclipse-rcp

我知道我可以plugin.xml创建新观点。此外,我可以使用{/ 1>代码创建IPerpspectiveFactory.createInitialLayout(IPageLayout)的新视图

layout.addView(ChatView.ID, IPageLayout.LEFT, 1.0f, editorArea);

是否可以通过命令从另一个视图执行相同操作?

此外,我的观点不是单身,所以我希望创建视图副本。

不幸的是,使用像

这样的代码
HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().showView(viewId);

我无法在布局中定义视图位置。我想将所有新视图传递给布局文件夹。

更新

我已按以下方式修改了透视代码:

public void createInitialLayout(IPageLayout layout) {

        String editorArea = layout.getEditorArea();

        layout.addView(IConsoleConstants.ID_CONSOLE_VIEW, IPageLayout.BOTTOM, 0.75f, editorArea);

        layout.addView(CoreSettingsView.ID, IPageLayout.LEFT, 0.25f, editorArea);

        //layout.addView(ChatView.ID, IPageLayout.LEFT, 1.0f, editorArea);

        IFolderLayout folder = layout.createFolder("chatfolder", IPageLayout.LEFT, 1.0f, editorArea);
        folder.addPlaceholder(ChatView.ID);
    }

之前的评论行导致聊天视图出现在透视的“主要”区域。

现在我根据建议改变它,让占位符在同一个地方。

处理程序执行的代码如下:

@Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        try {
            ChatView chatView = (ChatView) HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().showView(
                    ChatView.ID, 
                    Integer.toString(counter++), 
                    IWorkbenchPage.VIEW_ACTIVATE);

        } catch (PartInitException e) {
            e.printStackTrace();
        }
        return event;
    }

这会导致出现新视图,但它们都显示在与控制台视图相同的位置。即不是直接定位时出现的那个地方。

为什么?

更新2

这是关于占位符如何发生的图片。如果按下绿色按钮,红色箭头将显示实际出现的新视图。蓝色箭头显示视图应显示的位置以及如果显式位于透视图中,它(一个实例)实际出现的位置:

enter image description here

更新3

以下工作:

    IFolderLayout folder = layout.createFolder("chatfolder", IPageLayout.LEFT, 1.0f, editorArea);
    folder.addPlaceholder(ChatView.ID + ":*");

我也使用1.0f,尽管0.95f被认为是最大值。如果我使用0.95f则不会占用整个区域。

2 个答案:

答案 0 :(得分:4)

在创建初始布局时添加占位符。之后,从其他视图中,您只需显示要显示的视图。它会出现在占位符中。

See 9.2 Perspective

答案 1 :(得分:1)

您可以为每个视图使用唯一的secondary id并使用

打开多个具有相同ID的视图
IWorkbenchPage.showView(viewId, secondardId, IWorbenchPage.VEW_ACTIVATE);

所有视图都将放置在为视图ID定义的文件夹中。

你可以在透视工厂中做这样的事情来设置它:

IFolderLayout folder = layout.createFolder(folderId, IPageLayout.BOTTOM, 0.75f, layout.getEditorArea());

folder.addPlaceholder(viewId);