Core Expression

위클립스
이동: 둘러보기, 찾기

코어 익스프레션코어 익스프레션 플러그인 기반의 선언적인 프로그래밍 식 표현이다. 이 식은 XML로 기술 되며,IEvaluationContext를 평가해 boolean 결과를 반환한다.

목차

[편집] 배경

이클립스 3.2 부터 추가된 메뉴 확장점plugin.xml파일의 내용만으로 UI 및 메뉴를 구성하게 해 준다. 그러나 특정 메뉴의 동적인 가시성(Visibility)이나 가용성(Enablement)을 조작하기 위해서는 XML이 아닌 평가 코드[1]가 로드되어 적절한 시점에 실행되어야 하는데, 대부분의 플러그인은 클래스가 로드되면 플러그인 자체가 시작되기 때문에 단순히 UI를 만드는데 플러그인의 디펜던시가 모두 activate된는 비싼 초기화가 일어난다. 이는 이클립스 3.2~4.0사이에 일어나는 선언적 UI도입 정책과도 어긋난다. 코어 익스프레션은 메뉴의 가시성이나 가용성등과 같이 동적으로 평가되어야 하는 boolean값을 XML 기술만으로 가능하게 해, 플러그인을 시작하지 않고도 그러한 문제를 처리할 수 있게 하기 위해 생겨났다.

[편집] 코어 익스프레션과 커맨드 프레임워크

커맨드 프레임워크핸들러들의 enableWhen과 activeWhen을 기술 할 때 코어 익스프레션을 사용한다. 또한 메뉴 확장점에서도 visibleWhen을 기술 할 때 사용한다. 커맨드 프레임워크코어 익스프레션이 실행 될 IEvaluationContext를 공급한다.

IEvaluationContext는 평가를 위한 기본 변수와 고유 이름을 갖는 변수들을 제공한다. 커맨드 프레임워크에서는 전역 선택(ISelection)을 java.util.Collection 형태로 기본 변수로 제공한다. 이 기본변수는 비어 있거나(현재 워크 벤치 선택이 텍스트인 경우 처럼). 혹은 IStructuredSelection의 컨텐츠가 된다.

<with/> 엘리먼트를 이용해 평가식을 수행할 변수를 선택할 수 있다.

[편집] 변수들

커맨드 프레임워크가 사용하고 공급하는 변수들은 ISource.java에 리스트 되어 있다.

코어 익스프레션이 수행되는 컨텍스트에 따라 몇몇 변수들은 지정되어 있지 않을 수도 있다.

이름 타입 설명 Since
activeContexts String 들을 담은 Collection 현재 활성화 된 UI Context들의 ID를 담은 Collection. 보통 <iterate />, <count />, <test />등과 함께 사용된다. 3.2
activeShell org.eclipse.swt.widget.Shell 현재 활성 Shell. 워크벤치 윈도우의 쉘이거나 다이얼로그의 쉘일 수 있다. 3.2
activeWorkbenchWindowShell org.eclipse.swt.widget.Shell 활성 워크벤치 윈도우의 Shell 3.2
activeWorkbenchWindow org.eclipse.ui.IWorkbenchWindow 활성화 된 워크벤치 윈도우. 3.2
activeWorkbenchWindow.isCoolbarVisible java.lang.Boolean 현재 워크벤치 윈도우가 쿨바를 표시하고 있는지 여부. 3.3
activeWorkbenchWindow.isPerspectiveBarVisible java.lang.Boolean 현재 워크밴치 윈도우가 퍼스펙티브 바를 표시하고 있는지 여부. 3.3
activeWorkbenchWindow.activePerspective java.lang.String 현재 워크밴치 윈도우가 표시중인 퍼스펙티브 이름. 3.3
activeEditor IEditorPart 현재 활성 에디터. 에디터가 활성 상태가 아니더라도 마지막 활성 에디터가 기억됨. 3.2
activeEditorId String 활성 에디터의 id 3.2
activePart IWorkbenchPart 활성 파트. 활성 에디터와 동일할 수 있음 3.2
activePartId String 활성 파트의 id 3.2
activeSite IWorkbenchPartSite 활성 파트의 사이트 3.2
selection ISelection 현재 글로벌 셀렉션. 종종 <test />와 PropertyTester를 이용해 프로그래밍적으로 평가한다. 또한 3.3에서 추가된 <iterate />, <count />도 주로 함께 쓰인다. 3.2
activeMenu String Collection 현재 보여지고 있는 컨텍스트 메뉴의 ID목록. 3.2
activeMenuSelection ISelection 현재 컨텍스트 메뉴를 표시중인 뷰어의 셀렉션. 단 이 컨텍스트 메뉴는 사이트의 registerCongtextMenu(*) 를 통해 등록된 것이어야 한다. 이는 대체로 글로벌 셀렉션과 동일하지만, 모든 경우에 그런 것은 아니고, 이전 버전의 호환성을 위해 공급된다. 3.3
activeMenuEditorInput ISelection activeMenuSelection과 비슷 하지만, IEditorSite의 registerContextMenu(*)로 메뉴 매니저를 등록할 때, includeEditorInput 파라미터를 true로 준 경우 에디터 인풋으로 부터 셀렉션을 가져온다. 하위 버전 호환을 위해 공급된다. 3.3
activeFocusControl Control IFocusService에 등록되어 있고 현재 활성 포커스를 가진 컨트롤. 3.3
activeFocusControlId String 현재 활성 포커스를 가진 컨트롤이 IFocusService에 등록된 경우, 등록 할때 사용한 ID. 3.3

