3

在 application.e4xmi 文件中构建透视图后,我无法通过调用 IWorkbenchPage.resetPerspective() 来重置透视图。

4

2 回答 2

4

我认为这可以为其他人节省一些时间,并为自己记录下来。

能够重置 e4 透视图的技巧如下(假设具有 PerspectiveStack 元素的基本 application.e4xmi):

  1. 在 application.e4xmi 文件中,找到 Application/TrimmedWindow 节点下的 PerspectiveStack。记录/设置其 ID。
  2. 在 Eclipse 4 模型编辑器中,将 Perspective(s) 从 PerspectiveStack 下面拖到 Application/Snippets。(这将导致您的透视 ID 向 IPerspectiveRegistry 注册,并提供原始状态)。
  3. 创建新的 CopyPerspectiveSnippetProcessor。这将在启动时将您的片段中的透视图复制到您的 PerspectiveStack。这使得您不必在 e4xmi 文件中维护每个透视元素的两个副本。

    package com.example.application.processors;
    
    import org.eclipse.e4.core.di.annotations.Execute;
    import org.eclipse.e4.ui.model.application.MApplication;
    import org.eclipse.e4.ui.model.application.ui.MUIElement;
    import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
    import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
    import org.eclipse.e4.ui.workbench.modeling.EModelService;
    
    /**
     * Copies all snippet perspectives to perspective stack called "MainPerspectiveStack" In order to register/reset perspective and not have to sync two copies in
     * e4xmi.
     * 
     */
    public class CopyPerspectiveSnippetProcessor {
        private static final String MAIN_PERSPECTIVE_STACK_ID = "MainPerspectiveStack";
    
        @Execute
        public void execute(EModelService modelService, MApplication application) {
            MPerspectiveStack perspectiveStack = (MPerspectiveStack) modelService.find(MAIN_PERSPECTIVE_STACK_ID, application);
    
            // Only do this when no other children, or the restored workspace state will be overwritten.
            if (!perspectiveStack.getChildren().isEmpty())
                return;
    
            // clone each snippet that is a perspective and add the cloned perspective into the main PerspectiveStack
            boolean isFirst = true;
            for (MUIElement snippet : application.getSnippets()) {
                if (snippet instanceof MPerspective) {
                    MPerspective perspectiveClone = (MPerspective) modelService.cloneSnippet(application, snippet.getElementId(), null);
                    perspectiveStack.getChildren().add(perspectiveClone);
                    if (isFirst) {
                        perspectiveStack.setSelectedElement(perspectiveClone);
                        isFirst = false;
                    }
                }
            }
        }
    }
    
  4. 将您的 CopyPerspectiveSnippetProcess 注册到您的 plugin.xml 文件中。

    <extension id="MainAppModel" point="org.eclipse.e4.workbench.model">
        <processor beforefragment="false" class="com.example.application.processors.CopyPerspectiveSnippetProcessor"/>
    </extension>
    
  5. 像往常一样重置视角。您还需要将透视堆栈和当前透视设置为可见,因为有时可以将它们设置为不可见。示例处理程序可能如下所示:

    import org.eclipse.e4.core.di.annotations.Execute;
    import org.eclipse.e4.ui.model.application.MApplication;
    import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
    import org.eclipse.e4.ui.workbench.modeling.EModelService;
    import org.eclipse.ui.PlatformUI;
    
    public class ResetPerspectiveHandler {
        private static final String MAIN_PERSPECTIVE_STACK_ID = "MainPerspectiveStack";
    
        @Execute
        public void execute(EModelService modelService, MApplication application) {
             MPerspectiveStack perspectiveStack = (MPerspectiveStack) modelService.find(MAIN_PERSPECTIVE_STACK_ID, application);
             PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().resetPerspective();
             perspectiveStack.getSelectedElement().setVisible(true);
             perspectiveStack.setVisible(true);
        }
    }
    
于 2013-11-20T20:30:33.073 回答
1

重置视角(当您在没有清理工作空间的情况下午餐 e4 应用程序时,当您将其他视角切换到您的感知时)。

第 1 步:在应用程序级别的模型片段中添加附加组件。 在此处输入图像描述

步骤 2:创建 Add-on 类并实现 EventHandler

第 3 步:在类中添加以下代码。

public class ResetPrespectiveAddOn implements EventHandler {

private static final String MY_PERSPECTIVE_ID = "myPrespectiveId";

@Inject
private IEventBroker broker;

@PostConstruct
public void loadPrespective() {

    broker.subscribe(UIEvents.ElementContainer.TOPIC_SELECTEDELEMENT, this);
}

@SuppressWarnings("restriction")
@Override
public void handleEvent(Event event) {

    //UIEvents.EventTags.ELEMENT is trigger  for all UI activity
    Object property = event.getProperty(UIEvents.EventTags.ELEMENT);
    if (!(property instanceof PerspectiveStackImpl)) {
        return;

    }

    // Reset perspective logic .
    IEclipseContext serviceContext = E4Workbench.getServiceContext();
    final IEclipseContext appContext = (IEclipseContext) serviceContext.getActiveChild();
    EModelService modelService = appContext.get(EModelService.class);
    MApplication application = serviceContext.get(MApplication.class);
    MWindow mWindow = application.getChildren().get(0);

    PerspectiveStackImpl perspectiveStack = (PerspectiveStackImpl) property;
    List<MPerspective> children = perspectiveStack.getChildren();
    for (MPerspective myPerspective : children) {
        if (myPerspective.getElementId().equals(MY_PERSPECTIVE_ID)) {

            //find active perspective
            MPerspective activePerspective = modelService.getActivePerspective(mWindow);
            if(activePerspective.getElementId().equals(MY_PERSPECTIVE_ID))

            //Reseting perspective  e3 way 
            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().resetPerspective();


            // till now there is no direct e4 way to reset perspective 
            // but u can Add and remove e4 perspective with this code code              
            EPartService partService = serviceContext.get(EPartService.class);
            MPerspectiveStack perspectiveStack = (MPerspectiveStack) (MElementContainer<?>) activePerspective.getParent();
            int indexOf = perspectiveStack.getChildren().indexOf(activePerspective);
            perspectiveStack.getChildren().remove(indexOf);

            perspectiveStack.getChildren().add(myPerspective);
            partService.switchPerspective(myPerspective);
        }   
    }
}}
于 2018-09-24T06:01:34.543 回答