[zt]Master/Details 模式在Eclipse Forms中的应

系统 1789 0

From:http://www.eclipseworld.org/bbs/read.php?tid=1296

  Master/Details是UI设计中常见的一种模式。他有一组(列表或成树状结构)的master和一个被选中 master驱动的details集组成。
    master是一些不同的对象,通过对master的选择,驱动details的UI发生变化。在下面的图中,有3各不同的master,分别对应3种不同的UI:

描述:1 初始状态:只有master的树状列表
图片:


描述:2 选中一个master,是一个对象
图片:
 

描述:3 选中另外一个master,是一个不同的对象
图片:


描述:4 选中另外一个master,又是一个不同的对象
图片:
 

首先我们需要一个FormEditor,在这个FormEditor中添加我们要显示的页 最后我们只要实现不同的page就可以了。

 

java 代码
  1. public   class  AdvancedFormEditor  extends  FormEditor{   
  2.   
  3.    public  AdvancedFormEditor(){   
  4.      super ();   
  5.   }   
  6.   
  7.    protected   void  addPages(){   
  8.      try {   
  9.         addPage( new  MainPage( this ));   
  10.     } catch (PartInitException e){   
  11.         e.printStackTrace();   
  12.     }   
  13.   }   
  14.   
  15.    public   void  doSave(IProgressMonitor monitor){   
  16.   
  17.   }   
  18.   
  19.    public   void  doSaveAs(){   
  20.   }   
  21.   
  22.    public   boolean  isSaveAsAllowed(){   
  23.      return   false ;   
  24.   }   
  25. }   

 

然后来构造这个页,ScrolledPropertiesBlock对象就是我们存放master的地方。
在这个ScrolledPropertiesBlock中,我们将masters以树状结构显示出来。

java 代码
  1. public   class  MainPage  extends  FormPage{   
  2.    private  ScrolledPropertiesBlock block;   
  3.   
  4.    public  MainPage(FormEditor editor){   
  5.      super (editor, "main" , "Advanced Form Editor" );   
  6.     block= new  ScrolledPropertiesBlock();   
  7.   }   
  8.   
  9.    /* ManagedForm封装了form元素的生命周期管理与各个form元素之间的事件通知  
  10.   * ManagedForm本身并不是一个form,他包含了一个form并且可以注册IFormPart。  
  11.   * 可以将ManagedForm看作是'viewers',form和managed form之间的关系就好像  
  12.   * Table与TableViewer的关系一样。  
  13.   */   
  14.    protected   void  createFormContent(IManagedForm managedForm){   
  15.     ScrolledForm form=managedForm.getForm();   
  16.     form.setText( "Advanced Form Editor" );   
  17.     form.setBackgroundImage(Images.getImage( "icons/form_banner.gif" ));   
  18.        
  19.      //尽量在最后调用这个方法   
  20.     block.createContent(managedForm);   
  21.   }   
  22. }   



主要的内容还是在ScrolledPropertiesBlock这个类中。
  Eclipse Forms对Master/Details 模式体供了一个实现。具备以下属性:
1、当details part被创建的时候, master part的工厂方法createMasterPart还是抽象的,必须先被其子类实现。
2、Master and details实际上是sash form的两个子元素。可以通过调整sash的大小来改变他们俩的区域。
3、由于sash form的特性, master 与 details parts可以被横向或纵向排列。

    master/details 块的目的就是创建一个tree或table section,通过managed form来唤醒selection事件。
  如果details part可以处理被选中的master对象,他就会切换不同的页来显示属性。

  当子类在创建顶级master/details时应该注意:
1、创建一个用来驱动details的master part
2、为form tool bar提供actions,一般显示在form的右上方,与form标题区同排
3、注册detail页,master part可以条用注册的所有detail

