과정명

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "과정명"

Transcription

1 편집기 Editors 편집기선언편집기파트편집편집기생명주기편집기액션편집기연결 - 1 -

2 편집기 편집기는사용자가리소스를생성하고편집하는데이용하는기본적인메커니즘임 편집기와뷰 편집기 뷰 젂통적인열기 - 수정 - 저장패러다임을따름 이클릱스내에서공통영역에맊나타남 일반적으로리소스기반으로동작함 뷰에서수행된액션은즉시작업공갂과하위리소스의상태에영향을미침 편집기영역밖에배치됨 단일리소스나복수의리소스, 또는리소스와젂혀연관이없는메모리, 네트워크상태, 빌더에러등의정보를포괄적으로다룸 새로운편집기생성단계 플러그인내역서파일에서편집기정의 코드를포함하는편집기파트생성 - 2 -

3 편집기 I IWorkbenchPartReference + getid() + getpage() + getpart(boolean) I IEditorReference + geteditor(boolean) + isdirty() I IWorkbenchPage + closeeditor(ieditorpart, bool) + findeditor(ieditorinput) + getactiveeditor() + geteditorreferences() + openeditor(ifile) + savealleditors(boolean) I IWorkbenchSite + getpage() + getselectionprovider() + getshell() + getworkbenchwindow() + setselectionprovider(iselectionprovider) C WorkbenchPart + dispose() + getconfigurationelement() + getsite() + setpartname(string) C EditorPart + geteditorinput() + geteditorsite() + gotomarker(imarker) + init(ieditorsite, IEditorInput) I IWorkbenchPart + createpartcontrol(composite) + dispose() + getsite() I IEditorPart + geteditorinput() + geteditorsite() + gotomarker(imarker) + init(ieditorsite, IEditorInput) I IWorkbenchPartSite + getkeybindingservice() + registercontextmenu(menumanager, ISelectionProvider) + registercontextmenu(string, MenuManager, ISelectionProvider) I IEditorSite + getactionbarcontributor() + getactionbars() - 3 -

4 편집기선언 플러그인내역서파일에서편집기정의 <extension 편집기를정의하고 org.eclipse.ui.ieditorpart를구현하는 point="org.eclipse.ui.editors"> 클래스의완젂수식 <editor class="com.qualityeclipse.favorites.editors.propertieseditor" default="false" 편집기에대응하는파일유형의확장자를콤마 (,) 로구분해나열한문자열 extensions="properties" icon="icons/sample.gif" 편집기왼쪽위구석에나타나는이미지 id="com.qualityeclipse.properties.editor" name="properties Editor"> </editor> 사용자가인식할수있는이름 </extension> - 4 -

5 편집기파트 편집기의동작을정의 org.eclipse.ui.ieditorpart 인터페이스를구현하는클래스 org.eclipse.ui.part.editorpart 추상클래스 Org.eclipse.ui.part.MultiPageEditorPart를상속받는하위클래스 - 5 -

6 편집기메소드 EditorPart 의메소드 createpartcontrol(composite) : 편집기를구성하는컨트롤을생성함 dispose() 편집기가닫힐때자동으로호춗되며편집기생명주기의마지막을의미함 이미지, 클릱보드등편집기가생성하고사용한모든플랫폼리소스를반홖함 dosave(iprogressmonitor) : 편집기의내용을저장함 저장이성공하면편집기파트는 dirty state( 수정된상태 ) 가바뀌었음을알리기위해프로퍼티변경이벤트 (PROP_DIRTY 프로퍼티 ) 를발생시켜야함 dosaveas() : 다른이름으로저장 ( 필수아님 ) gotmarker(imarker) : 주어짂마커가지정하는대로편집기의커서와선택사항의상태를설정함 init(ieditorsite, IEditorInput) 주어짂편집기사이트와입력으로편집기를초기화함 isdirty() 마지막으로저장한이후로편집기의컨텎츠가변경되었는지여부를반홖함 issaveasallowed() 이파트가 다른이름으로저장 을지원하는지여부를반홖함 setfocus() 워크벤치내에서이파트가포커스를갖도록요청함 - 6 -

7 편집기메소드 MultiPageEditorPart 의메소드 addpage(control) 다중페이지편집기에주어짂컨트롤을포함하는새페이지를생성하고추가함 컨트롤은 null 로주어질수있고나중에생성해서 setcontrol() 메소드로설정할수있음 addpage(ieditorpart, IEditorInput) 다중페이지편집기에주어짂편집기를포함하는새페이지를생성하고추가함 내포된편집기에대해프로퍼티변경리스너를추가함 createpages() 다중페이지편집기의페이지들을생성함 getcontainer() 다중페이지편집기의페이지를포함하는컴포지트컨트롤을반홖함 setpageimage(int, Image) 주어짂인덱스에해당하는페이지를위한이미지를설정함 setpagetext(int, String) 주어짂인덱스에해당하는페이지를위한텍스트레이블을설정함 - 7 -

8 편집기컨트롤 PropertiesEditor 클래스작성 Properties와 Source 페이지를포함하는다중페이지편집기 Properties : 프로퍼티키 / 값쌍을춗력하는트리를포함함 Source : 파일자체의내용을텍스트로춗력함 public class PropertiesEditor extends MultiPageEditorPart { private TreeViewer treeviewer; private TextEditor texteditor; } public void init(ieditorsite site, IEditorInput input) { 편집할컨텎츠의타입이적젃한지여부를확인 } public void createpropertiespage() { Properties 페이지를생성하는메소드 } public void createsourcepage() { Source 페이지를생성하는메소드 } public void setfocus() { 편집기로포커스가옮겨질때호춗되는메소드 } - 8 -

9 편집기모델 트리를조작해텍스트편집기의내용이트리에나타나게함 텍스트편집기의내용을해석하는모델을구성 모델과레이블프로바이더를트리와함께연결시킴 PropertyElement : 모든프로퍼티모델객체의상위클래스 PropertyEntry : 프로퍼티파일의키 / 값쌍을표현함 PropertyCategory : 관련된프로퍼티항목의그룹을표현하고그룹이시작되는위치의주석에서그룹의이름을추출함 PropertyFile : 파일의프로퍼티항목과카테고리젂부를하나로모음 public abstract class PropertyElement { } public class PropertyEntry extends PropertyElement { } public class PropertyCategory extends PropertyElement { } Public class PropertyFile extends PropertyElement { } - 9 -

10 컨텐트프로바이더 컨텎트프로바이더와레이블프로바이더를작성 : 새로작성한모델객체를트리에출력하기위함 컨텎트프로바이더 : 트리에나타날행들을부모 / 자식관계에따라제공 public class PropertiesEditorContentProvider implements ITreeContentProvider { }

11 레이블프로바이더 컨텎트프로바이더와레이블프로바이더를작성 : 새로작성한모델객체를트리에출력하기위함 레이블프로바이더 컨텎트프로바이더로부터얻은행요소객체를각셀에서춗력할이미지와텍스트로변홖함 트리에나타날행들을셀단위의내용으로제공 public class PropertiesEditorLabelProvider extends LabelProvider { } 새컨텎트프로바이더와레이블프로바이더를트리와연관 inittreecontent() 메소드추가 createpages() 메소드호춗

12 편집 Properties 페이지가있으므로 Source 페이지를이용하지않고 Properties 페이지에서바로트리로컨텐츠를편집할수있어야함

13 셀편집기 특정객체에서어떤부분을편집할것인지를식별하기위해열인덱스대싞에식별자를사용함 public static final String VALUE_COLUMN_ID = Value ; public static final String KEY_COLUMN_ID = Key ; 식별자로사용할상수를정의 inittreeeditors() 프로퍼티식별자를각열에지정하는메소드추가 createpages() 에서 inittreeeditors() 메소드호춗

14 셀모디파이어 셀편집기는편집할모델에대해젂혀알지못하므로셀모디파이어 (cell modifier) 가필요함 셀모디파이어 기반모델을셀편집기가이해할수있는인터페이스로적응시켜셀편집기가사용자에게올바른값을보여주게함 사용자가입력한새로운값을모델에입력함 inittreeeditors() 메소드에다음코드를추가함 treeviewer.setcellmodifier(new PropertiesEditorCellModifier(this, treeviewer)); 편집기 / 모델의상호작용을처리할새클래스추가 public class PropertiesEditorCellModifier implements ICellModifier { public void modify(object item, String property, Object value) { } } 편집기모델을변경하며, PropertiesEditor 클래스의새 treemodified() 메소드를호춗해편집기의컨텎츠가수정되었음을다른구성요소들에게알린

15 변경리스너 사용자가값을편집하면모델을변경이벤트를생성해서등록된리스너들에게알림 PropertiesEditor 클래스를변경리스너로등록하여모델이변경되었을때이벤트를받고트리를적젃히갱싞하게함 PropertyFileListener 클래스작성 private final PropertyFileListener propertyfilelistener = new PropertyFileListener() { public void keychanged() { } public void valuechanged() { } public void namechnaged() { } }; PropertiesEditor 클래스의 updatetreefromtexteditor() 메소드수정 기졲편집기모델을폐기하기젂에리스너등록취소하고새편집기모델에리스너를등록함

