development
作者development·2010-12-11 14:11
·

仿IBM-BPM Editor实现的WorkFlowEditor

字数 125413阅读 1935评论 0赞 0
在网上搜了一些例子,找了一大队资料,终于把workFlowEditor做得差不多了,这是一个类似IBM-BPM Editor的工作流编辑器,现还有一些功能没实现,现将部分代码贴在此,有需要的朋友可以交流,拍砖,哈哈。

节点间的连线重绘:
As3代码
  1. package com  
  2. {  
  3.     import flash.geom.Point;  
  4.       
  5.     public class RefreshLine  
  6.     {  
  7.         /** 和节点相关的线条的数组 **/  
  8.         public var lineList:Array = [];  
  9.           
  10.         public var width:Number;  
  11.         public var height:Number;  
  12.         public var lineFlag:LineLag;  
  13.         public var line:Line;  
  14.         public var node:Nodes;  
  15.         private var isFromNode:Boolean=false;  
  16.         private var num1:int=0;     //开始节点,箭头右方向,连线数累加  
  17.         private var num2:int=0;     //开始节点,箭头左方向,连线数累加  
  18.         private var num3:int=0;     //开始节点,箭头上方向,连线数累加  
  19.         private var num4:int=0;     //开始节点,箭头下方向,连线数累加  
  20.         private var numA:int=0;     //结束节点,箭头右方向,连线数累加  
  21.         private var numB:int=0;     //结束节点,箭头左方向,连线数累加  
  22.         private var numC:int=0;     //结束节点,箭头上方向,连线数累加  
  23.         private var numD:int=0;     //结束节点,箭头下方向,连线数累加  
  24.         private var startX:int;  
  25.         private var startY:int;  
  26.         private var endX:int;  
  27.         private var endY:int;  
  28.           
  29.           
  30.         public function RefreshLine(node:Nodes)  
  31.         {  
  32.             this.node=node;  
  33.             lineList=node.lineList;  
  34.         }  
  35.           
  36.         /**  
  37.          * 重绘节点上的连线  
  38.          * */  
  39.         public function getAspectArr():void{  
  40.             for(var j:int = 0; j < lineList.length; j++){  
  41.                 lineFlag = lineList[j];  
  42.                 line = lineFlag.line;  
  43.                   
  44.                 switch(line.aspect){  
  45.                     case 1:  
  46.                         if(line.fromNode==node)  
  47.                             num1++;  
  48.                         else  
  49.                             numA++;  
  50.                         break;  
  51.                     case 2:  
  52.                         if(line.fromNode==node)  
  53.                             num2++;  
  54.                         else  
  55.                             numB++;  
  56.                         break;  
  57.                     case 3:  
  58.                         if(line.fromNode==node)  
  59.                             num3++;  
  60.                         else  
  61.                             numC++;  
  62.                         break;  
  63.                     case 4:  
  64.                         if(line.fromNode==node)  
  65.                             num4++;  
  66.                         else  
  67.                             numD++;  
  68.                         break;  
  69.                 }  
  70.             }  
  71.         }  
  72.           
  73.         public function refreshLine():void{  
  74.             var isHead:Boolean;  
  75.             var startNO:int=0;  //指向开始节点的连线的条数  
  76.             var endNO:int=0;    //指向结束节点的连线的条数  
  77.               
  78.             width=node.width;  
  79.             height=node.height;  
  80.             getAspectArr();  
  81.               
  82.             for(var i:int = 0; i < lineList.length; i++){  
  83.                 startX = node.x;  
  84.                 startY = node.y;  
  85.                 endX = node.x;  
  86.                 endY = node.y;  
  87.                 lineFlag = lineList[i];  
  88.                 line = lineFlag.line;  
  89.                 isHead = lineFlag.isHead;  
  90.                   
  91.                 if(line.fromNode==node){  
  92.                     isFromNode=true;  
  93.                     startNO++;  
  94.                 }else{  
  95.                     endNO++;  
  96.                 }  
  97.                   
  98.                 switch(node.type){  
  99.                     case Nodes.NODE:  
  100.                     case Nodes.EMAIL:  
  101.                     case Nodes.CLOCK:  
  102.                     case Nodes.ENDNODE:  
  103.                         circleNodePosition(startNO,endNO);  
  104.                         break;  
  105.                     case Nodes.RECT:  
  106.                         rectNodePosition(startNO,endNO);  
  107.                         break;  
  108.                     case Nodes.BRECT:  
  109.                         rectNodePosition(startNO,endNO);  
  110.                         break;  
  111.                     case Nodes.DIAMOND:  
  112.                         diamondNodePosition(startNO,endNO);  
  113.                         break;  
  114.                 }  
  115.                 /**  
  116.                  * 如果是连线箭头所指的,则重设线条开始位置  
  117.                  * 如果不是,则重设连线结束  
  118.                  **/   
  119.                 if(isHead)  
  120.                     line.startPoint = new Point(startX,startY);  
  121.                 else  
  122.                     line.endPoint = new Point(endX,endY);   
  123.                   
  124.                 line.drawLine(line.aspect);  
  125.             }  
  126.             num1=0;  
  127.             num2=0;  
  128.             num3=0;  
  129.             num4=0;  
  130.             numA=0;  
  131.             numB=0;  
  132.             numC=0;  
  133.             numD=0;  
  134.         }  
  135.           
  136.         private function circleNodePosition(startNO:int,endNO:int):void{  
  137.             switch(line.aspect){  
  138.                 case 1:  
  139.                     //箭头向右  
  140.                     switch(line.lineStyle){  
  141.                         case line.lineStyleArr[1]:  
  142.                             if(line.fromNode.y<line.toNode.y){  
  143.                                 startY+=Nodes.CIRCLE_RADIUS*2+1;  
  144.                             }else{  
  145.                                 startY-=1;  
  146.                             }  
  147.                             startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num1+1)*(startNO);  
  148.                             break;  
  149.                         case line.lineStyleArr[2]:  
  150.                             startX+=13;  
  151.                             startY+=Nodes.CIRCLE_RADIUS*2/(num1+1)*(startNO);  
  152.                             break;  
  153.                         default:  
  154.                             startX+=width-15;  
  155.                             startY+=Nodes.CIRCLE_RADIUS*2/(num1+1)*(startNO);  
  156.                             break;  
  157.                     }  
  158.                     endX+=15;  
  159.                     endY+=Nodes.CIRCLE_RADIUS*2/(numA+1)*(endNO);  
  160.                     break;  
  161.                 case 2:  
  162.                     //箭头向左  
  163.                     switch(line.lineStyle){  
  164.                         case line.lineStyleArr[1]:  
  165.                             if(line.fromNode.y<line.toNode.y){  
  166.                                 startY+=Nodes.CIRCLE_RADIUS*2+1;  
  167.                             }else{  
  168.                                 startY-=1;  
  169.                             }  
  170.                             startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num2+1)*(startNO);  
  171.                             break;  
  172.                         case line.lineStyleArr[2]:  
  173.                             startX+=width-15;  
  174.                             startY+=Nodes.CIRCLE_RADIUS*2/(num2+1)*(startNO);  
  175.                             break;  
  176.                         default:  
  177.                             startX+=13;  
  178.                             startY+=Nodes.CIRCLE_RADIUS*2/(num2+1)*(startNO);  
  179.                             break;  
  180.                     }  
  181.                     endX+=width-13;  
  182.                     endY+=Nodes.CIRCLE_RADIUS*2/(numB+1)*(endNO);  
  183.                     break;  
  184.                 case 3:  
  185.                     //箭头向上  
  186.                     switch(line.lineStyle){  
  187.                         case line.lineStyleArr[1]:  
  188.                             if(line.fromNode.x<line.toNode.x){  
  189.                                 startX+=width-15;  
  190.                             }else{  
  191.                                 startX+=13;  
  192.                             }  
  193.                             startY+=Nodes.CIRCLE_RADIUS*2/(num3+1)*(startNO);  
  194.                             break;  
  195.                         case line.lineStyleArr[2]:  
  196.                             startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num3+1)*(startNO);  
  197.                             startY+=Nodes.CIRCLE_RADIUS*2+1;  
  198.                             break;  
  199.                         default:  
  200.                             startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num3+1)*(startNO);  
  201.                             startY-=1;  
  202.                             break;  
  203.                     }  
  204.                     endX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(numC+1)*(endNO);  
  205.                     endY+=Nodes.CIRCLE_RADIUS*2+3;  
  206.                     break;  
  207.                 case 4:  
  208.                     //箭头向下  
  209.                     switch(line.lineStyle){  
  210.                         case line.lineStyleArr[1]:  
  211.                             if(line.fromNode.x<line.toNode.x){  
  212.                                 startX+=width-15;  
  213.                             }else{  
  214.                                 startX+=13;  
  215.                             }  
  216.                             startY+=Nodes.CIRCLE_RADIUS*2/(num4+1)*(startNO);  
  217.                             break;  
  218.                         case line.lineStyleArr[2]:  
  219.                             startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num4+1)*(startNO);  
  220.                             startY-=1;  
  221.                             break;  
  222.                         default:  
  223.                             startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num4+1)*(startNO);  
  224.                             startY+=Nodes.CIRCLE_RADIUS*2+1;  
  225.                             break;  
  226.                     }  
  227.                     endX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(numD+1)*(endNO);  
  228.                     endY-=2;  
  229.                     break;  
  230.             }  
  231.         }  
  232.           
  233.         private function rectNodePosition(startNO:int,endNO:int):void{  
  234.             switch(line.aspect){  
  235.                 case 1:  
  236.                     switch(line.lineStyle){  
  237.                         case line.lineStyleArr[1]:  
  238.                             if(line.fromNode.y<line.toNode.y){  
  239.                                 startY+=height+2;  
  240.                             }else{  
  241.                                 startY-=0;  
  242.                             }  
  243.                             startX+=width/(num1+1)*(startNO);  
  244.                             break;  
  245.                         case line.lineStyleArr[2]:  
  246.                             startX-=0;  
  247.                             startY+=height/(num1+1)*(startNO);  
  248.                             break;  
  249.                         default:  
  250.                             startX+=width;  
  251.                             startY+=height/(num1+1)*(startNO);  
  252.                             break;  
  253.                     }  
  254.                     endX-=2;  
  255.                     endY+=height/(numA+1)*(endNO);  
  256.                     break;  
  257.                 case 2:  
  258.                     switch(line.lineStyle){  
  259.                         case line.lineStyleArr[1]:  
  260.                             if(line.fromNode.y<line.toNode.y){  
  261.                                 startY+=height+2;  
  262.                             }else{  
  263.                                 startY-=0;  
  264.                             }  
  265.                             startX+=width/(num2+1)*(startNO);  
  266.                             break;  
  267.                         case line.lineStyleArr[2]:  
  268.                             startX+=width;  
  269.                             startY+=height/(num2+1)*(startNO);  
  270.                             break;  
  271.                         default:  
  272.                             startX-=0;  
  273.                             startY+=height/(num2+1)*(startNO);  
  274.                             break;  
  275.                     }  
  276.                     endX+=width+2;  
  277.                     endY+=height/(numB+1)*(endNO);  
  278.                     break;  
  279.                 case 3:  
  280.                     switch(line.lineStyle){  
  281.                         case line.lineStyleArr[1]:  
  282.                             if(line.fromNode.x<line.toNode.x){  
  283.                                 startX+=width;  
  284.                             }else{  
  285.                                 startX-=0;  
  286.                             }  
  287.                             startY+=height/(num3+1)*(startNO);  
  288.                             break;  
  289.                         case line.lineStyleArr[2]:  
  290.                             startX+=width/(num3+1)*(startNO);  
  291.                             startY+=height+2;  
  292.                             break;  
  293.                         default:  
  294.                             startX+=width/(num3+1)*(startNO);  
  295.                             startY-=0;  
  296.                             break;  
  297.                     }  
  298.                     endX+=width/(numC+1)*(endNO);  
  299.                     endY+=height+3;  
  300.                     break;  
  301.                 case 4:  
  302.                     switch(line.lineStyle){  
  303.                         case line.lineStyleArr[1]:  
  304.                             if(line.fromNode.x<line.toNode.x){  
  305.                                 startX+=width;  
  306.                             }else{  
  307.                                 startX-=0;  
  308.                             }  
  309.                             startY+=height/(num4+1)*(startNO);  
  310.                             break;  
  311.                         case line.lineStyleArr[2]:  
  312.                             startX+=width/(num4+1)*(startNO);  
  313.                             startY-=0;  
  314.                             break;  
  315.                         default:  
  316.                             startX+=width/(num4+1)*(startNO);  
  317.                             startY+=height+2;  
  318.                             break;  
  319.                     }  
  320.                     endX+=width/(numD+1)*(endNO);  
  321.                     endY-=1;  
  322.                     break;  
  323.             }  
  324.         }  
  325.           
  326.         private function diamondNodePosition(startNO:int,endNO:int):void{  
  327.             switch(line.aspect){  
  328.                 case 1:  
  329.                     if((num1<=1 && line.fromNode==node) || (numA<=1 && line.toNode==node)){  
  330.                         switch(line.lineStyle){  
  331.                             case line.lineStyleArr[1]:  
  332.                                 if(line.fromNode.y<line.toNode.y){  
  333.                                     startY+=Nodes.DIAMOND_BORDER;  
  334.                                 }else{  
  335.                                     startY-=0;  
  336.                                 }  
  337.                                 startX+=width/2;  
  338.                                 break;  
  339.                             case line.lineStyleArr[2]:  
  340.                                 startX+=4;  
  341.                                 startY+=Nodes.DIAMOND_BORDER/(num1+1)*(startNO);  
  342.                                 break;  
  343.                             default:  
  344.                                 startX+=Nodes.DIAMOND_BORDER+6;  
  345.                                 startY+=Nodes.DIAMOND_BORDER/2;  
  346.                                 break;  
  347.                         }  
  348.                         endX+=3;  
  349.                         endY+=Nodes.DIAMOND_BORDER/2;  
  350.                     }else{  
  351.                         switch(line.lineStyle){  
  352.                             case line.lineStyleArr[1]:  
  353.                                 if(line.fromNode.y<line.toNode.y){  
  354.                                     startY+=Nodes.DIAMOND_BORDER-13;  
  355.                                 }else{  
  356.                                     startY+=13;  
  357.                                 }  
  358.                                 startX+=width/(num1+1)*(startNO);  
  359.                                 break;  
  360.                             case line.lineStyleArr[2]:  
  361.                                 startX+=(width-Nodes.DIAMOND_BORDER)/2+10;  
  362.                                 startY+=Nodes.DIAMOND_BORDER/(num1+1)*(startNO);  
  363.                                 break;  
  364.                             default:  
  365.                                 startX+=Nodes.DIAMOND_BORDER-6;  
  366.                                 startY+=Nodes.DIAMOND_BORDER/(num1+1)*(startNO);  
  367.                                 break;  
  368.                         }  
  369.                         endY+=Nodes.DIAMOND_BORDER/(numA+1)*(endNO);  
  370.                           
  371.                         if((num1==3 && startNO==2) || (numA==3 && endNO==2)){  
  372.                             endX+=3;  
  373.                         }else{  
  374.                             endX+=15;  
  375.                         }  
  376.                     }  
  377.                     break;  
  378.                 case 2:  
  379.                     if((num2<=1 && line.fromNode==node) || (numB<=1 && line.toNode==node)){  
  380.                         switch(line.lineStyle){  
  381.                             case line.lineStyleArr[1]:  
  382.                                 if(line.fromNode.y<line.toNode.y){  
  383.                                     startY+=Nodes.DIAMOND_BORDER;  
  384.                                 }else{  
  385.                                     startY-=0;  
  386.                                 }  
  387.                                 startX+=width/2;  
  388.                                 break;  
  389.                             case line.lineStyleArr[2]:  
  390.                                 startX+=Nodes.DIAMOND_BORDER+6;  
  391.                                 startY+=Nodes.DIAMOND_BORDER/(num2+1)*(startNO);  
  392.                                 break;  
  393.                             default:  
  394.                                 startX+=4;  
  395.                                 startY+=Nodes.DIAMOND_BORDER/2;  
  396.                                 break;  
  397.                         }  
  398.                         endX+=Nodes.DIAMOND_BORDER+6;  
  399.                         endY+=Nodes.DIAMOND_BORDER/2;  
  400.                     }else{  
  401.                         switch(line.lineStyle){  
  402.                             case line.lineStyleArr[1]:  
  403.                                 if(line.fromNode.y<line.toNode.y){  
  404.                                     startY+=Nodes.DIAMOND_BORDER-13;  
  405.                                 }else{  
  406.                                     startY+=13;  
  407.                                 }  
  408.                                 startX+=width/(num2+1)*(startNO);  
  409.                                 break;  
  410.                             case line.lineStyleArr[2]:  
  411.                                 startX+=Nodes.DIAMOND_BORDER-6;  
  412.                                 startY+=Nodes.DIAMOND_BORDER/(num2+1)*(startNO);  
  413.                                 break;  
  414.                             default:  
  415.                                 startX+=(width-Nodes.DIAMOND_BORDER)/2+13;  
  416.                                 startY+=Nodes.DIAMOND_BORDER/(num2+1)*(startNO);  
  417.                                 break;  
  418.                         }  
  419.                         endY+=Nodes.DIAMOND_BORDER/(numB+1)*(endNO);  
  420.                           
  421.                         if((num2==3 && startNO==2) || (numB==3 && endNO==2)){  
  422.                             endX+=Nodes.DIAMOND_BORDER+7;  
  423.                         }else{  
  424.                             endX+=Nodes.DIAMOND_BORDER-4;  
  425.                         }  
  426.                     }  
  427.                     break;  
  428.                 case 3:  
  429.                     if((num3<=1 && line.fromNode==node) || (numC<=1 && line.toNode==node)){  
  430.                         switch(line.lineStyle){  
  431.                             case line.lineStyleArr[1]:  
  432.                                 if(line.fromNode.x<line.toNode.x){  
  433.                                     startX+=Nodes.DIAMOND_BORDER+6;  
  434.                                 }else{  
  435.                                     startX+=4;  
  436.                                 }  
  437.                                 startY+=Nodes.DIAMOND_BORDER/2;  
  438.                                 break;  
  439.                             case line.lineStyleArr[2]:  
  440.                                 startX+=width/(num3+1)*(startNO);  
  441.                                 startY+=Nodes.DIAMOND_BORDER;  
  442.                                 break;  
  443.                             default:  
  444.                                 startX+=width/2;  
  445.                                 startY-=0;  
  446.                                 break;  
  447.                         }  
  448.                         endX+=width/2;  
  449.                         endY+=Nodes.DIAMOND_BORDER+2;  
  450.                     }else{  
  451.                         switch(line.lineStyle){  
  452.                             case line.lineStyleArr[1]:  
  453.                                 if(line.fromNode.x<line.toNode.x){  
  454.                                     startX+=Nodes.DIAMOND_BORDER-13;  
  455.                                 }else{  
  456.                                     startX+=15;  
  457.                                 }  
  458.                                 startY+=Nodes.DIAMOND_BORDER/(num3+1)*(startNO);  
  459.                                 break;  
  460.                             case line.lineStyleArr[2]:  
  461.                                 startX+=width/(num3+1)*(startNO);  
  462.                                 startY+=Nodes.DIAMOND_BORDER-13;  
  463.                                 break;  
  464.                             default:  
  465.                                 startX+=width/(num3+1)*(startNO);  
  466.                                 startY+=13;  
  467.                                 break;  
  468.                         }  
  469.                         endX+=width/(numC+1)*(endNO);  
  470.                         if((num3==3 && startNO==2) || (numC==3 && endNO==2)){  
  471.                             endY+=Nodes.DIAMOND_BORDER+2;  
  472.                         }else{  
  473.                             endY+=Nodes.DIAMOND_BORDER-11;  
  474.                         }  
  475.                     }  
  476.                     break;  
  477.                 case 4:  
  478.                     if((num4<=1 && line.fromNode==node) || (numD<=1 && line.toNode==node)){  
  479.                         switch(line.lineStyle){  
  480.                             case line.lineStyleArr[1]:  
  481.                                 if(line.fromNode.x<line.toNode.x){  
  482.                                     startX+=Nodes.DIAMOND_BORDER+6;  
  483.                                 }else{  
  484.                                     startX+=4;  
  485.                                 }  
  486.                                 startY+=Nodes.DIAMOND_BORDER/2;  
  487.                                 break;  
  488.                             case line.lineStyleArr[2]:  
  489.                                 startX+=width/(num4+1)*(startNO);  
  490.                                 startY-=0;  
  491.                                 break;  
  492.                             default:  
  493.                                 startX+=width/2;  
  494.                                 startY+=Nodes.DIAMOND_BORDER;  
  495.                                 break;  
  496.                         }  
  497.                         endX+=width/2;  
  498.                         endY-=1;  
  499.                     }else{  
  500.                         switch(line.lineStyle){  
  501.                             case line.lineStyleArr[1]:  
  502.                                 if(line.fromNode.x<line.toNode.x){  
  503.                                     startX+=Nodes.DIAMOND_BORDER-13;  
  504.                                 }else{  
  505.                                     startX+=15;  
  506.                                 }  
  507.                                 startY+=Nodes.DIAMOND_BORDER/(num4+1)*(startNO);  
  508.                                 break;  
  509.                             case line.lineStyleArr[2]:  
  510.                                 startX+=width/(num4+1)*(startNO);  
  511.                                 startY+=13;  
  512.                                 break;  
  513.                             default:  
  514.                                 startX+=width/(num4+1)*(startNO);  
  515.                                 startY+=Nodes.DIAMOND_BORDER-13;  
  516.                                 break;  
  517.                         }  
  518.                         endX+=width/(numD+1)*(endNO);  
  519.                         if((num4==3 && startNO==2) || (numD==3 && endNO==2)){  
  520.                             endY-=1;  
  521.                         }else{  
  522.                             endY+=11;  
  523.                         }  
  524.                     }  
  525.                     break;  
  526.             }  
  527.         }  
  528.           
  529.     }  
  530. }  
