⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 topflowevent.js

📁 CommitFlow,很不错的在线流程设计源码,供大家学习参考
💻 JS
📖 第 1 页 / 共 4 页
字号:
// 这里的x,y是换算过的值(/ZOOM)
function fireProcMouseMove(x, y){
  if (document.all.Canvas == null) return;
  for(var i = 0; i< _FLOW.Procs.length; i ++){
    Proc = _FLOW.Procs[i];
	  obj = document.getElementById(Proc.ID);
    if (x >= parseInt(Proc.X) && x <= (parseInt(Proc.X) + parseInt(Proc.Width))
      && y >= parseInt(Proc.Y) && y <= (parseInt(Proc.Y) + parseInt(Proc.Height))) {
      doProcMouseMove(obj, x, y);	
	  return true;
    }
  }
  if (i >= _FLOW.Procs.length){
    document.all.Canvas.style.cursor = (_TOOLTYPE == "point"?"default":"crosshair");
  }
  return false;
}

function doDocMouseDown(){
  var x = (event.x + document.body.scrollLeft) / _ZOOM;
  var y = (event.y + document.body.scrollTop) / _ZOOM;
  var oEvt = event.srcElement;
  if (oEvt.id == "tableContainer" || oEvt.id == "") return; 	// 过滤数据视图/对象视图上的事件
  if (oEvt.typ=="Step")
  {
	  document.all.Canvas.style.cursor = "default";
	  return;
  }
  if (fireProcMouseDown(x, y)) return;		// 过滤图元上的事件
  switch(_TOOLTYPE){
    case "rect":
    case "roundrect":
    case "diamond":
    case "oval":
	case "fillrect":
      if(oEvt.tagName != "DIV") return;
      if(oEvt.id != "Canvas") return;
      var obj = document.all("_" + _TOOLTYPE + "ui");
      _CURRENTX = x;
      _CURRENTY = y;
      obj.style.left = _CURRENTX;
      obj.style.top = _CURRENTY;
      obj.style.width  = 0;
      obj.style.height = 0;
      obj.style.display = "block"
      _MOVETYPE = _TOOLTYPE;
      break;
  }
}

