Eclipse RCP workbench.xmi控制已保存的部件

时间:2016-12-15 18:42:51

标签: eclipse eclipse-rcp

关闭E4 RCP应用程序时,会在workbench.xmi文件中记录/保存更改。

在partstack中,应用程序关闭时可能会打开几个部分。

这些部分标记为

<children xsi:type="basic:PartStack"
                xmi:id="_The_ID"
                elementId="elemId"
                contributorURI="URI"
                containerData="3000">
  <tags>NoAutoCollapse</tags>
</children>

重新启动应用程序时,会创建并再次显示在workbench.xmi中保存的这些部件。

如何在启动应用程序期间再次控制这些部件以允许/不允许创建部件?

如果您的数据模型(与您的部件相关联)保存在文件中,则使用此选项。

例如,以下序列:

1.-关闭RCP并打开一些部分(即 file-to-remain.xml file-to-be-deleted.xml

2.-用户删除文件 file-to-be-deleted.xml 删除数据。

3.-重新启动RCP,因此创建 file-to-deleted.xml 并显示没有数据。

目标是避免在步骤3中创建 file-to-deleted.xml .-

我会在阅读greg-449回答以及他的回答后延伸我的解释:&#34; e4 - removing elements from the application model&#34;

在应用程序关闭时,我保存了一个workbench.xmi,其中包含一个PartStack和两个Part(2个xml文件)(file-to-remain.xml,file-to-be-deleted.xml)

请注意,元素ID是包含文件路径的字符串。通过part.setElementID(String)方法完成零件创建。

另请注意,这些部件是由名为AutodocuForm.class

的类创建的
<children xsi:type="basic:PartStack" 
          xmi:id="_iDPe2cIDEeaAXZB7N2qOIw" 
          elementId="my-plugin.partstack.0" 
          contributorURI="platform:/plugin/my-plugin" 
          containerData="3066" 
          selectedElement="_6pVbwMNsEeaiI_JEbgNbYQ">

          <children xsi:type="basic:Part"
                    xmi:id="_3ZCIocNsEeaiI_JEbgNbYQ" 
                    elementId="C:\Users\name\Desktop\file-to-remain.xml" 
                    contributorURI="platform:/plugin/my-plugin" 
                    contributionURI="bundleclass://my-plugin/my-plugin.autodocu.AutodocuForm" 
                    label="file-to-remain.xml" 
                    iconURI="platform:/plugin/my-plugin/icons/file_obj.gif" 
                    closeable="true">
         </children>

         <children xsi:type="basic:Part" 
                   xmi:id="_6pVbwMNsEeaiI_JEbgNbYQ" 
                   elementId="C:\Users\name\Desktop\file-to-be-deleted.xml" 
                   contributorURI="platform:/plugin/my-plugin" 
                   contributionURI="bundleclass://my-plugin/my-plugin.autodocu.AutodocuForm" 
                   label="file-to-be-deleted.xml" 
                   iconURI="platform:/plugin/my-plugin/icons/file_obj.gif" 
                   closeable="true">
         </children>
</children>

我创建了一个LifeCycle类:

public class LifeCycleManager {

    @ProcessRemovals
    void postContextCreate(IEclipseContext context, MApplication application, EModelService modelService, EPartService partService){

        List<MPart> parts = modelService.findElements(application, null, MPart.class, null);
        for(MPart elParte: parts){
            if(elParte.getContributionURI().endsWith("AutodocuForm")){
                Path partPath = Paths.get(elParte.getElementId());
                if(Files.exists(partPath, LinkOption.NOFOLLOW_LINKS)){
                    System.out.println("FILE EXISTS INTO THE FILE SYSTEM...");
                }
                else{
                    System.out.println("FILE DOES NOT EXIST INTO THE FILE SYSTEM...");
                    MElementContainer<MUIElement> parent = elParte.getParent();
                    elParte.setToBeRendered(false);
                    parent.getChildren().remove(elParte);

                }
            }
        }
    }
}

如果我删除&#34; file-to-be-deleted.xml&#34;并重新启动应用程序,部分未显示在partStack中,但我获得以下异常:

!ENTRY org.eclipse.e4.ui.workbench.swt 4 2 2016-12-20 11:09:38.601
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt".
!STACK 0
java.lang.NullPointerException
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.showTab(LazyStackRenderer.java:160)
...
...

!ENTRY org.eclipse.e4.ui.workbench 4 0 2016-12-20 11:09:38.601
!MESSAGE Exception occurred while rendering: org.eclipse.e4.ui.model.application.ui.basic.impl.PartStackImpl@39478c45 
            (elementId: my-plugin.partstack.0, 
              tags: [NoAutoCollapse], 
              contributorURI: platform:/plugin/my-plugin) 
            (widget: CTabFolder {}, 
              renderer: org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer@1b62d923, 
              toBeRendered: true, 
              onTop: false, 
              visible: true, 
              containerData: 3066, 
              accessibilityPhrase: null)
!STACK 0
java.lang.NullPointerException
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.showTab(LazyStackRenderer.java:160)
...
...

在我看来,该部件已从模型中删除,但零件堆栈未更新。

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以指定-clearPersistedState选项以使RCP忽略workbench.xmi并完全按照Application.e4xmi中的描述打开。

您也可以指定-persistState false来停止首先保存的workbench.xmi。

在&#39;程序参数&#39;中指定这些内容。 &#39;发布&#39;部分.product文件编辑器中的选项卡。

在启动期间,没有任何支持可以恢复模型的一部分。 workbench.xmi只是退出RCP时应用程序模型的副本。

如果您有要打开的部件列表,您可以在RCP启动期间执行此操作,可能是在“应用程序启动完成”中。事件。这可能是你的LifeCycle类中的一个方法(如果你有的话):

@Optional
@Inject
public void appStartupComplete(@UIEventTopic(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE) Event event,
                               EPartService partService)
{
  // TODO call partService.showPart for parts to be opened
}

答案 1 :(得分:0)

删除parent.getChildren().remove(elParte);后,异常就解决了。 此外,有必要从模型中删除零件(从零件堆栈列表中),如下一个代码段所示:

public class LifeCycleManager {

@ProcessRemovals
void postContextCreate(IEclipseContext context, MApplication application, EModelService modelService, EPartService partService){

    List<MPart> parts = modelService.findElements(application, null, MPart.class, null);
    for(MPart elParte: parts){
        if(elParte.getContributionURI().endsWith("AutodocuForm")){
            Path partPath = Paths.get(elParte.getElementId());
            if(Files.exists(partPath, LinkOption.NOFOLLOW_LINKS)){
                System.out.println("FILE EXISTS INTO THE FILE SYSTEM...");
            }
            else{
                System.out.println("FILE DOES NOT EXIST INTO THE FILE SYSTEM...");
                MElementContainer<MUIElement> parent = elParte.getParent();
                elParte.setToBeRendered(false);
                //parent.getChildren().remove(elParte);
                Iterator it = parent.getChildren().iterator();
                elParte.setToBeRendered(false);
                while(it.hasNext()){
                    MUIElement el = (MUIElement) it.next();
                    if(el.getElementId().equals(elParte.getElementId())){
                       //Remove the part from the PartStack list
                       parent.getChildren().remove(el);
                       //Remove the selected element to avoid that the 
                       //deleted file was the selected element prior to
                       //deletion, which is stored into the 
                       //workbench.xmi file
                       parent.setSelectedElement(null);
                       break;
                    }
                }
            }
        }
    }
 }
}