/** * Copyright 2015 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ RED.subflow = (function() { function getSubflow() { return RED.nodes.subflow(RED.workspaces.active()); } function findAvailableSubflowIOPosition(subflow) { var pos = {x:70,y:70}; for (var i=0;iCannot create subflow: no nodes selected","error"); return; } var i; var nodes = {}; var new_links = []; var removedLinks = []; var candidateInputs = []; var candidateOutputs = []; var boundingBox = [selection.nodes[0].x, selection.nodes[0].y, selection.nodes[0].x, selection.nodes[0].y]; for (i=0;i 1) { RED.notify("Cannot create subflow: multiple inputs to selection","error"); return; } //if (candidateInputs.length == 0) { // RED.notify("Cannot create subflow: no input to selection","error"); // return; //} var lastIndex = 0; RED.nodes.eachSubflow(function(sf) { var m = (new RegExp("^Subflow (\\d+)$")).exec(sf.name); if (m) { lastIndex = Math.max(lastIndex,m[1]); } }); var name = "Subflow "+(lastIndex+1); var subflowId = RED.nodes.id(); var subflow = { type:"subflow", id:subflowId, name:name, in: candidateInputs.map(function(v,i) { var index = i; return { type:"subflow", direction:"in", x:v.target.x-(v.target.w/2)-80, y:v.target.y, z:subflowId, i:index, id:RED.nodes.id(), wires:[{id:v.target.id}] }}), out: candidateOutputs.map(function(v,i) { var index = i; return { type:"subflow", direction:"in", x:v.source.x+(v.source.w/2)+80, y:v.source.y, z:subflowId, i:index, id:RED.nodes.id(), wires:[{id:v.source.id,port:v.sourcePort}] }}) }; RED.nodes.addSubflow(subflow); var subflowInstance = { id:RED.nodes.id(), type:"subflow:"+subflow.id, x: center[0], y: center[1], z: RED.workspaces.active(), inputs: subflow.in.length, outputs: subflow.out.length, h: Math.max(30/*node_height*/,(subflow.out.length||0) * 15), changed:true } subflowInstance._def = RED.nodes.getType(subflowInstance.type); RED.editor.validateNode(subflowInstance); RED.nodes.add(subflowInstance); candidateInputs.forEach(function(l) { var link = {source:l.source, sourcePort:l.sourcePort, target: subflowInstance}; new_links.push(link); RED.nodes.addLink(link); }); candidateOutputs.forEach(function(output,i) { output.targets.forEach(function(target) { var link = {source:subflowInstance, sourcePort:i, target: target}; new_links.push(link); RED.nodes.addLink(link); }); }); subflow.in.forEach(function(input) { input.wires.forEach(function(wire) { var link = {source: input, sourcePort: 0, target: RED.nodes.node(wire.id) } new_links.push(link); RED.nodes.addLink(link); }); }); subflow.out.forEach(function(output,i) { output.wires.forEach(function(wire) { var link = {source: RED.nodes.node(wire.id), sourcePort: wire.port , target: output } new_links.push(link); RED.nodes.addLink(link); }); }); for (i=0;i