控制器设计
通用模型
我们可以简单抽取一个控制器通用模型,实现监听器的注册和注销,其它控制器继承该控制器。
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);
}
}
}
其它控制器
其它控制器类似。
至此,控制器业基本完成。