본문 바로가기

프로그래밍/JAVA

[eclipse] eclipse 4 platform

이클립스 3.x 플랫폼에서는 org.eclipse.ui.views Extention Point를 정의하고, ViewPart를 상속받아 뷰를 구현했다. 뭐 이 구조도 크게 나쁠건 없는것 같은데, 이클립스에서는 이것저것 상속 대상이 많아지는게 비 효율적이라 생각했나 보다. 결국 이클립스가 4.x 플랫폼(이하 e4)으로 넘어가면서 구조가 바뀌었는데, Application model 이라는 녀석을 사용하기로 한 것이다. 더불어 Application 내부의 윈도우, 뷰등은 별도의 상속없이 xmi, DI, @annotation을 사용하게 되었다. (xml의 늪으로 빠져든다...-_-;;;)


기존 PDE 에서 e4 기반 프로젝트를 구성하기 위해서는 이것저것 만져줄 것이 많은데, 이러한 작업을 한 곳에서 도와주는 도구가 있다. 말그대로 E4 TOOLS 이다.


E4 Tools : http://download.eclipse.org/e4/downloads/

(Incubation 단계의 플러그인이라 조만간 이클립스 업데이트에 포함될 듯 싶다)


E4 Tools를 설치하면, 프로젝트 카테고리에 Eclipse 4가 생성되며, e4 기반 프로젝트 및 class, model 관련 wizard가 생성된다.




샘플 프로젝트를 하나 만들어 보자.

File>New>Project...>Eclipse 4> Eclipse 4 Application Project


화면은 기존 Plug-in 프로젝트와 동일하다. 단지 Target Platform이 an OSGi framework 로 고정되어 있다.




기본값들로 선택하면, 프로젝트가 생성된다.

기존 3.x 플랫폼과 다르게 Application.e4xmi , com.sample.test.product 파일이 추가되어 있다.



application model 은 Application.e4xmi 로 정의되어 있는데, 어플리케이션이 시작되면 해당 xmi파일을 읽어 application model을 생성,초기화 작업이 진행된다. Application.e4xmi는 Eclipse 4 model editor를 통해 내용을 살펴보고 편집이 가능하며, 다른 이름으로 변경하고 싶은경우 Extentons(plugin.xml) 파일을 수정하면 된다.


<extension

id="product"

point="org.eclipse.core.runtime.products">

<product

name="com.sample.helloworld"

application="org.eclipse.e4.ui.workbench.swt.E4Application">

<property

name="applicationXMI"

value="com.sample.helloworld/Application.e4xmi">

</property>

</product>

</extension>






뷰 추가하기


Application.e4xmi를 보면 대강 감이 온다.

Application>Windows>Trimmed Window>Controls에 뷰를 하나 넣어보자.




Part 추가 후 오른쪽 Part 속성에서 Class URI 링크를 누르면 New contribution class 팝업이 뜬다.




뷰가 생성되었다. 소스를 보면 참 조촐하다. 상속도 없고, @Inject, @PostConstruct 어노테이션만

붙어있는 메쏘드 2개가 전부이다. 하지만, 기존의 ViewPart와 마찬가지로 생성한 MyViewPart.java에서 Window Builder로 UI 편집이 가능하다. 


Part Annotation 

@Inject

의존성 주입. 플랫폼 내부적으로 객체를 할당해 놓고, 해당 객체의 사용이 필요해지면 injection을 통해 객체를 사용하게 하는데, 해당 객체를 주입하라는 annotation이다.


@Target(value={METHOD,CONSTRUCTOR,FIELD})

@Retention(value=RUNTIME)

@Documented

public @interface Inject


ex)

@Inject

public MyViewPart() {

}




@PostConstruct


@Target(value=METHOD)

@Retention(value=RUNTIME)

@Documented

public @interface PostConstruct


오브젝트 생성 후 UI 구성을 위한 annotation.


@PreDestory

오브젝트가 종료되면 호출되는 메쏘드를 위한 annotation


@Focus

Part 오브젝트가 포커싱 되면 호출된다.


@Persists

@PersistState



메뉴, 커맨드, 핸들러 추가하기

Commands 에서 Command 만들기