function doDocMouseMove(){
var x = (event.x + document.body.scrollLeft) / _ZOOM;
var y = (event.y + document.body.scrollTop) / _ZOOM;
var m,n,aryPt,_movePt,sqrta,_moveLine
  switch(_MOVETYPE){
    case "line":	
    case "polyline":
		//_MOVEOBJ.to = x + "," + y;
	    _MOVEOBJ.to = x + "," + (y - 0);//原代码
      break;
	case "line_m":
		var zx=x*_ZOOM
		var zy=y*_ZOOM
		if (oOval==null)createOval(zx,zy);
		if (_PointOrLine==0)
		{
			oOval.fillcolor = "blue";
			oOval.strokecolor = "blue";
		}
		m = _clkPx.substr(0,_clkPx.length-2)*4/3;
		n = _clkPy.substr(0,_clkPy.length-2)*4/3;
		sqrta = Math.sqrt((x-m)*(x-m)+(y-n)*(y-n));
	    var _arySltLine = _strSltLine.split(',');
		if(sqrta>10)
	    {
			oOval.style.left = zx-3;
			oOval.style.top = zy-3;
			if(_PointOrLine==0){
			  _movePt = (x*3/4)+'pt,'+(y*3/4)+"pt";
			  _MOVEOBJ.Points = _strPt1+""+_movePt+""+_strPt2;
			}
			else{
			  _moveLine = _arySltLine[0]+','+_arySltLine[1]+','+x*3/4+'pt,'+y*3/4+'pt,'+_arySltLine[2]+','+_arySltLine[3];
			  _MOVEOBJ.Points = _strLine1+_moveLine+_strLine2;
			}
			document.getElementById(_MOVEOBJ.ID).outerHTML=_MOVEOBJ.toString();
			_FLOW.Modified = true;
		}
	  break;
    case "proc_m":
		m = _clkPx.substr(0,_clkPx.length-2)*4/3;
		n = _clkPy.substr(0,_clkPy.length-2)*4/3;
		sqrta = Math.sqrt((x-m)*(x-m)+(y-n)*(y-n));
		if(sqrta>10)
	    {
			var newX = x - _CURRENTX;
			var newY = y - _CURRENTY;
			if(newX < 0) newX = 0;
			if(newY < 30) newY = 30;
			_MOVEOBJ.style.left = newX + 2; //修正两个像素
			_MOVEOBJ.style.top = newY + 2;
			changeProcPos(_MOVEOBJ);
		}
		break;
    case "proc_n":
      var newH = y - parseInt(_MOVEOBJ.style.top);
      if(newH < 30) newH = 30;
      _MOVEOBJ.style.height = newH;
      changeProcPos(_MOVEOBJ);
      break;
    case "proc_e":
      var newW = x - parseInt(_MOVEOBJ.style.left);
      if(newW < 30) newW = 30;
      _MOVEOBJ.style.width = newW;
      changeProcPos(_MOVEOBJ);
      break;
    case "proc_nw":
      var newW = x - parseInt(_MOVEOBJ.style.left);
      var newH = y - parseInt(_MOVEOBJ.style.top);
      if(newW < 30) newW = 30;
      if(newH < 30) newH = 30;
      _MOVEOBJ.style.width = newW;
      _MOVEOBJ.style.height = newH;
      changeProcPos(_MOVEOBJ);
      break;
    case "rect":
    case "roundrect":
    case "diamond":
    case "oval":
	case "fillrect":
      var newX = x;
      var newY = y;
      var obj = document.all("_" + _MOVETYPE + "ui");
      if(newX < _CURRENTX) obj.style.left = newX;
      obj.style.width = Math.abs(newX - _CURRENTX);
      if(newY < _CURRENTY) obj.style.top = newY;
      obj.style.height = Math.abs(newY - _CURRENTY);
      break;
    default: // 不是在移动状态下,将鼠标移动消息交给图元
      fireProcMouseMove(x, y); 
	 
  }
}
//获取当前点到当前对象的8个点中最近的点
function getNearPt(oProc,x,y)
{
	var objProc = document.getElementById(oProc.ID)
	var fromW = parseInt(objProc.style.width);
	var fromH = parseInt(objProc.style.height);
	var fromX = parseInt(objProc.style.left);
	var fromY = parseInt(objProc.style.top);
	var arrX = new Array();
	var arrY = new Array();
	var arrPos = new Array(0,0.25,0.5,0.75,1);
	var nX, nY, m,n , nearPt,poX,poY;
	arrX[0] = fromX;
	arrX[1] = fromX + fromW / 4;
	arrX[2] = fromX + fromW / 2;
	arrX[3] = fromX + fromW * 3 / 4;
	arrX[4] = fromX + fromW;

	arrY[0] = fromY;
	arrY[1] = fromY + fromH / 4;
	arrY[2] = fromY + fromH / 2;
	arrY[3] = fromY + fromH * 3 / 4;
	arrY[4] = fromY + fromH;
	m=0;
	n=0;
	for (var i=0; i<4; i++)
	{
		Math.abs(x-arrX[i]) < Math.abs(x-arrX[i+1]) ? m=m : m=i+1;
		Math.abs(y-arrY[i]) < Math.abs(y-arrY[i+1]) ? n=n : n=i+1;
	}
	if (m>0 && m<4 && n>0 && n<4)
	{
		if (m==3)
			m=4;
		else 
			m=0;
		if (n==3)
			n=4;
		else 
			n=0;
	}

	nX = arrX[m];
	nY = arrY[n];
	poX = arrPos[m];
	poY = arrPos[n];
	nearPt = nX*3/4+"pt,"+nY*3/4+"pt|~|"+poX+","+poY
	//nearPt = nX + "," + nY;
	return nearPt;
}
function doDocMouseUp(){
  var x = (event.x + document.body.scrollLeft) / _ZOOM;
  var y = (event.y + document.body.scrollTop) / _ZOOM;
  switch(_MOVETYPE){
	 case "line_m":
		 document.body.removeChild(oOval);
		 oOval = null;
		//var Step = _FLOW.getStepByID(_MOVEOBJ.ID);
		var ProcTo
		ProcTo = _FLOW.getProcAtXY(x, y);
		if (ProcTo==null)
		{
			if (ptMoveType=="from" || ptMoveType=="to")
			{
				_MOVEOBJ.Points = _strPt1+_strSltPt+_strPt2;
				document.getElementById(_MOVEOBJ.ID).outerHTML=_MOVEOBJ.toString();
			}
		}
		else
	    {
			if (ptMoveType=="from" || ptMoveType=="to")
			{
				var Proc1,Proc2;
				Proc1 = _FLOW.getProcAtXY(_CURRENTX, _CURRENTY);
				Proc2 = _FLOW.getProcAtXY(x, y);
				
				var nearPt = getNearPt(ProcTo,x,y);
				var strPt = nearPt.split("|~|")[0];
				var arrPt = strPt.split(",");
				var strPos = nearPt.split("|~|")[1];
				var nX = arrPt[0].substr(0,arrPt[0].length-2);
				var nY = arrPt[1].substr(0,arrPt[1].length-2);
				var relX = strPos.split(",")[0];
				var relY = strPos.split(",")[1];
				if (ptMoveType=="from")
				{
					Proc1 = ProcTo;
					Proc2 = _FLOW.getProcByID(_MOVEOBJ.ToProc);
				}
				if (ptMoveType=="to")
				{
					Proc1 = _FLOW.getProcByID(_MOVEOBJ.FromProc);
					Proc2 = ProcTo;
				}
				var existProc = _FLOW.StepPathExists(Proc1.ID, Proc2.ID)
				if((Proc1.ID == Proc2.ID)||(existProc!=null && existProc.ID != _MOVEOBJ.ID)
					||(Proc1.ProcType == "EndProc" || Proc2.ProcType == "BeginProc")
					||(_MOVEOBJ.FromProc=="begin" && ptMoveType=="from" && ProcTo.ID != _MOVEOBJ.FromProc)
					||(_MOVEOBJ.FromProc=="begin" && ptMoveType=="to" && ProcTo.ID != _MOVEOBJ.ToProc)
					||(_MOVEOBJ.FromProc!="begin" && ProcTo.ID=="begin")){
					if(existProc!=null && existProc.ID != _MOVEOBJ.ID)
						alert("已经有一个路径从[" + _FLOW.getProcByID(Proc1.ID).Text + "]至[" + _FLOW.getProcByID(Proc2.ID).Text + "],操作不成功");
					if(Proc1.ProcType == "EndProc" || Proc2.ProcType == "BeginProc")
						alert("路径必须符合“起点不能是结束结点,终点不能是开始结点”的规则!");
					if(Proc1.ID == Proc2.ID)
						alert("不能指向本身!");
					//FromProc是开始节点的联线
					//if (ptMoveType=="from"&&ProcTo.ID!=_MOVEOBJ.FromProc)alert(_MOVEOBJ.FromProc);
					//if (ptMoveType=="to"&&ProcTo.ID!=_MOVEOBJ.ToProc)alert(_MOVEOBJ.FromProc);
					_MOVEOBJ.Points = _strPt1+_strSltPt+_strPt2;
					document.getElementById(_MOVEOBJ.ID).outerHTML=_MOVEOBJ.toString();
				}
				else
				{
					if (ptMoveType=="from")
					{
						_MOVEOBJ.setPropValue("FromProc",ProcTo.ID);
						_MOVEOBJ.fromRelX = relX;
						_MOVEOBJ.fromRelY = relY;
					}
					if (ptMoveType=="to")
					{
						_MOVEOBJ.setPropValue("ToProc",ProcTo.ID);
						_MOVEOBJ.toRelX = relX;
						_MOVEOBJ.toRelY = relY;
					}
					_MOVEOBJ.Points = _strPt1+strPt+_strPt2;
					document.getElementById(_MOVEOBJ.ID).outerHTML=_MOVEOBJ.toString();
					stuffProp();
					_FLOW.Modified = true;
					var newobj = new TStep(_FLOW);
					newobj.clone(_MOVEOBJ)
					pushLog("editstep", {"_old":_MOVELINEOBJ,"_new":newobj});
				}
			}
			
		}
		updateFlow(document.getElementById(_MOVEOBJ.ID));
		break;
    case "proc_m":
    case "proc_n":
    case "proc_e":
    case "proc_nw":
      var Proc = _FLOW.getProcByID(_MOVEOBJ.id);
      var oldVal = {"X":Proc.X,"Y":Proc.Y,"Width":Proc.Width,"Height":Proc.Height};
      if(_MOVETYPE == "proc_m"){
        Proc.setPropValue("X",_MOVEOBJ.style.left);
        Proc.setPropValue("Y",_MOVEOBJ.style.top);
      }
      else{
        Proc.setPropValue("Width",_MOVEOBJ.style.width);
        Proc.setPropValue("Height",_MOVEOBJ.style.height);
      }
      //如果只是细小的调节,不记录历史操作
      if(Math.abs(parseInt(oldVal.X) - parseInt(Proc.X)) > 2 || Math.abs(parseInt(oldVal.Y) - parseInt(Proc.Y)) > 2
         || Math.abs(parseInt(oldVal.Width) - parseInt(Proc.Width)) > 2 || Math.abs(parseInt(oldVal.Height) - parseInt(Proc.Height)) > 2){
        pushLog("moveproc", {"objID":Proc.ID,"moveType":_MOVETYPE,"_old": oldVal, "_new":{"X":Proc.X,"Y":Proc.Y,"Width":Proc.Width,"Height":Proc.Height}});
      }
      stuffProp();
      _FLOW.Modified = true;
	  updateFlow(_MOVEOBJ);
	  saveStepsToProc(_MOVEOBJ);
      break;
    case "rect":
    case "roundrect":
    case "diamond":
    case "oval":
	case "fillrect":

    case "line":
    case "polyline":
      var obj = document.all("_" + (_MOVETYPE == "polyline"?"line":_MOVETYPE) + "ui");
      obj.style.display = "none";
      if(_MOVETYPE == "line" || _MOVETYPE == "polyline"){

		var Proc1,Proc2, Step;
        Proc1 = _FLOW.getProcAtXY(_CURRENTX, _CURRENTY);
        Proc2 = _FLOW.getProcAtXY(x, y);
		if(Proc1 == null || Proc2 == null){
          alert("起点或终点不是[任务],请在[任务]图形上按住鼠标并拖动到某[任务]图形上松开.");
          break;;
        }
        if(_FLOW.StepPathExists(Proc1.ID, Proc2.ID)!=null){
          alert("已经有一个路径从[" + _FLOW.getProcByID(Proc1.ID).Text + "]至[" + _FLOW.getProcByID(Proc2.ID).Text + "],请更改!");
          break;
        }
        if(Proc1.ID == Proc2.ID){
          alert("不能指向本身!");
          break;
        }
		if(Proc1.ProcType == "BeginProc")
		{
			alert("开始节点不允许手动联线!");
			break;
		}
        if(Proc1.ProcType == "EndProc" || Proc2.ProcType == "BeginProc"){
          alert("路径必须符合“起点不能是结束结点,终点不能是开始结点”的规则!");
          break;
        }
        Step = new TStep(_FLOW);
        Step.FromProc = Proc1.ID;
        Step.ToProc = Proc2.ID;
		//Step.Cond = Step.Text
		Step.zIndex = 2;
        Step.ShapeType = "PolyLine";

        _FLOW.addStep(Step);
        pushLog("addstep", Step);
        DrawAll();
		
      }
      else{
        var Proc = new TProc(_FLOW);
        //Proc.ShapeType = (_MOVETYPE == "rect"?"Rect":(_MOVETYPE == "roundrect"?"RoundRect":(_MOVETYPE == "oval"?"Oval":"Diamond")));
        Proc.ShapeType = (_MOVETYPE == "rect"?"Rect":(_MOVETYPE == "roundrect"?"RoundRect":(_MOVETYPE=="fillrect"?"FillRect":(_MOVETYPE == "oval"?"Oval":"Diamond"))));
		Proc.X = parseInt(obj.style.left);
        Proc.Y = parseInt(obj.style.top);
        Proc.Width = parseInt(obj.style.width);
        Proc.Height = parseInt(obj.style.height);
        if(Proc.Width < 20 || Proc.Height < 20){
          //alert("图形长宽小于最小值,将采用默认大小");
          Proc.Width = 100;
          Proc.Height = 40;
        }
		_FLOW.addProc(Proc);
        pushLog("addproc", Proc);
        DrawAll();
      }
      break;
  }
  _MOVETYPE = "";
  _MOVELINEOBJ = null;
  _MOVEOBJ = null;
  return true;
}
function doDocSelectStart(){
  var oEvt = event.srcElement.tagName;
  if(oEvt != "INPUT") return false;
}

