확장점은 기능 단위를 느슨하게 결합시키기 위한 메커니즘으로 이클립스 전반에 걸쳐 사용된다하나의 플러그인은 플러그인 내역서(Menefiset.MF)에서 확장점을 선언하며다른 개발자가 사용할

최소한의 인터페이스와 관련 클래스를 노출시킨다다른 플러그인은 확장점에 대한 확장을 선언하고 적절한 인터페이스를 구현하며제공된 클래스를 기반으로 구성 요소를 참조하거나 구축한다.

 

 

<확장점>

<Extension-point

Id="favorites"

Name = "Favorites"

Schema="schema/favorites.exsd"/>

 

 

<third Party Plug-in>

<extension

Point="com.qualityeclipse.favorites.favorites">

<itemType

Name="Workbench File"

Icon=\"icons/type/file.gif"

targetClass="org.eclipse.core.resource.Ifile"

Class="com.qualityeclipse.favorites.model.type.FileFactory"

Id="WBFile">

</itemType>

</extension>

 

 확장점은 플러그인의 식별자와 마침표 뒤에 알파벳,숫자밑줄(_) 이루어진 단순 식별자를 붙여 구성한 유일한 식별자를 갖는다.

확장점을 선언할때는 단순식별자만을 사용한다확장점에 대한 확장을 선언할때는 확장점에 대한 전체 식별자를 사용한다.

 

확장점의 사용되어야할 스키마 정의를 나타내는 exsd

모든 확장점은 확장점이 어떻게 사용되어야 하는지를 정의하는 스키마를 가진다절절한 확장점 사용을 위해 반드시 스키마가 필요한것은 아니지만이클립스 PDE 스키마를 사용해 확장에 대한 기본적인 자동 검증을 수행하고 자동으로 확장점에 대한 Javadoc 느낌의 문서를 생성한다.

스키마는 XML 형식의 파일로 관섭적으로 <extension-point-id>.exsd라는 이름을 사용하며 플러그인 설치 디렉토리의 하위 디렉토리 schema 위치한다.

이클립스 설치 디렉토리/plugins/com.qualityeclipse.favorites_1.0.0/schema/favorites.exsd 같은 위치에 존재한다.

 

확장점 생성

확정점으로 생성하고 싶은 플러그인의 메니페스트 파일에서 확정점 페이지로 이동하여 추가 버튼을 클릭하고 확장점을 생성한다.

<Extension-point

Id="favorites"

Name = "Favorites"

Schema="schema/favorites.exsd"/

위에 설명한   처럼 해당 확장점은 favorites처럼 보이나 실제로는 com.qualityeclipse.favorites.fvorites 같이 길게 확장점을 사용하여야 한다.

 

확장점 스키마(exsd)작성

위의 확장점 생성 마법사가 완료되면 자동으로 schema 디렉토리에 새로 생성될 favorites.exsd 파일을 편집하는 스키마 편집기로 이동된다.

스키마 편집기를 다시 열고 싶을 경우 schema 디렉토리를 찾아 favorites.exsd 파일을 더블 클릭하거나 Favorites 플러그인 내역서에서 확장점을 찾아 마우스 오른쪽 클릭하고

스키마 열기를 선택 하면된다.

 

스키마 편집기는