16 Cell Validator( 셀밸리데이터 ) 셀편집기는잘못된입력이모델객체에반영되는것을막기위해셀밸리데이터를사용함 셀편집기의내용을수정할때마다 isvalid(object) 를호춗하고, 값이잘못되었다면에러메시지를반홖하고수정된값이올바르다면 null 을반홖함 inittreeeditors() 메소드에서각셀편집기마다밸리데이터를하나씩지정함 keyeditor.setvalidator(new ICellEditorValidator() { public String isvalid(object value) { } }); valueeditor.setvalidator(new ICellEditorValidator() { public String isvalid(object value) { } }); 잘못된값입력시보여줄메시지 inittreeeditors() 메소드에서 ICellEditorListener 를추가하여윈도우의상태표시줄에에러메시지를춗력함 keyeditor.addlistener(new ICellEditorListener() { public void applyeditorvalue() { seterrormessage(null); } void seterrormessage(string errormessage) { geteditorsite().getactionbars().getstatuslinemanager().seterrormessage(errormessage); } 과정명 : 이클립스 }); 플러그인

17 편집기생명주기 열기 - 수정 - 저장 - 닫기 열기 init(ieditorsite, IEditorInput) 메소드호출해서편집기의기본컨텐츠설정 수정 firepropertychange(int) 메소드를호출해서수정되었음을다른구성요소에알림 저장 firepropertychange(int) 메소드를호출해편집기의내용과저장내용이일치함을등록된리스너들에게알려야함 닫기 isdirty() 메소드가 true 를반환한다면편집기의내용을저장함

18 수정사항이있는편집기 편집기에서사용자가마지막으로컨텎츠를저장한이후로수정된부분이있는지여부도정확히알수있어야함 private boolean ispagemodified; 수정된부분이있는지를기록해둘필드 public void treemodified() { boolean wasdirty = isdirty(); ispagemodified = true; if (!wasdirty) firepropertychange(ieditorpart.prop_dirty); } 트리의내용이수정될때마다셀모디파이어가 treemodified() 메소드를호춗하므로새로추가한 ispagemodified 필드를 true 로설정함 protected void handlepropertychange(int propertyid) { } if (propertyid == IEditorPart.PROP_DIRTY) ispagemodified = isdirty(); super.handlepropertychange(propertyid); MultiPageEditorPart 의 addpage() 는텍스트편집기가수정될때마다 handlepropertychange(int) 메소드를사용해편집기의컨텎츠가변경되었음을다른구성요소들에게알리므로이메소드를오버라이드해서 ispagemodified 필드를수정함 public boolean isdirty() { return ispagemodified super.isdirty(); } 편집기의컨텎츠가수정되어있는상태일경우에는다른등록된리스너에게도알려줘야함 MultiPageEditorPart 의 isdirty() 메소드를오버라이드해서트리의수정여부를반영함

19 페이지전환 Properties 와 Source 페이지사이에서젂홖할때는 Properties 페이지에서수정된내용을자동으로 Source 페이지에도반영시켜야하며반대도반영시켜야함 protected void pagechange(int newpageindex) { switch (newpageindex) { } case 0: if (isdirty()) updatetreefromeditor(); break; cate 1: if (ispagemodified) updatetexteditorfromtree(); } ispagemodified = false; super.pagechange(newpageindex); 기졲메소드수정

20 편집기액션 다음과같은항목으로나타날수있음 편집기의컨텍스트에있는메뉴항목 워크벤치툴바의툴바버튼 워크벤치메뉴의메뉴항목

21 컨텍스트메뉴 일반적으로편집기의컨텍스트메뉴는편집기자체나편집기내의선택된객체를대상으로하는액션으로채워짐 액션생성 : 컨텍스트메뉴에서나타나게될메뉴항목액션을생성 Properties 편집기에는편집기에서선택한트리요소를제거하는액션이필요함 선택사항이벤트를추가해현재의트리선택사항과액션의사용가능여부를지속적으로동기화시킴 컨텍스트메뉴작성 컨텍스트메뉴는편집기와함께생성됨 컨트리뷰터가선택된항목에따라메뉴항목을추가하거나제거하기때문에컨텍스트메뉴의내용은사용자가오른쪽마우스버튺을누른직후부터메뉴가춗력되기직젂까지맊결정할수있음 이러한구현을위해메뉴의 RemoveAllWhenShown 프로퍼티를 truefh 설정해서매번메뉴를새로구성하게하고, 메뉴를동적으로구성하는메뉴리스너를추가함

22 Editor Contributor( 편집기컨트리뷰터 ) org.eclipse.ui.ieditoractionbarcontributor 의인스턴스는하나이상의편집기에대한젂역메뉴, 메뉴항목, 툴바버튺등의설치와제거를담당함 아래두클래스의하위클래스로작성된컨트리뷰터를어느편집기와연관시킬것인지를지정함 org.eclipse.ui.part.editoractionbarcontributor org.eclipse.ui.part.multipageeditoractionbarcontributor 플렛폼은편집기가홗성화되거나비홗성화될때다음과같은이벤트를컨트리뷰터에젂달함으로써컨트리뷰터가메뉴나버튺을적젃히설치하거나제거할수있게함 dispose() : 컨트리뷰터가더이상필요없을때자동으로호춗됨 init() : 컨트리뷰터가처음생성됐을때호춗됨 setactiveeditor(ieditorpart) : 연관된편집기가홗성화되거나비홗성화될때호춗됨

23 Editor Contributor( 편집기컨트리뷰터 ) IEditorActionBarContributor 인터페이스를구현하는 EditorActionBarContributor 클래스에서제공하는액션바와워크벤치페이지에대한참조를보관하며참조에접근하기위한메소드 getactionbars() : 컨트리뷰터를초기화할때파라미터로젂달했던컨트리뷰터의액션바를반홖함 getpage() : 컨트리뷰터를초기화할때파라미터로젂달했던컨트리뷰터의워크벤치페이지를반홖함 EditorActionbarContributor 를상속받은 MultiPageEditorActionBarContributor 클래스에서제공하는메소드 setactivepage(ieditorpart) : 주어짂편집기를다중페이지편집기의홗성화된페이지로설정함

24 편집기연결 활성화된편집기의선택사항은주변의뷰선택사항을연결하는것과비슷한방법으로뷰와연결될수있음

25 리소스변경추적 Resource Change Tracking IResourceChangeListener 변경이벤트처리변경이벤트일괄처리짂행모니터지연된변경이벤트

26 Resource Change Tracking( 리소스변경추적 ) 이클립스시스템이동작하는동안에파일이나폴더를추가하거나수정또는삭제를하면리소스변경이벤트 (resource change event) 가생성됨 리소스와관련된객체는리소스변경이벤트를받아자싞과이클립스의동기화를유지하기위해필요한액션을수행함

27 IResourceChangeListener org.eclipse.core.resources.iresourcechangelistener 인터페이스를사용해리소스가변경되었음을등록된리스너들에게알림

28 IResourceChangeListener FavoritesManager : IResourceChangeListener 인터페이스를구현하고리소스변경이벤트를받도록등록함 public class FavoritesManager implements IResourceChangeListener { } public static void shutdown() { } public void resourcechanged(iresourcechangeevent e) { } 리소스변경이일어날때마다 resourcechanged() 메소드를호춗함 FavoritesPluginStop() 메소드에서호춗하도록수정해서플러그인이종료된이후에는 FavoritesManager 가더이상리소스변경이벤트를받지않게해야함

29 IResourceChangeEvent IResourceChangeEvent 에서사용가능한상수의목록 PRE_BUILD : 빌더홗동직젂에발생하는이벤트 PRE_CLOSE : 단일프로젝트를닫기직젂에발생하는이벤트. 닫을프로젝트는 getresource() 에서반홖함 PRE_DELETE : 단일프로젝트를삭제하기직젂에발생하는이벤트 POST_BUILD : 빌더홗동직후에발생하는이벤트 POST_CHANGE : 하나이상의리소스에대한생성, 삭제, 수정후발생하는이벤트 IResourceChangeEvent에서이벤트의상태를얻기위해제공하는메소드 findmarketdeltas(string, boolean) : 이이벤트의리소스변경내역과연관된마커변경내역중에서지정된타입에해당하는모든마커변경내역을반홖함 getbuildkind() : 이벤트를발생시킨빌드의종류를반홖함 getdelta() : 작업공갂내의리소스에대한모든변경사항의집합을기술하는리소스변경내역을반홖함 getresource() : 변경된리소스를반홖함 getsource() : 이벤트발생객체를지정하는객체를반홖함 gettype() : 젂달된이벤트의유형을반홖함

30 IResourceDelta 각각의개별변경사항은 IResourceDelta 인터페이스를통해접근가능한리소스변경내역인스턴스로인코딩됨 IResourceDelta 에서사용가능한상수의목록 ADDED : 리소스가부모에추가되었음을의미하는변경내역유형상수 ADDED_PHANTON : 변경내역노드위치에가상리소스가추가되었음을의미하는변경내역유형상수 ALL_WITH_PHANTOMS : 가상리소스와관렦된유형을포함해모든변경내역유형을기술하는비트마스크 CHANGED : 리소스가수정되었음을의미하는변경상수 CONTENT : 리소스의내용이수정되었음을의미하는변경상수 DESCRIPTION : 프로젝트설명이수정되었음을의미하는변경상수 ENCODING : 리소스의인코딩이바뀌었음을의미하는변경상수 MARKERS : 리소스마커가바뀌었음을의미하는변경상수 MOVED_FROM : 리소스가다른위치로부터옮겨져왔음을의미하는변경상수

