www.pudn.com > WorkflowDesigner.rar > DesignerBackTransitionTool.cs, change:2007-12-17,size:8171b


using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 
 
namespace WorkflowDesigner.Designer 
{ 
    public class DesignerBackTransitionTool : DesignerTool 
    { 
 
        #region 字段 
        /// <summary> 
        /// 开始鼠标位置的x轴坐标 
        /// </summary> 
        private int startMouseX; 
 
 
        /// <summary> 
        /// 开始鼠标位置的y轴坐标 
        /// </summary> 
        private int startMouseY; 
 
 
        /// <summary> 
        /// 记录前一个鼠标位置的x轴坐标 
        /// </summary> 
        private int prevMouseX; 
 
 
        /// <summary> 
        /// 记录前一个鼠标位置的y轴坐标 
        /// </summary> 
        private int prevMouseY; 
 
        /// <summary> 
        /// 开始节点 
        /// </summary> 
        private WfAbstractActivity startActivity; 
        #endregion 
 
         #region 属性 
 
        /// <summary> 
        /// 开始鼠标位置的x轴坐标 
        /// </summary> 
        public int StartMouseX 
        { 
            get { return startMouseX; } 
            set { startMouseX = value; } 
        } 
 
        /// <summary> 
        /// 开始鼠标位置的y轴坐标 
        /// </summary> 
        public int StartMouseY 
        { 
            get { return startMouseY; } 
            set { startMouseY = value; } 
        } 
 
        /// <summary> 
        /// 记录前一个鼠标位置的x轴坐标 
        /// </summary> 
        public int PrevMouseX 
        { 
            get { return prevMouseX; } 
            set { prevMouseX = value; } 
        } 
 
        /// <summary> 
        /// 记录前一个鼠标位置的y轴坐标 
        /// </summary> 
        public int PrevMouseY 
        { 
            get { return prevMouseY; } 
            set { prevMouseY = value; } 
        } 
        #endregion 
 
        #region 构造函数 
        /// <summary> 
        /// 构造函数 
        /// </summary> 
        public DesignerBackTransitionTool() 
        { 
             
        } 
        #endregion 
 
        #region 操作 
 
        #region 私有 
        #endregion 
 
        #region 保护 
 
        #endregion 
 
        #region 公用 
 
          
 
        /// <summary> 
        /// 当鼠标按下时 
        /// </summary> 
        /// <param name="x">鼠标点所在的位置x轴坐标</param> 
        /// <param name="y">鼠标点所在的位置y轴坐标</param> 
        public override void OnMouseDown(int x, int y) 
        { 
            
            //得到鼠标点击下去的对象(调用document中的方法) 
            HitTestResult start = this.Ctrl.Document.HitTest(x, y); 
            //如果为空或者不为节点对象 
            if ((start == null) || !(start.result is WfAbstractActivity)) 
            { 
                MessageBox.Show("退回流向没有开始在节点上!"); 
                //如果ctrl没有按下 
                if (!this.IsControlPressed()) 
                { 
                    //设置当前的设计工具为指针设计工具 
                    this.Ctrl.CurrentTool = new DesignerSelector(); 
                } 
            } 
            else if (start.result is WfEndActivity) 
            { 
                MessageBox.Show("退回流向开始不能为结束节点!"); 
                //如果ctrl没有按下 
                if (!this.IsControlPressed()) 
                { 
                    //设置当前的设计工具为指针设计工具 
                    this.Ctrl.CurrentTool = new DesignerSelector(); 
                } 
            } 
            else if (start.result is WfStartActivity) 
            { 
                MessageBox.Show("退回流向开始不能为开始节点!"); 
                //如果ctrl没有按下 
                if (!this.IsControlPressed()) 
                { 
                    //设置当前的设计工具为指针设计工具 
                    this.Ctrl.CurrentTool = new DesignerSelector(); 
                } 
            } 
            else 
            { 
                //设置开始节点 
                startActivity = start.result as WfAbstractActivity; 
                //使画布被鼠标捕获 
                Ctrl.SetCapture(); 
                SavePrevMousePosition(x, y); 
                startMouseX = x; 
                startMouseY = y; 
            } 
        } 
 
        /// <summary> 
        /// 当鼠标弹开时 
        /// </summary> 
        /// <param name="x">鼠标点所在的位置x轴坐标</param> 
        /// <param name="y">鼠标点所在的位置y轴坐标</param> 
        public override void OnMouseUp(int x, int y) 
        { 
            //得到横向滚动条和竖向滚动条交叉的(top,hight)点 
            Point scrollOffset = Ctrl.ScrollOffset; 
            //得到开始点的屏幕坐标 计算公式:[注:25为设计器画布初始时增加的偏移数值]x坐标=开始点的x轴坐标-横向滚动条+25 
            Point startPoint = Ctrl.PointToScreen(new Point(startMouseX - scrollOffset.X + 25, startMouseY - scrollOffset.Y + 25)); 
            //根据屏幕坐标绘制线(前一个鼠标位置) 
            ControlPaint.DrawReversibleLine(startPoint, Ctrl.PointToScreen(new Point(prevMouseX - scrollOffset.X + 25, prevMouseY - scrollOffset.Y + 25)), Color.Black); 
            //鼠标处是否有可视化对象 
            HitTestResult end = Ctrl.Document.HitTest(x, y); 
            //如果为空或者不是节点 
            if ((end == null) || (!(end.result is WfAbstractActivity))) 
            { 
                MessageBox.Show("退回流向没有结束在节点上"); 
            } 
            //如果是开始和结束都是相同节点 
            else if (end.result == startActivity) 
            { 
                MessageBox.Show("退回流向的开始和结束都是相同活动"); 
            } 
            //如果是开始节点 
            else if (end.result is WfStartActivity) 
            { 
                MessageBox.Show("退回流向不能结束于开始节点"); 
            } 
            else if (end.result is WfEndActivity) 
            { 
                MessageBox.Show("流向不能结束于结束节点"); 
            } 
            else 
            { 
                //初始化可视化流转对象 
                WfBackTransition trans = new WfBackTransition(startActivity, end.result as WfAbstractActivity); 
                //对齐到表格 
                trans.AlignToGrid(); 
                //加入到指定文档的可视化对象的队列中 
                this.Ctrl.Document.VisualObjectList.Add(trans); 
            } 
            //重绘制 
            Ctrl.RedrawAll(); 
            //如果没有按下contrl键 
            if (!IsControlPressed()) 
            { 
                //当前工具为选择 
                Ctrl.CurrentTool = new DesignerSelector(); 
            } 
 
        } 
 
 
        /// <summary> 
        /// 当鼠标移动时 
        /// </summary> 
        /// <param name="x">鼠标点所在的位置x轴坐标</param> 
        /// <param name="y">鼠标点所在的位置y轴坐标</param> 
        public override void OnMouseMove(int x, int y) 
        { 
          // 得到偏移点 
          // 根据偏移点和上次画的点画出起始点到目前鼠标所在点的线段 
            //得到横向滚动条和竖向滚动条交叉的(top,hight)点 
            Point scrollOffset = Ctrl.ScrollOffset; 
            //得到开始点的屏幕坐标 计算公式:[注:25为设计器画布初始时增加的偏移数值]x坐标=开始点的x轴坐标-横向滚动条+25 
            Point startPoint = Ctrl.PointToScreen(new Point(startMouseX - scrollOffset.X + 25, startMouseY - scrollOffset.Y + 25)); 
            //根据屏幕坐标绘制线(前一个鼠标位置) 
            ControlPaint.DrawReversibleLine(startPoint, Ctrl.PointToScreen(new Point(prevMouseX - scrollOffset.X + 25, prevMouseY - scrollOffset.Y + 25)), Color.Black); 
            //根据屏幕坐标绘制线(当前鼠标位置) 
            ControlPaint.DrawReversibleLine(startPoint, Ctrl.PointToScreen(new Point(x - scrollOffset.X + 25, y - scrollOffset.Y + 25)), Color.Black); 
            //保存前一个鼠标所在的位置 
            this.SavePrevMousePosition(x, y); 
             
 
        } 
 
         /// <summary> 
        /// 保存前一个鼠标所在的位置 
        /// </summary> 
        /// <param name="x">前一个鼠标所在位置的x轴坐标</param> 
        /// <param name="y">前一个鼠标所在位置的y轴坐标</param> 
        private void SavePrevMousePosition(int x, int y) 
        { 
            prevMouseX = x; 
            prevMouseY = y; 
        } 
         
        #endregion 
        #endregion 
    } 
}