public override void ProcessEvent(CoreMouseEventArgs e) { switch (e.Type) { case CoreMouseEventProcessor.MouseEnter: { CoreMouseEnterEventArgs args = e as CoreMouseEnterEventArgs; //Console.WriteLine("SelectMode::MouseEnter{" + args.Location.X + "," + args.Location.Y + "}"); break; } case CoreMouseEventProcessor.MouseLeave: { CoreMouseLeaveEventArgs args = e as CoreMouseLeaveEventArgs; //Console.WriteLine("SelectMode::MouseLeave{" + args.Location.X + "," + args.Location.Y + "}"); break; } case CoreMouseEventProcessor.MouseDown: { CoreMouseDownEventArgs args = e as CoreMouseDownEventArgs; if (args.Button == CoreMouseDownEventArgs.LeftButton) { //Console.WriteLine("SelectMode::MouseLeftButtonDown{" + args.Location.X + "," + args.Location.Y + "} : " + args.Count); BaseUMLObject TopUMLObject = Panel.TopBaseUMLObjectsAt(args.Location); List <BaseUMLShape> Shapes = Panel.AllBaseUMLShapes(); foreach (BaseUMLShape s in Shapes) { s.setSelected(false); } if (TopUMLObject != null) { TopUMLObject.setSelected(true); LockTarget = TopUMLObject; LockTargetShiftX = args.Location.X - LockTarget.GetLocation().X; LockTargetShiftY = args.Location.Y - LockTarget.GetLocation().Y; } else { LockTarget = null; } } if (args.Button == CoreMouseDownEventArgs.RightButton) { //Console.WriteLine("SelectMode::MouseRightButtonDown{" + args.Location.X + "," + args.Location.Y + "} : " + args.Count); } break; } case CoreMouseEventProcessor.MouseUp: { CoreMouseUpEventArgs args = e as CoreMouseUpEventArgs; if (args.Button == CoreMouseUpEventArgs.LeftButton) { Panel.getForeground().Children.Clear(); //Console.WriteLine("SelectMode::MouseLeftButtonUp{" + args.Location.X + "," + args.Location.Y + "}"); } if (args.Button == CoreMouseUpEventArgs.RightButton) { //Console.WriteLine("SelectMode::MouseRightButtonUp{" + args.Location.X + "," + args.Location.Y + "}"); } break; } case CoreMouseEventProcessor.MouseMove: { CoreMouseMoveEventArgs args = e as CoreMouseMoveEventArgs; //BaseUMLShape TopUMLShape = Panel.getTopShapesAt(args.Location); //if(TopUMLShape==null) // return; //Console.WriteLine("TopUMLShape:" + TopUMLShape.getID() + " Depth:" + TopUMLShape.getDepth()); //Console.WriteLine("SelectMode::MouseMove{" + args.Location.X + "," + args.Location.Y + "}"); break; } case CoreMouseEventProcessor.MouseDragging: { CoreMouseDraggingEventArgs args = e as CoreMouseDraggingEventArgs; //Console.WriteLine("SelectMode::MouseDragging{(" + args.Start.X + "," + args.Start.Y + ")->(" + args.End.X + "," + args.End.Y + ")," + args.Distance + ",key=" + args.Button + "}"); if (args.Button == CoreMouseDragEndEventArgs.LeftButton) { if (LockTarget != null) { double dx = args.End.X - LockTargetShiftX - LockTarget.GetLocation().X; double dy = args.End.Y - LockTargetShiftY - LockTarget.GetLocation().Y; LockTarget.Move(new Point(dx, dy), BaseUMLObject.Move_Relative); //鄰居連帶機制啟動 /* * foreach(ConnectionPort port in LockTarget.AllConnectionPort()) * { * List<Connection> conns = port.AllConnection(); * foreach(Connection conn in conns) * { * if(conn.getConnShape().IsStartConn(conn)) * { * BaseUMLObject UndirectlyObj = conn.getConnShape().getEndConn().getPort().getParent(); * if(UndirectlyObj != LockTarget) * UndirectlyObj.Move(new Point(dx, dy), BaseUMLObject.Move_Relative); * } * else * { * BaseUMLObject UndirectlyObj = conn.getConnShape().getStartConn().getPort().getParent(); * if (UndirectlyObj != LockTarget) * UndirectlyObj.Move(new Point(dx, dy), BaseUMLObject.Move_Relative); * } * * } * }*/ } else { DrawingGroup Group = Panel.getForeground(); using (DrawingContext dc = Group.Open()) { CoreDraw.DrawBorder(dc, new CoreRectRange(args.Start, args.End), 1, Brushes.Black, CoreDraw.LineStyle_StraightLine); } } } break; } case CoreMouseEventProcessor.MouseDragEnd: { CoreMouseDragEndEventArgs args = e as CoreMouseDragEndEventArgs; //Console.WriteLine("SelectMode::MouseDragEnd{(" + args.Start.X + "," + args.Start.Y + ")->("+args.End.X + "," + args.End.Y + "),"+args.Distance+",key="+args.Button+"}"); if (args.Button == CoreMouseDragEndEventArgs.LeftButton) { if (LockTarget == null) { List <BaseUMLObject> Objects = Panel.AllBaseUMLObjects(); if (Objects != null) { if (Objects.Count != 0) { foreach (BaseUMLObject s in Objects) { if (s.Inside(new CoreRectRange(args.Start, args.End))) { s.setSelected(true); } } return; } } } else { LockTarget = null; } } break; } } }
public override void ProcessEvent(CoreMouseEventArgs e) { switch (e.Type) { case CoreMouseEventProcessor.MouseDown: { CoreMouseDownEventArgs args = e as CoreMouseDownEventArgs; BaseUMLObject LastStartTarget = Panel.TopBaseUMLObjectsAt(args.Location); break; } case CoreMouseEventProcessor.MouseDragging: { CoreMouseDraggingEventArgs args = e as CoreMouseDraggingEventArgs; //Console.WriteLine("BaseConnShape_Mode::MouseDragging{(" + args.Start.X + "," + args.Start.Y + ")->(" + args.End.X + "," + args.End.Y + ")," + args.Distance + ",key=" + args.Button + "}"); BaseUMLObject StartTarget = Panel.TopBaseUMLObjectsAt(args.Start); BaseUMLObject EndTarget = Panel.TopBaseUMLObjectsAt(args.End); ConnectionPort StartPort = null, EndPort = null; DrawingGroup PanelForeground = Panel.getForeground(); if (StartTarget != null) { StartPort = StartTarget.NearConnectionPort(args.Start); } if (EndTarget != null) { EndPort = EndTarget.NearConnectionPort(args.End); } if (StartTarget != null) //開始點在BaseUMLObject上 { if (LastEndTarget != null) //上次的EndTarget不為空,將他的Ports顏色還原並取消選取 { foreach (ConnectionPort port in LastEndTarget.AllConnectionPort()) { port.setHighLight(false); } LastEndTarget.setSelected(false); LastEndTarget = null; } if (EndTarget != null) //開始點在BaseUMLObject上,結束點在BaseUMLObject上,把開始BaseUMLObject和結束BaseUMLObject的目標Port來HighLight { foreach (ConnectionPort port in StartTarget.AllConnectionPort()) //將開始BaseUMLObject顏色還原 { port.setHighLight(false); } if (StartPort != null) //設定開始BaseUMLObject目標Port顏色 { StartPort.setHighLight(true); } StartTarget.setSelected(true); if (EndTarget != StartTarget) //結束和開始不相同 { foreach (ConnectionPort port in EndTarget.AllConnectionPort()) //將結束BaseUMLObject顏色還原 { port.setHighLight(false); } if (EndPort != null) //設定結束BaseUMLObject目標Port顏色 { EndPort.setHighLight(true); } EndTarget.setSelected(true); LastEndTarget = EndTarget; //設定上次的EndTarget為此次的EndTarget } } else //開始點在BaseUMLObject上,結束點不在BaseUMLObject上 { //開始點在BaseUMLObject上,結束點不在BaseUMLObject上 //將開始BaseUMLObject顏色還原 foreach (ConnectionPort port in StartTarget.AllConnectionPort()) { port.setHighLight(false); } //選取開始BaseUMLObject讓其能繪出Port顏色 StartTarget.setSelected(true); } using (DrawingContext dc = PanelForeground.Open()) //要求子類別畫出預覽圖形 { ProcessPreviewConnShape(dc, args.Start, args.End); } } else { if (LastStartTarget != null) //開始點不在BaseUMLObject上,將上次StartTarget的Port顏色還原 { foreach (ConnectionPort port in LastStartTarget.AllConnectionPort()) { port.setHighLight(false); } LastStartTarget = null; } } break; } case CoreMouseEventProcessor.MouseDragEnd: { CoreMouseDragEndEventArgs args = e as CoreMouseDragEndEventArgs; //Console.WriteLine("BaseConnShape_Mode::MouseDragEnd{(" + args.Start.X + "," + args.Start.Y + ")->(" + args.End.X + "," + args.End.Y + ")," + args.Distance + ",key=" + args.Button + "}"); BaseUMLObject StartTarget = Panel.TopBaseUMLObjectsAt(args.Start); BaseUMLObject EndTarget = Panel.TopBaseUMLObjectsAt(args.End); ConnectionPort StartPort = null, EndPort = null; DrawingGroup PanelForeground = Panel.getForeground(); if (StartTarget != null) { foreach (ConnectionPort port in StartTarget.AllConnectionPort()) //將開始BaseUMLObject顏色還原 { port.setHighLight(false); } StartTarget.setSelected(false); //將開始BaseUMLObject取消選取 StartPort = StartTarget.NearConnectionPort(args.Start); } if (EndTarget != null) { foreach (ConnectionPort port in EndTarget.AllConnectionPort()) //將開始BaseUMLObject顏色還原 { port.setHighLight(false); } EndTarget.setSelected(false); //將開始BaseUMLObject取消選取 EndPort = EndTarget.NearConnectionPort(args.End); } if (StartPort != null && EndPort != null && StartTarget != EndTarget) { ProcessAddConnShape(StartPort, EndPort); } break; } case CoreMouseEventProcessor.MouseUp: { Panel.getForeground().Children.Clear(); break; } } }