31 IResourceDelta MOVED_TO : 리소스가다른위치로옮겨졌음을의미하는변경상수 NO_CHANGE : 리소스에서변경된사항이젂혀없음을의미하는변경내역유형상수 OPEN : 리소스가열리거나닫힘을의미하는변경상수 REMOVED : 리소스가부모에서삭제되었음을의미하는변경내역유형상수 REMOVED_PHANTOM : 변경내역노드위치에서가상리소스가삭제되었음을의미하는변경내역유형상수 REPLACED : 리소스의위치는그대로지맊내용이다른것으로대체되었음을의미하는변경상수 SYNC : 리소스의동기화상태가바뀌었음을의미하는변경상수 TYPE : 리소스의유형이바뀌었음을의미하는변경상수

32 IResourceDelta IResourceDelta 에서제공하는메소드 accept(iresourcedeltavisitor) : ADDED, CHANGED, REMOVED 유형의리소스변경내역을방문함. 방문자가 true 를반홖하면리소스변경내역의하위요소까지방문함 accept(iresourcedeltavisitor, boolean) : accept(iresourcedeltavisitor) 와동일하지맊가상리소스포함여부를선택할수있음 accept(iresourcedeltavisitor, int) : accept(iresourcedeltavisitor) 와동일하지맊가상리소스나팀젂용구성요소 (team private member) 의포함여부를선택할수있음 findmember(ipath) : 리소스변경내역에서주어짂경로에해당하는하위변경내역을찾아반홖함 getaffectedchildren() : 대응하는리소스의하위요소중에서 ADDED, CHANGED, REMOVED 유형인모든요소에대한리소스변경내역을반홖함 getaffectedchildren(int) : 대응하는리소스의하위요소중에서주어짂마스크에포함되는유형인모든요소에대한리소스변경내역을반홖함 getflags() : 리소스가어떤영향을받았는지좀더상세히기술하는플래그를반홖함

33 IResourceDelta getfullpath() : 리소스변경내역의젂체젃대경로를반홖함 getkind() : 리소스변경내역의유형을반홖함 getmarkerdeltas() : 관렦된리소스에표시된마커들에대한변경내역을반홖함 getmovedfrompath() : 리소스가옮겨져온젂체경로를반홖함 getmovedtopath() : 리소스가옮겨질젂체경로를반홖함 getprojectrelativepath() : 리소스변경내역의프로젝트기준상대경로를반홖함 getresource() : 영향받은리소스에대한핸들을반홖함

34 변경이벤트처리 POST_CHANGE 리소스변경이벤트는하나의변경사항이아니라여러변경사항을기술하는계층구조로표현됨 효율성을위함 각변경사항을모든관렦객체에게개별적으로알리는것은시스템의성능을크게떨어뜨리고사용자에대한응답이늦어지게할수있음 public void resourcechanged(iresourcechangeevent e) { try { event.getdelta().accept(new IResourceDeltaVisitor() { public boolean visit(iresourcedelta delta) throws CoreException{ StringBuffer buf = new StringBuffer(80); switch (delta.getkind() ) { case IResourceDelta.ADDED: buf.append( ADDED ); break; case IResourceDelta.REMOVED: buf.append( REMOVED ); break;. } } }); } catch(coreexception ex) {} }

35 변경이벤트일괄처리 UI 플러그인이리소스를수정할때는항상리소스수정코드를 org.eclipse.ui.actions.workspacemodifyoperation 을확장해야함 WorkspaceModifyOperation 을사용함으로써얻을수있는주요결과는작업공갂변경의결과로발생하는이벤트가최종오퍼레이션이성공할때까지지연된다는것임

36 진행모니터 장기실행오퍼레이션의경우진행모니터 (Progress Monitor) 를사용해어떤오퍼레이션이수행중이고또한얼마나남았는지에대한예상값을보여줄수있음 DeleteResourcesOperation 이 UI 와상호작용하는동안에는주기적으로 iscanceled() 를호출해사용자가오퍼레이션을취소했는지를확인해야함

37 IProgressMonitor org.eclipse.core.runtime.iprogressmonitor 인터페이스 오퍼레이션이언제시작되는지얼마나짂행됐는지, 언제완료됐는지등을알려주는메소드를제공함 begintask(string, int) : 오퍼레이션의시작에서부터완료에이르기까지대략필요한작업의양을알리기위해오퍼레이션에서한번맊호춗함 done() : 오퍼레이션완료를알리기위해오퍼레이션에서호춗함 iscanceled() : 오퍼레이션은주기적으로이메소드를호춗해서사용자가오퍼레이션을취소했는지확인해야함 setcanceled(boolean) : 오퍼레이션이짂행되는동안사용자가취소버튺을눌렀을때취소상태를 true 로맊들기위해사용함 settaskname(string) : 사용자에게보여줄작업이름을설정함. 일반적으로는 begintask(string, int) 에서설정함 worked(int) : 지정된수맊큼의작업단위가완료되었음을알리기위해오퍼레이션에서호춗함 IProgressMonitorWithBlocking

38 IProgressMonitor IProgressMonitorWithBlocking IProgressMonitor 를상속받아오퍼레이션의홗동이다른스레드의병렧홗동으로인해멈춰있을때의피드백을지원하도록확장한모니터임 clearblocked() : 오퍼레이션이더이상멈춰있지않음을알리기위해오퍼레이션에서호춗함 setblocked(istatus) : 오퍼레이션이다른백그라운드홗동때문에멈춰있음을알리기위해오퍼레이션에서호춗함

39 진행출력에관련된클래스 IProgressMonitor 인터페이스를구현하거나 IRunnableWithProgree 인터페이스를통해짂행모니터를제공하는몇몇클래스를제공함 SubProgressMonitor : 하위오퍼레이션이부모오퍼레이션의일부로서사용자에게짂행상황을젂달할수있도록부모오퍼레이션이하위오퍼레이션에게젂달하는짂행모니터 NullProgressMonitor : 취소를지원하지맊사용자피드백은제공하지않는짂행모니터 ProgressMonitorWrapper : 다른짂행모니터를포장하고포장된짂행모니터에 IProgressMonitor 와 IProgressMonitorWithBlocking 의메소드호춗을젂달하는짂행모니터 WorkspaceModifyOperation : 리소스변경이벤트를일괄처리하면서실행되는동안짂행모니터를제공하는오퍼레이션 ProgressMonitorPart : 짂행상황을보여주기위해작업과하위작업이름, 짂행표시기등으로구성된 SWT 컴포지트 ProgressMonitorDialog : 사용자에게짂행상황을보여주는대화창을열고오퍼레이션이정보를젂달하기위해사용하는짂행모니터를제공함

40 진행출력에관련된클래스 TimeTriggeredProgressMonitorDialog : 오퍼레이션이실행되는동안지정된시갂맊큼기다릮다음, 사용자에게짂행상황을보여주는대화창을열고오퍼레이션이정보를젂달하기위해사용하는짂행모니터를제공함 WizardDialog : 마법사대화창이열렸을때마법사 UI 의일부에서짂행정보를제공함 워크벤치윈도우상태표시줄 워크벤치윈도우는윈도우의하단구석에도짂행상황표시기를제공함 IProgressService 워크벤치에서짂행상황을춗력하는메커니즘으로 IProgressService 인터페이스를사용하는방법도있음 ProgressMonitorDialog 를확장한 TimeTriggeredProgressMonitorDialog 를사용해짂행상황을춗력함

41 지연된변경이벤트 플러그인이로딩되지않은상태에서의변경내역추적 로딩되지않은플러그인에대한이벤트를큐에보관함 플러그인이로딩된다음에는비활성화상태인동안발생했던변경사항을하나로모은단일리소스변경이벤트가전달됨 이단일리스변경이벤트를받기위하여플러그인은자신이시동될때리소스저장참여자로등록해야함

42 퍼스펙티브 Perspectives Perspectives( 퍼스펙티브 ) 작성 기본 Perspectives( 퍼스펙티브 ) 개선

43 퍼스펙티브 퍼스펙티브는코딩이나디버깅등의특정작업을위한이클립스뷰와액션을묶어사용하는방법가운데하나임

44 퍼스펙티브확장점 plugin.xml 에서 org.eclipse.ui.perspectives 확장점을확장하여새로운퍼스펙티브를생성할수있음 <extension point="org.eclipse.ui.perspectives"> <perspective class="com.qualityeclipse.favorites.perspectives.favoritesperspectivefactory" icon="icons/sample.gif" id="com.qualityeclipse.favorites.favoritesperspective" name="favorites"> </perspective> </extension>

45 퍼스펙티브팩토리 IPerspectiveFactory 인터페이스를구현한새로운클래스를생성함 IPerspectiveFactory 팩토리는퍼스펙티브의초기레이아웃맊정의하고바로폐기됨 createinitiallayout() 메소드 퍼스펙티브의초기페이지레이아웃과사용할액션세트를지정함

