블로그 이미지

GUEST

eclipse 2012. 9. 5. 13:44

eclipse javascript 개발 plugin - VJET

주화입마로 인해 중단했던 nodejs를 다시 한 번 끄적여 보려고 한다. 

사용할 도구를 고르는 것은 또다른 개발의 기쁨. javascript 개발 환경을 찾다가 발견한 것이 VJET이다.


0. 소개

홈페이지는 여기

eBay Open Source 라는 곳도 있구나. eBay내에서 사용된 기술을 공동의 이익을 위해 오픈소스화하는 것이 목적이란다. 좋은 마인드. 일종의 사회 환원일 수 있겠다. 암튼 고맙다. 잘 쓸께~


1. 설치

- eclipse market에서 VJET으로 찾아 설치.

- New > Project 선택해서 검색창에 VJET 으로 찾으면 VJET project가 나온다. 선택. project 생성.


==> 여기서 js파일 만들고 require('http') 입력하면 노란줄 생긴다. nodejs의 library를 인식 못하는 것이다.

설치 문서에 보면, "Importing VJET JavaScript Type Libraries" 항목이 있다. 

VJET이 인식할 수 있도록 javascript library를 프로젝트의 형태로 제공하는데, 이 프로젝트들을 필요에 따라 import한 후, 먼저 생성한 VJET 프로젝트의 build path에 추가해야 한다. 


다음과 같은 javascript library를 지원한다.

  • NodeJS
  • jQuery
  • jQuery 모바일
  • Dojo
  • JSON
  • Canvas

- NodeJS를 다운. zip형태이므로 eclipse에서 File > Import > Existing project into WorkSpace > Select archive File 선택하고, 다운받은 NodejsTL.zip을 찾아 지정한다.
먼저 생생한 VJET 프로젝트를 우클릭하여 Properties > VJET > VJET Build Path > Projects > Add > NodejsTL을 선택한다. 

이렇게 하면 nodejs의 library를 인식하고 code assistant기능을 사용할 수 있다.




,
eclipse 2010. 10. 18. 17:21

ATF jsEvalView

ATF에는 Firebug처럼 javascript를 입력해서 실행시킬 수 있는 view가 있다.
어떤 방식으로 작동하는지 살펴보자.

view에 대응하는 page객체는 JSEvalPage이다.
createControl() 에서 화면요소를 구성하고, 하단에서 아래처럼 document와 통신할 부분을 초기화해준다.

evaluator.init(webBrowser.getDocument());

Evaluator class의 객체 evaluator의 init() method에서 javascript가 evalute되는 과정은 다음과 같다.

1) EVAL_READY, EVAL_DONE, EVAL_ERROR event에 대한 eventhandler를 document에 등록한다.
    EVAL_READY - ATF_Eval.js가 document dom tree에 추가되면 ATF_Eval.js에서 호출.
    EVAL_DONE - ATF view에서 javascript + enter 입력하고 javascript가 실행된 후에 호출.
    EVAL_ERROR - javascript실행 중 error가 나면 호출.


2) ATF_Eval.js를 읽어들여 document HEAD에 붙인다.
   ATF_Eval.js에 있는 function객체는 "___ATF_INTERNAL__EVAL" id로 등록된다.
   ATF_Eval.js는 loading되면 init()을 실행한다.
   init()에서는 display:none 으로 DIV를 생성하여 INPUT, TEXTAREA를 만들어 붙인 후,
   ATF_EVAL_READY 이벤트를 발생시킨다. 
   Evaluator에서는 이벤트핸들러 handleEvalReady()가 작동하여 아래처럼 INPUT의 참조자를 얻어온다.

   protected void handleEvalReady(nsIDOMEvent event) {
evalIn = (nsIDOMHTMLInputElement) event.getTarget().queryInterface(
nsIDOMHTMLInputElement.NS_IDOMHTMLINPUTELEMENT_IID);
        // no longer need this listener
event.getCurrentTarget().removeEventListener(EVAL_READY, listener, true);
   }

   
3) 입력 component를 만들고 enter에 대한 eventhandler를 붙인다.
   enter가 발생하면 view의 입력창에 있는 String(eval에서 실행할 javascript구문)을 ATF_Eval.js에서 만든 INPUT에 value로 할당하고 EVAL_SET event를 발생시킨다. 
   ATF_Eval.js에서는 EVAL_SET event의 eventhandler로 eval을 실행해 준다.


