2014-10-20 119 views
1

我目前正在研究eclipse e4 RCP應用程序,並且我有一個作爲工作管理器的部分,用戶可以在其中看到所有活動作業及其進度,在日食。現在的問題是,用戶可以通過雙擊工具欄打開進度部分,他也應該能夠隨時關閉進度部分,而不是處理我想讓它不可見的部分。 起初我認爲這不應該是一個問題,因爲我可以設置該部分不可見,但問題是如何捕捉關閉事件並按照我的方式處理它。是否有任何事件,接口或偵聽器可以實現以捕捉關閉事件並防止該部件被丟棄?捕捉零件的關閉事件(Eclipse e4 RCP)

+0

你是問關於E4應用程序(使用Application.e4xmi)或3.x的兼容模式RCP? – 2014-10-20 17:46:29

+0

是的,我想諮詢一下使用Application.e4xmi的E4應用.. – tom1991te 2014-10-20 17:48:13

+0

'EPartService.addPartListener'會告訴你關閉,但我不知道anywa你停止關閉發生。 – 2014-10-20 20:09:08

回答

1

您可以實現一個CustomSaveHandler並用一個處理器替換Default Eclipse Save Handler。在該SaveHandler中,您可以控制零件是否關閉。所以你可以不關閉它並使其不可見。

ExampleCode:

public class ReplaceSaveHandlerProcessor { 
@Named("your.id.to.window") 
@Inject 
MWindow window; 

@Inject 
IEventBroker eventBroker; 

@Execute 
void installIntoContext() { 
    eventBroker.subscribe(UIEvents.Context.TOPIC_CONTEXT, new EventHandler() { 

     @Override 
     public void handleEvent(final Event event) { 
      if (UIEvents.isSET(event)) { 
       if (window.equals(event.getProperty("ChangedElement")) && (window.getContext() != null)) { 

        window.getContext().runAndTrack(new RunAndTrack() { 

         private final ISaveHandler saveHandler = new CustomSaveHandler(); 

         @Override 
         public boolean changed(final IEclipseContext context) { 
          Object getSaveHandlerValue = context.get(ISaveHandler.class); 


          if (!saveHandler.equals(getSaveHandlerValue)) { // prevents endless loop 
           ContextInjectionFactory.inject(saveHandler, window.getContext()); 
           context.set(ISaveHandler.class, saveHandler); 
          } 


          return true; // ture keeps tracking and the saveHandler as the only opportunity 
         } 

        }); 
       } 
      } 
     } 

    }); 
} 
} 

你必須定義ExtentionPoint org.eclipse.e4.workbench.model一個Extention 與你ReplaceSaveHandlerProcessor。 (您必須聲明窗口ID在本extention「元素」(新增截圖:enter image description here

的CustomSaveHandler必須實現ISaveHandler接口在其方法YPU可以說,如果部分應該真的被關閉

public class CustomSaveHandler implements ISaveHandler { 

@Override 
public boolean save(MPart dirtyPart, boolean confirm) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean saveParts(Collection<MPart> dirtyParts, boolean confirm) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public Save promptToSave(MPart dirtyPart) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public Save[] promptToSave(Collection<MPart> dirtyParts) { 
    // TODO Auto-generated method stub 
    return null; 
} 

}