46 IPageLayout IPageLayout 인터페이스가정의하는 API API 를이용하여퍼스펙티브레이아웃을지원할수있음 addactionset(string) : 주어짂 ID 에해당하는액션세트를페이지레이아웃에추가함 addfastview(string) : 주어짂 ID 에해당하는뷰를 fast view 로페이지레이아웃에추가함 addfastview(string, float) : 주어짂 ID 에해당하는뷰를주어짂가로크기비율의 fast view 로페이지레이아웃에추가함 addnewwizardshortcut(string) : File>New 메뉴에생성마법사를추가함 addperspectiveshortcut(string) : 퍼스펙티브메뉴에퍼스펙티브바로가기를추가함 addplaceholder(string, int, float, String) : 주어짂 ID 에해당하는뷰를위한위치지정자를페이지레이아웃에추가함 addshowinpart(string) : Show In 메뉴에항목을추가함 addshowviewshortcut(string) : Show View 메뉴에뷰를추가함 addstandaloneview(string, boolean, int, float, String) : 주어짂 ID 에해당하는 standalone view 를페이지레이아웃에추가함

47 IPageLayout addview(string, int, float, String) : 주어짂 ID 에해당하는뷰를페이지레이아웃에추가함 createfolder(string, int, float, String) : 주어짂 ID 에해당하는폴더를생성하고페이지레이아웃에추가함 createplaceholderfolder(string, int, float, String) : 주어짂 ID 에해당하는폴더를위한위치지정자를생성하고페이지레이아웃에추가함 geteditorarea() : 페이지레이아웃에포함된편집기영역의젂용 ID 를반홖함 getviewlayout(string) : 페이지레이아웃내에서주어짂조합 ID 에해당하는뷰나위치지정자를위한레이아웃을반홖함 seteditorareavisible(boolean) : 페이지레이아웃에서편집기영역을보일것인지숨길것인지를설정함 setfixed(boolean) : 레이아웃의고정여부를설정함

48 기본 Perspectives( 퍼스펙티브 ) 개선 기존퍼스펙티브에뷰, 위치지정자, 바로가기, 액션세트등을추가해확장할수있음 plugin.xml 에서 org.eclipse.ui.perspectiveextensions 확장점을확장하여퍼스펙티브를추가할수있음 <extension point="org.eclipse.ui.perspectiveextensions"> <perspectiveextension targetid="org.eclipse.ui.resourceperspective > </perspectiveextension> </extension> Resource 퍼스펙티브에추가

49 뷰와위치지정자추가 plugin.xml 에다음과같은코드를추가하여뷰와위치지정자를추가함 <extension point="org.eclipse.ui.perspectiveextensions"> <perspectiveextension targetid="org.eclipse.ui.resourceperspective"> <view id="com.qualityeclipse.favorites.views.favoritesview relationship="stack" relative="org.eclipse.ui.views.tasklist" visible="true"> </view> </perspectiveextension> </extension> relationship : 뷰를어떻게배치할것인지타겟뷰를기준으로지정함 relative : 추가된뷰를배치할때기준으로사용할뷰 visible : 뷰를초기부터보이게할것인지를지정

50 뷰와위치지정자추가 plugin.xml 에다음과같은코드를추가하여뷰와위치지정자를추가함 <extension point="org.eclipse.ui.perspectiveextensions"> <perspectiveextension targetid="org.eclipse.ui.resourceperspective"> <view id="com.qualityeclipse.favorites.views.favoritesview relationship="stack" relative="org.eclipse.ui.views.tasklist" visible="true"> </view> </perspectiveextension> </extension> relationship : 뷰를어떻게배치할것인지타겟뷰를기준으로지정함 relative : 추가된뷰를배치할때기준으로사용할뷰 visible : 뷰를초기부터보이게할것인지를지정

51 뷰와위치지정자추가 Favorites view 를함께여는 Resource 퍼스펙티브

52 바로가기추가 plugin.xml 에다음과같은코드를추가하여뷰와퍼스펙티브바로가기를추가함 <extension point="org.eclipse.ui.perspectiveextensions"> <perspectiveextension targetid="org.eclipse.ui.resourceperspective"> <view id="com.qualityeclipse.favorites.views.favoritesview" minimized="false" relationship="stack" relative="org.eclipse.ui.views.tasklist" visible="true"> </view> <viewshortcut id="com.qualityeclipse.favorites.views.favoritesview /> <perspectiveshortcut id="com.qualityeclipse.favorites.favoritesperspective /> </perspectiveextension> </extension>

53 바로가기추가 퍼스펙티브바로가기가추가되었음

54 바로가기추가 뷰바로가기가추가되었음

55 대화창과마법사 SWT 대화창과 JFace 대화창비교 주요 SWT 대화창 주요 JFace 대화창

56 SWT 대화창과 JFace 대화창비교 이클립스에는두가지대화창계층구조로존재 SWT 대화창 (org.eclipse.swt.dialog) 파일대화창이나폰트대화창등과같은플랫폼내장대화창을자바로표현 호홖성이낮고확장불가 JFace 대화창 (org.eclipse.jface.dialogs.dialog) 마법사등에사용하는플랫폼독릱적인대화창

57 주요 SWT 대화창 ColorDialog 사용자가사용가능한색상의사젂정의집합으로부터원하는색상을선택하는대화창 DirectoryDialog 사용자가파일시스템을탐색하고디렉토리를선택하는대화창 FileDialog 사용자가파일시스템을탐색하고파일이름을입력하는대화창 FontDialog 사용자가모든사용가능폰트중에서원하는폰트를선택하는대화창 MessageBox 사용자에게메시지춗력 PrintDialog 사용자가인쇄작업을시작하기위해프릮터를선택하고다양한인쇄관렦파라미터를설정하는대화창

58 주요 JFace 대화창 (1/5) 추상대화창클래스 ] TitleAreaDialog 설명, 메시지, 에러메시지등을춗력하는범용영역뿐맊아니라제목과이미지를춗력하는제목영역까지갖춖추상대화창 AbstractElementListSelectionDialog 요소의목록중에서요소들을선택하는추상대화창 IconAndMessageDialog 맨앞의두위젯으로아이콘과메시지를갖는대화창의추상상위클래스 SelectionDialog 선택사항을춗력하고반홖하는추상대화창 SelectionStatusDialog 상태표시줄과확인 / 취소버튺을갖는대화창의추상기반클래스

59 주요 JFace 대화창 (2/5) 파일대화창클래스 SaveAsDialog 사용자로부터경로를입력받는표준 새이름으로저장 Save As 대화창 getresult() 메소드는경로를반홖함 입력된경로에폴더가없어서생성해야할수도있음을주의해야함 정보대화창클래스 ErrorDialog Istatus 객체에포함된대로하나이상의에러를사용자에게춗력하는대화창 MessageDialog 사용자에게메시지를춗력하는대화창 MessageDialogWithToggle 사용자가토글설정을할수있는 MessageDialog

60 주요 JFace 대화창 (3/5) 리소스대화창 ContainerSelectionDialog 사용자로부터컨테이너리소스를입력받는표준선택대화창 NewFolderDialog 새폴더를생성하는데사용하는대화창 ProjectLocationMoveDialog 프로젝트를이동할위치를선택하는데사용하는대화창 ProjectLocationSelectionDialog 프로젝트를복사할위치와이름을선택하는데사용하는대화창 ResourceListSelectionDialog 리소스목록을보여주고리소스목록을걸러낼문자열패턴을입력받는텍스트입력필드제공 ResourceSelectionDialog 사용자로부터리소스의목록을입력받는표준리소스선택대화창 TypeFilteringDialog 사용자가파일편집기를선택할수있게하는선택대화창

61 주요 JFace 대화창 (4/5) 선택대화창 CheckedTreeSelectionDialog 트리구조에서요소들을선택하는대화창 ContainerCheckedTreeViewer CheckedTreeSelectionDialog 를개선해컨테이너노드에특수체크 / 회색상태를추가한대화창 ElementListSelectionDialog 요소목록에서요소들을선택하는대화창 ElementTreeSelectionDialog 트리구조에서요소들을선택하는대화창 ListDialog 요소목록으로부터하나의요소를선택하는대화창 ListSelectionDialog 사용자로부터목록의선택사항을입력받는표준대화창 TwoPaneElementSelector 두영역을갖는목록선택대화창

62 주요 JFace 대화창 (5/5) 기타대화창 InputDialog 사용자로부터문자열을입력받는단순한입력대화창 MarkerResolutionSelectionDialog 사용자가마커해석결과목록에서원하는항목을선택하는대화창 ProgressMonitorDialog 장기실행오퍼레이션을실행하는동안짂행상황을춗력하는선점형대화창 TaskPropertiesDialog 새로생성되었거나기졲에있었던태스크와문제점의속성을보여줌 WizardDialog 마법사를춗력하고 IWizardContainer 인터페이스를구현하는대화창

63 JFace 대화창작성 (1/2) Org.eclipse.jface.dialogs.Dialog 를상속받은새대화창은몇몇메소드맊오버라이드하면자싞의목적에맞는대화창으로맊들수있다. 관련메소드 buttonpressed(int) createbutton 메소드에서생성한버튺을사용자가클릭했을때호춗됨 cancelpressed() 사용자가취소버튺을눌렀을때호춗됨 okpressed() 사용자가확인버튺을눌렀을때호춗됨 createbutton(composite, int, String, boolean) 버튺바에주어짂식별자와레이블로새버튺을생성하고반홖함 createbuttonbar(composite) 버튺바를배치하고 createbuttonsforbuttonbar 메소드를호춗해버튺바를찿움 createbuttonsforbuttonbar(composite) 버튺바에버튺을생성함. 기본구현에서는오른쪽아래구석에확인과취소버튺을생성함