package com { import flash.geom.Point; public class RefreshLine { /** 和节点相关的线条的数组 **/ public var lineList:Array = []; public var width:Number; public var height:Number; public var lineFlag:LineLag; public var line:Line; public var node:Nodes; private var isFromNode:Boolean=false; private var num1:int=0; //开始节点,箭头右方向,连线数累加 private var num2:int=0; //开始节点,箭头左方向,连线数累加 private var num3:int=0; //开始节点,箭头上方向,连线数累加 private var num4:int=0; //开始节点,箭头下方向,连线数累加 private var numA:int=0; //结束节点,箭头右方向,连线数累加 private var numB:int=0; //结束节点,箭头左方向,连线数累加 private var numC:int=0; //结束节点,箭头上方向,连线数累加 private var numD:int=0; //结束节点,箭头下方向,连线数累加 private var startX:int; private var startY:int; private var endX:int; private var endY:int; public function RefreshLine(node:Nodes) { this.node=node; lineList=node.lineList; } /** * 重绘节点上的连线 * */ public function getAspectArr():void{ for(var j:int = 0; j < lineList.length; j++){ lineFlag = lineList[j]; line = lineFlag.line; switch(line.aspect){ case 1: if(line.fromNode==node) num1++; else numA++; break; case 2: if(line.fromNode==node) num2++; else numB++; break; case 3: if(line.fromNode==node) num3++; else numC++; break; case 4: if(line.fromNode==node) num4++; else numD++; break; } } } public function refreshLine():void{ var isHead:Boolean; var startNO:int=0; //指向开始节点的连线的条数 var endNO:int=0; //指向结束节点的连线的条数 width=node.width; height=node.height; getAspectArr(); for(var i:int = 0; i < lineList.length; i++){ startX = node.x; startY = node.y; endX = node.x; endY = node.y; lineFlag = lineList[i]; line = lineFlag.line; isHead = lineFlag.isHead; if(line.fromNode==node){ isFromNode=true; startNO++; }else{ endNO++; } switch(node.type){ case Nodes.NODE: case Nodes.EMAIL: case Nodes.CLOCK: case Nodes.ENDNODE: circleNodePosition(startNO,endNO); break; case Nodes.RECT: rectNodePosition(startNO,endNO); break; case Nodes.BRECT: rectNodePosition(startNO,endNO); break; case Nodes.DIAMOND: diamondNodePosition(startNO,endNO); break; } /** * 如果是连线箭头所指的,则重设线条开始位置 * 如果不是,则重设连线结束 **/ if(isHead) line.startPoint = new Point(startX,startY); else line.endPoint = new Point(endX,endY); line.drawLine(line.aspect); } num1=0; num2=0; num3=0; num4=0; numA=0; numB=0; numC=0; numD=0; } private function circleNodePosition(startNO:int,endNO:int):void{ switch(line.aspect){ case 1: //箭头向右 switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=Nodes.CIRCLE_RADIUS*2+1; }else{ startY-=1; } startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num1+1)*(startNO); break; case line.lineStyleArr[2]: startX+=13; startY+=Nodes.CIRCLE_RADIUS*2/(num1+1)*(startNO); break; default: startX+=width-15; startY+=Nodes.CIRCLE_RADIUS*2/(num1+1)*(startNO); break; } endX+=15; endY+=Nodes.CIRCLE_RADIUS*2/(numA+1)*(endNO); break; case 2: //箭头向左 switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=Nodes.CIRCLE_RADIUS*2+1; }else{ startY-=1; } startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num2+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width-15; startY+=Nodes.CIRCLE_RADIUS*2/(num2+1)*(startNO); break; default: startX+=13; startY+=Nodes.CIRCLE_RADIUS*2/(num2+1)*(startNO); break; } endX+=width-13; endY+=Nodes.CIRCLE_RADIUS*2/(numB+1)*(endNO); break; case 3: //箭头向上 switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=width-15; }else{ startX+=13; } startY+=Nodes.CIRCLE_RADIUS*2/(num3+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num3+1)*(startNO); startY+=Nodes.CIRCLE_RADIUS*2+1; break; default: startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num3+1)*(startNO); startY-=1; break; } endX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(numC+1)*(endNO); endY+=Nodes.CIRCLE_RADIUS*2+3; break; case 4: //箭头向下 switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=width-15; }else{ startX+=13; } startY+=Nodes.CIRCLE_RADIUS*2/(num4+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num4+1)*(startNO); startY-=1; break; default: startX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(num4+1)*(startNO); startY+=Nodes.CIRCLE_RADIUS*2+1; break; } endX+=width/2-Nodes.CIRCLE_RADIUS+Nodes.CIRCLE_RADIUS*2/(numD+1)*(endNO); endY-=2; break; } } private function rectNodePosition(startNO:int,endNO:int):void{ switch(line.aspect){ case 1: switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=height+2; }else{ startY-=0; } startX+=width/(num1+1)*(startNO); break; case line.lineStyleArr[2]: startX-=0; startY+=height/(num1+1)*(startNO); break; default: startX+=width; startY+=height/(num1+1)*(startNO); break; } endX-=2; endY+=height/(numA+1)*(endNO); break; case 2: switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=height+2; }else{ startY-=0; } startX+=width/(num2+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width; startY+=height/(num2+1)*(startNO); break; default: startX-=0; startY+=height/(num2+1)*(startNO); break; } endX+=width+2; endY+=height/(numB+1)*(endNO); break; case 3: switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=width; }else{ startX-=0; } startY+=height/(num3+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width/(num3+1)*(startNO); startY+=height+2; break; default: startX+=width/(num3+1)*(startNO); startY-=0; break; } endX+=width/(numC+1)*(endNO); endY+=height+3; break; case 4: switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=width; }else{ startX-=0; } startY+=height/(num4+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width/(num4+1)*(startNO); startY-=0; break; default: startX+=width/(num4+1)*(startNO); startY+=height+2; break; } endX+=width/(numD+1)*(endNO); endY-=1; break; } } private function diamondNodePosition(startNO:int,endNO:int):void{ switch(line.aspect){ case 1: if((num1<=1 && line.fromNode==node) || (numA<=1 && line.toNode==node)){ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=Nodes.DIAMOND_BORDER; }else{ startY-=0; } startX+=width/2; break; case line.lineStyleArr[2]: startX+=4; startY+=Nodes.DIAMOND_BORDER/(num1+1)*(startNO); break; default: startX+=Nodes.DIAMOND_BORDER+6; startY+=Nodes.DIAMOND_BORDER/2; break; } endX+=3; endY+=Nodes.DIAMOND_BORDER/2; }else{ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=Nodes.DIAMOND_BORDER-13; }else{ startY+=13; } startX+=width/(num1+1)*(startNO); break; case line.lineStyleArr[2]: startX+=(width-Nodes.DIAMOND_BORDER)/2+10; startY+=Nodes.DIAMOND_BORDER/(num1+1)*(startNO); break; default: startX+=Nodes.DIAMOND_BORDER-6; startY+=Nodes.DIAMOND_BORDER/(num1+1)*(startNO); break; } endY+=Nodes.DIAMOND_BORDER/(numA+1)*(endNO); if((num1==3 && startNO==2) || (numA==3 && endNO==2)){ endX+=3; }else{ endX+=15; } } break; case 2: if((num2<=1 && line.fromNode==node) || (numB<=1 && line.toNode==node)){ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=Nodes.DIAMOND_BORDER; }else{ startY-=0; } startX+=width/2; break; case line.lineStyleArr[2]: startX+=Nodes.DIAMOND_BORDER+6; startY+=Nodes.DIAMOND_BORDER/(num2+1)*(startNO); break; default: startX+=4; startY+=Nodes.DIAMOND_BORDER/2; break; } endX+=Nodes.DIAMOND_BORDER+6; endY+=Nodes.DIAMOND_BORDER/2; }else{ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.y<line.toNode.y){ startY+=Nodes.DIAMOND_BORDER-13; }else{ startY+=13; } startX+=width/(num2+1)*(startNO); break; case line.lineStyleArr[2]: startX+=Nodes.DIAMOND_BORDER-6; startY+=Nodes.DIAMOND_BORDER/(num2+1)*(startNO); break; default: startX+=(width-Nodes.DIAMOND_BORDER)/2+13; startY+=Nodes.DIAMOND_BORDER/(num2+1)*(startNO); break; } endY+=Nodes.DIAMOND_BORDER/(numB+1)*(endNO); if((num2==3 && startNO==2) || (numB==3 && endNO==2)){ endX+=Nodes.DIAMOND_BORDER+7; }else{ endX+=Nodes.DIAMOND_BORDER-4; } } break; case 3: if((num3<=1 && line.fromNode==node) || (numC<=1 && line.toNode==node)){ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=Nodes.DIAMOND_BORDER+6; }else{ startX+=4; } startY+=Nodes.DIAMOND_BORDER/2; break; case line.lineStyleArr[2]: startX+=width/(num3+1)*(startNO); startY+=Nodes.DIAMOND_BORDER; break; default: startX+=width/2; startY-=0; break; } endX+=width/2; endY+=Nodes.DIAMOND_BORDER+2; }else{ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=Nodes.DIAMOND_BORDER-13; }else{ startX+=15; } startY+=Nodes.DIAMOND_BORDER/(num3+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width/(num3+1)*(startNO); startY+=Nodes.DIAMOND_BORDER-13; break; default: startX+=width/(num3+1)*(startNO); startY+=13; break; } endX+=width/(numC+1)*(endNO); if((num3==3 && startNO==2) || (numC==3 && endNO==2)){ endY+=Nodes.DIAMOND_BORDER+2; }else{ endY+=Nodes.DIAMOND_BORDER-11; } } break; case 4: if((num4<=1 && line.fromNode==node) || (numD<=1 && line.toNode==node)){ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=Nodes.DIAMOND_BORDER+6; }else{ startX+=4; } startY+=Nodes.DIAMOND_BORDER/2; break; case line.lineStyleArr[2]: startX+=width/(num4+1)*(startNO); startY-=0; break; default: startX+=width/2; startY+=Nodes.DIAMOND_BORDER; break; } endX+=width/2; endY-=1; }else{ switch(line.lineStyle){ case line.lineStyleArr[1]: if(line.fromNode.x<line.toNode.x){ startX+=Nodes.DIAMOND_BORDER-13; }else{ startX+=15; } startY+=Nodes.DIAMOND_BORDER/(num4+1)*(startNO); break; case line.lineStyleArr[2]: startX+=width/(num4+1)*(startNO); startY+=13; break; default: startX+=width/(num4+1)*(startNO); startY+=Nodes.DIAMOND_BORDER-13; break; } endX+=width/(numD+1)*(endNO); if((num4==3 && startNO==2) || (numD==3 && endNO==2)){ endY-=1; }else{ endY+=11; } } break; } } } }

键盘事件类:
As3代码
  1. package com  
  2. {  
  3.     import flash.events.KeyboardEvent;  
  4.     import flash.events.MouseEvent;  
  5.       
  6.     import mx.core.UITextField;  
  7.       
  8.     import net.L4cd.iTrace;  
  9.       
  10.     public class WFKeyboard  
  11.     {  
  12.         private var node:Nodes;  
  13.         private var line:Line;  
  14.         private var workFlow:CusWorkFlow;  
  15.         private var o:Object;  
  16.         /** CusWorkFlow对象的放大/缩小参数 **/  
  17.         private var scaleNO:Number=.2;  
  18.         /** 封装连线的对象 **/  
  19.         private var lineLag1:LineLag;  
  20.           
  21.         public var trace:Function = iTrace.init;  
  22.           
  23.         public function WFKeyboard()  
  24.         {  
  25.               
  26.         }  
  27.           
  28.         /** 选择键盘按键ASCII值 **/  
  29.         public function chooseKey(e:KeyboardEvent,mouseE:MouseEvent):void {  
  30.             o=getObjects(mouseE);  
  31.             node=o.node as Nodes;  
  32.             line=o.line as Line;  
  33.             workFlow=o.workFlow as CusWorkFlow;  
  34.             switch(e.keyCode){  
  35.                 case 8:  
  36.                 case 46:  
  37.                     deleteNode(node,line,workFlow);  
  38.                     break;  
  39.                 case 65:  
  40.                     if(!e.ctrlKey)return;  
  41.                       
  42.                     break;  
  43.                 case 107:  
  44.                     if(!e.ctrlKey)return;  
  45.                     workFlow.scaleX+=scaleNO;//放大CusWorkFlow对象  
  46.                     workFlow.scaleY+=scaleNO;  
  47.                     break;  
  48.                 case 109:  
  49.                     if(!e.ctrlKey)return;  
  50.                     workFlow.scaleX-=scaleNO;//缩小CusWorkFlow对象  
  51.                     workFlow.scaleY-=scaleNO;  
  52.                     break;  
  53.             }  
  54.         }  
  55.           
  56.         /** 删除节点或连线 **/  
  57.         private function deleteNode(node:Nodes,line:Line,workFlow:CusWorkFlow):void {  
  58.             if(!workFlow)return;  
  59.               
  60.             if(node){  
  61.                 var num:int=node.lineList.length;  
  62.                 for(var i:int=0;i<num;i++){  
  63.                     var lineLag:LineLag=node.lineList[i];  
  64.                     workFlow.removeChild(lineLag.line);  
  65.                       
  66.                     if(node==lineLag.line.fromNode){  
  67.                         for(var j:int=0;j<lineLag.line.toNode.lineList.length;j++){  
  68.                             lineLag1=lineLag.line.toNode.lineList[j] as LineLag;  
  69.                             if(node==lineLag1.line.fromNode){  
  70.                                 lineLag.line.toNode.lineList.splice(j,1);  
  71.                             }  
  72.                         }  
  73.                     }else{  
  74.                         for(var k:int=0;k<lineLag.line.fromNode.lineList.length;k++){  
  75.                             lineLag1=lineLag.line.fromNode.lineList[k] as LineLag;  
  76.                             if(node==lineLag1.line.toNode){  
  77.                                 lineLag.line.fromNode.lineList.splice(k,1);  
  78.                             }  
  79.                         }  
  80.                     }  
  81.                 }  
  82.                   
  83.                 workFlow.removeChild(node);  
  84.             }else if(line){  
  85.                 for(var m:int=0;m<line.toNode.lineList.length;m++){  
  86.                     lineLag1=line.toNode.lineList[m] as LineLag;  
  87.                     if(line==lineLag1.line){  
  88.                         line.toNode.lineList.splice(m,1);  
  89.                         break;  
  90.                     }  
  91.                 }  
  92.                   
  93.                 for(var n:int=0;n<line.fromNode.lineList.length;n++){  
  94.                     lineLag1=line.fromNode.lineList[n] as LineLag;  
  95.                     if(line==lineLag1.line){  
  96.                         line.fromNode.lineList.splice(n,1);  
  97.                     }  
  98.                 }  
  99.                 workFlow.removeChild(line);  
  100.             }  
  101.         }  
  102.           
  103.         /** 重画节点边框,表示选中或非选中 **/  
  104.         public function reDrawNode(map:Nodes):void{  
  105.             switch(map.type){  
  106.                 case Nodes.NODE:  
  107.                     map.drawNode();  
  108.                     break;  
  109.                 case Nodes.DOC:  
  110.                     map.drawDoc();  
  111.                     break;  
  112.                 case Nodes.EMAIL:  
  113.                     map.drawEmail();  
  114.                     break;  
  115.                 case Nodes.RECT:  
  116.                     map.drawRect();  
  117.                     break;  
  118.                 case Nodes.BRECT:  
  119.                     map.drawBRect();  
  120.                     break;  
  121.                 case Nodes.DIAMOND:  
  122.                     map.drawDiamond();  
  123.                     break;  
  124.                 case Nodes.CLOCK:  
  125.                     map.drawClock();  
  126.                     break;  
  127.                 case Nodes.ENDNODE:  
  128.                     map.drawEndNode();  
  129.                     break;  
  130.                 case Nodes.LEFTDASHED:  
  131.                     map.drawDashed();  
  132.                     break;  
  133.                 case Nodes.RIGHTDASHED:  
  134.                     map.drawDashed2();  
  135.                     break;  
  136.             }  
  137.         }  
  138.           
  139.         /** 返回鼠标选中的对象 **/  
  140.         private function getObjects(e:MouseEvent):Object{  
  141.             o=new Object();  
  142.             if(e.target is UITextField){  
  143.                 o.node=e.target.parent.parent as Nodes;  
  144.                 o.workFlow=e.target.parent.parent.parent as CusWorkFlow;  
  145.             }else if(e.target is Nodes){  
  146.                 o.node=e.target as Nodes;  
  147.                 o.workFlow=e.target.parent as CusWorkFlow;  
  148.             }else if(e.target is CusWorkFlow){  
  149.                 o.workFlow=e.target as CusWorkFlow;  
  150.             }else if(e.target is Line){  
  151.                 o.line=e.target as Line;  
  152.                 o.workFlow=e.target.parent as CusWorkFlow;  
  153.             }  
  154.             return o;  
  155.         }  
  156.     }  

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广