利用GEF制作表格系统(控制器设计)

控制器设计

通用模型

我们可以简单抽取一个控制器通用模型,实现监听器的注册和注销,其它控制器继承该控制器。

public class AbstractEditPart extends AbstractGraphicalEditPart

      implements PropertyChangeListener{

     

      //@Override

      public void activate(){

             super.activate();

             ((AbstractNode)getModel()).addPropertyChangeListener(this);

             //System.out.println("activate");

      }

      //@Override

      public void deactivate(){

             super.deactivate();

             ((AbstractNode)getModel()).removePropertyChange(this);

             //System.out.println("deactivate");

      }

     

      //@Override

      protected IFigure createFigure() {

             // TODO Auto-generated method stub

             return null;

      }

 

      //@Override

      protected void createEditPolicies() {

             // TODO Auto-generated method stub

 

      }

 

      public void propertyChange(PropertyChangeEvent evt) {

             // TODO Auto-generated method stub

            

      }

 

}

表格控制器设计

表格的控制器虽然比较复杂,但是也理解其机制,也不是特别复杂。重要的是要考虑表格中含有子元素,所以要注意:供子元素列表获取;子元素画板获取;素发生变化时,在刷新视图的显示、刷新子元素列表;安装相应的策略等。

public class FormTableEditPart extends AbstractEditPart{

     

      protected IFigure createFigure() {

             return new TableFigure((TableNode)getModel());

      }

     

      public void refreshVisuals(){

            

             Rectangle constraint = ((TableNode)getModel()).getConstraint();

            

             if(constraint.width==-1 || constraint.height == -1){

                   

                    constraint.width= ((TableNode)getModel()).getGrid().numColumns * 20+2;//((TableNode)getModel()).getWidthHint()

                    constraint.height=((TableNode)getModel()).getHeightHint()*2+2;

                    ((TableNode)getModel()).setConstraint(constraint);

             }

             ((GraphicalEditPart)getParent()).setLayoutConstraint(this, getFigure(), constraint);

            

      }

     

      public List getModelChildren(){

            

             return ((TableNode)getModel()).getChildren();

      }

      public void createEditPolicies(){

 

             installEditPolicy(EditPolicy.CONTAINER_ROLE,new ContainerLayoutEditPolicy());

             installEditPolicy(EditPolicy.COMPONENT_ROLE,new FormDeleteEditPolicy());

      }

      public IFigure getContentPane(){

            

             return ((TableFigure)getFigure()).getContainerFigure();

      }

     

      public void propertyChange(PropertyChangeEvent event){

             String prop=event.getPropertyName();

            

             if(TableNode.P_CHILDREN.equals(prop)){

                    this.refreshChildren();

                    this.refreshVisuals();

 

             }else if(prop.equals(TableNode.P_CONSTRAINT)){

                    refreshVisuals();

             }else if(prop.equals(TableNode.P_CHILDCHANGE)){

                   

                    refreshVisuals();

             }else if(prop.equals(TableNode.P_GRIDMANAGER)){

                    String delta=(String)event.getNewValue();

                    test(delta);

                    TableNode table=(TableNode)getModel();

                    Rectangle cons=TableTool.getTableConstraint(table);

                    table.setConstraint(cons);

             }else if(prop.equals(TableNode.P_TABLEBGCOLOR)){

                    getFigure().setBackgroundColor(((TableNode)getModel()).getBgColor());

                   

             }

            

             super.propertyChange(event);

      }

      public void test(String delta){

 

             List list=this.getChildren();

             IFigure parent=getContentPane();

             String type=delta.split(":")[0];

             int chgValue=Integer.parseInt(delta.split(":")[1]);

 

             GridLayout layout=((TableNode)getModel()).getGrid();

             for(int i=0;i<list.size();i++){

 

                    CellEditPart part=(CellEditPart)list.get(i);

                    GridData gridData=((CellNode)part.getModel()).getGridData();

                    if("vspace".equalsIgnoreCase(type)){

                           if(gridData.verticalSpan >1){

                                  gridData.heightHint+=(gridData.verticalSpan-1)*chgValue;

                           }

                    }else if("hspace".equalsIgnoreCase(type)){

                           if(gridData.horizontalSpan >1){

                                  gridData.widthHint+=(gridData.horizontalSpan-1)*chgValue;

                           }

                    }else{

                          

                    }

                    layout.setConstraint(part.getFigure(), gridData);

             }

 

      }

     

}

其它控制器

其它控制器类似。

 

至此,控制器业基本完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值