2016-12-15 2 views
0

Когда приложение 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 не обновляется.

Заранее спасибо

+0

Разрешить только шаг 2 внутри RCP приложения. –

+1

Если вы установите для setToBeRendered значение false, вероятно, нет необходимости удалять из родителя. –

+0

Он отлично работает, удаляя 'parent.getChildren(). Remove (elParte);' и добавляя некоторый код, как определено в ответе ниже. –

ответ

0

Вы можете указать -clearPersistedState вариант, чтобы сделать RCP игнорировать workbench.xmi и открыть точно так, как описано в Application.e4xmi.

Вы также можете указать -persistState false, чтобы остановить сохранение workbench.xmi.

Задайте их в разделе «Аргументы программы» на вкладке «Запуск» в редакторе файлов .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 
} 
+0

Если я укажу -clearPersistedState, файл workbench.xmi будет удален. Цель состоит в том, чтобы сохранить список файлов в сохраненном состоянии workbench.xmi, чтобы быть открытым при перезагрузке и восстановить Map с помощью MPart.getpersistedState() –

+0

Добавлена ​​заметка о стартовых частях во время запуска ответ. –

+0

Добавлены дополнительные сведения после ответа greg-449 –

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; 
        } 
       } 
      } 
     } 
    } 
} 
} 
Смежные вопросы