핸들러

org.eclipse.ui.handlers

3.1

핸들러 확장점은 Eclipse 3.0에서 정의되는 실험적 handlerSubmission 요소의 상술입니다. 핸들러는 특정 시점에서 명령의 작동입니다. 명령은 0개 이상의 핸들러와 연관될 수 있습니다. 그러나 임의의 시점에서 명령은 활성 핸들러를 갖지 않거나 하나의 활성 핸들러를 갖습니다. 활성 핸들러는 현재 명령의 동작 수행을 책임지고 있는 핸들러입니다. 이것은 조치 핸들러 및 대상 재지정 가능 조치의 개념과 매우 유사합니다.

핸들러 확장자를 사용하면 플러그인 개발자가 특정 조건에서 활성이 되고/되거나 사용되어야 하는 핸들러를 지정할 수 있습니다. 핸들러가 비활성인 경우 명령이 그의 작동을 핸들러에 위임하지 않습니다. 핸들러를 사용할 수 없는 경우, 핸들러는 실행하도록 요청되지 않습니다. 즉 핸들러의 실행이 차단됩니다. 조건은 3.0 중에 추가되는 표현식 언어 기능을 사용하여 정의됩니다. 조건은 activeWhenenabledWhen 절을 사용하여 표현됩니다.

Workbench는 이들 표현식이 의존할 수 있는 몇 가지 변수를 제공합니다. 지원되는 변수는 활성 컨텍스트, 활성 편집기, 활성 부분 및 현재 선택사항입니다. 이 초기 디자인에서는 지원되지 않지만 다른 변수를 추가하거나 플러그인 개발자가 다른 변수를 제공할 수 있도록 허용하는 방법까지 용이하게 알 수 있습니다.

조건을 지정하지 않는 핸들러가 기본 핸들러입니다. 기본 핸들러는 다른 핸들러가 그의 모든 조건을 만족하지 않는 경우에만 활성입니다. 두 핸들러가 여전히 만족되는 조건을 갖는 경우 조건이 비교됩니다. 아이디어는 그의 조건이 더 특정하거나 더 로컬인 핸들러를 선택하는 것입니다. 이를 수행하기 위해 조건이 참조하는 변수를 찾습니다. 조건은 변수 "wins"를 참조합니다. 만족도의 순서(최소 특정부터 최대 특정까지)는 org.eclipse.ui.ISources에 정의됩니다.

여전히 충돌을 해결하지 못하는 경우 어떤 핸들러도 활성이 아닙니다. 특정 추적 옵션이 켜진 경우 메시지가 로그에 기록됩니다. 충돌은 두 개의 기본 핸들러가 있는 경우에도 발생할 수 있습니다. 이 경우가 발생하지 않게 하는 것은 플러그인 개발자와 통합 테스트의 책임입니다. 이러한 조건은 불필요한 플러그인 로드를 막는 데 사용됩니다. 이들 핸들러 정의는 프록시에서 랩됩니다. 프록시가 기본 핸들러를 로드하기 위해서는 두 가지가 발생해야 합니다. 프록시에 대한 조건이 만족되어 활성이 되고, 명령이 위임해야 하는 어떤 작업(예: execute())을 수행하도록 명령에 요청해야 합니다.

<!ELEMENT extension (handler)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #IMPLIED

name  CDATA #IMPLIED>


<!ELEMENT handler (activeWhen? | class? | enabledWhen?)>

<!ATTLIST handler

commandId CDATA #REQUIRED

class     CDATA #IMPLIED>


<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>



<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>



<!ELEMENT class (parameter)>

<!ATTLIST class

class CDATA #IMPLIED>


<!ELEMENT parameter EMPTY>

<!ATTLIST parameter

name  CDATA #REQUIRED

value CDATA #REQUIRED>


<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.compare.Command"

>

<activeWhen>

<with variable=

"selection"

>

<count value=

"1"

/>

<iterate operator=

"and"

>

<adapt type=

"IResource"

/>

</iterate>

</with>

</activeWhen>

</handler>

</extension>

플러그인 로드를 더욱 피하기 위해 핸들러가 사용되는 시기를 지정할 수 있습니다. 프록시가 아직 핸들러를 로드하지 않은 경우 표현식 구문만이 핸들러가 사용되는지 여부를 결정하는 데 사용됩니다. 프록시가 핸들러를 로드한 경우 첫 번째로 표현식 구문을 참고합니다. 표현식 구문이 true로 평가되는 경우 핸들러가 사용 가능한지 묻습니다. (이것은 표현식 구문과 핸들러의 사용 상태 사이의 생략된 부울 "and" 오퍼레이션입니다.)

<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.Handler"

>

<enabledWhen>

<with variable=

"context"

>

<property id=

"id"

value=

"debugging"

/>

</with>

</enabledWhen>

</handler>

</extension>

모든 핸들러는 org.eclipse.core.commands.IHandler를 구현합니다. Workbench 안에서 org.eclipse.ui.handlers.IHandlerService 인터페이스를 사용하여 핸들러를 활성화 및 비활성화할 수 있습니다. 이 인터페이스는 IWorkbench 자체 같이 지원 Workbench 오브젝트로부터 검색할 수 있습니다. 서비스를 검색하려면 IWorkbench.getAdapter(IHandlerService.class) 같은 호출을 작성할 수 있습니다.

또한 Workbench에서 레거시 코드를 사용하여 핸들러를 활성화 및 비활성화할 수 있습니다. 이는 아래에 표시된 레거시 메커니즘을 통해 완료할 수 있습니다. 이 메커니즘은 조치를 사용하여 메뉴 또는 도구 모음을 제공하는 클라이언트에 유용합니다.

 IWorkbenchPartSite mySite;
 IAction myAction;
 
 myAction.setActionDefinitionId(commandId);
 IKeyBindingService service = mySite.getKeyBindingService();
 service.registerAction(myAction);