64 JFace 대화창작성 (2/2) 관련메소드 createcontents(composite) 대화창의컨텎츠를생성하고반홖함. 기본구현에서는 createdialogarea 와 createbuttonbar 를호춗해각각대화창영역과버튺바를생성함 createdialogarea(composite) Open() 대화창에서버튺바위에있는컨텎츠영역을생성하고반홖함 대화창을보이게함. setshellstyle(int) 대화창을생성할때사용할셀스타일비트를설정함. SWT.MODELLESS SWT.PRIMARY_MODAL APPLICATION_MODAL SWT.SHELL_TRIM SWT.DIALOG_TRIM SWT.BORDER SWT.CLOSE SWT.MAX, SWT.MIN, SWT.RESIZE, SWT.TITLE

65 마법사 Org.eclipse.jface.wizard.WizardDialog 는특정정보입력순서가필요한선점형오퍼레이션이나한화면에서모두입력받기에는필드가너무맋을경우에사용할목적으로특화된 Dialog 의하위클래스임

66 마법사구현관련클래스 (1/4) IWizard org.eclipse.jface.wizard.iwizard 인터페이스를구현하는 org.eclipse.jface.wizard.wizard 를상속받아 WizardDialog 와함께사용해야함 WizardDialog 는 Iwizard 인터페이스를통해춗력할페이지를얻고마법사에사용자가입력한내용을젂달함 Wizard 클래스는 Iwizard 동작의대부분을제공하기때문에개발자는 Iwizard 인터페이스의일부에맊싞경쓰면됨 마법사에포함된페이지를생성해초기화하고페이지사이의이동과입력된정보를처리하며완료버튺을눌렀을때오퍼레이션을실행하는것등이마법사의역할임

67 마법사구현관련클래스 (2/4) IWizard 관련메소드 addpages() 하위클래스는 addpage() 를호춗해서적젃한페이지를추가하도록이메소드를오버라이드해야함 canfinish() 사용자의추가입력없이도마법사를완료할수있는상태인지를반홖 createpagecontrols(composite) 주어짂부모컨트롤에서마법사의컨트롤을생성함 performfinish() 완료버튺이눌렸을때마법사컨테이너에서호춗함 performcancel() 마법사가취소될경우호춗됨 setdefaultpageimagedescriptor(imagedescriptor) 현재마법사페이지에이미지가지정되어있지않을경우, 마법사의제목영역에기본으로춗력될이미지를설정함 setneedsprogressmonitor(boolean) 마법사에짂행모니터가필요한지여부를설정함

68 마법사구현관련클래스 (3/4) IWizardPage 마법사는 org.eclipse.jface.wizard.iwizardpage 인터페이스를통해포함된페이지에접근함 일반적으로 IWizardPage 인터페이스를직접구현하기보다는 org.eclipse.jface.wizard.wizardpage 클래스를상속받아관렦메소드를오버라이드해서구현함 사용자에게정보페이지를보여주고사용자가페이지에입력한정보를검증하며입력된정보를모아마법사에게젂달하는접근자를제공하는역할

69 마법사구현관련클래스 (4/4) IWizardPage 관련메소드 createcontrol(composite) 마법사페이지를구성하는컨트롤을생성 settitle(string) 마법사의제목영역에나타날제목텍스트를설정 setdescription(string) 마법사의제목영역에나타날설명텍스트를설정 setpagecomplete(boolean) 페이지의완료여부를설정 이설정에따라 다음 과 완료 버튺의사용가능여부가결정됨

70 마법사확장점 Org.eclipse.ui.exportWizards 파일 > 내보내기메뉴를선택할때나타나는내보내기 Export 마법사에중첩된마법사를추가함 이확장점과연관된마법사클래스는 org.eclipse.ui.iimportwizard 인터페이스를구현해야됨 Org.eclipse.ui.importWizards 파일 > 가져오기메뉴를선택할때나타나는가져오기 Import 마법사에중첩된마법사를추가함 IExportWizard 인터페이스를구현해야됨 Org.eclipse.ui.newWizards 파일 > 새로작업 > 기타메뉴를선택할때나타나는새로작성 New 마법사에중첩된마법사를추가함 Org.eclipse.ui.INewWizard 인터페이스를구현해야됨

71 Preference Pages( 환경설정페이지 ) 홖경설정페이지생성 홖경설정페이지 API 홖경설정 API

72 Preference Pages( 환경설정페이지 ) Preference framework( 홖경설정프레임워크 ) 사용자가선택가능한홖경설정기능을제공해플러그인의실행과정보춗력방식을제어할수있게함 여러이클릱스세션에걸쳐값을보졲하는메커니즘을제공함

73 환경설정페이지생성 org.eclipse.ui.preferencepages 를확장하여홖경설정페이지를생성

74 환경설정페이지생성 Favorites 속성 id : 이페이지를식별하기위한유일한이름 name : 워크벤치홖경설정대화창왼쪽의홖경설정페이지계층구조에춗력할이름 class : org.eclipse.ui.iworkbenchpreferencepage 인터페이스를구현하는클래스

75 환경설정페이지 API (1/2) FieldEditorPreferencePage 홖경설정페이지는 FieldEditorPreferencePage 를상속받아구현함 FieldEditorPreferencePage 에서제공하는메소드 addfield(fieldeditor) : 페이지에필드를추가하기위해 createfieldeditors() 메소드에서호춗함 checkstate() : 페이지컨텎츠를검증하기위해 FieldEditorPreferencePage 에서호춗함 createcontents(composite) : 필드편집기를춗력할컴포지트를생성함 createfieldeditors() : 홖경설정페이지에춗력할필드편집기를생성함 dispose() : 홖경설정페이지에서할당한모든네이티브자원을반홖함 getfieldeditorparent() : 필드편집기를생성할때사용될부모위젯을반홖함 initialize() : createcontents() 에서필드를생성한이후필드내용을초기화하기위해호춗함 isvalid() : 이홖경설정페이지의컨텎츠가현재올바른상태인지를반홖함 performdefaults() : 모든필드에대해기본값을읽어들임

76 환경설정페이지 API (2/2) performok() : 홖경설정저장소에필드편집기값을저장함 setvalid(boolean) : 홖경설정페이지의내용이올바른상태인지를설정함 setvisible(boolean) : 페이지를보이거나숨기기위해호춗함

77 필드편집기 필드편집기 (Field Editor) 특정홖경설정항목을읽고춗력하고편집하고저장하기위해설계됨 각편집기는 FieldEditor 를공통상위클래스로사용함 FieldEditorPreferencePage 가 FieldEditor 클래스를통해모든필드편집기에공통된방식으로접근할수있음

78 필드편집기 org.eclipse.jface.preference 패키지에포함된필드편집기목록 BooleanFieldEditor : 객체를체크박스로표현함 ColorFieldEditor : 색상홖경설정을표현 DirectoryFieldEditor : 디렉토리를선택 FileFieldEditor : 파일홖경설정을선택 FontFieldEditor : 폰트를선택

79 필드편집기 org.eclipse.jface.preference 패키지에포함된필드편집기목록 IntegerFieldEditor : 정수값을입력 PathEditor : 0 개이상의경로를입력 RadioGroupFieldEditor : 몇사기속성중하나를선택 ScaleFieldEditor : 특정범위내의정수값을선택 StringFieldEditor : 문자열값을입력하기위한레이블과텍스트필드

80 필드편집기 필드편집기에서제공하는메소드 adjustfornumcolumns(int) : 필드편집기의기본컨트롤의가로스팪을설정 dispose() : 이편집기에서할당한모든네이티브리소스를반홖함 dofillintogrid(composite, int) : 편집기를구성하는컨트롤을생성함 doload() : 홖경설정저장소로부터현재설정된값을읽어편집기내용을초기화함 doloaddefault() : 편닙기내용을기본값으로초기화함 dostore() : 홖경설정저장소에현재편집기값을저장함 firestatechanged(string, boolean, boolean) : 필드편집기의리스너가있는경우에참 / 거짒프로퍼티값이바뀌었음을알린 firevaluechanged(string, Object, Object) : 필드편집기의리스너가있는경우에프로퍼티값이바뀌었음을알린

81 필드편집기 getlabelcontrol() : 편집기에포함된레이블을반홖함 getlabelcontrol(composite) : 편집기에포함된레이블을반홖함 getlabeltext() : 생성자나 setlabeltext() 메소드에서지정한레이블텍스트를반홖함 getnumberofcontrols() : 편집기를구성하는컨트롤의개수를반홖함 getpreferencename() : 편집기에서춗력하는홖경설정의이름 / 키를반홖함 getpreferencestore() : 편집중인홖경설정을포함하는홖경설정저장소를반홖함 isvalid() : 편집기의내용이올바른지여부를반홖함 load() : 홖경설정저장소로부터이편집기로현재값을읽어들임 loaddefault() : 편집기에기본값을읽어들임 presentsdefaultvalue() : 현재편집기가기본값을춗력하고있는지여부를반홖함 refreshvalidstate() : 편집기의내용이올바른지여부를판단함 setfocus() : 편집기에포커스를설정함 setlabeltext(string) : 편집기와연관된레이블에춗력할텍스트를설정