4) ATF_Eval.js의 function eval()은 evaluate()실행 후, 결과를 받아 TEXTAREA영역에 출력하고 "ATF_EVAL_DONE" event를 발생시킨다. 
   Evaluator 객체의 init()에서 등록한 EVAL_DONE event의 eventhandler가 이를 처리하는데, 
   이 결과를 화면에 보여주기 위한 과정을 살펴볼 필요가 있다.


ATF의 jsEvalView에서 javascript를 입력하고 enter를 치면 Evaluator객체의 evaluate(..)함수가 실행된다. 
evalute(..) 함수는 "EVAL_SET" event를 발생시키기만 하는데 evalRet(evaluate result)를 return한다.
어떻게 된 것일까? 
아래 코드를 보자.

// setting the input node as the target tells the JavaScript to do an
// eval with the target node as context
nsIDOMEventTarget target = (nsIDOMEventTarget) node
.queryInterface(nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID);
target.dispatchEvent(event);

// since this is all single threaded through the UI thread, control is
// passed to the page side
// and returns back to the Java side handler which sets evalRet. At the
// end, it all returns
// to this point.
return evalRet;

single thread이므로 dispatchEvent 이후에 제어가 UI, 즉 javascript - ATF_Eval.js 로 넘어간다. 
ATF_Eval.js에서는 evaluate()후에 ATF_EVAL_DONE event를 발생시킨다.
ATF view의 이벤트핸들러(Evaluate의 handleEvalDone())가 결과를 evalRet에 할당하게 된다.
ATF의 jsEvalView에서, enter이후 결과를 받기까지 과정이 single thread하에서 순차적으로 일어나는 것이다.


   







,
eclipse 2010. 10. 1. 16:02

ATF 설치시 주의사항 - 01

# ATF 설치 순서

1. Xulrunner, Xpcom이 먼저 설치된다.
   통합된 Mozilla Xpcom update site는 문제가 있으므로  Zend에서 1.9.1을 받아서 먼저 설치하고,
   ATF update site에서는 ATF만 받는다.

2. hard binding
   Xulrunner와 Xpcom 1.9.2를 만들어 먼저 설치한 후, ATF를 설치하면 아래와 같이 에러가 난다.

Cannot complete the install because one or more required items could not be found.
  Software being installed: AJAX Tools Framework Webtools Integration (Incubation) 0.3.0.v201006041600-15-7zCN3GbYINYP5NiDOfPM (org.eclipse.atf.feature.feature.group 0.3.0.v201006041600-15-7zCN3GbYINYP5NiDOfPM)
  Missing requirement: Mozilla Browser Xulrunner embedder 0.3.0.v200909041100 (org.eclipse.atf.mozilla.swt.browser 0.3.0.v200909041100) requires 'bundle org.mozilla.xulrunner 1.9.1' but it could not be found
  Cannot satisfy dependency:
    From: AJAX Tools Framework Webtools Integration (Incubation) 0.3.0.v201006041600-15-7zCN3GbYINYP5NiDOfPM (org.eclipse.atf.feature.feature.group 0.3.0.v201006041600-15-7zCN3GbYINYP5NiDOfPM)
    To: org.eclipse.atf.mozilla.ide.feature.feature.group [0.3.0.v201006041600-17K-DZRDIVE2KhCNeOL]
  Cannot satisfy dependency:
    From: AJAX Tools Framework Mozilla IDE (Incubation) 0.3.0.v201006041600-17K-DZRDIVE2KhCNeOL (org.eclipse.atf.mozilla.ide.feature.feature.group 0.3.0.v201006041600-17K-DZRDIVE2KhCNeOL)
    To: org.eclipse.atf.mozilla.swt.browser [0.3.0.v200909041100]

org.eclipse.atf.mozilla.swt.browser 플러그인이 Xulrunner를 찾는데, 버전이 명시되어 있기 때문에 문제가 발생한다.
org.eclipse.atf.mozilla.swt.browser 플러그인은 다른 ATF 플러그인들과 달리 (MANIFEST.MF) dependancy에 Xulrunner의 번들 버전을 명시하고 있다.

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.atf.mozilla.swt.browser; singleton:=true
Bundle-Version: 0.3.0.qualifier
Bundle-Vendor: %Bundle-Vendor
Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime,
 org.mozilla.xpcom,
 org.mozilla.xulrunner;bundle-version="1.9.1"
