본문 바로가기

프로그래밍/JAVA

[eclipse] Extention Points

플러그인은 플랫폼에 등록되어 지는데 이 정보는 plugin.xml에서 제공했었다. 이때 등록한 정보를 바탕으로 IExtensionRegistry -> IExtensionPoint 를 얻어와 실제 플러그인이 로드되는 구조이다. 따라서, Extension Point 정보가 플러그인의 각 동작을 수행하는 가장 중요한 요소가 된다. 플러그인이 로드되면 플러그인의 시작과 종료를 처리하고, 이러한 라이프사이클에 대해 BundleContex가 정보를 제공하게 된다.


크게 신경쓸 내용은 아닌데 간단히 살펴보면.. 

플러그인 시작시 등록(Registration)과 초기화(Initialization)가 이루어지고, 이때 주어진 BundleContext 를 참조해 시작된 플러그인과 시스템의 플러그인의 정보를 얻게 된다. BundleContext.getBundles()는 시스템의 번들의 배열을 제공하며, BundleEvent는 플러그인의 상태를 제공하게 된다. 종료시에는 사용된 객체들을 정리하는 작업이 진행된다.


BundleActivator 인터페이스에는 플러그인 시작과 중지를 위한 start, stop 메쏘드가 정의되어 있으며, 이를 상속받아 번들 관리 로직등을 구현할 수 있게 된다. 플러그인 프로젝트 생성시 Activator를 생성할 지 묻는데, 이녀석 역시 BundleActivator-Plugin-AbstractUIPlugin 순으로 상속된 녀석이다. 내용을 대충 살펴보면 설정정보나 이미지리스트, 번들 리스너 정도들을 가지고 있다.


뭔소린지도 모르겠고 하니 다시 Extention Point나 알아보자.


plugin.xml을 더블클릭하면, Extensions 탭이 활성화된다. 뭔가 있어 보이지만 결국은 xml 이다.

아래쪽 탭을 보면 Extentions 와 Extention Points 탭이 있는데, Extention Points는 신규로 Extention Point를 만들때 사용하는 것이고, 이미 만들어진 Extention Point를 사용하는 경우는 Extentions 탭에서 작업이 이루어진다.




Hello World 플러그인의 Extentions 정보이다. Extention Point는 org.eclipse.ui.views이고, 그 하위에 Category와 View가 정의되어 있다. Add 버튼을 눌러 Extention Point를 추가하거나 Remove로 제거 할 수 있으며, plugin.xml을 직접 수정해도 된다. 


해당 Extention Point에서 마우스 오른쪽 버튼을 눌러 하위 항목 추가도 가능하다.






org.eclipse.ui.views



구성요소

<category/>

<view/>



<category> 속성

id

name

parentCategory


<view> 속성

id

name

class

category

icon


View 클래스 : ViewPart 상속.







org.eclipse.ui.editors



<editor> 속성

id : editor ID

name : editor 이름

icon : 아이콘

extentions :

class : Editor 클래스

command

launcher

contributorClass

default

filenames

symbolicFontName

matchingStrategy


Editor 클래스 : EditorPart 상속. 

하위 클래스로 AbstractMultiEditor, AbstractTextEditor, CommonSourceNotFoundEditor, FormPage, MultiPageEditor, MultiPageEditorPart 등이 있다.





org.eclipse.ui.commands



메뉴 선택이나 이벤트에 대한 정의로 이루어진다. command 만으로는 원하는 처리가 이루어지지 않으며, defaultHandler 에 핸들러를 등록해야 한다.

구성요소

<command>

<commandParameter/>

<defaultHandler/>

<state/>

</command>



<command> 속성

id

name

category

description

categoryId

defaultHandler

returnTypeId

helpContextId



<commandParameter> 속성

id

name

values

typeId

optional




핸들러 서비스를 통해 커맨드를 직접 호출할 수 있다

IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);

handlerService.executeCommand( "command", null);






org.eclipse.ui.menus



메인메뉴, 툴바 등.

메뉴의 경우 Contribution 설정 후 실제 메뉴를 등록해야 한다. contribution을 통해 해당 메뉴가 어디에 표시될지가 결정된다.


구성요소

<group>

<location/>

</group>

<widget>

<class/>

<layout/>

<visibleWhen/>

<location/>

</widget>

<menuContribution>

<menu>