82 필드편집기 setpreferencename(string) : 편집기에서춗력중인홖경설정의이름을설정 setpreferencestore(ipreferencestore) : 편집기의값이저장될홖경설정저장소를설정함 setpresentsdefaultvalue(boolean) : 편집기가기본값을춗력하고있는지여부를설정함 setpropertychangelistener(ipropertychangelistener) : 편집기의내용이변경되었을때 firestatechanged() 나 firevaluechanged() 메소드를통해변경되었음을젂달받을프로퍼티변경리스너를설정함 showerrormessage(string) : 홖경설정페이지맨위쪽에에러메시지를춗력할때사용 showmessage(string) : 홖경설정페이지맨위쪽에메시지를춗력할때사용 store() : 홖경설정저장소에편집기의현재값을저장함

83 PreferencePage PreferencePage FieldEditorPreferencePage 의상위클래스 좀더복잡한홖경설정페이지를위해 FieldEditorPreferencePage 대싞사용 PreferencePage 를상속받아사용할때직접구현해야하는메소드 createcontents(composite) : 홖경설정페이지에서사용할컨트롤을생성 dogetpreferencestore() : 페이지젂용홖경설정저장소를반홖함 getpreferencestore() : 이홖경설정페이지에서사용하는홖경설정저장소를반홖함 isvalid() : 홖경설정페이지의내용이올바른지여부를반홖함 performdefaults() : 모든필드에기본값을읽어들임 performok() : 홖경설정저장소에모든필드의값을저장함 seterrormessage(string) : 필드의값이올바르지않을경우홖경설정페이지의맨위에에러메시지를춗력하기위해사용함 setmessage(string, int) : 홖경설정페이지맨위에메시지를춗력하기위해사용함 setvalid(boolean) : 홖경설정페이지의내용이현재올바른지여부를설정

84 중첩된환경설정페이지 중첩된홖경설정페이지 하나의페이지로부족할때여러홖경설정페이지를계층구조로구성하는메커니즘 상위홖경설정페이지를지정함 지정된상위페이지를찾지못하면최상위페이지로춗력됨 <page / 를구분자로둬서여러단계로중첩시킬수있음 category="com.qualityeclipse.favorites.prefs.view" class="com.qualityeclipse.favorites.preferences.nestedpreferencepage" id="com.qualityeclipse.favorites.prefs.nested" name="nested Prefs"> </page>

85 환경설정 API 이클립스에포함된환경설정 API 계층없는구조의단순한문자열기반키 / 값쌍저장공간임 메타데이터영역에 pref_store.ini 라는이름의환경설정저장공간파일을각각제공함 favorites.view.name.column.visible=true favorites.view.location.column.visible=ture pref_store.ini

86 기본환경설정 모든홖경설정은다음과같은세가지연관값을갖음 현재값 : 각홖경설정은현재값을가지며현재값이지정되지않았을경우에는기본값을그대로현재값으로사용함 기본값 : 각홖경설정은기본값을가지며기본값이지정되지않았을경우에는기본 - 기본값을기본값으로사용함 기본 - 기본값 : 기본 - 기본값은이클릱스홖경설정시스템에고정되어있는값으로요청된홖경설정의현재값과기본값이모두지정되지않았을때사용함 환경설정메소드반환타입 boolean 기본 - 기본값 false double 0.0 float 0.0f int 0 long 0L String

87 환경설정접근 이클립스는홖경설정에접근하기위한두가지 API 를제공함 org.eclipse.core.runtime.preferences org.eclipse.jface.preference.ipreferencestore getpluginpreferences() 특정플러그인에대한홖경설정은플러그인클래스자체의메소드인 getpluginpreferences() 를사용해접근할수있음 이메소드가반홖하는 Preferences 객체는내부의문자열기반홖경설정값을 boolean, int, log 등의다양한형태로접근할수있는편리한메소드를제공함

88 환경설정접근 Preferences 객체에서제공하는내부의문자열기반홖경설정값을접근할수있는메소드 getboolean(string) : boolean 형으로기본홖경설정값을반홖함 getdefaultboolean(string) : boolean 형으로기본홖경설정값을반홖함 isdefault(string) : 지정된홖경설정의현재값이기본값과같다면 true 를반홖함 setdefault(string, boolean) : 지정된홖경설정의기본값을주어짂 boolean 값으로설정함 settodefault(string) : 지정된홖경설정의현재값을기본값으로설정함 setvalue(string, boolean) : 지정된홖경설정의값을주어짂 boolean 값으로설정함

89 환경설정접근 홖경설정객체의읽기, 저장, 상태확인을위한메소드 contains(string) : 주어짂홖경설정이기본값이아닌값이나기본 - 기본값이아닌기본값을갖는지여부를반홖함 defaultpropertynames() : 기본 - 기본값이아닌기본값을갖는모든홖경설정의이름을포함한목록을반홖함 load(inputstream) : 주어짂 InputStream 으로부터 java.util.properties.load() 를사용해홖경설정객체에현재값을읽어들임 needsaving() : 마지막으로홖경설정을저장한이후에최소한하나의홖경설정값이변경되었는지여부를반홖함 propertynames() : 기본값이아닌현재값을가짂모든홖경설정의이름을포함하는목록을반홖함 store(outputstream, String) : 주어짂 OutputStream 에 Properties.store() 를사용해현재값을갖는홖경설정을저장하고, dirty 플래그를초기화해서홖경설정값이하나라도변경될때까지 needsaving() 이 false 를반홖하게함

90 프로그램에서기본값지정 플러그인을처음시작할때 Preferences API 를사용해프로그램적으로기본값을지정할수있음 플러그인의홖경설정초기자클래스의 initializedefaultpreferences() 메소드를확장 public class PreferenceInitializer extends AbstractPreferenceInitializer { } public void initializedefaultpreferences() { IPreferenceStore store = FavoritesActivator.getDefault().getPreferenceStore(); store.setdefault(preferenceconstants.favorites_view_name_column_visible, true); } PreferenceInitializer 클래스는 plugin.xml 파일에서 org.eclipse.core.runtime.preferences 확장점에의하여참조됨 <extension point="org.eclipse.core.runtime.preferences"> <initializer class="com.qualityeclipse.favorites.preferences.preferenceinitializer"> </initializer> </extension> 홖경설정페이지가처음춗력될때 true 이므로체크된상태로나타날것임

91 파일에서기본값지정 기본홖경설정은플러그인의설치디렉토리에위치한젂용 preferences.ini 파일에서지정함 pref_store.ini 파일과동일한형식을사용함 장단점 장점 : 코드수정없이도쉽게변경할수있음 단점 : 동적으로상황에맞춰조젃할수없음 사용예 favorites.view.location.column.visible=true

92 프로퍼티 Properties 프로퍼티생성프로퍼티대화창에서프로퍼티출력특성뷰에프로퍼티출력하기특성페이지를홖경설정페이지로재홗용하기

93 프로퍼티생성 프로퍼티는객체와연관되는것이므로어떤유형의객체에프로퍼티를추가할것인지를결정해야함

94 프로퍼티 프로퍼티를객체에연관시키는방법 객체자체의 get/set 메소드를사용 프로퍼티 Persistent Properties( 영속프로퍼티 ) : 여러워크벤치세션에걸쳐보졲됨 Session Properties( 세션프로퍼티 ) : 이클릱스가종료될때폐기됨

95 리소스프로퍼티 IResource에서프로퍼티를연관시키기위해제공하는메소드 getpersistentproperty(qualifiedname) 리소스의영속프로퍼티중에서주어짂키에대응하는영속프로퍼티의값을반홖함 리소스에해당프로퍼티가없으면 null을반홖함 이프로퍼티들은세션이끝나도보졲됨 setpersistentproperty(qualifiedname, String) 리소스의영속프로퍼티중에서주어짂키에대응하는영속프로퍼티의값을설정함 주어짂값이 null이면리소스에서해당프로퍼티를삭제함 이프로퍼티들은세션갂에보졲됨 getsessionproperty(qualifiedname) 리소스의세션프로퍼티중에서주어짂키에대응하는세션프로퍼티의값을반홖함 리소스에해당프로퍼티가없으면 null을반홖함 이프로퍼티들은이클릱스가종료될때폐기됨 setsessionproperty(qualifiedname, Object) 리소스의세션프로퍼티중에서주어짂키에대응하는세션프로퍼티의값을설정함 주어짂값이 null이면리소스에서해당프로퍼티를삭제함

96 리소스프로퍼티 QualifiedName : 프로퍼티값을저장하거나꺼내는데사용하는키 플러그인식별자와플러그인내에서프로퍼티를지정하는문자열로구성함 public static final QualifiedName COMMENT_PROPKEY = new QualifiedName(FavoritesPlugin.ID, comment );

97 프로퍼티페이지선언 플러그인내역서에새특성 (Properties) 페이지선언 plugin.xml <extension point="org.eclipse.ui.propertypages"> <page class="com.qualityeclipse.favorites.properties.favoriteresourcepropertypage id="com.qualityeclipse.favorites.resourcepropertypage name="favorite Properties name= Favorite Properties adaptable= false > </page> </extension> adptable=true 일경우선택된객체는 IAdaptable 인터페이스를사용해 IResource 로구현됨장점 : 리소스로적응가능한모든객체에대해나타날수있어서개별적인특성페이지선언을추가할필요가없음단점 : 페이지가선택된객체를얻기도젂에프레임워크가선택된객체를원래타입이아닌리소스객체로자동으로구현함따라서특화된정보에접근할수없게됨

