天天看點

gef事件機制--CreationTool

當我們點選tool欄的建立節點工具時,Tool就會是CreationTool,

gef事件機制--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)));

}

繼續閱讀