Windows>Trimmed Window 속성에서 Main Menu에 체크에 Main Menu 활성화

Main Menu에 Menu추가, Menu에 HandledMenuItem 추가




Windows>Trimmed Window>Handler에 핸들러도 하나 추가한다.


Handler와 HandledMenuItem의 Command에 위에 만든 Command를 지정한다.




핸들러 속성에서 Class URI를 클릭해 핸들러 클래스 생성한다.




@Excute 어노테이션이 붙은 메쏘드를 구현하면, 메뉴 선택시 Command가 호출되고, 해당 Command를 참조하는 Handler 의 @Excute 메쏘드가 호출된다.



MAddon

DI로 사용될 사용자 객체를 만들기 위해서 Addon을 활용할 수 있다. Application model에 Addons항목이 보이는데, 이곳에 일종의 팩토리 클래스를 생성하고, 해당 클래스를 통해 DI에 사용될 객체를 등록하게 된다. 예를 들어 MyData란 객체를 등록하고자 한다면, 일단 Addon을 하나 생성하고 Class URI를 눌러 Addon 클래스를 생성한다.



전체에서 사용가능한 객체는 MApplication의 IEclipseContext에 등록되어야 한다.


public class Test {

@PostConstruct

public void createData( MApplication application ) {

MyData data = new MyData();

application.getContext().set( data.getClass().getName(), data );

}


}


이제 Part 나 다른 context에서 인젝션을 사용할 수 있다.

public class SomePart {

@Inject

MyData data;



// 혹은

@Inject

public void checkData( MyData data ) {

.

.

}

}


기타


URI

연결된 클래스를 지정하거나 리소스를 지정하는데 URI가 사용되는데, 데이터에 따라 아래 형태를 취한다.

클래스 : bundleclass://Bundle-SymbolicName/PackageName.ClassName

리소스 : platform:/plugin/Bundle-SymbolicName/Path/FileName.Extention



활성화된 Part, Shell 이 변경되면 호출.

@Inject

@Optional

public void onActiveShell( @Named(IServiceConstants.ACTIVE_SHELL ) Shell shell ) {

}


@Inject

@Optional

public void onActivePart( @Named(IServiceConstants.ACTIVE_PART) MPart part ) {

}



@Preference(org.eclipse.e4.core.di.extensions)


IEclipsePreference injection

@Inject

@Preference(nodePath="com.sample.test.pref")

IEclipsePreference prefs;


.

.


private void setData( String name ) {

prefs.put("name", name);

prefs.flush();

}



preference data inject to field.

@Inject

@Preference(nodePath="com.sample.test.pref", value="name")

protected String name;




트랙킹

@Inject

@Optional

public void onPreferenceChanged( 

@Preference(nodePath="com.sample.test.pref", value="name) 

String name) {

}



@IEventBroker ( org.eclipse.e4.core.service, org.eclipse.osgi.service )

이클립스 내부 이벤트 처리를 위한 인터페이스

선언

@Inject

private IEventBroker eventBroker;


등록

eventBroker.subscribe( 이벤트 정의 문자열, EventHandler handler );


해제

eventBroker.unsubscribe( handler );


이벤트 전달

eventBroker.post

eventBroker.send


@EventTopic

@UIEventTopic

별도의 핸들러 없이 annotation으로 이벤트 수신 ( 이벤트 브로커의 등록, 해제는 자동으로 이루어짐)

UI 쓰레드에서 이벤트를 받아 처리할때는 @UIEventTopic 사용

@Inject

@Optional

private void onEvent( @UIEventTopic(이벤트 정의 문자열) String s ) {

.

.

}



'프로그래밍 > JAVA' 카테고리의 다른 글

힙 덤프 명령  (0) 2017.02.23
jni 관련~  (2) 2014.04.16
AES 암호화  (0) 2014.03.27
[OSGi] 서비스 등록 및 해제  (0) 2014.03.21
Annotation  (0) 2014.03.15
[swt] 이벤트  (0) 2014.03.14
[eclipse] Extention Points  (0) 2014.03.14
[eclipse] simple plug-in example  (0) 2014.03.13
Apache HttpClient 관련 정리  (0) 2014.03.11
[JAVA TV] MHP 배경이미지 처리  (0) 2013.12.27