function doDocKeyDown(){
  switch(event.keyCode){
    case 46: //Del
      if(_FOCUSTEDOBJ != null && event.srcElement.tagName != "INPUT" && event.srcElement.tagName != "SELECT")
        mnuDelObj();
      break;
   /* case 90: //z
      if(event.ctrlKey && event.shiftKey)
        redoLog();
      else if(event.ctrlKey)
        undoLog();
      break;
    case 89: //y
      if(event.ctrlKey) redoLog();
      break;
    case 112: //F1
      mnuAbout();
      break;
	case 187: //+
      if(event.ctrlKey) mnuSetZoom('in');
      break;
	case 189: //-
      if(event.ctrlKey) mnuSetZoom('out');
      break;*/
	case 83: //s
      if(event.ctrlKey) mnuSaveFlow();
      break;
	/*case 79: //o
      if(event.ctrlKey) mnuOpenFlow();
      break;
	case 78: //n
      if(event.ctrlKey) mnuNewFlow();
      break;
	case 67: //C
      if(event.ctrlKey) mnuCopyProc();
      break;*/
	case 13: //enter
      document.all.Canvas.focus();
      break;
  }
}
function showExcuter(id)
{

}
document.onselectstart = doDocSelectStart;
document.onmousedown = doDocMouseDown;
document.onmousemove = doDocMouseMove;
document.onmouseup = doDocMouseUp;
document.onkeydown = doDocKeyDown;
document.onerror = new Function("return false;"); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -