2016-12-15 9 views
0

E4 RCPアプリケーションが終了すると、変更はworkbench.xmiファイルに記録/保存されます。Eclipse RCP workbench.xmi保存された部分の制御

パーツスタック内では、アプリケーションが終了した時点で複数のパーツが開いている可能性があります。アプリケーションが作成されworkbench.xmiで保存されたこれらの部品を再起動し、再度表示される場合

これらの部品は

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

としてタグ付けされています。

部品の作成を許可/禁止するために、アプリケーションの起動中にこれらの部品をどのように制御することができますか?

これは、(あなたの部品に接続された)データモデルがファイルに保存される場合に使用されます。例えば

、以下の配列:

1.- RCPは、オープンいくつかの部分で閉鎖されている(すなわち、ファイルツーremain.xmlファイルに被deleted.xml

2.-ユーザーがファイルを削除します。ファイルが削除されます。

3-RCPが再起動されるため、削除対象ファイルが作成され、データなしで表示されます。

目的は、私が質問にグレッグ-449の答えとも彼の答えを読んだ後、私の説明を拡張しますファイル・ツー・被deleted.xmlステップ3.-

での作成を避けるためです。 "e4 - removing elements from the application model"

私は、アプリケーションが閉じられた時点(ファイルから残りのファイル、削除されるファイル)でPartStackと2つのParts(2つのxmlファイル)を含むworkbench.xmiを保存しました。 xml)

要素IDは、ファイルパスを含む文字列であることに注意してください。パートの作成時にpart.setElementID(String)メソッドを実行します。

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); 

       } 
      } 
     } 
    } 
} 

私は、「ファイルツーことを削除した場合:

も部品が、私はライフサイクルのクラスを作成している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> 

というクラスによって作成されていることに注意してください-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) 
... 
... 

パーツはモデルから削除されているようですが、パーツスタックは更新されていません。事前

+0

RCPアプリケーション内のステップ2のみを許可します。 –

+1

setToBeRenderedをfalseに設定すると、おそらく親から削除する必要はありません。 –

+0

'parent.getChildren()。remove(elParte);'を削除し、以下の答えで定義されているコードを追加しています。 –

答えて

0

ありがとうございますRCPはworkbench.xmiを無視してApplication.e4xmiで説明したように、正確に開くようにする-clearPersistedStateオプションを指定することができます。

-persistState falseを指定して、最初に保存されるworkbench.xmiを停止することもできます。

これらは、.productファイルエディタの[起動中]タブの[プログラム引数]セクションで指定します。

起動時にモデルの一部だけを復元するためのサポートはありません。 workbench.xmiは、RCPを終了したときのアプリケーションモデルのコピーに過ぎません。

開こうとする部品のリストがある場合は、RCPの起動時にこれを行うことができます。これはおそらく、「アプリケーション起動完了」イベントです。これはおそらく、(持っていれば)自分のライフサイクルクラスのメソッドのようになります。

@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が削除されます。 MPe.getpersistedState()を使用してMap をリカバリ時に開くようにworkbench.xmiの永続状態にあるファイルのリストを保存することです。 –

+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; 
        } 
       } 
      } 
     } 
    } 
} 
} 
関連する問題