details: http://www.bx.psu.edu/hg/galaxy/rev/49fe600b9499 changeset: 1495:49fe600b9499 user: James Taylor james@jamestaylor.org date: Mon Sep 08 09:47:37 2008 -0400 description: Update packed version of workflow editor script (fix z-index problem again?)
1 file(s) affected in this change:
static/scripts/packed/galaxy.workflow_editor.canvas.js
diffs (8 lines):
diff -r d427760f8fec -r 49fe600b9499 static/scripts/packed/galaxy.workflow_editor.canvas.js --- a/static/scripts/packed/galaxy.workflow_editor.canvas.js Mon Sep 08 09:16:32 2008 -0400 +++ b/static/scripts/packed/galaxy.workflow_editor.canvas.js Mon Sep 08 09:47:37 2008 -0400 @@ -1,1 +1,1 @@ -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.prototy pe,{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 C=$("#canvas-container");if(!this.canvas){this.canvas=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(this.canvas)}C.append($(this.canvas));if(this.dragging){this.canvas.style.zIndex="300"}}var L=function(S){return $(S).offset().left-C.offset().left};var G=function(S){return $(S).offset().top-C.offset().top};var F=L(this.handle1.element)+5;var E=G(this.handle1.element)+5;var N=L(this.handle2.element)+5;var K=G(this.handle2.element)+5;var D=100;var I=Math.min(F,N);var A=Math.max(F,N);var H=Math.min(E,K);var R=Math.max(E,K);var B=Math.min(Math.max(Math.abs(R-H)/2,100),300);var M=I-D;var Q=H-D;var O=A-I+2*D;var J=R-H+2*D;this.canvas.style.left=M+"px";this.canvas.styl e.top=Q+"px";this.canvas.setAttribute("width",O);this.canvas.setAttribute("height",J);F-=M;E-=Q;N-=M;K-=Q;var P=this.canvas.getContext("2d");P.lineCap="round";P.strokeStyle=this.outer_color;P.lineWidth=7;P.beginPath();P.moveTo(F,E);P.bezierCurveTo(F+B,E,N-B,K,N,K);P.stroke();P.strokeStyle=this.inner_color;P.lineWidth=5;P.beginPath();P.moveTo(F,E);P.bezierCurveTo(F+B,E,N-B,K,N,K);P.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(F,E){E.helper.get(0).terminal.connectors[0].inner_color="#BBFFBB"},out:function(F,E){E.helper.get(0).terminal.connectors[0].inner_color="#FFFFFF"},drop:function(I ,G){var E=$(this).data("droppable");var F=G.draggable.get(0).terminal;var H=E.element.get(0).terminal;var J=new Connector();J.connect(F,H);J.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(F,E){h=E.helper.get(0);h.terminal.redraw()},stop:function(F,E){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")});$(this.element).draggable("destroy").remove();workflow.remove_node(this)},make_active:function(){$(this.element).addClass("toolForm-active")},make_inactive:function(){$(this.element).removeClass("toolForm-active")},init_field_data:function(D){var C=this.element;if(D.type){this.type=D.type}this.form_html=D.form_html;this.tool_state=D.tool_state;this.tool_errors= D.tool_errors;if(this.tool_errors){C.addClass("tool-node-error")}else{C.removeClass("tool-node-error")}var B=this;var A=C.find(".toolFormBody");A.find("div").remove();var E=$("<div class='inputs'></div>").appendTo(A);$.each(D.data_inputs,function(H,F){var G=$("<div class='terminal input-terminal'></div>");B.enable_input_terminal(G,F.name,F.extensions);E.append($("<div class='form-row dataRow input-data-row' name='"+F.name+"'>"+F.label+"</div>").prepend(G))});if((D.data_inputs.length>0)&&(D.data_outputs.length>0)){A.append($("<div class='rule'></div>"))}$.each(D.data_outputs,function(I,F){var H=$("<div class='terminal output-terminal'></div>");B.enable_output_terminal(H,F.name,F.extension);var G=F.name;if(F.extension!="input"){G=G+" ("+F.extension+")"}A.append($("<div class='form-row dataRow'>"+G+"</div>").append(H))});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_error s=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(I,G){var H=$("<div class='terminal input-terminal'></div>");D.enable_input_terminal(H,G.name,G.extensions);F.find("div[name="+G.name+"]").each(function(){$(this).find(".input-terminal").each(function(){var J=this.terminal.connectors[0];if(J){H[0].terminal.connectors[0]=J;J.handle2=H[0].terminal}});$(this).remove()});B.append($("<div class='form-row dataRow input-data-row' name='"+G.name+"'>"+G.label+"</div>").prepend(H))});F.replaceWith(B);F.find("div.input-data-row > .terminal").each(function(){this.terminal.destroy()});this.changed();this.redraw()},error:function(C){var A=$(this.element).find(".toolFormBody");A.find("div").remove();var B="<div style='color: red; text-style: italic;'>"+C+"</div>";this.form_html=B;A.html(B);workflow.node_change d(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(H,I){E[G.name]={id:I.handle1.node.id,output_name:I.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,functio n(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 H=wf.nodes[F.id];var I=new Connector();I.connect(H.output_terminals[F.output_name],C.input_terminals[G]);I.redraw()}})})},clear_active_node:function(){if(this.active_node){this.active_node.make_inactive()}parent.show_form_for_tool("<div>No node selected</div>")},activate_node:function(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){this.activate_node(A)}}});function prebuild_node(H,F,K){var E=$("<div class='toolForm toolFormInCanvas'></div>");var C=new Node(E);C.type=H;if(H=="tool"){C.tool_id=K}var J=$("<div class='toolFormTitle unselectab le'>"+F+"</div>");E.append(J);E.css("left",$(window).scrollLeft()+20);E.css("top",$(window).scrollTop()+20);var I=$("<div class='toolFormBody'></div>");var D="<div><img height='16' align='middle' src='../images/loading_small_white_bg.gif'/> loading tool info...</div>";I.append(D);C.form_html=D;E.append(I);var G=$("<div class='buttons' style='float: right;'></div>");G.append($("<img src='../images/delete_icon.png' />").click(function(L){C.destroy()}).hover(function(){$(this).attr("src","../images/delete_icon_dark.png")},function(){$(this).attr("src","../images/delete_icon.png")}));zmax=$("#canvas-container").data("zmax");if(!zmax){zmax=0}E.css("zIndex",zmax+1);$("#canvas-container").data("zmax",zmax+1);E.appendTo("#canvas-container");var B=$("#canvas-container").position();E.css({left:(-B.left)+10,top:(-B.top)+10});var A=E.width();G.prependTo(J);A+=(G.width()+10);E.css("width",A);$(E).draggable({cursor:"move",scrollPanel:true,panel:$("#canvas-container"),scrollSensitivity:10, scrollSpeed:20,click:function(M,L){zmax=$("#canvas-container").data("zmax");$(this).css("zIndex",zmax+1);$("#canvas-container").data("zmax",zmax+1);workflow.activate_node(C)},start:function(M,L){workflow.activate_node(C);$(this).css("z-index",$("#canvas-container").data("zmax")+1000)},drag:function(M,L){$(this).find(".terminal").each(function(){this.terminal.redraw()})},stop:function(M,L){zmax=$("#canvas-container").data("zmax");$(this).css("zIndex",zmax+1);$("#canvas-container").data("zmax",zmax+1);$(this).find(".terminal").each(function(){this.terminal.redraw()});workflow.node_changed(this)}});return C}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}; \ No newline at end of file +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.prototy pe,{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 C=$("#canvas-container");if(!this.canvas){this.canvas=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(this.canvas)}C.append($(this.canvas));if(this.dragging){this.canvas.style.zIndex="300"}}var L=function(S){return $(S).offset().left-C.offset().left};var G=function(S){return $(S).offset().top-C.offset().top};var F=L(this.handle1.element)+5;var E=G(this.handle1.element)+5;var N=L(this.handle2.element)+5;var K=G(this.handle2.element)+5;var D=100;var I=Math.min(F,N);var A=Math.max(F,N);var H=Math.min(E,K);var R=Math.max(E,K);var B=Math.min(Math.max(Math.abs(R-H)/2,100),300);var M=I-D;var Q=H-D;var O=A-I+2*D;var J=R-H+2*D;this.canvas.style.left=M+"px";this.canvas.styl e.top=Q+"px";this.canvas.setAttribute("width",O);this.canvas.setAttribute("height",J);F-=M;E-=Q;N-=M;K-=Q;var P=this.canvas.getContext("2d");P.lineCap="round";P.strokeStyle=this.outer_color;P.lineWidth=7;P.beginPath();P.moveTo(F,E);P.bezierCurveTo(F+B,E,N-B,K,N,K);P.stroke();P.strokeStyle=this.inner_color;P.lineWidth=5;P.beginPath();P.moveTo(F,E);P.bezierCurveTo(F+B,E,N-B,K,N,K);P.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(F,E){E.helper.get(0).terminal.connectors[0].inner_color="#BBFFBB"},out:function(F,E){E.helper.get(0).terminal.connectors[0].inner_color="#FFFFFF"},drop:function(I ,G){var E=$(this).data("droppable");var F=G.draggable.get(0).terminal;var H=E.element.get(0).terminal;var J=new Connector();J.connect(F,H);J.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(F,E){h=E.helper.get(0);h.terminal.redraw()},stop:function(F,E){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(D){var C=this.element;if(D.type){this.type=D. type}this.form_html=D.form_html;this.tool_state=D.tool_state;this.tool_errors=D.tool_errors;if(this.tool_errors){C.addClass("tool-node-error")}else{C.removeClass("tool-node-error")}var B=this;var A=C.find(".toolFormBody");A.find("div").remove();var E=$("<div class='inputs'></div>").appendTo(A);$.each(D.data_inputs,function(H,F){var G=$("<div class='terminal input-terminal'></div>");B.enable_input_terminal(G,F.name,F.extensions);E.append($("<div class='form-row dataRow input-data-row' name='"+F.name+"'>"+F.label+"</div>").prepend(G))});if((D.data_inputs.length>0)&&(D.data_outputs.length>0)){A.append($("<div class='rule'></div>"))}$.each(D.data_outputs,function(I,F){var H=$("<div class='terminal output-terminal'></div>");B.enable_output_terminal(H,F.name,F.extension);var G=F.name;if(F.extension!="input"){G=G+" ("+F.extension+")"}A.append($("<div class='form-row dataRow'>"+G+"</div>").append(H))});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(I,G){var H=$("<div class='terminal input-terminal'></div>");D.enable_input_terminal(H,G.name,G.extensions);F.find("div[name="+G.name+"]").each(function(){$(this).find(".input-terminal").each(function(){var J=this.terminal.connectors[0];if(J){H[0].terminal.connectors[0]=J;J.handle2=H[0].terminal}});$(this).remove()});B.append($("<div class='form-row dataRow input-data-row' name='"+G.name+"'>"+G.label+"</div>").prepend(H))});F.replaceWith(B);F.find("div.input-data-row > .terminal").each(function(){this.terminal.destroy()});this.changed();this.redraw()},error:function(C){var A=$(this.element).find(".toolFormBody");A.find("div").remove();var B="<div style='color: red; tex t-style: italic;'>"+C+"</div>";this.form_html=B;A.html(B);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(H,I){E[G.name]={id:I.handle1.node.id,output_name:I.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 H=wf.nodes[F.id];var I=new Connector();I.connect(H.output_terminals[F.output_name],C.input_terminals[G]);I.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(H,F,K){var E=$("<d iv class='toolForm toolFormInCanvas'></div>");var C=new Node(E);C.type=H;if(H=="tool"){C.tool_id=K}var J=$("<div class='toolFormTitle unselectable'>"+F+"</div>");E.append(J);E.css("left",$(window).scrollLeft()+20);E.css("top",$(window).scrollTop()+20);var I=$("<div class='toolFormBody'></div>");var D="<div><img height='16' align='middle' src='../images/loading_small_white_bg.gif'/> loading tool info...</div>";I.append(D);C.form_html=D;E.append(I);var G=$("<div class='buttons' style='float: right;'></div>");G.append($("<img src='../images/delete_icon.png' />").click(function(L){C.destroy()}).hover(function(){$(this).attr("src","../images/delete_icon_dark.png")},function(){$(this).attr("src","../images/delete_icon.png")}));E.appendTo("#canvas-container");var B=$("#canvas-container").position();E.css({left:(-B.left)+10,top:(-B.top)+10});var A=E.width();G.prependTo(J);A+=(G.width()+10);E.css("width",A);$(E).draggable({cursor:"move",scrollPanel:true,panel:$("#canvas-container"),s crollSensitivity:10,scrollSpeed:20,click:function(M,L){workflow.activate_node(C)},start:function(M,L){workflow.activate_node(C)},drag:function(M,L){$(this).find(".terminal").each(function(){this.terminal.redraw()})},stop:function(M,L){$(this).find(".terminal").each(function(){this.terminal.redraw()});workflow.node_changed(this)}});return C}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}; \ No newline at end of file
galaxy-dev@lists.galaxyproject.org