Когда приложение E4 RCP закрыто, изменения записываются/сохраняются в файле workbench.xmi.Eclipse RCP workbench.xmi управление сохраненными частями
В пределах частичной упаковки несколько частей могут быть открыты в момент закрытия приложения.
Эти части помечены как
<children xsi:type="basic:PartStack"
xmi:id="_The_ID"
elementId="elemId"
contributorURI="URI"
containerData="3000">
<tags>NoAutoCollapse</tags>
</children>
Когда приложение перезапускается эти части сохранены в workbench.xmi созданы и снова отображается.
Как управлять этими частями при запуске приложения снова, чтобы разрешить/не разрешить создание детали?
Это должно использоваться в том случае, если ваша модель данных (связанная с вашей частью) сохраняется в файле.
Например, следующая последовательность:
1.- RCP закрыта с некоторыми частями открытых (т.е. файл к remain.xml и файл-к-быть-deleted.xml)
2.- Пользователь удаляет файл file-to-be-deleted.xml удаление данных.
3.- RCP перезапускается, поэтому file-to-be-deleted.xml создается и отображается без данных.
Цель состоит в том, чтобы избежать создания файла-быть-deleted.xml на этапе 3.-
Я направляю мои объяснения после прочтения Greg-449 ответа, а также его ответ на вопрос: "e4 - removing elements from the application model"
У меня есть файл workbench.xmi, содержащий один PartStack и две части (2 xml-файла) в момент закрытия приложений (файл-to-stay.xml, file-to-be-deleted. xml)
Обратите внимание, что идентификатор элемента представляет собой строку, содержащую путь к файлу. Выполнено при создании части методом 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);
}
}
}
}
}
Если удалить «файл-быть -deleted.xml "и перезапустить приложение, часть не показана внутри 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: [email protected]39478c45
(elementId: my-plugin.partstack.0,
tags: [NoAutoCollapse],
contributorURI: platform:/plugin/my-plugin)
(widget: CTabFolder {},
renderer: [email protected],
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)
...
...
Мне кажется, что часть удалена из модели, но часть Stack не обновляется.
Заранее спасибо
Разрешить только шаг 2 внутри RCP приложения. –
Если вы установите для setToBeRendered значение false, вероятно, нет необходимости удалять из родителя. –
Он отлично работает, удаляя 'parent.getChildren(). Remove (elParte);' и добавляя некоторый код, как определено в ответе ниже. –