General Information(일반정보), Extension Point Elements(확장점 요소), Element Grammer(요소 문법), Documentation (문서등의  가지 주요 파트로 구성된다.

 

  1. 확장점 요소 목록은 확장점에 대해 확장으로 나타날 요소와  요소의 연관된 속성을 나타낸다.

 

  1. 요소 문법 목록은 확장에 표현될 XML 요소가 어떻게 나타나야 하는지에 대한 명세를 포함한다.(3.2 이후에는 확장점 요소로 통합 되었다.)
  2. Documentation 영역은 확장점 스키마를 사용해 확장점에 대한 도움말 페이지를 동적으로 생성하여 입력하는 부분이다.

 

 

확장점 요소와 속성

확장점 element 요소는 확장 선언에 나타나는 XML 요소에 대응한다확장점 attribute 요소는 확장 선언에 나타나는 XML 속성에 대응한다.

확장점 attribute 요소는 확장 선언에 나타나는 XML 속성에 대응한다예를 들어 다음과 같은 확장의 경우, itemType 확장점 요소이고 id, name, class, targetClass 확장점 속성이다.

<third Party Plug-in>

<extension

Point="com.qualityeclipse.favorites.favorites">

<itemType

Id="com.example.xyz.myNewFavoriteItemID"

Name="New Favorites Item Name"

targetClass="com.example.xyz.MyObjectClass"

Class="com.example.xyz.MyFavoriteItem"

>

</itemType>

</extension>

 

1. 확장점 attribute 요소는 확장점과 연관된  가지 프로퍼티를 가진다.

이름 Name : 확장 선언에 나타날 속성 이름(itemType id, name, targetClass, Class 모두가 속성 이름이다.)

타입Type : 속성의 타입은 string이나 Boolean  하나를 선택한다현재로서는 스키마 편집기와 PDE에서 인식하는 유형이   가지 뿐이다.

사용Use :  속성이 required 확장에 반드시 선언해야 하며 optional 결우 확장 선언에서 빼도 무관하다또는 default 선언하면 확장에 명시적으로 선언되지 않을

2. 경우 value 프로퍼티에 명시된 값을 기본으로 적용한다.

유형Kind : Type 프로퍼티가 string이면  프로퍼티 문자열을 어떻게 해석할지를 지정한다확장점 코드에서 자바 클래스이미지에대한 리소스 경로단순 문자열 등으로 해석   있다.

기반Based On : Kind 속성이 java 경우에  프로퍼티는 속성에서 상속 받거나 구현해야  클래스나 인터페이스의 완전 수식명을지정한다.(이클립스 3.2 이상부터는  프로퍼티를 Extend Implement 구분했다.)

Restriction : Type string이고 kind string이면  프로퍼티는 속성의 값으로 사용 가능한 문자열의 목록을 지정한다예를 들면 필드를 사용해서 속성값이 one, two, three  하나만 가능하게   있다.

변환 가능Translatable :  속성이 사람이 읽을  있는 것인지아니면 변환해야 하는지 여부를 지정한다.

기본값Value : Use 속성을 default 지정했다면 확장 속성의 값을 명시적으로 지정하지 않았을  기본으로 지정될 기본 값을 설정한다.


 

※주의 사항 : 확장점을 범용 목적으로 작성한다면 확장의 늦은 초기화를 지원할 계획을 세움으로써 다른 플러그인의 추가 로딩으로 인해 메모리를 과도하게 사용하거나

시스템이 느려 지는 일이 생기지 않도록 해야한다. targetClass 같은 명세가 주어져 있지 않을 경우 해당 클래스로 동작을 해야  경우 마다 계속해서  모든 플러그인들을

로드 해야하는 경우가 발생할  있다.

 

확장은 어떻게 확장점에 동작 구현을 제공할까?

확장이 인터페이스를 구현하거나 추상 기반 클래스를 상속 받아야 하는가인터페이스를 구현하는 확장을 요구한다면 확장 개발자가 유연하게 확장을 구현   있다.

반면 인터페이스가 변경되면 기존 확장이 모두 동작하지 않게   있다추상 기반 클래스를 상속 받는 확장을 요구한다면 느슨한 결합의 장점을 유지하면서 유연성을

어느정도 확보   있다추상 기반 클래스에 메소드를 추가해도 기존 확장은 동작을 멈추지 않으므로 확장 개발자의 유연성을 크게손해 끼치지 않는다.

-> 결론은 인터페이스로 정의  경우 수정될 때마다 문제가   있으므로 추상 클래스를 사용할 .

 

확장점 요소를 정의한 다음에는 요소 구성 방법을 기술하는 요소 문법을 정의한다요소 문법은 PDE 요소를 검증할   사용한다왼쪽의 확장점 요소를 하나 선택하면

Element Grammer 출력된다.

 

 

확장점 구현 코드

확장점을 정의한 다음에는 새로 정의한 확장점에 대한 확장에서 선언하는 정보에 따라 Favorites 항목 유형과 Favorites 객체를 구성하는 코드를 작성해야 한다.

늦은 초기화라는 이클립스 원리를 따르면서 더불어 메모리 사용량을 낮추기 위해  Favorites항목 유형과 해당 플러그인은  필요할 때만 로딩 해야한다.

그렇게 하기 위해서는 확장될 때 사용되는 class 메소드등의 리팩토링이 필요하다.

 


여기서 나오는 예제의 FavoriteItemType 확장점에 사용되는 Class 명이다.

FavoriteItemType 대해  번째로 수정할 사항은 항목 유형 인스턴스를 클래스코드에서 상수로 직접 확장하는 대신 확장 정보로부터  클래스의 인스턴스를

생성하게 하는 것이다. TYPES 배열의 이름을 cachedTypes 변경해서  필드의 목적을 좀더 정확한 의미로 표현하게 한다또한 getType() 메소드를 수정해 

확장마다 FavoriteItemType  인스턴스를 생성하도록 한다.

    ToolBarManager manager = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL);
    