Fragment-Host: org.eclipse.swt;bundle-version="[3.5.0,4.0.0)"
Bundle-RequiredExecutionEnvironment: J2SE-1.4
Eclipse-LazyStart: true

그러므로 1.9.1을 먼저 설치하고 ATF를 설치한 후, 1.9.2를 update한다.
설치순서 : zend(1.9.1) -> ATF(0.3.0) -> zend(1.9.2)


cf) Mozilla에서 Xulrunner,Xpcom은 1.9.2.10까지 나와 있는데, eclipse용으로 배포하지는 않으므로 eclipse 플러그인으로 제작한 후, feature를 이용해 배포해야 한다.

cf) 실제 eclipse SWT에서 Mozilla를 사용하는 부분은 ATF와 밀결합되어 있는 흔적이 보인다.




# ATF와 SWT의 밀결합 요소
atf.cvs.psf를 이용하여 ATF 소스를 받아 설치되는 plugin들 중에 org.eclipse.atf.mozilla.swt.mozilla을 열어보자.
소스는 XULRunnerInitializer 달랑 한 개 있다. 문제가 되는 것은 package - org.eclipse.swt.browser 이다.
ATF에서 배포하는 플러그인이 왜 eclipse swt package를 사용하는 걸까?

*XULRunnerInitializer의 작동

XULRunnerInitializer는 static method initialize와 log 두 개로 구성된 class이다.
initialize는 static영역에 등록되어 있으며
Plugin으로 등록된 번들들을 뒤져 xulrunner를 찾은 후, System Property로 등록하는 일을 한다.
xulrunner 번들을 찾을 때, 

org.mozilla.xulrunner,
org.mozilla.xulrunner.win32.win32.x86, 
org.mozilla.xulrunner.carbon.macosx,
org.mozilla.xulrunner.gtk.linux.x86

와 같은 이름을 찾는다. 이 중, org.mozilla.xulrunner는 1.8 버젼에서 사용하는 relic이므로 사용하지 않도록 하자.
그럼, window일 경우 org.mozilla.xulrunner.win32.win32.x86, mac일 경우org.mozilla.xulrunner.carbon.macosx, 리눅스일 경우 org.mozilla.xulrunner.gtk.linux.x86 라는 이름의 폴더가 eclipse/plugin/ 밑에 존재해야 한다.

jar로 배포된 후, 위와 같은 이름의 폴더로 압축이 풀려야 한다는 것을 주의하자.

for (int i = 0; i < bundles.length && url == null; i++) {
Bundle bundle = Platform.getBundle(bundles[i]);
if (bundle != null)
url = bundle.getResource("/xulrunner");
}

위와 같이 번들을 찾는데 jar로 남아 있는 것은 찾지 못한다. 또한 폴더 밑에 xulrunner 폴더가 있어야 하는 것을 알 수 있다.
정상적으로 번들을 찾으면 

if (xulRunnerRoot != null) {
System.setProperty(XULRUNNER_PATH, xulRunnerRoot.getAbsolutePath());
}

위와 같이 System Property로 등록이 된다.



한편 SWT의 Mozilla를 보자.

new Browser(parent, SWT.MOZILLA);

와 같이 SWT에서 mozilla 브라우저 component를 생성할 때, 실제 생성을 책임지는 class는 Mozilla.java이다.

Mozilla.java의 작동을 살펴보자.

String mozillaPath = System.getProperty (XULRUNNER_PATH);
/*
* Browser clients that ship XULRunner in a plug-in must have an opportunity 
* to set the org.eclipse.swt.browser.XULRunnerPath system property to point
* at their XULRunner before the first Mozilla-based Browser is created.  To
* facilitate this, reflection is used to reference non-existent class
* org.eclipse.swt.browser.XULRunnerInitializer the first time a Mozilla-
* based Browser is created.   A client wishing to use this hook can do so
* by creating a fragment of org.eclipse.swt that implements this class and
* sets the system property in its static initializer.
*/
if (mozillaPath == null) {
try {
Class.forName ("org.eclipse.swt.browser.XULRunnerInitializer"); //$NON-NLS-1$
mozillaPath = System.getProperty (XULRUNNER_PATH);
} catch (ClassNotFoundException e) {
/* no fragment is providing this class, which is the typical case */
}
}