java 代码
  1. public   class  ScrolledPropertiesBlock  extends  MasterDetailsBlock {   
  2.    class  MasterContentProvider...{   
  3.     ... ...   
  4.   }   
  5.    class  MasterLabelProvider...{   
  6.     ... ...   
  7.   }   
  8.   
  9.    protected   void  createMasterPart( final  IManagedForm managedForm,Composite parent) {   
  10.     FormToolkit toolkit = managedForm.getToolkit();   
  11.     Section section = toolkit.createSection(parent, Section.DESCRIPTION|Section.TITLE_BAR);   
  12.     section.setText( "模型列表" );   
  13.     section.setDescription( "以下把两种模型列在表中,可以通过选择不同的模型在右边切换编辑页面进行编辑" );   
  14.     section.marginWidth =  10 ;   
  15.     section.marginHeight =  5 ;   
  16.        
  17.     toolkit.createCompositeSeparator(section);   
  18.        
  19.     Composite client = toolkit.createComposite(section, SWT.WRAP);   
  20.     GridLayout layout =  new  GridLayout();   
  21.     layout.numColumns =  2 ;   
  22.     client.setLayout(layout);   
  23.        
  24.     Table t = toolkit.createTable(client, SWT.NULL);   
  25.     t.setLayoutData( new  GridData(GridData.FILL_BOTH));   
  26.        
  27.      /*  
  28.       * 为当前parent内,toolkit所创建的widget添加边框。如果widget已经设置了SWT.BORDER,  
  29.       * 则不会再为其添加边框。   
  30.       */   
  31.     toolkit.paintBordersFor(client);   
  32.        
  33.     Button b = toolkit.createButton(client,  "添加" , SWT.PUSH);   
  34.     b.setLayoutData( new  GridData(GridData.VERTICAL_ALIGN_BEGINNING));   
  35.        
  36.      /* IFormPart管理了整个Part的dirty state, saving, commit, focus, selection changes等等这样的事件。  
  37.       * 并不是form中的每一个control都需要成为一个form part,最好将一组control通过实现IFormPart变成一个Part.  
  38.       * 一般来说Section就是一个自然形成的组,所以Eclipse Form提供了一个SectionPart的实现,它包含一个Section  
  39.       * 的实例。     
  40.       */   
  41.      final  SectionPart spart =  new  SectionPart(section);   
  42.     managedForm.addPart(spart);   
  43.        
  44.     TableViewer viewer =  new  TableViewer(t);   
  45.     viewer.addSelectionChangedListener( new  ISelectionChangedListener() {   
  46.          public   void  selectionChanged(SelectionChangedEvent event) {   
  47.           managedForm.fireSelectionChanged(spart, event.getSelection());   
  48.         }   
  49.     });   
  50.     viewer.setContentProvider( new  MasterContentProvider());   
  51.     viewer.setLabelProvider( new  MasterLabelProvider());   
  52.     viewer.setInput( new  SimpleFormEditorInput( "simple " ));   
  53.        
  54.      /**  
  55.       * Sets the client of this expandable composite. The client must not be  
  56.       * null and must be a direct child of this container.  
  57.       */   
  58.     section.setClient(client);   
  59.   }   
  60.      
  61.    protected   void  createToolBarActions(IManagedForm managedForm) {   
  62.      final  ScrolledForm form = managedForm.getForm();   
  63.     Action haction =  new  Action( "hor" , Action.AS_RADIO_BUTTON) {   
  64.          public   void  run() {   
  65.           sashForm.setOrientation(SWT.HORIZONTAL);   
  66.           form.reflow( true );   
  67.         }   
  68.     };   
  69.     haction.setChecked( true );   
  70.     haction.setToolTipText( "横向排列" );   
  71.     haction.setImageDescriptor(Images.getImageDescriptor( "icons/th_horizontal.gif" ));   
  72.        
  73.     Action vaction =  new  Action( "ver" , Action.AS_RADIO_BUTTON) {   
  74.          public   void  run() {   
  75.           sashForm.setOrientation(SWT.VERTICAL);   
  76.           form.reflow( true );   
  77.         }   
  78.     };   
  79.     vaction.setChecked( false );   
  80.     vaction.setToolTipText( "纵向排列" );   
  81.     vaction.setImageDescriptor(Images.getImageDescriptor( "icons/th_vertical.gif" ));   
  82.     form.getToolBarManager().add(haction);   
  83.     form.getToolBarManager().add(vaction);   
  84.   }   
  85.    protected   void  registerPages(DetailsPart detailsPart){   
  86.     detailsPart.registerPage(TopicDatadefSet. class new  DatadefSetDetailsPage());   
  87.     detailsPart.registerPage(TopicCategory. class new  TopicCatalogDetailsPage());   
  88.     detailsPart.registerPage(TopicDef. class new  TopicDetailsPage());   
  89.   }   
  90. }   

 

大家应该注意到上面的程序中有两个很重要的方法:

java 代码
  1. TableViewer viewer =  new  TableViewer(t);   
  2. viewer.addSelectionChangedListener( new  ISelectionChangedListener() {   
  3.    public   void  selectionChanged(SelectionChangedEvent event) {   
  4.     managedForm.fireSelectionChanged(spart, event.getSelection());   
  5.   }   
  6. });   


这里面的event.getSelection()得到的就是这个master的对象,也就是下面这个方法中的
TopicDatadefSet、TopicCategory、TopicDef3个对象。而下面这个方法就是把每个master对象与其detail页关联起来:

java 代码
  1. protected   void  registerPages(DetailsPart detailsPart){   
  2.     detailsPart.registerPage(TopicDatadefSet. class new  DatadefSetDetailsPage());   
  3.     detailsPart.registerPage(TopicCategory. class new  TopicCatalogDetailsPage());   
  4.     detailsPart.registerPage(TopicDef. class new  TopicDetailsPage());   
  5. }   

 

java 代码
  1. public   class  DatadefSetDetailsPage  implements  IDetailsPage{   
  2.   ... ...   
  3. }   

 

 

[zt]Master/Details 模式在Eclipse Forms中的应用


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论