天天看點

GEF原理及實作系列(五、請求和編輯政策)1.請求和編輯政策(Request and EditPolicies)2.編輯政策的實作

關鍵字: policies

請求和編輯政策是GEF架構中減輕控制器的負擔、減小代碼耦合度而實作的一種解決方案。

1.請求和編輯政策(Request and EditPolicies)

請求和編輯政策對初學者來說是比較難了解的部分,但正是因為這種機制才使得GEF架構功能強大,而且非常靈活。
在EditPart中,可以通過設定不同的編輯政策(EditPolicies)來處理不同的請求,這樣,一方面,可以把代碼從EditPart中解放處 理,分别由不同的EditPolicies進行處理,另一方面,使用者可以着力于自己的關注點,但由此也增加了學習GEF架構的時間。
另外,在EditPart中設定編輯政策時,要指定相應的角色(Role),角色隻是一個辨別,在同一個EditPart中不能存在兩個相同角色的編輯政策,讀者可以在GEF的聯機文檔(http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.gef.doc.isv/guide/guide.html )中找到詳細的編輯政策、請求和角色說明。
           

2.編輯政策的實作

控制器中通過createEditPolicies()方法添加編輯政策,每種編輯政策負責處理相應的請求。通常請求一般會對模型進行操作,在EditPolicies中,可以通過指令的方式操作模型,指令将在後面介紹。EditPolicies代碼如下:
           

java 代碼

package com.example.policies;  
  
import org.eclipse.draw2d.geometry.Rectangle;  
import org.eclipse.gef.EditPart;  
import org.eclipse.gef.Request;  
import org.eclipse.gef.commands.Command;  
import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;  
import org.eclipse.gef.requests.CreateRequest;  
  
import com.example.commands.CreateNodeCommand;  
import com.example.commands.MoveNodeCommand;  
import com.example.model.Diagram;  
import com.example.model.Node;  
import com.example.parts.NodePart;  
  
public class DiagramLayoutEditPolicy extends XYLayoutEditPolicy {  
  
    protected Command createAddCommand(EditPart child, Object constraint) {  
        return null;  
    }  
    //建立模型位置改變的指令  
    protected Command createChangeConstraintCommand(EditPart child, Object constraint) {  
        //如果位置改變的不是Node則傳回  
        if (!(child instanceof NodePart))  
            return null;  
        if (!(constraint instanceof Rectangle))  
            return null;  
  
        MoveNodeCommand cmd = new MoveNodeCommand();  
        cmd.setNode((Node) child.getModel());  
        //設定模型新的位置資訊  
        cmd.setLocation(((Rectangle) constraint).getLocation());  
        return cmd;  
  
    }  
    //獲得建立模型的指令  
    protected Command getCreateCommand(CreateRequest request) {  
        //判斷請求建立的是否為Node  
        if (request.getNewObject() instanceof Node) {  
            //建立CreateNodeCommand  
            CreateNodeCommand cmd = new CreateNodeCommand();  
            //設定父模型  
            cmd.setDiagram((Diagram) getHost().getModel());  
            //設定目前模型  
            cmd.setNode((Node) request.getNewObject());  
            Rectangle constraint = (Rectangle) getConstraintFor(request);  
            //設定模型的位置資訊  
            cmd.setLocation(constraint.getLocation());  
            //傳回Command對象  
            return cmd;  
        }  
        return null;  
    }  
  
    protected Command getDeleteDependantCommand(Request request) {  
        return null;  
    }  
}  
           
通過實作此編輯政策,GEF編輯器将能夠處理XYLayoutEditPolicy所能響應的相關請求,并交由相應的Command進行處理。
           

繼續閱讀