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