package jetbrains.mps.lang.editor.diagram.runtime.jetpad.palette.impl;
/*Generated by MPS */
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.jetpad.projectional.view.ViewTrait;
import jetbrains.mps.openapi.editor.EditorContext;
import jetbrains.mps.nodeEditor.cells.jetpad.DiagramCell;
import jetbrains.mps.openapi.editor.cells.SubstituteAction;
import jetbrains.mps.smodel.action.NodeSubstituteActionWrapper;
import org.jetbrains.annotations.Nullable;
import jetbrains.jetpad.projectional.view.ViewTraitBuilder;
import jetbrains.jetpad.projectional.view.ViewEvents;
import jetbrains.jetpad.projectional.view.ViewEventHandler;
import jetbrains.jetpad.event.MouseEvent;
import jetbrains.jetpad.projectional.view.View;
import jetbrains.mps.nodeEditor.cells.jetpad.JetpadUtils;
import jetbrains.mps.editor.runtime.commands.EditorCommand;
public class PaletteConnectorCreationAction extends AbstractPaletteCreationAction {
private _FunctionTypes._return_P4_E0<? extends Boolean, ? super SNode, ? super Object, ? super SNode, ? super Object> myCanCreateConnectorCallback;
private _FunctionTypes._void_P5_E0<? super SNode, ? super SNode, ? super Object, ? super SNode, ? super Object> mySetConnectorCallBack;
private ViewTrait myTrait;
private EditorContext myEditorContext;
public PaletteConnectorCreationAction(DiagramCell diagramCell, SubstituteAction action, final _FunctionTypes._return_P4_E0<? extends Boolean, ? super SNode, ? super Object, ? super SNode, ? super Object> canCreateConnector, final _FunctionTypes._void_P5_E0<? super SNode, ? super SNode, ? super Object, ? super SNode, ? super Object> setConnectorCallback, EditorContext editorContext) {
super(diagramCell, action);
myCanCreateConnectorCallback = canCreateConnector;
mySetConnectorCallBack = setConnectorCallback;
myEditorContext = myDiagramCell.getContext();
}
protected SubstituteAction createSubstituteAction(SubstituteAction action) {
return new NodeSubstituteActionWrapper(action) {
@Override
public SNode substitute(@Nullable EditorContext context, String string) {
SNode result = super.substitute(context, string);
DiagramCell.ConnectionInfo connectionInfo = myDiagramCell.getConnectionInfo();
mySetConnectorCallBack.invoke(result, connectionInfo.getFromNode(), connectionInfo.getFromId(), connectionInfo.getToNode(), connectionInfo.getToId());
return result;
}
@Override
public boolean canSubstitute(String string) {
if (!(super.canSubstitute(string))) {
return false;
}
DiagramCell.ConnectionInfo connectionInfo = myDiagramCell.getConnectionInfo();
return connectionInfo.isValid() && myCanCreateConnectorCallback.invoke(connectionInfo.getFromNode(), connectionInfo.getFromId(), connectionInfo.getToNode(), connectionInfo.getToId());
}
};
}
protected ViewTrait getTrait() {
if (myTrait == null) {
myTrait = new ViewTraitBuilder().on(ViewEvents.MOUSE_DRAGGED, new ViewEventHandler<MouseEvent>() {
@Override
public void handle(View view, MouseEvent event) {
if (!(myDiagramCell.hasConnectionDragFeedback())) {
View sourceView = view.viewAt(event.location());
if (sourceView == null || !(check_y3ke3n_a0a1a0a0a0b0a0a0a0a0h(sourceView.prop(JetpadUtils.CONNECTION_SOURCE).get()))) {
return;
}
myDiagramCell.showConnectionDragFeedback(sourceView);
}
myDiagramCell.updateConnectionDragFeedback(event.location());
}
}).on(ViewEvents.MOUSE_RELEASED, new ViewEventHandler<MouseEvent>() {
@Override
public void handle(View view, MouseEvent event) {
if (!(myDiagramCell.hasConnectionDragFeedback())) {
return;
}
myDiagramCell.hideConnectionDragFeedback();
final boolean[] result = new boolean[]{false};
myEditorContext.getRepository().getModelAccess().runReadAction(new Runnable() {
public void run() {
result[0] = mySubstituteAction.canSubstitute("");
}
});
if (!(result[0])) {
return;
}
myEditorContext.getRepository().getModelAccess().executeCommand(new EditorCommand(myEditorContext) {
protected void doExecute() {
mySubstituteAction.substitute(myEditorContext, "");
}
});
event.consume();
}
}).build();
}
return myTrait;
}
private static boolean check_y3ke3n_a0a1a0a0a0b0a0a0a0a0h(Boolean checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.booleanValue();
}
return false;
}
}