From:http://www.eclipseworld.org/bbs/read.php?tid=1296
?
Master/Details是UI設(shè)計中常見的一種模式。他有一組(列表或成樹狀結(jié)構(gòu))的master和一個被選中 master驅(qū)動的details集組成。
? ? master是一些不同的對象,通過對master的選擇,驅(qū)動details的UI發(fā)生變化。在下面的圖中,有3各不同的master,分別對應(yīng)3種不同的UI:
描述:1 初始狀態(tài):只有master的樹狀列表
圖片:
描述:2 選中一個master,是一個對象
圖片:
?
描述:3 選中另外一個master,是一個不同的對象
圖片:
描述:4 選中另外一個master,又是一個不同的對象
圖片:
?
首先我們需要一個FormEditor,在這個FormEditor中添加我們要顯示的頁
最后我們只要實現(xiàn)不同的page就可以了。
?
- public ? class ?AdvancedFormEditor? extends ?FormEditor{ ??
- ??
- ?? public ?AdvancedFormEditor(){ ??
- ???? super (); ??
- ??} ??
- ??
- ?? protected ? void ?addPages(){ ??
- ???? try { ??
- ????????addPage( new ?MainPage( this )); ??
- ????} catch (PartInitException?e){ ??
- ????????e.printStackTrace(); ??
- ????} ??
- ??} ??
- ??
- ?? public ? void ?doSave(IProgressMonitor?monitor){ ??
- ??
- ??} ??
- ??
- ?? public ? void ?doSaveAs(){ ??
- ??} ??
- ??
- ?? public ? boolean ?isSaveAsAllowed(){ ??
- ???? return ? false ; ??
- ??} ??
- }???
?
然后來構(gòu)造這個頁,ScrolledPropertiesBlock對象就是我們存放master的地方。
在這個ScrolledPropertiesBlock中,我們將masters以樹狀結(jié)構(gòu)顯示出來。
- public ? class ?MainPage? extends ?FormPage{ ??
- ?? private ?ScrolledPropertiesBlock?block; ??
- ??
- ?? public ?MainPage(FormEditor?editor){ ??
- ???? super (editor, "main" , "Advanced?Form?Editor" ); ??
- ????block= new ?ScrolledPropertiesBlock(); ??
- ??} ??
- ??
- ?? /*?ManagedForm封裝了form元素的生命周期管理與各個form元素之間的事件通知 ?
- ??*?ManagedForm本身并不是一個form,他包含了一個form并且可以注冊IFormPart。 ?
- ??*?可以將ManagedForm看作是'viewers',form和managed?form之間的關(guān)系就好像 ?
- ??*?Table與TableViewer的關(guān)系一樣。 ?
- ??*/ ??
- ?? protected ? void ?createFormContent(IManagedForm?managedForm){ ??
- ????ScrolledForm?form=managedForm.getForm(); ??
- ????form.setText( "Advanced?Form?Editor" ); ??
- ????form.setBackgroundImage(Images.getImage( "icons/form_banner.gif" )); ??
- ???? ??
- ???? //盡量在最后調(diào)用這個方法 ??
- ????block.createContent(managedForm); ??
- ??} ??
- }???
主要的內(nèi)容還是在ScrolledPropertiesBlock這個類中。
? Eclipse Forms對Master/Details 模式體供了一個實現(xiàn)。具備以下屬性:
1、當details part被創(chuàng)建的時候, master part的工廠方法createMasterPart還是抽象的,必須先被其子類實現(xiàn)。
2、Master and details實際上是sash form的兩個子元素。可以通過調(diào)整sash的大小來改變他們倆的區(qū)域。
3、由于sash form的特性, master 與 details parts可以被橫向或縱向排列。
? ? master/details 塊的目的就是創(chuàng)建一個tree或table section,通過managed form來喚醒selection事件。
? 如果details part可以處理被選中的master對象,他就會切換不同的頁來顯示屬性。
? 當子類在創(chuàng)建頂級master/details時應(yīng)該注意:
1、創(chuàng)建一個用來驅(qū)動details的master part
2、為form tool bar提供actions,一般顯示在form的右上方,與form標題區(qū)同排
3、注冊detail頁,master part可以條用注冊的所有detail
- public ? class ?ScrolledPropertiesBlock? extends ?MasterDetailsBlock?{ ??
- ?? class ?MasterContentProvider...{ ??
- ????...?... ??
- ??} ??
- ?? class ?MasterLabelProvider...{ ??
- ????...?... ??
- ??} ??
- ??
- ?? protected ? void ?createMasterPart( final ?IManagedForm?managedForm,Composite?parent)?{ ??
- ????FormToolkit?toolkit?=?managedForm.getToolkit(); ??
- ????Section?section?=?toolkit.createSection(parent,?Section.DESCRIPTION|Section.TITLE_BAR); ??
- ????section.setText( "模型列表" ); ??
- ????section.setDescription( "以下把兩種模型列在表中,可以通過選擇不同的模型在右邊切換編輯頁面進行編輯" ); ??
- ????section.marginWidth?=? 10 ; ??
- ????section.marginHeight?=? 5 ; ??
- ???? ??
- ????toolkit.createCompositeSeparator(section); ??
- ???? ??
- ????Composite?client?=?toolkit.createComposite(section,?SWT.WRAP); ??
- ????GridLayout?layout?=? new ?GridLayout(); ??
- ????layout.numColumns?=? 2 ; ??
- ????client.setLayout(layout); ??
- ???? ??
- ????Table?t?=?toolkit.createTable(client,?SWT.NULL); ??
- ????t.setLayoutData( new ?GridData(GridData.FILL_BOTH)); ??
- ???? ??
- ???? /* ?
- ??????*?為當前parent內(nèi),toolkit所創(chuàng)建的widget添加邊框。如果widget已經(jīng)設(shè)置了SWT.BORDER, ?
- ??????*?則不會再為其添加邊框。? ?
- ??????*/ ??
- ????toolkit.paintBordersFor(client); ??
- ???? ??
- ????Button?b?=?toolkit.createButton(client,? "添加" ,?SWT.PUSH); ??
- ????b.setLayoutData( new ?GridData(GridData.VERTICAL_ALIGN_BEGINNING)); ??
- ???? ??
- ???? /*?IFormPart管理了整個Part的dirty?state,?saving,?commit,?focus,?selection?changes等等這樣的事件。 ?
- ??????*?并不是form中的每一個control都需要成為一個form?part,最好將一組control通過實現(xiàn)IFormPart變成一個Part. ?
- ??????*?一般來說Section就是一個自然形成的組,所以Eclipse?Form提供了一個SectionPart的實現(xiàn),它包含一個Section ?
- ??????*?的實例。??? ?
- ??????*/ ??
- ???? final ?SectionPart?spart?=? new ?SectionPart(section); ??
- ????managedForm.addPart(spart); ??
- ???? ??
- ????TableViewer?viewer?=? new ?TableViewer(t); ??
- ????viewer.addSelectionChangedListener( new ?ISelectionChangedListener()?{ ??
- ???????? public ? void ?selectionChanged(SelectionChangedEvent?event)?{ ??
- ??????????managedForm.fireSelectionChanged(spart,?event.getSelection()); ??
- ????????} ??
- ????}); ??
- ????viewer.setContentProvider( new ?MasterContentProvider()); ??
- ????viewer.setLabelProvider( new ?MasterLabelProvider()); ??
- ????viewer.setInput( new ?SimpleFormEditorInput( "simple?" )); ??
- ???? ??
- ???? /** ?
- ??????*?Sets?the?client?of?this?expandable?composite.?The?client?must?not?be ?
- ??????*?null?and?must?be?a?direct?child?of?this?container. ?
- ??????*/ ??
- ????section.setClient(client); ??
- ??} ??
- ?? ??
- ?? protected ? void ?createToolBarActions(IManagedForm?managedForm)?{ ??
- ???? final ?ScrolledForm?form?=?managedForm.getForm(); ??
- ????Action?haction?=? new ?Action( "hor" ,?Action.AS_RADIO_BUTTON)?{ ??
- ???????? public ? void ?run()?{ ??
- ??????????sashForm.setOrientation(SWT.HORIZONTAL); ??
- ??????????form.reflow( true ); ??
- ????????} ??
- ????}; ??
- ????haction.setChecked( true ); ??
- ????haction.setToolTipText( "橫向排列" ); ??
- ????haction.setImageDescriptor(Images.getImageDescriptor( "icons/th_horizontal.gif" )); ??
- ???? ??
- ????Action?vaction?=? new ?Action( "ver" ,?Action.AS_RADIO_BUTTON)?{ ??
- ???????? public ? void ?run()?{ ??
- ??????????sashForm.setOrientation(SWT.VERTICAL); ??
- ??????????form.reflow( true ); ??
- ????????} ??
- ????}; ??
- ????vaction.setChecked( false ); ??
- ????vaction.setToolTipText( "縱向排列" ); ??
- ????vaction.setImageDescriptor(Images.getImageDescriptor( "icons/th_vertical.gif" )); ??
- ????form.getToolBarManager().add(haction); ??
- ????form.getToolBarManager().add(vaction); ??
- ??} ??
- ?? protected ? void ?registerPages(DetailsPart?detailsPart){ ??
- ????detailsPart.registerPage(TopicDatadefSet. class ,? new ?DatadefSetDetailsPage()); ??
- ????detailsPart.registerPage(TopicCategory. class ,? new ?TopicCatalogDetailsPage()); ??
- ????detailsPart.registerPage(TopicDef. class ,? new ?TopicDetailsPage()); ??
- ??} ??
- } ??
?
大家應(yīng)該注意到上面的程序中有兩個很重要的方法:
- TableViewer?viewer?=? new ?TableViewer(t); ??
- viewer.addSelectionChangedListener( new ?ISelectionChangedListener()?{ ??
- ?? public ? void ?selectionChanged(SelectionChangedEvent?event)?{ ??
- ????managedForm.fireSelectionChanged(spart,?event.getSelection()); ??
- ??} ??
- }); ??
這里面的event.getSelection()得到的就是這個master的對象,也就是下面這個方法中的
TopicDatadefSet、TopicCategory、TopicDef3個對象。而下面這個方法就是把每個master對象與其detail頁關(guān)聯(lián)起來:
- protected ? void ?registerPages(DetailsPart?detailsPart){ ??
- ????detailsPart.registerPage(TopicDatadefSet. class ,? new ?DatadefSetDetailsPage()); ??
- ????detailsPart.registerPage(TopicCategory. class ,? new ?TopicCatalogDetailsPage()); ??
- ????detailsPart.registerPage(TopicDef. class ,? new ?TopicDetailsPage()); ??
- }???
?
- public ? class ?DatadefSetDetailsPage? implements ?IDetailsPage{ ??
- ??...?... ??
- }???
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
