关闭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)
...
...
在我看来,该部件已从模型中删除,但零件堆栈未更新。
提前致谢
答案 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;
}
}
}
}
}
}
}