먼저 System Property에서 XULRUNNER_PATH를 찾는다. 주석에서 알 수 있듯이, 브라우저가 처음 초기화되기 이전에, 별도로 (자체)생성한 XULRunnerInitializer 클래스를 만들어, static영역에서 XULRUNNER_PATH를 등록할 것을 권하고 있다.

ATF의 XULRunnerInitializer가 static영역에서 이를 등록했고, SWT는 이를 가져다 쓰게 된다. 이 후, initXULRunner(), initXPCOM() 등을 호출하여 XPCom까지 불러온다.

# nsIWebBrowser
XPCom을 사용할 준비가 완료되면 아래와 같이 실제 browser 객체를 생성한다.

/* create the nsIWebBrowser instance */
nsID NS_IWEBBROWSER_CID = new nsID ("F1EAC761-87E9-11d3-AF80-00A024FFC08C"); //$NON-NLS-1$
rc = componentManager.CreateInstance (NS_IWEBBROWSER_CID, 0, nsIWebBrowser.NS_IWEBBROWSER_IID, result);
if (rc != XPCOM.NS_OK) {
browser.dispose ();
error (rc);
}
if (result[0] == 0) {
browser.dispose ();
error (XPCOM.NS_NOINTERFACE);
}
webBrowser = new nsIWebBrowser (result[0]);
result[0] = 0;

org.eclipse.swt.internal.mozilla 패키지에 있는 nsIWebBrowser는 nsISupports를 상속하고,
mozilla XPCOM API에 있는 nsIWebBrowser 명세를 구현하고 있다. 

cf) swt의 internal.mozilla  패키지는 XPCOM 관련 부분의 구현체인 것으로 보이는데, 이렇듯 Mozilla의 XPCOM명세를 eclipse SWT에서 구현하고 있다는 사실이 흥미롭다. 좀 더 연구가 필요하다. 
또한, Mozilla.java를 보면, AWT의 Browser 관련 부분에 대한 작동 원리를 이해하는데 많은 도움이 될 것이다.




,
eclipse 2010. 9. 28. 17:06

feature, update site

eclipse rcp product에서 plugin을 만들고 배포하는 법.

 - eclipse FAQvogella.de를 참고.


xpcom과 xulrunner 배포.
xpcomjava의 eclipse plugin 배포 url은 mozilla ftp 사이트zend의 것이 있다. 
mozilla ftp사이트에는 1.8대 version, zend에는 1.9.1이 올라와 있다.


eclipse plugin istall 메뉴에서 zend의 것을 올리면, 
  Mozilla XPCOM for Java - 1.9.1
  Mozilla Xulrunner - 1.9.1 

두 개가 보인다. 위의 것은 Xpcom의 java interface이고, xulrunner는 실제 xpcom파일들(lib, exe 등)을 설치한다. 


eclipse ATF에서의 xpcom과 xulrunner 배포.
eclipse ATF는 mozilla xulrunner를 필요로 하는데, ATF plugin을 설치할 때 xpcom과 xulrunner를 같이 제공한다. 

ATF 사이트에서는 ATF install시에 자동으로 XULRunner 플러그인을 다운받아 설치한다고 되어 있다.(참고)
실제로 ATF plugin을 update site로 설치해 보면, 


위와 같이 Mozilla XPCOM for Java, Mozilla Xulrunner를 기본 포함하고 있음을 확인할 수 있다.
참고로, zend를 이용하여 Xulrunner만 살치한 후에 ATF를 설치하려고 하면, Mozilla Xulrunner가 보이지 않는다.

cf) ATF를 설치할 때 버전 관련 에러가 날 수 있는데,  이는 ATF에 들어있는 xpcom 관련 파일들이 1.8 버전대로부터 update를 요구하기 때문이다. 현재 1.8 버전대로부터 설치하여 update를 할 수 있는 방법을 못 찼았다.
zend 사이트로부터  xpcom 파일들을 먼저 설치하고 ATF 관련 파일들만 설치하도록 하자.