LabelContributionItem labelItem = new LabelContributionItem("myLabelId");  //Label ContibutionItem 생성
    manager.add(labelItem);
    
TextContributionItem textItem = new TextContributionItem("myTextId");
    manager.add(textItem);
    
ToolBar toolbar = manager.createControl(parent);
    
return toolbar;

 

출처: <http://stackoverflow.com/questions/28900682/what-is-the-proper-way-to-add-custom-controls-to-the-eclipse-toolbar-using-work>

 public Point getCenterPoint() {
                Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
                Rectangle shellBounds = parentShell.getBounds();
                return new Point(shellBounds.x + shellBounds.width / 2, (shellBounds.y + shellBounds.height) / 2);
        }

Then simply override the getInitialLocation method of Dialog;

        @Override
        protected Point getInitialLocation(Point initialSize) {
                Point shellCenter = getCenterPoint();
                return new Point(shellCenter.x - initialSize.x / 2, shellCenter.y - initialSize.y / 2);
        }

 

출처: <https://sureshkrishna.wordpress.com/2007/09/05/make-your-eclipse-dialogs-and-messages-to-cetre-of-screen/


1. GEF(Graphical Editing Framework)?

 말그대로 framework. 그래픽 쪽을 다루기 위한 framework. 모델을 그래픽적으로 다룰 때 쓰는 것. 기본적으로는 MVC(Model - View - Controller) 체제에 맞추어져 있다. 어떠한 정보들은 Model이 갖고 있고, 그것을 화면에 보여주는 역할을 하는 것은 View 쪽에서, 관리하는 것은 Controller 쪽에서 하는 형식이다 각 부분별로 다음 부터 보자.

 

2. Model

GEF 에서의 Model 은 기본적으로 Object 형으로 처리한다.

그리고 모델은 항상 최상위 모델의 child 관계로 존재해야 한다. 예를 들면 최상위 모델을 보여주는 화면의 배경이라고 하면, 모든 모델은 이 배경의 child 로 존재해야 하는 것이다. 또한, Model의 변경을 Controller 에 알려주기 위해서 Listener를 구현할 필요가 있다.

 

 3. View

GEF 에서의 View 는 GEF에 포함되어 있는 draw2d 나 SWT 를 사용해서 구현한다.

 

 

 4. Controller GEF에서는 controller 부분을 EditPart 를 사용해서 구현한다. Contoller는 기본적으로 Model 과 View를 관리하는 역할을 하기 때문에 이와 관련된 부분이 존재한다. 그 중에 하나는 Model과 Controller를 연결하는 EditPartFactory이다. 또한, EditPolicy라는 것이 있는다. 이것은 EditPart에 install 되어서, Command(org.eclipse.gef.commands.command)를 이용해서 EditPart의 동작을 결정한다. Controller에서 하는 일들을 대략적으로 설명하면, user에 의해 model 의 변경이 요청이 들어온다. 이러한 요청은 Request(org.eclipse.gef.Request) 형태로 처리가 된다. 그러면 이러한 Request 형태를 갖고, EditPart는 자신에게 install 되어 있는 EditPolicy를 검토한다. EditPolicy중에 적합한 EditPolicy 를 선택하고, 이 EditPolicy 과 command(org.eclipse.gef.commands.command) 형태로 변경 명령을 내리면, model 변경이 반영되는 것이다.


JFace Dialog에서 레이아웃 설정으로 버튼 바 숨기기


protected void createButtonsForButtonBar(final Composite parent)

{

  GridLayout layout = (GridLayout)parent.getLayout();

  layout.marginHeight = 0;

 

}

+ Recent posts