mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-10-24 02:04:04 +08:00
1 line
10 KiB
JavaScript
1 line
10 KiB
JavaScript
function Terminal(a){this.element=a;this.connectors=[]}Terminal.prototype={connect:function(a){this.connectors.push(a);if(this.node){this.node.changed()}},disconnect:function(a){this.connectors.splice($.inArray(a,this.connectors),1);if(this.node){this.node.changed()}},redraw:function(){$.each(this.connectors,function(a,b){b.redraw()})},destroy:function(){$.each(this.connectors.slice(),function(a,b){b.destroy()})}};function OutputTerminal(a,b){Terminal.call(this,a);this.datatype=b}OutputTerminal.prototype=new Terminal;function InputTerminal(a,b){Terminal.call(this,a);this.datatypes=b}InputTerminal.prototype=new Terminal;$.extend(InputTerminal.prototype,{can_accept:function(a){if(this.connectors.length<1){for(t in this.datatypes){if(a.datatype=="input"){return true}if(issubtype(a.datatype,this.datatypes[t])){return true}}}return false}});function Connector(b,a){this.canvas=null;this.dragging=false;this.inner_color="#FFFFFF";this.outer_color="#D8B365"}$.extend(Connector.prototype,{connect:function(b,a){this.handle1=b;this.handle1.connect(this);this.handle2=a;this.handle2.connect(this)},destroy:function(){if(this.handle1){this.handle1.disconnect(this)}if(this.handle2){this.handle2.disconnect(this)}$(this.canvas).remove()},redraw:function(){var d=$("#canvas-container");if(!this.canvas){this.canvas=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(this.canvas)}d.append($(this.canvas));if(this.dragging){this.canvas.style.zIndex="300"}}var n=function(c){return $(c).offset().left-d.offset().left};var i=function(c){return $(c).offset().top-d.offset().top};var g=n(this.handle1.element)+5;var f=i(this.handle1.element)+5;var p=n(this.handle2.element)+5;var m=i(this.handle2.element)+5;var e=100;var k=Math.min(g,p);var a=Math.max(g,p);var j=Math.min(f,m);var u=Math.max(f,m);var b=Math.min(Math.max(Math.abs(u-j)/2,100),300);var o=k-e;var s=j-e;var q=a-k+2*e;var l=u-j+2*e;this.canvas.style.left=o+"px";this.canvas.style.top=s+"px";this.canvas.setAttribute("width",q);this.canvas.setAttribute("height",l);g-=o;f-=s;p-=o;m-=s;var r=this.canvas.getContext("2d");r.lineCap="round";r.strokeStyle=this.outer_color;r.lineWidth=7;r.beginPath();r.moveTo(g,f);r.bezierCurveTo(g+b,f,p-b,m,p,m);r.stroke();r.strokeStyle=this.inner_color;r.lineWidth=5;r.beginPath();r.moveTo(g,f);r.bezierCurveTo(g+b,f,p-b,m,p,m);r.stroke()}});function Node(a){this.element=a;this.input_terminals={};this.output_terminals={};this.tool_errors={}}$.extend(Node.prototype,{enable_input_terminal:function(c,a,b){node=this;$(c).each(function(){var d=this.terminal=new InputTerminal(this,b);d.node=node;d.name=a;$(this).droppable({tolerance:"intersect",accept:function(e){e=e.get(0);return(e.terminal)&&(d.can_accept(e.terminal))},activeClass:"input-terminal-active",over:function(g,f){f.helper.get(0).terminal.connectors[0].inner_color="#BBFFBB"},out:function(g,f){f.helper.get(0).terminal.connectors[0].inner_color="#FFFFFF"},drop:function(k,i){var f=$(this).data("droppable");var g=i.draggable.get(0).terminal;var j=f.element.get(0).terminal;var l=new Connector();l.connect(g,j);l.redraw()}});$(this).hoverIntent(function(){if(d.connectors.length>0){var e=$("<div class='callout'></div>").css({display:"none"}).appendTo("body").append($("<div class='buttons'></div>").append($("<img src='../images/delete_icon.png' />").click(function(){$.each(d.connectors,function(g,f){f.destroy()});e.remove()}))).bind("mouseleave",function(){$(this).remove()});e.css({top:$(this).offset().top-2,left:$(this).offset().left-e.width(),"padding-right":$(this).width()}).show()}},function(){});node.input_terminals[a]=d})},enable_output_terminal:function(c,a,b){node=this;$(c).each(function(){var d=this.terminal=new OutputTerminal(this,b);d.node=node;d.name=a;$(this).draggable({scrollPanel:true,panel:$("#canvas-container"),helper:function(){var e=$('<div class="drag-terminal" style="position: absolute;"></div>').appendTo("#canvas-container").get(0);e.terminal=new OutputTerminal(e);var f=new Connector();this.drag_temp_connector=f;f.dragging=true;f.connect(this.terminal,e.terminal);return e},drag:function(g,f){h=f.helper.get(0);h.terminal.redraw()},stop:function(g,f){this.drag_temp_connector.destroy()}});node.output_terminals[a]=d})},redraw:function(){$.each(this.input_terminals,function(a,b){b.redraw()});$.each(this.output_terminals,function(a,b){b.redraw()})},destroy:function(){$.each(this.input_terminals,function(a,b){b.destroy();$(b.element).droppable("destroy")});$.each(this.output_terminals,function(a,b){b.destroy();$(b.element).draggable("destroy")});workflow.remove_node(this);$(this.element).draggable("destroy").remove()},make_active:function(){$(this.element).addClass("toolForm-active")},make_inactive:function(){var a=this.element.get(0);(function(b){b.removeChild(a);b.appendChild(a)})(a.parentNode);$(a).removeClass("toolForm-active")},init_field_data:function(e){var d=this.element;if(e.type){this.type=e.type}this.form_html=e.form_html;this.tool_state=e.tool_state;this.tool_errors=e.tool_errors;if(this.tool_errors){d.addClass("tool-node-error")}else{d.removeClass("tool-node-error")}var c=this;var a=d.find(".toolFormBody");a.find("div").remove();var g=$("<div class='inputs'></div>").appendTo(a);$.each(e.data_inputs,function(j,b){var f=$("<div class='terminal input-terminal'></div>");c.enable_input_terminal(f,b.name,b.extensions);g.append($("<div class='form-row dataRow input-data-row' name='"+b.name+"'>"+b.label+"</div>").prepend(f))});if((e.data_inputs.length>0)&&(e.data_outputs.length>0)){a.append($("<div class='rule'></div>"))}$.each(e.data_outputs,function(k,b){var j=$("<div class='terminal output-terminal'></div>");c.enable_output_terminal(j,b.name,b.extension);var f=b.name;if(b.extension!="input"){f=f+" ("+b.extension+")"}a.append($("<div class='form-row dataRow'>"+f+"</div>").append(j))});workflow.node_changed(this)},update_field_data:function(e){var c=$(this.element),d=this;this.tool_state=e.tool_state;this.form_html=e.form_html;this.tool_errors=e.tool_errors;if(this.tool_errors){c.addClass("tool-node-error")}else{c.removeClass("tool-node-error")}var f=c.find("div.inputs");var b=$("<div class='inputs'></div>");var a=f.find("div.input-data-row");$.each(e.data_inputs,function(k,g){var j=$("<div class='terminal input-terminal'></div>");d.enable_input_terminal(j,g.name,g.extensions);f.find("div[name="+g.name+"]").each(function(){$(this).find(".input-terminal").each(function(){var i=this.terminal.connectors[0];if(i){j[0].terminal.connectors[0]=i;i.handle2=j[0].terminal}});$(this).remove()});b.append($("<div class='form-row dataRow input-data-row' name='"+g.name+"'>"+g.label+"</div>").prepend(j))});f.replaceWith(b);f.find("div.input-data-row > .terminal").each(function(){this.terminal.destroy()});this.changed();this.redraw()},error:function(d){var a=$(this.element).find(".toolFormBody");a.find("div").remove();var c="<div style='color: red; text-style: italic;'>"+d+"</div>";this.form_html=c;a.html(c);workflow.node_changed(this)},changed:function(){workflow.node_changed(this)}});function Workflow(){this.id_counter=0;this.nodes={};this.name=null;this.has_changes=false}$.extend(Workflow.prototype,{add_node:function(a){a.id=this.id_counter;this.id_counter++;this.nodes[a.id]=a;this.has_changes=true;a.workflow=this},remove_node:function(a){if(this.active_node==a){this.clear_active_node()}delete this.nodes[a.id];this.has_changes=true},remove_all:function(){wf=this;$.each(this.nodes,function(b,a){a.destroy();wf.remove_node(a)})},to_simple:function(){var a={};$.each(this.nodes,function(b,d){var e={};$.each(d.input_terminals,function(f,g){e[g.name]=null;$.each(g.connectors,function(j,k){e[g.name]={id:k.handle1.node.id,output_name:k.handle1.name}})});var c={id:d.id,type:d.type,tool_id:d.tool_id,tool_state:d.tool_state,tool_errors:d.tool_errors,input_connections:e,position:$(d.element).position()};a[d.id]=c});return{steps:a}},from_simple:function(a){wf=this;var b=0;wf.name=a.name;$.each(a.steps,function(e,d){var c=prebuild_node("tool",d.name,d.tool_id);c.init_field_data(d);if(d.position){c.element.css({top:d.position.top,left:d.position.left})}c.id=d.id;wf.nodes[c.id]=c;b=Math.max(b,parseInt(e))});wf.id_counter=b+1;$.each(a.steps,function(e,d){var c=wf.nodes[e];$.each(d.input_connections,function(g,f){if(f){var i=wf.nodes[f.id];var j=new Connector();j.connect(i.output_terminals[f.output_name],c.input_terminals[g]);j.redraw()}})})},clear_active_node:function(){if(this.active_node){this.active_node.make_inactive();this.active_node=null}parent.show_form_for_tool("<div>No node selected</div>")},activate_node:function(a){if(this.active_node!=a){this.clear_active_node();parent.show_form_for_tool(a.form_html,a);a.make_active();this.active_node=a}},node_changed:function(a){this.has_changes=true;if(this.active_node==a){parent.show_form_for_tool(a.form_html,a)}}});function prebuild_node(k,i,n){var g=$("<div class='toolForm toolFormInCanvas'></div>");var d=new Node(g);d.type=k;if(k=="tool"){d.tool_id=n}var m=$("<div class='toolFormTitle unselectable'>"+i+"</div>");g.append(m);g.css("left",$(window).scrollLeft()+20);g.css("top",$(window).scrollTop()+20);var l=$("<div class='toolFormBody'></div>");var e="<div><img height='16' align='middle' src='../images/loading_small_white_bg.gif'/> loading tool info...</div>";l.append(e);d.form_html=e;g.append(l);var j=$("<div class='buttons' style='float: right;'></div>");j.append($("<img src='../images/delete_icon.png' />").click(function(b){d.destroy()}).hover(function(){$(this).attr("src","../images/delete_icon_dark.png")},function(){$(this).attr("src","../images/delete_icon.png")}));g.appendTo("#canvas-container");var c=$("#canvas-container").position();g.css({left:(-c.left)+10,top:(-c.top)+10});var a=g.width();j.prependTo(m);a+=(j.width()+10);g.css("width",a);$(g).draggable({cursor:"move",scrollPanel:true,panel:$("#canvas-container"),scrollSensitivity:10,scrollSpeed:20,click:function(f,b){workflow.activate_node(d)},start:function(f,b){workflow.activate_node(d)},drag:function(f,b){$(this).find(".terminal").each(function(){this.terminal.redraw()})},stop:function(f,b){$(this).find(".terminal").each(function(){this.terminal.redraw()});workflow.node_changed(this)}});return d}var ext_to_type=null;var type_to_type=null;function issubtype(b,a){b=ext_to_type[b];a=ext_to_type[a];return(a in type_to_type[b])}function populate_datatype_info(a){ext_to_type=a.ext_to_class_name;type_to_type=a.class_to_classes}; |