public void mouseUp()

in ui/src/main/java/org/apache/hop/ui/hopgui/file/workflow/HopGuiWorkflowGraph.java [714:1010]


  public void mouseUp(MouseEvent event) {
    // canvas.setData("mode", null); does not work.
    canvas.setData("mode", "null");
    if (EnvironmentUtils.getInstance().isWeb()) {
      // RAP does not support certain mouse events.
      mouseMove(event);
    }

    // Default cursor
    setCursor(null);

    if (viewPortNavigation || viewDrag) {
      viewDrag = false;
      viewPortNavigation = false;
      viewPortStart = null;
      return;
    }

    boolean control = (event.stateMask & SWT.MOD1) != 0;

    boolean singleClick = false;
    SingleClickType singleClickType = null;
    ActionMeta singleClickAction = null;
    NotePadMeta singleClickNote = null;
    WorkflowHopMeta singleClickHop = null;
    viewDrag = false;
    viewDragStart = null;
    mouseOverName = null;

    if (iconOffset == null) {
      iconOffset = new Point(0, 0);
    }
    Point real = screen2real(event.x, event.y);
    Point icon = new Point(real.x - iconOffset.x, real.y - iconOffset.y);
    AreaOwner areaOwner = getVisibleAreaOwner(real.x, real.y);

    try {
      HopGuiWorkflowGraphExtension ext =
          new HopGuiWorkflowGraphExtension(this, event, real, areaOwner);
      ExtensionPointHandler.callExtensionPoint(
          LogChannel.GENERAL, variables, HopExtensionPoint.WorkflowGraphMouseUp.id, ext);
      if (ext.isPreventingDefault()) {
        redraw();
        clearSettings();
        return;
      }
    } catch (Exception ex) {
      LogChannel.GENERAL.logError("Error calling WorkflowGraphMouseUp extension point", ex);
    }

    // Did we select a region on the screen? Mark actions in region as selected
    //
    if (selectionRegion != null) {
      selectionRegion.width = real.x - selectionRegion.x;
      selectionRegion.height = real.y - selectionRegion.y;

      if (selectionRegion.isEmpty()) {
        singleClick = true;
        singleClickType = SingleClickType.Workflow;
      } else {
        workflowMeta.unselectAll();
        selectInRect(workflowMeta, selectionRegion);
        selectionRegion = null;
        updateGui();
        return;
      }
    }

    // Quick new hop option? (drag from one action to another)
    //
    if (areaOwner != null && areaOwner.getAreaType() != null) {
      switch (areaOwner.getAreaType()) {
        case ACTION_ICON:
          if (startHopAction != null) {
            currentAction = (ActionMeta) areaOwner.getOwner();
            hopCandidate = new WorkflowHopMeta(startHopAction, currentAction);
            addCandidateAsHop();
            redraw();
          }
          break;
        case ACTION_NAME:
          if (startHopAction == null
              && selectionRegion == null
              && selectedActions == null
              && selectedNotes == null) {
            // This is available only in single click mode...
            //
            startHopAction = null;
            selectionRegion = null;
            ActionMeta actionMeta = (ActionMeta) areaOwner.getParent();
            editAction(actionMeta);
            return;
          }
        default:
          break;
      }
    }

    // Clicked on an icon?
    //
    if (selectedAction != null && startHopAction == null) {
      if (event.button == 1) {
        Point realclick = screen2real(event.x, event.y);
        if (lastClick.x == realclick.x && lastClick.y == realclick.y) {
          // Flip selection when control is pressed!
          if (control) {
            selectedAction.flipSelected();
          } else {
            singleClick = true;
            singleClickType = SingleClickType.Action;
            singleClickAction = selectedAction;

            // If the clicked action is not part of the current selection, cancel the
            // current selection
            if (!selectedAction.isSelected()) {
              workflowMeta.unselectAll();
              selectedAction.setSelected(true);
            }
          }
        } else {
          // Find out which Transforms & Notes are selected
          selectedActions = workflowMeta.getSelectedActions();
          selectedNotes = workflowMeta.getSelectedNotes();

          // We moved around some items: store undo info...
          //
          boolean also = false;
          if (selectedNotes != null && !selectedNotes.isEmpty() && previousNoteLocations != null) {
            int[] indexes = workflowMeta.getNoteIndexes(selectedNotes);

            addUndoPosition(
                selectedNotes.toArray(new NotePadMeta[selectedNotes.size()]),
                indexes,
                previousNoteLocations,
                workflowMeta.getSelectedNoteLocations(),
                also);
            also = selectedActions != null && !selectedActions.isEmpty();
          }
          if (selectedActions != null
              && !selectedActions.isEmpty()
              && previousTransformLocations != null) {
            int[] indexes = workflowMeta.getActionIndexes(selectedActions);
            addUndoPosition(
                selectedActions.toArray(new ActionMeta[selectedActions.size()]),
                indexes,
                previousTransformLocations,
                workflowMeta.getSelectedLocations(),
                also);
          }
        }
      }

      // OK, we moved the action, did we move it across a hop?
      // If so, ask to split the hop!
      if (splitHop) {
        WorkflowHopMeta hop = findHop(icon.x + iconSize / 2, icon.y + iconSize / 2, selectedAction);
        if (hop != null) {
          int id = 0;
          if (!hopGui.getProps().getAutoSplit()) {
            MessageDialogWithToggle md =
                new MessageDialogWithToggle(
                    hopShell(),
                    BaseMessages.getString(PKG, "HopGuiWorkflowGraph.Dialog.SplitHop.Title"),
                    BaseMessages.getString(PKG, "HopGuiWorkflowGraph.Dialog.SplitHop.Message")
                        + Const.CR
                        + hop.toString(),
                    SWT.ICON_QUESTION,
                    new String[] {
                      BaseMessages.getString(PKG, "System.Button.Yes"),
                      BaseMessages.getString(PKG, "System.Button.No")
                    },
                    BaseMessages.getString(
                        PKG, "HopGuiWorkflowGraph.Dialog.Option.SplitHop.DoNotAskAgain"),
                    hopGui.getProps().getAutoSplit());
            id = md.open();
            hopGui.getProps().setAutoSplit(md.getToggleState());
          }

          if ((id & 0xFF) == 0) { // Means: "Yes" button clicked!
            workflowActionDelegate.insertAction(workflowMeta, hop, selectedAction);
          }
        }
        // Discard this hop-split attempt.
        splitHop = false;
      }

      selectedActions = null;
      selectedNotes = null;
      selectedAction = null;
      selectedNote = null;
      startHopAction = null;
      endHopLocation = null;

      updateGui();
    } else {
      // Notes?
      if (selectedNote != null) {
        if (event.button == 1) {
          if (lastClick.x == real.x && lastClick.y == real.y) {
            // Flip selection when control is pressed!
            if (control) {
              selectedNote.flipSelected();
            } else {
              // single click on a note: ask what needs to happen...
              //
              singleClick = true;
              singleClickType = SingleClickType.Note;
              singleClickNote = selectedNote;
            }
          } else {
            // Find out which Transforms & Notes are selected
            selectedActions = workflowMeta.getSelectedActions();
            selectedNotes = workflowMeta.getSelectedNotes();

            // We moved around some items: store undo info...
            boolean also = false;
            if (selectedNotes != null
                && !selectedNotes.isEmpty()
                && previousNoteLocations != null) {
              int[] indexes = workflowMeta.getNoteIndexes(selectedNotes);
              addUndoPosition(
                  selectedNotes.toArray(new NotePadMeta[selectedNotes.size()]),
                  indexes,
                  previousNoteLocations,
                  workflowMeta.getSelectedNoteLocations(),
                  also);
              also = selectedActions != null && !selectedActions.isEmpty();
            }
            if (selectedActions != null
                && !selectedActions.isEmpty()
                && previousTransformLocations != null) {
              int[] indexes = workflowMeta.getActionIndexes(selectedActions);
              addUndoPosition(
                  selectedActions.toArray(new ActionMeta[selectedActions.size()]),
                  indexes,
                  previousTransformLocations,
                  workflowMeta.getSelectedLocations(),
                  also);
            }
          }
        }

        selectedNotes = null;
        selectedActions = null;
        selectedAction = null;
        selectedNote = null;
        startHopAction = null;
        endHopLocation = null;

        updateGui();
      }
    }

    if (clickedWorkflowHop != null) {
      // Clicked on a hop
      //
      singleClick = true;
      singleClickType = SingleClickType.Hop;
      singleClickHop = clickedWorkflowHop;
    }
    clickedWorkflowHop = null;

    // Only do this "mouseUp()" if this is not part of a double click...
    //
    final boolean fSingleClick = singleClick;
    final SingleClickType fSingleClickType = singleClickType;
    final ActionMeta fSingleClickAction = singleClickAction;
    final NotePadMeta fSingleClickNote = singleClickNote;
    final WorkflowHopMeta fSingleClickHop = singleClickHop;

    if (PropsUi.getInstance().useDoubleClick()) {
      hopGui
          .getDisplay()
          .timerExec(
              hopGui.getDisplay().getDoubleClickTime(),
              () ->
                  showContextDialog(
                      event,
                      real,
                      fSingleClick,
                      fSingleClickType,
                      fSingleClickAction,
                      fSingleClickNote,
                      fSingleClickHop));
    } else {
      showContextDialog(
          event,
          real,
          fSingleClick,
          fSingleClickType,
          fSingleClickAction,
          fSingleClickNote,
          fSingleClickHop);
    }

    lastButton = 0;
  }