📄 topflowevent.js
字号:
// 这里的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 + -