public void mouseUp()

in ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java [843:1138]


  public void mouseUp(MouseEvent e) {
    // canvas.setData("mode", null); does not work.
    canvas.setData("mode", "null");

    if (EnvironmentUtils.getInstance().isWeb()) {
      // RAP does not support certain mouse events.
      mouseMove(e);
    }

    // Default cursor
    setCursor(null);

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

    boolean control = (e.stateMask & SWT.MOD1) != 0;
    PipelineHopMeta selectedHop = findPipelineHop(e.x, e.y);
    updateErrorMetaForHop(selectedHop);
    boolean singleClick = false;
    mouseOverName = null;
    viewDrag = false;
    viewDragStart = null;
    SingleClickType singleClickType = null;
    TransformMeta singleClickTransform = null;
    NotePadMeta singleClickNote = null;
    PipelineHopMeta singleClickHop = null;

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

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

    // Did we select a region on the screen? Mark transforms 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.Pipeline;
      } else {
        pipelineMeta.unselectAll();
        selectInRect(pipelineMeta, selectionRegion);
        selectionRegion = null;
        updateGui();
        return;
      }
    }

    // Special cases...
    //
    if (areaOwner != null && areaOwner.getAreaType() != null) {
      switch (areaOwner.getAreaType()) {
        case TRANSFORM_OUTPUT_DATA:
          if ((!mouseMovedSinceClick || EnvironmentUtils.getInstance().isWeb())
              && showTransformOutputData(areaOwner)) {
            return;
          }
          break;
        case TRANSFORM_ICON:
          if (startHopTransform != null) {
            // Mouse up while dragging around a hop candidate
            //
            currentTransform = (TransformMeta) areaOwner.getOwner();
            candidate = new PipelineHopMeta(startHopTransform, currentTransform);
            addCandidateAsHop(e.x, e.y);
            redraw();
            return;
          }
          break;
        case TRANSFORM_NAME:
          if (startHopTransform == null
              && selectionRegion == null
              && selectedTransforms == null
              && selectedNotes == null) {
            // This is available only in single click mode...
            //
            startHopTransform = null;
            selectionRegion = null;

            TransformMeta transformMeta = (TransformMeta) areaOwner.getParent();
            editTransform(transformMeta);
          }
          return;

        default:
          break;
      }
    }

    // Clicked on an icon?
    //
    if (selectedTransform != null && startHopTransform == null) {
      if (e.button == 1) {
        Point realClick = screen2real(e.x, e.y);
        if (lastClick.x == realClick.x && lastClick.y == realClick.y) {
          // Flip selection when control is pressed!
          if (control) {
            selectedTransform.flipSelected();
          } else {
            singleClick = true;
            singleClickType = SingleClickType.Transform;
            singleClickTransform = selectedTransform;

            // If the clicked transform is not part of the current selection, cancel the
            // current selection
            if (!selectedTransform.isSelected()) {
              pipelineMeta.unselectAll();
              selectedTransform.setSelected(true);
            }
          }
        } else {
          // Find out which Transforms & Notes are selected
          selectedTransforms = pipelineMeta.getSelectedTransforms();
          selectedNotes = pipelineMeta.getSelectedNotes();

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

            also = selectedTransforms != null && !selectedTransforms.isEmpty();
            hopGui.undoDelegate.addUndoPosition(
                pipelineMeta,
                selectedNotes.toArray(new NotePadMeta[selectedNotes.size()]),
                indexes,
                previousNoteLocations,
                pipelineMeta.getSelectedNoteLocations(),
                also);
          }
          if (selectedTransforms != null && previousTransformLocations != null) {
            int[] indexes = pipelineMeta.getTransformIndexes(selectedTransforms);
            hopGui.undoDelegate.addUndoPosition(
                pipelineMeta,
                selectedTransforms.toArray(new TransformMeta[selectedTransforms.size()]),
                indexes,
                previousTransformLocations,
                pipelineMeta.getSelectedTransformLocations(),
                also);
          }
        }
      }

      // OK, we moved the transform, did we move it across a hop?
      // If so, ask to split the hop!
      if (splitHop) {
        PipelineHopMeta hi =
            findPipelineHop(icon.x + iconSize / 2, icon.y + iconSize / 2, selectedTransform);
        if (hi != null) {
          splitHop(hi);
        }
        splitHop = false;
      }

      selectedTransforms = null;
      selectedNotes = null;
      selectedTransform = null;
      selectedNote = null;
      startHopTransform = null;
      endHopLocation = null;

      updateGui();
    } else {
      // Notes?
      //

      if (selectedNote != null) {
        if (e.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
            selectedTransforms = pipelineMeta.getSelectedTransforms();
            selectedNotes = pipelineMeta.getSelectedNotes();

            // We moved around some items: store undo info...

            boolean also = false;
            if (selectedNotes != null
                && !selectedNotes.isEmpty()
                && previousNoteLocations != null) {
              int[] indexes = pipelineMeta.getNoteIndexes(selectedNotes);
              hopGui.undoDelegate.addUndoPosition(
                  pipelineMeta,
                  selectedNotes.toArray(new NotePadMeta[selectedNotes.size()]),
                  indexes,
                  previousNoteLocations,
                  pipelineMeta.getSelectedNoteLocations(),
                  also);
              also = selectedTransforms != null && !selectedTransforms.isEmpty();
            }
            if (selectedTransforms != null
                && !selectedTransforms.isEmpty()
                && previousTransformLocations != null) {
              int[] indexes = pipelineMeta.getTransformIndexes(selectedTransforms);
              hopGui.undoDelegate.addUndoPosition(
                  pipelineMeta,
                  selectedTransforms.toArray(new TransformMeta[selectedTransforms.size()]),
                  indexes,
                  previousTransformLocations,
                  pipelineMeta.getSelectedTransformLocations(),
                  also);
            }
          }
        }

        selectedNotes = null;
        selectedTransforms = null;
        selectedTransform = null;
        selectedNote = null;
        startHopTransform = null;
        endHopLocation = null;
        updateGui();
      }
    }

    if (avoidContextDialog) {
      avoidContextDialog = false;
      selectionRegion = null;
      return;
    }

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

    // Only do this "mouseUp()" if this is not part of a double click...
    //
    final boolean fSingleClick = singleClick;
    final SingleClickType fSingleClickType = singleClickType;
    final TransformMeta fSingleClickTransform = singleClickTransform;
    final NotePadMeta fSingleClickNote = singleClickNote;
    final PipelineHopMeta fSingleClickHop = singleClickHop;

    if (PropsUi.getInstance().useDoubleClick()) {
      hopGui
          .getDisplay()
          .timerExec(
              hopGui.getDisplay().getDoubleClickTime(),
              () ->
                  showActionDialog(
                      e,
                      real,
                      fSingleClick,
                      fSingleClickType,
                      fSingleClickTransform,
                      fSingleClickNote,
                      fSingleClickHop));
    } else {
      showActionDialog(
          e,
          real,
          fSingleClick,
          fSingleClickType,
          fSingleClickTransform,
          fSingleClickNote,
          fSingleClickHop);
    }
    lastButton = 0;
  }