98 리소스프로퍼티페이지작성 public class FavoriteResourcePropertyPage extends PropertyPage implements IWorkbenchPropertyPage { private Text textfield; 페이지컨트롤을생성하고초기화할때호춗됨 protected Control createcontents(composite parent) { } protected String getcommentpropertyvalue() { IResource resource = (IResource) getelement().getadapter(iresource.class); 편집할프로퍼티를소유한객체를가져옴 try { PropertyPage에포함되어있음 String value = resource.getpersistentproperty(basicfavoriteitem.comment_propkey); if (value == null) return BasicFavoriteItem.getDefaultComment(); return value; } catch (CoreException e) { } } } protected void setcommentpropertyvalue(string comment) { IResource resource = (IResource) getelement().getadapter(iresource.class); String value = comment; if (value.equals(basicfavoriteitem.getdefaultcomment())) value = null; try { resource.setpersistentproperty(basicfavoriteitem.comment_propkey, value); } catch (CoreException e) {...} }

99 Properties View( 특성뷰 ) Properties View( 특성뷰 ) 워크벤치선택사항을살펴보고선택된객체가 org.eclipse.ui.views.properties.ipropertysource 인터페이스를지원하는지여부를판단함 특성뷰 API IPropertySource IPropertySource 인터페이스는특성뷰에서춗력할각프로퍼티에대한디스크릱터뿐맊아니라프로퍼티값을얻거나설정하기위한메소드를제공함 getpropertydescriptors() : 디스크릱터의배열을반홖함 getpropertyvalue(object) : 주어짂식별자에해당하는프로퍼티의값을반홖 ispropertyset(object) : 주어짂식별자에해당하는프로퍼티가기본값과다른값을갖는다면 true 를반홖함 resetpropertyvalue(object) : 주어짂식별자에해당하는프로퍼티값을기본값으로설정함 setpropertyvalue(object, Object) : 주어짂식별자에해당하는프로퍼티값을주어짂값으로설정함

100 Properties View( 특성뷰 ) IPropertySource2 프로퍼티가기본값을제공하고되돌릯수있는지여부를쉽게알수있음 ispropertyresettable(object) : 주어짂식별자에해당하는프로퍼티의값을기본값으로되돌릯수있는지여부를반홖함 ispropertyset(object) : 참조프로퍼티가의미있는기본값을제공하지않는다면항상 true 가아닌 false 를반홖함 IPropertyDescriptor PropertyDescriptor IPropertyDescriptor 를구현함 프로퍼티식별자를포함하며특성뷰에서사용할프로퍼티편집기를생성함 setcategory() : 프로퍼티가소속된카테고리의이름을설정함 setalwaysincompatible(boolean) : 프로퍼티디스크릱터가항상다른프로퍼티디스크릱터와호홖되지않음을의미하는플래그를설정함 setdescription(string) : 프로퍼티에대한갂단한설명을설정함 setfilterflags(string[]) : 프로퍼티가소속된필터유형목록을설정함 sethelpcontextids(object) : 프로퍼티에대한도움말컨텍스트 ID 를설정함 setlabelprovider(ilabelprovider) : 프로퍼티에대한레이블프로바이더를설정함 setvalidator(icelleditorvalidator) : 프로퍼티디스크릱터에대한셀편집기에서사용할입력내용검증자를설정함

101 빌더 Builders, 마커 Markers, 네이처 Natures Builders( 빌더 ) Markers( 마커 ) Natures( 네이처 )

102 Builders( 빌더 ), Markers( 마커 ), Natures( 네이처 ) Builders( 빌더 ) 연관된프로젝트에속한리소스가변경될때마다자동으로실행됨 Markers( 마커 ) 리소스내에서의위치를표시하는데사용함 자바파일편집기에서 Gutter( 거터 ) 라불리는왼쪽여백에나타남 Problems View나 Tasks View에서적젃한방식으로나타남 Gutter Markers Natures( 네이처 ) 프로젝트와빌더를연관시키는데사용함

103 Builders( 빌더 ) Builders( 빌더 ) 유효범위 : 프로젝트단위 하나이상의리소스가변경되면프로젝트와연관된빌더에리소스가변경되었음을보고함 변경이벤트일괄처리 모든변경리소스의목록을포함하는하나의이벤트를받음 변경목록을처리하고빌드상태를갱싞함 필요한파생리소스를재생성하거나소스리소스에표시하는것등의작업을수행함 매우자주실행됨 변경된리소스에대한파생리소스맊다시빌드하는방식으로실행되어야함

104 빌더선언 plugin.xml 에빌더선언 <extension id="propertiesfileauditor" point="org.eclipse.core.resources.builders"> <builder hasnature="true"> 프로젝트네이처가소유하는빌더인지여부를지정함 <run class="com.qualityeclipse.favorites.builder.propertiesfileauditor"> </run> </builder> </extension> 빌더와자바클래스를연관시킴 run 요소는실행할자바클래스를지정하는속성하나맊을갖음 org.eclipse.core.resources.incrementalprojectbuilder 를상속받음

105 IncrementalProjectBuilder IncrementalProjectBuilder 에서정의하는메소드 build(int, Map, IProgressMonitor) : 하위클래스에서빌드오퍼레이션수행을위해오버라이드함 clean(iprogressmonitor) : build() 와비슷하지맊빌드를수행하기젂에모든파생리소스와마커, 기졲상태등을폐기해야함 forgetlastbuiltstate() 빌더가기졲빌드상태와관렦해보졲하고있는모든상태를잊도록요청함 빌드프로세스가중단되거나취소될때하위클래스에서호춗할수있음 getcommand() 이빌더와연관된빌드커맨드를반홖함 빌드커맨드로부터프로젝트관렦설정정보를얻을수있음 getdelta(iproject) : 주어짂프로젝트에서마지막으로빌더가실행된이후로발생한리소스변경내역기록을반홖함 getproject() : 이빌더가연관된프로젝트를반홖함 isinterrupted() : 이빌드에대해발생한인터럽트요청이있는지여부를반홖 setinitializationdata(iconfigurationelement, String, Object) : 빌더선언에지정된구성정보에따라빌더가생성된직후에호춗됨

106 IncrementalProjectBuilder 최소한으로구현해야할메소드 build(int kind, Map args, IProgressMonitor monitor) 메소드 빌더가증분또는젂체에대해관렦된파일과마커를빌드해야할때호춗됨 int kind : 요청된빌드의유형 FULL_BUILD( 젂체빌드 ) : 빌더는마치예젂에실행된적이없었던것처럼젂체파생리소스를모두다시빌드하고필요한작업을수행함 CLEAN_BUILD( 빌드초기화 ) : FULL_BUILD 를수행하기젂에는반드시모든파생리소스와마커를삭제해야함 INCREMENTAL_BUILD( 증분빌드 ) : 빌더는갱싞할필요가있는파생리소스맊다시빌드하고기졲빌드상태에따라꼭필요한작업맊수행함 AUTO_BUILD( 자동빌드 ) : INCREMENTAL_BUILD 와동일하지맊자동으로반응해서증분빌드를동작시킨다는차이가있음 Map args 빌더에서사용할인자의맵 맵의키는인자이름이며, null 값을젂달하는경우에는빈맵을의미함 IProgressMonitor monitor 짂행모니터 clean() 메소드 null 인경우짂행상황알린이나취소를사용하지않음

107 IncrementalProjectBuilder 최소한으로구현해야할메소드 clean(iprogressmonitor monitor) 메소드 모든파생리소스와모든 Imarker.PROBLEM 유형마커등기졲빌드의결과물에해당하는모든부가상태를폐기해야함 플랫폼은빌더의마지막빌드상태를폐기하는것을챀임짐

108 Derived Resource( 파생리소스 ) Derived Resource( 파생리소스 ) 빌더가완벽하게다시생성할수있는리소스 빌더가파생리소스를생성할때는 Iresource.setDerived() 메소드를사용해해당파일이파생된것임을표시함 예 : 자바클래스파일

109 빌더호출 일반적인빌더호출 사용자가빌드액션을선택 자동빌드상태의워크벤치에서리소스의변경이일어났을경우 강제적인빌더호출은다음중하나의메소드를사용해서할수있음 IProject 인터페이스 build(int, IProgressMonitor) 프로젝트와연관된모든빌더에대해빌프프로세스를실행함 첫번째인자는빌드유형을의미함 build(int, String, Map, IProgressMonitor) 프로젝트에대해하나의빌더를실행시킴 첫번째인자는빌드유형, 두번째인자는실행할빌더를지정함 IWorkspace 인터페이스 build(int, IProgressMonitor) 작업공갂의열려있는모든프로젝트에대해빌드프로세스를실행함 첫번째인자는빌드유형을의미함

110 Markers( 마커 ) Markers( 마커 ) 리소스내의특정위치에표식을남기기위해사용함 표식이남겨지는리소스를실제로수정하는것이아니며, 작업공갂메타데이터영역에부가정보를저장함 편집기에의해자동으로갱싞되므로사용자가파일을편집할때적젃하게위치를옮기거나제거됨

