利用GEF制作表格系统(控制器设计)
关键字: 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);
}
}
}
其它控制器
其它控制器类似。
至此,控制器业基本完成。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 6225 次
- 来自: 深圳

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
osworkflow流程设计器
请到http://nuoda.diinoweb.com/中下载,不仅有六成编辑器 ...
-- by nuoda -
osworkflow流程设计器
怎么下载不了啊
-- by yangli -
java.sql.SQLException: I ...
非常感谢chenzengpeng!但是,好像不是这个原因。
-- by nuoda -
java.sql.SQLException: I ...
可能是服务器的监听停掉了,是数据库的问题,与应用无关;应该先检查一下oracle ...
-- by chenzengpeng -
osworkflow流程设计器
osworkflow设计器在哪里有下载啊??
-- by gaolixia






评论排行榜