<command/>

<visibleWhen/>

<control/>

<dynamic/>

<separator/>

</menu>

<toolbar>

<command/>

<visibleWhen/>

<control/>

<dynamic/>

<separator/>

<toolbar/>

<command>

<parameter/>

<visibleWhen/>

</command>

<separator/>

<dynamic>

<class/>

<visibleWhen/>

</dynamic>

<control>

<visibleWhen/>

</control>

</menuContribution>


<group> 속성

id

separatorsVisible



<menuContribution> 속성

locationURI

menu:org.eclipse.ui.main.menu : 메인메뉴

toolbar:org.eclipse.ui.main.toolbar : 툴바

toolbar:viewId : 뷰의 툴바

popup:id : 컨텍스트메뉴, 팝업 메뉴

class

allPopups


<menu> 속성

label

id

mnemonic

icon

tooltip

commandId : 커맨드 id, <command> 요소를 포함하는 경우 필요없음.



<toolbar> 속성

id

label



<command> 속성

commandId

label

id

mnemonic

icon

disabledIcon

hoverIcon

tooltip

helpContextId

style : push, radio, toggle, pulldown

mode




org.eclipse.ui.handlers



구성요소

<handler>

<activeWhen/>

<class>

<enabledWhen/>

</handler>



<handler> 속성

class : 핸들러 클래스

commandId : 연결된 커맨드 ID

helpContextId


Handler클래스 : AbstractHandler 상속

핸들러가 실행되면 execute() 함수가 호출된다. 해당 함수에서 HandlerUtil 클래스를 사용할 수 있다.








org.eclipse.core.runtime.preference



Window>Preferences 선택시 나오는 설정화면과 관련된 확장이다. 화면(UI)은 아래의 preferencePages에서 정의하고, 여기서는 설정 정보에 관련한 내용을 정의한다.


구성요소

<initializer>

<modifier>

<scope>


Initializer 클래스는 AbstractPreferenceInitializer 상속해 구현

modifier 클래스는 PreferenceModifyListener 상속해 구현





org.eclipse.ui.preferencePages



<page> 속성

id

class

name

category



Page 클래스 : PreferencePage 를 상속받아 구현


createContents : UI 요소들을 구현한다.

performApply

performOk

performDefaults 

doGetPreferenceStore : 설정 저장소 얻을때 호출되므로, 저장소에 따라 구현한다.

ex) 플러그인 기본 저장소(Activator)

protected IPreferenceStore doGetPreferenceStore() {

return MyPlugin.getDefault().getPreferenceStore();

}






org.eclipse.ui.newWizards

org.eclipse.ui.importWizards

org.eclipse.ui.exportWizards



위자드는 여러개의 Wizard page들이 Page set으로 구성되고, Wizard Dialog에 표시되는 구조로 이루어져 있다. 클래스로 보면 최상위에 WizardDialog(IWizardContainer), 페이지들을 관리하는 Wizard(IWizard), 각각의 페이지를 나타내는 WizardPage(IWizardPage) 클래스를 사용한다.


구성요소

<primaryWizard/>

<category/>

<wizard>

<description/>

<keywordReference/>

<selection/>

</wizard>



<wizard> 속성

id

name

class

icon

category

project

finalPerspective

preferredPerspectives

helpHref

descriptionImage

canFinishEarly

hasPages



Wizard 클래스 : Wizard 클래스를 상속

createPageControls : 페이지 생성

addPage  : 생성한 페이지를 등록한다.

performFinish : finish 선택시 호출된다.

performCancel : cancel



WizardPage 클래스 : WizardPage 클래스를 상속


기본 모습은 이렇다.



setPageComplete : 다음 페이지로 넘기라고 Wizard에 요청한다.

setPreviousPage : 이전 페이지 버튼이 눌렸음을 Wizard에서 호출한다.



WizardDilog

WizardDialog dialog = WizardDialog( getShell() , new MyIWizard() );

dialog.opne();




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

AES 암호화  (0) 2014.03.27
[OSGi] 서비스 등록 및 해제  (0) 2014.03.21
[eclipse] eclipse 4 platform  (0) 2014.03.17
Annotation  (0) 2014.03.15
[swt] 이벤트  (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
[JAVA TV] 타이머  (0) 2013.12.27
[awt] 이미지 읽기~  (0) 2013.12.17