핸들러 확장점은 Eclipse 3.0에서 정의되는 실험적 handlerSubmission
요소의 상술입니다. 핸들러는 특정 시점에서 명령의
작동입니다. 명령은 0개 이상의 핸들러와 연관될 수 있습니다. 그러나 임의의 시점에서 명령은 활성 핸들러를 갖지 않거나 하나의 활성 핸들러를
갖습니다. 활성 핸들러는 현재 명령의 동작 수행을 책임지고 있는 핸들러입니다. 이것은 조치 핸들러 및 대상 재지정 가능 조치의 개념과 매우 유사합니다.
핸들러 확장자를 사용하면 플러그인 개발자가 특정 조건에서 활성이 되고/되거나 사용되어야 하는 핸들러를 지정할 수 있습니다. 핸들러가 비활성인 경우 명령이 그의 작동을 핸들러에 위임하지 않습니다. 핸들러를 사용할 수 없는 경우, 핸들러는 실행하도록 요청되지 않습니다. 즉 핸들러의 실행이 차단됩니다.
조건은 3.0 중에 추가되는 표현식 언어 기능을 사용하여 정의됩니다. 조건은 activeWhen
및 enabledWhen
절을
사용하여 표현됩니다.
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)>
<!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);
Copyright (c) 2005 IBM Corporation and others.
All rights reserved. 본 프로그램 및 본 프로그램에 동봉되는 자료는 본 배포물에 동봉되는 Eclipse Public License v1.0의 조항에 따라 사용해야 하며
웹 사이트(http://www.eclipse.org/legal/epl-v10.html)에서도 관련 사항을 참조할 수 있습니다.