當我們點選tool欄的建立節點工具時,Tool就會是CreationTool,
然後在繪圖區移動時會執行如下:
protected boolean handleMove() {
updateTargetRequest();
updateTargetUnderMouse();
setCurrentCommand(getCommand());
showTargetFeedback();
//feedback
return true;
}
protected void updateTargetRequest() {
CreateRequest req = getCreateRequest();
if (isInState(STATE_DRAG_IN_PROGRESS)) {
Point loq = getStartLocation();
Rectangle bounds = new Rectangle(loq, loq);
bounds.union(loq.getTranslated(getDragMoveDelta()));
req.setSize(bounds.getSize());
req.setLocation(bounds.getLocation());
req.getExtendedData().clear();
if (!getCurrentInput().isAltKeyDown() && helper != null) {
PrecisionRectangle baseRect = new PrecisionRectangle(bounds);
PrecisionRectangle result = baseRect.getPreciseCopy();
helper.snapRectangle(req, PositionConstants.NSEW,
baseRect, result);
req.setLocation(result.getLocation());
req.setSize(result.getSize());
}
} else {
req.setSize(null);
req.setLocation(getLocation());
}
}
當我們從tool欄選擇工具,然後在繪圖區單擊放開時就會建立這個圖形。
protected boolean handleButtonUp(int button) {
if (stateTransition(STATE_DRAG | STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) {
eraseTargetFeedback();
unlockTargetEditPart();
performCreation(button);
}
setState(STATE_TERMINAL);
handleFinished();
return true;
}
protected void performCreation(int button) {
EditPartViewer viewer = getCurrentViewer();
executeCurrentCommand();
selectAddedObject(viewer);
}
protected void handleFinished() {
if (unloadWhenFinished())
getDomain().loadDefaultTool();
else
reactivate();
}
對于上面的過程targetEditPart都是contentEditpart.是以command都是執行contentEditpart的getCommand(REQ_CREATE);
對于feedback,contentEditpart的policy是xylayoutpolicy,其showTargetFeedback如下:
public void showTargetFeedback(Request request) {
if (REQ_ADD.equals(request.getType())
|| REQ_CLONE.equals(request.getType())
|| REQ_MOVE.equals(request.getType())
|| REQ_RESIZE_CHILDREN.equals(request.getType())
|| REQ_CREATE.equals(request.getType()))
showLayoutTargetFeedback(request);
if (REQ_CREATE.equals(request.getType())) {
CreateRequest createReq = (CreateRequest)request;
if (createReq.getSize() != null)
showSizeOnDropFeedback(createReq);
}
}
故會執行showSizeOnDropFeedback。
protected void showSizeOnDropFeedback(CreateRequest request) {
Point p = new Point(request.getLocation().getCopy());
IFigure feedback = getSizeOnDropFeedback(request);
feedback.translateToRelative(p);
Dimension size = request.getSize().getCopy();
feedback.translateToRelative(size);
feedback.setBounds(new Rectangle(p, size).expand(getCreationFeedbackOffset(request)));
}