Xulrunner version up
Xulrunner는 현재 1.9.2.10까지 나온 것을 확인했다. 그러나 xulrunner와 xpcom for java만 있고, eclipse를 위한 배포버전을 찾을 수 없다. eclipse에서 1.9.2 버전을 사용하려면 xulrunner sdk를 다운받아 exe로 regstry 등록을 한 후, classpath에 MozillaGlue.jar와 MozillaInterfaces.jar를 등록해 사용하면 된다. (참고)

현재 버전의 ATF와 1.9.2를 같이 사용하려면 어떻게 해야 할까. 
ATF UI package들은 org.mozilla.xpcom 패키지 이름을 통해 xulrunner를 사용하고 있다. 
xulrunner 1.9.2를 org.mozilla.xpcom 이름을 가진 plugin으로 말아서 배포하면 ATF에 xulrunner를 version up하여 인식시킬 수 있다.








,
eclipse 2010. 9. 14. 13:26

eclipse SourceViewer

SourceViewer는 jface에서 제공하는 viewer 객체들 중 한 가지이다.
TextViewer를 상속하고 ISourceViewer를 구현한다.

TextViewer의 기능 외에 아래와 같은 기능을 제공(구현)한다.

visual annotation
visual indication
management of text viewer add-ons
explicit configuration





,
eclipse 2010. 9. 13. 14:59

eclipse selection service

eclipse의 editor나 view에서 selection이 발생했을 경우, selection event를 workbench를 통해 다른 view나 editor에 전달할 수 있다.

1. event provider

1.1 ISelectionProvider 구현

org.eclipse.jface.viewers.ISelectionProvider interface를 구현해야 한다.
구현할 method는 아래와 같다.

public void addSelectionChangedListener(ISelectionChangedListener listener) 
public ISelection getSelection() 
public void removeSelectionChangedListener
public void setSelection(ISelection selection)

event를 발생시키는 part에서는 스스로를 provider로 workbench에 등록시킨다.

getSite().setSelectionProvider(viewer);


TreeViewer와 같이 eclipse가 selection provider로서 구현하여 제공하는 control을 사용하여 selectionProvider의 인자로 등록한다면 ISelectionProvider를 구현하지 않아도 된다.
그러나 SelectionProvider를 구현한다면, 

new ListenerList() 하여 listener들을 담을 객체를 만들고, addSelectionChangedListener에서 add(listener)를 해 주고, removeSelectionChangedListener에서는 remove(listener)을 해 준다.

listener들에게 event 를 전파할 때는 ListenerList를 loop를 돌며 selectionChanged(event)를 호출해 준다.

public void fireEvent(final SelectionChangedEvent event ){
Object[] listeners = selectionListeners.getListeners();
for (int i = 0; i < listeners.length; ++i) {
final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
SafeRunnable.run(new SafeRunnable() {
public void run() {
l.selectionChanged(event);
}
});
}
}





2. event listneer
event를 수신하는 part는 아래와 같이 event listener로 등록한다.

getSite().getPage().addSelectionListener(this);
getSite().getWorkbenchWindow()
.getSelectionService().addSelectionListener(this));


,
eclipse 2010. 8. 27. 19:30

eclipse atf selection event handling

eclipse atf는 중심이 되는 MozBrowserEditor와 대여섯개의 view, 그리고 debug perspective로 구성된다.

editor와 view들은 각각 selection event를 전파(provide)하거나 구독(listen)한다.
editor와 특정 view들은 provider이면서 listener이기도 하다.

provider가 되기 위해서는 ISelectionProvider를, listenr가 되기 위해서는 ISelectionListener를 구현한다.
(eclipse의 selection event mechanism은 여기를 참조)


ISelectionListener vs. ISelectionChangedListener

일반적으로 view나 editor가 event를 청취하려면 ISelectionListener를 구현하고, event provider에게 등록한다.
구현할 method는 public void selectionChanged(IWorkbenchPart part, ISelection selection) 이다.

그럼 ISelectionChangedListener는 뭘까?
view를 만들 때 PageBookView를 상속하면, active되는 part가 변경될 때, view 안에 page만 갈아끼워서 자원의 낭비를 줄이는 이점이 있다.  이는 part가 activated될 때, view에서 상응하는 page를 보여줄 것인지를 물어보는 식으로 작동한다.