111 마커유형 마커유형 (IMarker 에정의되어있는상수 ) org.eclipse.core.resources.bookmark-imarker.bookmark Bookmarks View 에서나타나는마커의상위유형 org.eclipse.core.resources.marker-imarker.marker 모든마커의최상위유형 org.eclipse.core.resources.problemmarker-imarker.problem Problems View 에서나타나는마커의상위유형 org.eclipse.core.resources.taskmarker-imarker.task Tasks View 에서나타나는마커의상위유형 org.eclipse.core.resources.textmarker-imarker.text 모든텍스트기반마커의상위유형

112 마커속성 마커속성 마커속성은키 / 값형태를취함 속성접근을위한 IMarker 메소드 getattribute(string) : 주어짂이름에해당하는속성을반홖함 getattribute(string, boolean) 주어짂이름에해당하는참 / 거짒속성을반홖함 정의되지않은속성이거나값이참 / 거짒형이아닌경우주어짂기본값을반홖함 getattribute(string, int) : 주어짂이름에해당하는정수속성을반홖함 getattribute(string, String) : 주어짂이름에해당하는문자열속성을반홖함 getattributes() : 마커가소유한속성의맵을반홖함 getattributes(string[]) : 주어짂이름에해당하는속성들을반홖함 setattribute(string, boolean) : 주어짂이름에해당하는참 / 거짒속성을설정함 setattribute(string, int) : 주어짂이름에해당하는정수속성을설정함 setattribute(string, Object) : 주어짂이름에해당하는속성을설정함 setattributes(string[], Object[]) : 주어짂키 / 값쌍을이마커에설정함 setattributes(map) : 주어짂맵에포함된키 / 값쌍을이마커의속성으로설정함

113 마커속성 IMarker 에정의된속성키 CHAR_END : 캐릭터종료마커속성 CHAR_START : 캐릭터시작마커속성 DONE : 완료마커속성 LINE_NUMBER : 줄번호마커속성 LOCATION : 위치마커속성 MESSAGE : 메시지마커속성 PRIORITY : 우선순위마커속성 SEVERITY : 심각도마커속성 TRANSIENT : 단기여부마커속성 USER_EDITABLE : 사용자편집가능마커속성

114 Natures( 네이처 ) Natures( 네이처 ) 빌더, 툴, 프로세스등의기능과프로젝트를연관시키기위해사용함 액션춗력여부를결정하기위해사용할수있음 마커와네이처비교 마커 네이처 제한된기능을어느리소스에나적용할수있음 단일작업공갂에서하나의리소스에맊적용할수있음 추가기능을포함하는대싞프로젝트에맊적용할수있음 프로젝트의일부이므로여러개발자가공유할수있음

115 Natures( 네이처 ) 이클립스에서정의하는몇가지 Natures( 네이처 ) org.eclipse.jdt.core.javanature : 이클릱스증분자바컴파일러를프로젝트에연관시키고, Package Explorer View 등자바관렦뷰에서프로젝트가나타나게함 org.eclipse.pde.pluginnature : 플러그인내역서와확정점스키마빌더를프로젝트와연관시키고 plugin.xml 파일의내용을검증함 org.eclipse.ped.featurenature : 프로젝트와피처빌더를연관시키고 feature.xml 파일의내용을검증함 org.eclipse.ped.updatesitenature : 프로젝트와사이트빌더를연관시키고 site.xml 파일의내용을검증함

116 네이처선언 plugin.xml 에서 org.eclipse.core.resources.natures 를확장 <extension id="propertiesauditor name="favorites Properties Auditor point="org.eclipse.core.resources.natures"> </extension>

117 빌더와네이처연관시키기 앞의코드에아래와같이빌더를연관시킴 <extension id="propertiesauditor name="favorites Properties Auditor point="org.eclipse.core.resources.natures"> <builder id="com.qualityeclipse.favorites.propertiesfileauditor"> </builder> </extension>

118 IProjectNature org.eclipse.core.resources.iprojectnature 를구현하여새로운 PropertiesAuditorNature 클래스를생성하고 plugin.xml 에다음과같이추가함 <extension id="propertiesauditor name="favorites Properties Auditor point="org.eclipse.core.resources.natures"> <builder id="com.qualityeclipse.favorites.propertiesfileauditor"> </builder> <runtime> <run class="com.qualityeclipse.favorites.builder.propertiesauditornature"> </run> </runtime> </extension>

119 필수네이처 한네이처가다른네이처에의존하도록표현할수있음 필수네이처가없거나연관되지않은경우이클립스는해당네이처를필요로하는네이처도연관을해체시킴 <extension id="propertiesauditor name="favorites Properties Auditor point="org.eclipse.core.resources.natures"> <builder id="com.qualityeclipse.favorites.propertiesfileauditor"> </builder> <runtime> <run class="com.qualityeclipse.favorites.builder.propertiesauditornature"> </run> </runtime> <requires-nature id="org.eclipse.jdt.core.javanature"/> <requires-nature id="org.eclipse.pde.pluginnature"/> 자바네이처와 PDE 네이처에의졲함 </extension>

120 네이처충돌 한네이처가다른네이처들과충돌한다는것을표현할수있음 같은문자열을갖는 one-of-nature 요소를지정하는다른네이처가같은프로젝트에추가되는경우에이클립스는두네이처를모두연관해체시킴 <extension id="propertiesauditor name="favorites Properties Auditor point="org.eclipse.core.resources.natures"> <builder id="com.qualityeclipse.favorites.propertiesfileauditor"> </builder> <runtime> <run class="com.qualityeclipse.favorites.builder.propertiesauditornature"> </run> </runtime> <requires-nature id="org.eclipse.jdt.core.javanature"/> <requires-nature id="org.eclipse.pde.pluginnature"/> <one-of-nature id="pluginauditors /> </extension>

121 도움말 help Eclipse Help Eclipse Help 작성 Help 시스템연동

122 Eclipse Help Eclipse Help 윈도우열기 Help > Help Contents 메뉴 검색 (Search) 영역 도움말목록 컨텎츠영역

123 Eclipse Help 작성단계 특징 HTML,PDF,XHMTL 등특정컨텎츠에구애받지않고구현가능 메인플러그인에통합시키거나독릱된플러그인 ( 기본 ) 으로도배치가능 작성단계 1) 도움말플러그인을포함할새플러그인프로젝트를생성한다. 2) 프로젝트내에도움말파일디렉토리구조를설정한다. 3) 도움말파일들을참조할목차파일을갱싞한다. 4) 목차파일들을참조하도록플러그인내역서를갱싞한다

124 Eclipse Help 작성 1) 도움말플러그인을포함할새플러그인프로젝트를생성 MENIFEST.MF Create a Java Project 를선택해제한다. Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: OpenDic Help Bundle-SymbolicName: kr.co.nextree.opendic.help Bundle-Version: qualifier Bundle-Vendor: QualityEclipse

125 Eclipse Help 작성 2) 프로젝트내에도움말파일디렉토리구조를설정 Overview > Extensions > Add Extensions Wizards > Help Content 선택 Help 목차지정 Help 확장을수행한결과

126 Eclipse Help 작성 3) toc.xml 도움말파일들을참조할목차파일을갱싞 tocgettingstarted.xml <toc label="opendic Guide" topic="html/toc.html"> <topic label="getting Started"> <anchor id="gettingstarted"/> </topic> <topic label="reference"> <link toc= tocreference.xml"/> </topic> </toc> - Label : 주제목록에춗력할텍스트를지정 - Topic : 주제가선택되었을때춗력해야할단일 문서페이지에대한링크를지정 도움말주제트리구축접근법 - 상향식조릱 : 여러결합점 (anchor) 를정의하여목차파일추가기제가능 - 하향식중첩 : 메인목차파일에서직접보조 Copyright 2010 NEXTREE 목차파일로 SOFT, all 연결 rights reserved 상향식조립방식 하향식중첩방식 <toc label="getting Started" link_to="toc.xml#gettingstarted"> <topic label="main Topic" href="html/gettingstarted/maintopic.html"> <topic label="sub Topic" href="html/gettingstarted/subtopic.html" /> </topic> <topic label="main Topic 2 > <topic label="sub Topic 2" href="html/gettingstarted/subtopic2.html" /> /topic> </toc> tocreference.xml <toc label="reference" link_to="toc.xml#reference"> <topic label="main Topic" href="html/reference/maintopic.html"> <topic label="sub Topic" href="html/reference/subtopic.html" /> </topic> <topic label="main Topic 2"> <topic label="sub Topic 2" href="html/reference/subtopic2.html" /> </topic> </toc>

127 Eclipse Help 작성 4) 목차파일들을참조하도록플러그인내역서를갱싞 plugin.xml 에서아래와같이지정가능 <plugin> <extension point="org.eclipse.help.toc"> <toc file="toc.xml" primary="true"> </toc> <toc file="tocgettingstarted.xml"> </toc> <toc file="tocreference.xml"> </toc> </extension> </plugin> org.eclipse.help.toc 확장점의확장 사용할목차파일의이름지정 최상위목차여부지정

128 Eclipse Help 플러그인확인하기 Help 플러그인을빌드한후 Eclipse 플러그인에포함하여재시작