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;
}