[편집] Property Tester들

이클립스 SDK는 코어 익스프레션에서 사용할 수 있는 몇몇 프로퍼티 테스터를 공급한다. 코어 익스프레션은 property 속성 및 인자, 값을 지정해 프로퍼티 테스터의 구현과 독립적으로 속성 테스트를 정의할 수 있다. 프로퍼티 속성은 네임 스페이스와 이름으로 구성된다. 예를 들어 IResource의 이름 속성을 테스트 하려면, org.eclipse.core.resource.name 속성을 테스트 해야한다.

[편집] Platform

Namespace Type 구현
org.eclipse.core.runtime org.eclipse.core.runtime.Platform PlatformPropertyTester.java
속성 설명
product 현재 실행중인 프로덕트의 id.
isBundleInstalled 주어진 변수를 id로 갖는 번들이 설치되어있는지 여부를 테스트.

[편집] IResource

Namespace Type 구현
org.eclipse.core.resources org.eclipse.core.resources.IResource ResourcePropertyTester.java
속성 설명
name 파일 이름. "*" 및 "?" 와일드 카드 사용가능.
path 파일의 경로. "*" 및 "?" 와일드 카드 사용가능.
extension 파일의 확장자. "*" 및 "?" 와일드 카드 사용가능.
readOnly 파일이 읽기 전용인지 여부
projectNature 리소스가 소속된 프로젝트가 인자로 주어진 String값이 ID인 네이쳐를 가진 프로젝트인지 여부.
persistentProperty 리소스 영구 속성을 검사, 첫번째 인자는 프로퍼티 명, 두번째 인자는 값으로 사용됨. 파일의 속성이 인자로 주어진 값과 일치하면 true.
projectPersistentProperty persistentProperty와 동일하나, 리소스가 속한 프로젝트의 속성으로 테스트 됨.
sessionProperty 리소스 세션 속성을 검사, 첫번째 인자는 프로퍼티 명, 두번째 인자는 값으로 사용됨. 파일의 속성이 인자로 주어진 값과 일치하면 true.
projectSessionProperty sessionProperty와 동일하나, 리소스가 속한 프로젝트의 속성으로 테스트 됨.

[편집] IFile

Namespace Type 구현
org.eclipse.core.resources org.eclipse.core.resources.IFile IFilePropertyTester.java
속성 설명
contentTypeId 인자로 주어진 컨텐트 타입 ID가 파일의 컨텐트 타입과 일치하는지 여부.

[편집] IProject

Namespace Type 구현
org.eclipse.core.resources org.eclipse.core.resources.IProject ProjectPropertyTester.java
속성 설명
open 프로젝트가 열려 있는 경우라면 true

[편집] ResourceMapping

Namespace Type 구현
org.eclipse.core.resources org.eclipse.core.resources.mapping.ResourceMapping ResourceMappingPropertyTester.java
속성 설명
projectPersistentProperty ResourceMapping에 대해 projectPersistentProperty 속성 테스트를 제공한다. 첫번째 인자는 속성 명, 두번째 인자는 기대 값으로 취급되어 일치하면 true를 리턴한다. 만약 하나의 인자만 준 경우, 해당 속성을 소유했는지 여부를 리턴한다.

[편집] IWorkbench

Namespace Type 구현
org.eclipse.ui org.eclipse.ui.IWorkbench ActivityPropertyTester.java
속성 설명
isActivityEnabled 인자로 주어진 ID의 activity가 활성상태인지 여부
isCategoryEnabled 인자로 주어진 ID의 카테고리 활성 상태인지 여부

[편집] IWorkbenchWindow

Namespace Type 구현
org.eclipse.ui org.eclipse.ui.IWorkbenchWindow OpenPerspectivePropertyTester.java
속성 설명
isPerspectiveOpen 테스트 할 퍼스펙티브 ID.

