關鍵字: 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進行處理。