2012-04-30 1 views
1

따라서 PLAY_COMMAND_IDSTOP_COMMAND_ID으로 식별되는 두 개의 명령이 있습니다. 각각의 명령에는 각각 playHandlerstopHandler의 핸들러가 있습니다 (이들은 AbstractHandler 클래스를 확장하고 있습니다).Command Eclipse Plugin 개발의 IHandlerActivation 활성화/비활성화시이 코드의 문제점

이러한 명령은 내보기의 도구 모음에있는 버튼 스타일로 제공됩니다. 기본적으로 내가 원하는 것은 처음에는 PLAY_COMMAND이 활성화되어 있지만 STOP_COMMAND은 활성화되어 있지 않습니다. PLAY_COMMAND을 클릭하면 STOP_COMMAND이 활성화되고 그 자체는 비활성화됩니다 (PLAY_COMMAND). 그리고 그 반대의 경우 STOP_COMMAND 클릭.

그래서 내가하는 일은 이와 같습니다. 처음에는 재생 버튼을 클릭 한 다음 정지 버튼이 활성화되고 재생 버튼이 비활성화되었습니다. 정지 버튼을 클릭 한 다음 재생 버튼이 활성화되고 정지 버튼이 비활성화됩니다.하지만 재생 버튼을 클릭하면 다시 말하면, 정지 버튼이 활성화되어있을 때도 재생 버튼은 여전히 ​​활성화되어 있습니다). 그래서 여기 내 코드와 무슨 일이야 :

private AbstractHandler playHandler, stopHandler, pauseHandler, stepHandler; 
private IHandlerActivation playActivation, stopActivation, pauseActivation, stepActivation; 
private void createHandlers(){ 
    final IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class); 
    playHandler = new AbstractHandler() { 

     @Override 
     public Object execute(ExecutionEvent event) throws ExecutionException { 
     handlerService.deactivateHandler(playActivation); 
     if(stopActivation == null){ 
      stopActivation = handlerService.activateHandler(STOP_COMMAND_ID, stopHandler); 
     } else { 
      handlerService.activateHandler(stopActivation); 
     } 
     return null; 
     } 
    }; 

    stopHandler = new AbstractHandler() { 

     @Override 
     public Object execute(ExecutionEvent event) throws ExecutionException { 
     handlerService.deactivateHandler(stopActivation); 
     handlerService.activateHandler(playActivation); 
     return null; 
     } 
    }; 
    playActivation = handlerService.activateHandler(PLAY_COMMAND_ID, playHandler); 
    } 
} 

createHandlers() 방법은 내보기에 createPartControl(Composite parent) 방법의 끝에서 호출됩니다.

답변

0

좋아, 여기 내가 찾은 것. activateHandler(IHandlerActivation) 메서드를 호출 할 때 반환되는 IHandlerActivation은 비활성화 될 때 동일한 처리기를 활성화하는 데 다시 사용할 수 없습니다. 따라서 해결책은 handlerService.activateHandler(playActivation) 대신 handlerService.activateHandler(commandID, playHandler)으로 전화를 시도하십시오.