ex)
protected boolean isImportant(IWorkbenchPart part) {
return part instanceof IEditorPart;
}

실제 보여질 UI(SWT control)와 내용은 page가 만들게 된다.
page는 Page를 상속받고 createControl(Composite parent) 안에서 UI와 내용을 엮게 된다. 
(ContentProvider와 LabelProvider를 알 필요가 있다.)
사실, eclipse에서 사용하는 UI의 패턴이 몇 개 되지 않고(
TreeViewer, TableViewer, TableTreeViewer 등
), 대부분 jface에서 제공하는 것을 사용하게 된다.

이 Viewer들은 ISelectionProvider를 구현하고 있어, view에서 발생하는 selection event에 대한 provider역할도 해 준다.

page에서는 Viewer.addSelectionChangedListener(this)를 호출하여 
page를 event의 청취자로 등록할 수 있다. 
다만, 이 때 page는 ISelectionChangedListener을 구현한다.

ex)
public void selectionChanged(SelectionChangedEvent e) {
...
}

ISelectionChangedListener는 page내의 widget에서 발생한 event를 page가 받아서 handling하기 위해 쓰인다. 인자가 event 하나 밖에 없으므로 widget이 여러 개 있을 때는 event.getSource()를 통해 event를 발생시킨 widget이 어디인지 확인한다.


cf) Viewer들은 ISelectionProvider를 구현하고 있다. 그러므로,
public void createControl(Composite parent) {
   ...
   getSite().setSelectionProvider(treeViewer);
   ...
 }
와 같이 eclipse Selection mechanism에 provider로 등록할 수 있다.
이 때는  
     같은 Site를 공유하면서 
ISelectionListener를 구현하는 
모든 view, editor, page등에게 
event가 전파된다.

ISelectionListener를 구현한 청취자의 경우를 보자.
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
     ...
}
와 같이 event handler를 구현할 때,
인자로 part를 받으므로 어떤 Part(viewpart or editorpart)에서 온 것인지 확인할 수 있고,
selection을 통해, 어떤 widget이 일으킨 event인지 알 수도 있다.



DOMInspectorView를 예로 들어, 
atf에서 처리한 기법을 보자.
DOMInspectorView는 BrowserBoundView를 상속받는다. BrowserBoundView의 doCreatePage(part)를 보자.
protected PageRec doCreatePage(IWorkbenchPart part) {
...
return new PageRec(part, page);
}
doCreatePage는 PageBookView에서 정의하였고, 
doCreatePage를 통해 PageRec 객체를 얻는다.

PageBookView는 pageRec객체에서 page를 얻고, page에서 site를 얻어내고, site로부터 다시 selectionProvider를 얻는다.

slectionProvider.addSelectionChangedListener( PageBookView_Inner_ISelectionChanedLister )

selectionProvider로 page객체가 등록되었으면 (또는 page 내의 widget VIewer들)
page객체의 addSelectionChangedListener가 호출되고, PageBookView를 상속한 View part가 청취자로 등록되는 것이다. 
PageBookView 안에는 ISelectionChangedLister를 구현하는 anonymous class가 존재한다.


DOMInspectorPage에서는 selectionChanged 때마다 청취자 list를 돌면서 아래와 같이 selectionChanged(event)를 호출해 준다.

protected void fireSelectionChanged(final SelectionChangedEvent event) {
Object[] listeners = selectionListeners.getListeners();
for (int i = 0; i < listeners.length; ++i) {
final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
SafeRunnable.run(new SafeRunnable() {
public void run() {
l.selectionChanged(event);
}
});
}
}

위와 같이 호출할 때, eclipse Selection mechanism에 의해 SelectionChangedEvent(part, selection) event를 일으켜 준다. (AbstractTreeViewer참조)

결국, ISelectListener를 구현한 part( Editor, View 등)에서도 selectionChanged(part, selection) 함수가 호출된다. part를 출력해 보면 page(DOMInspectorPage)가 들어있는 ViewPart가 나온다.

event handler를 상속받아 구현하지 않고 직접 호출할 때에는 event 객체를 직접 만들어야 하는데, 이 때는 event를 제어할 수 있는 이점이 있다.