[편집] 예제

[편집] 기본 IStructuredSelection

워크벤치 셀렉션이 모두 Person 클래스의 인스턴스인 경우에만 true를 리턴하는 코어 익스프레션 예제:

<!-- with 노드를 이용해 어떤 변수를 평가할 것인지 결정하지 않으면 기본 변수인 워크벤치 셀렉션이 평가 대상이 된다 -->
<activeWhen>
    <!-- IStructuredSelection (워크벤치 셀렉션)에 속한 각각의 엔트리들에 대해 테스트 한다. --> 
    <iterate> 
       <!-- 각각의 엔트리가 Person의 인스턴스 인경우 true를 리턴한다. iterate는 and(기본)과 or모드를 지원한다 -->
       <instanceof value="org.eclipse.ui.examples.contributions.model.Person"/>
    </iterate>
</activeWhen>

[편집] 패키지 익스플로러 IStructuredSelection

패키지 익스플로러는 org.eclipse.core.resource.IResource 및 org.eclipse.jdt.core.IJavaElement 클래스가 섞여 공급된다. 만약 모든 *.java 파일을 얻으려면 다음과 같이 하면 된다.:

  1. 기본 변수를 이터레이트 한다.
  2. adapt노드를 이용해 관심 영역의 어댑터를 얻는다, 이 경우 IResource가 된다.[2]
  3. org.eclipse.core.resources property 리소스 프로퍼티 테스터를 이용해 이름을 검사한다.

예:

<activeWhen>
    <iterate>
       <adapt type="org.eclipse.core.resources.IResource">
          <test property="org.eclipse.core.resources.name" 
                value="*.java"/>
       </adapt>
    </iterate>
</activeWhen>

[편집] 활성 에디터

특정한 유형의 에디터가 활성화 되었을 때만 작동하는 핸들러를 만들려면 ,핸들러의 activeWhen 식에 activeEditorId 변수를 이용하면 된다.

<activeWhen>
    <with variable="activeEditorId">
       <equals value="org.eclipse.ui.DefaultTextEditor"/>
    </with>
</activeWhen>

[편집] 복잡한 코어 익스프레션

불린 연산자를 포함한 복잡한 식도 표현할 수 있다, 예: (a & b & (c | d | (!e))):

<and>
  <test args="a" property="rcpAuthActivitiesExample.test" />
  <test args="b" property="rcpAuthActivitiesExample.test" />
  <or>
    <test args="c" property="rcpAuthActivitiesExample.test" />
    <test args="d" property="rcpAuthActivitiesExample.test" />
    <not>
      <test args="e" property="rcpAuthActivitiesExample.test" />
    </not>
  </or>
</and>

예제에서는프로퍼티 테스터 한 종류만 사용한 것과 달리 모든 유형의 익스프레션 노드를 조합하여 식을 만들 수 있다.

[편집] 3.3에서 추가된 코어 익스프레션

버전 3.2에서 2개의 익스프레션이 더 추가 되었다.

[편집] count와 iterate

Count와 iterate는 원래 java.util.Collection에 대해서만 작동했지만 현재는 org.eclipse.core.expressions 패키지의 ICountable과 IIteratable 인터페이스를 직접 구현하거나 어댑터를 공급하는 모든 객체에 대해 사용할 수 있다.[3]

워크벤치는 IStructuredSelection과 ISelection에 대해 두 어댑터를 공급한다.

[편집] definition

org.eclipse.core.expressions.definitions 확장점이 새롭게 소개되었다. 이제 코어 익스프레션을 정의 해두고, 다른 익스프레션에서 참조할 수 있다.

<extension point="org.eclipse.core.expressions.definitions">
    <definition id="org.eclipse.ui.examples.contributions.view.inView">
       <with variable="activePartId">
          <equals value="org.eclipse.ui.examples.contributions.view"/>
       </with>
    </definition>
</extension>

그리고 다른 익스프레션에서:

<activeWhen>
    <reference definitionId="org.eclipse.ui.examples.contributions.view.inView"/>
</activeWhen>

참조된 익스프레션은 이 지점에서 계산된다.

[편집] 참조

  1. 평가코드의 예: 워크벤치 선택에 따라 사용가능하거나 불가능한 경우를 계산하여 메뉴에 적용하는 코드
  2. 모든 IJavaElement들은 IResource.class 어댑터 질의를 받으면, 자바 요소가 포함된 리소스를 리턴한다.
  3. Java 1.5에서는 iterable 객체를 직접 만들 방법이 없었다.
개인 도구
이름공간
변수
행위
포탈
탐색
도움
도구모음