protected IDOMNodeSelection selection = new IDOMNodeSelection() {
...
}
fireSelectionChanged(new SelectionChangedEvent(this, this.selection));
와 같이 selection event를 직접 만들고, 

Class MyEditor implements ISelectionListener{

  public void selectionChanged(IWorkbenchPart part, ISelection selection) {
     ...
     if (selection instanceof IDOMNodeSelection) {
     ...
     }
  }

}

event handler에서 event type에 따라 작동을 제어할 수 있다.










 
,
eclipse 2010. 8. 17. 16:42

eclipse perspective

eclipse 메뉴 > window > Open perspective 밑으로 java, debug, cvs 등 다수의 perspective를 확인할 수 있다.
perspective는 eclipse의 작업을 구분짓는 단위이며 workbench의 page가 생성될 때 page layout을 배치한다.
(resource는 eclipse platform의 perspective이다.)

별도의 perspective를 만들려면
plugin.xml에서 org.eclipse.ui.perspectives extention point를 확장하고, 
해당 class는 org.eclipse.ui.IPerspectiveFactory를 구현한다.

IPerspectiveFactory의 method createInitialLayout(IPageLayout layout)를 구현할 때, page의 layout을 구성하게 된다.

,
eclipse 2010. 8. 17. 10:57

eclipse workbench

으례 보는 eclipse 화면에는 상단에 menu, toolbar가 있고 중앙에 editor와 view들이 있다. 
이렇게 menu들과 editor, view들로 구성된 단위를 workbench라고 한다. view는 editor에 종속적이며, 한 단위로 움직인다. editor+view를 page라고 한다. 즉, 

workbench = menubar + toolbar + page(=editor + view) 

와 같이 구성된다.

workbench(와 editor, view)에는 partsite가 있다. 
part는 visual component, 즉 swt 객체와 관련된 부분이다. IWorkbenchpart interface로 정의되며, IViewpart와 IEditorPart가 이를 상속한다. workbench part가 생성되는 과정은 다음과 같다.

Lifecycle of workbench
* part extention is created
  a. instantiate the part
  b. create the part site
  c. part.init(site)
* when visible in the workbench
  a. part.createControl(parent)
  b. fire partOpend event to all listeners
* when part is activated or gets focus
  a. part.setFocus()
  b. fire partActivated event to all listeners
* when part is closed
  a. doSave or return cancel
  b. deactive part
  c. fire partClosed event to all listeners
  d. controls are disposed on SWT widget tree
  e. part.disclose()


workbench에서 part 객체를 생성하고, site를 만들어 part를 초기화한다.

part객체가 visible하게 되면 createPartControl(Compsite parent)를 호출한다.
createPartControl은 parent밑에 control을 만든 후 layout을 조정한다.
site 객체에 각종 global action, context menu과 selection provider를 등록한다.

workbench 객체로부터 site를 얻으면, 이를 통해 workbench에 등록되어 있는 page(editor, view), selection provider 등을 얻을 수 있다. 

editor와 view에도 site가 있다. editorsite에서 contextmenu와 actionbar를, viewsite로부터 actionbar를 얻을 수 있다. 
결국, site는 객체와 객체 외부의 인터페이스 역할을 한다.



,
eclipse 2010. 8. 17. 09:18

eclipse editor

eclipse화면은 editor와 여기에 연관된 view들로 구성된다.
 
editor는 IEditorPart를 구현해야 하는데 EditorPart가 기본 구현체이다. 실제 eclipse ide에서 editor를 만들 때는eclipse에서 제공하는 TextEditor나 MultiPageEditorPart를 상속받아 구현한다.
IEditorPart는 IAdaptable을 상속받기 때문에 eclipse의 adaptor 메커니즘을 사용할 수 있다. (getAdapter(class)를 구현해야 한다.)

editor를 초기화할 때 site와 input객체가 필요하다. 실제로는 workbenchpage가 openEditor(IEditorInput input, String editorId)에서 editor에 input을 넘겨준다.

IEditorPart의 메소드는 다음과 같다.
IEditorInput getEditorInput()
IEditorSite getEditorSite()
void init(IEditorSite site, IEditorInput input)
 

editor input은 IEditorInput을 구현한다. equals(Object) 메소드만 구현하여 원하는 파일 포맷을 사용할수도 있다. 


,
TOTAL TODAY