ToolPointer.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. using Resources;
  2. using SmartCoalApplication.Annotation.Command;
  3. using SmartCoalApplication.Annotation.Enum;
  4. using SmartCoalApplication.Annotation.Label;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Drawing;
  8. using System.Windows.Forms;
  9. namespace SmartCoalApplication.Annotation
  10. {
  11. /// <summary>
  12. /// 通用->选择功能->需要满足可选择标注、测量、视场等功能
  13. /// </summary>
  14. public class ToolPointer : Tool
  15. {
  16. private enum SelectionMode
  17. {
  18. None,
  19. NetSelection, // group selection is active
  20. Move, // object(s) are moves
  21. Size // object is resized
  22. }
  23. private static SelectionMode selectMode = SelectionMode.None;
  24. // Object which is currently resized:
  25. private static DrawObject resizedObject;
  26. private static int resizedObjectHandle;
  27. // Keep state about last and current pointscroll (used to move and resize objects)
  28. private static Point lastPoint = new Point(0, 0);
  29. private static Point startPoint = new Point(0, 0);
  30. private static CommandChangeState commandChangeState;
  31. private static bool wasMove;
  32. private static RichTextBox lab;
  33. //private static NumericUpDown numLab;
  34. private static ISurfaceBox areaNow;
  35. private static bool isModifyTextString = false;
  36. //private static bool isModifyWorkType = false;
  37. private static DrawObject dObject;
  38. public static EventHandler GetMouseLeftClickPoint;
  39. /// <summary>
  40. /// Left mouse button is pressed
  41. /// </summary>
  42. /// <param name="drawArea"></param>
  43. /// <param name="e"></param>
  44. public static void OnMouseDown(ISurfaceBox drawArea, MouseEventArgs e)
  45. {
  46. areaNow = drawArea;
  47. if (isModifyTextString && dObject != null)
  48. {
  49. dObject.textboxMessage = lab.Text;
  50. drawArea.Controls.Remove(lab);
  51. drawArea.Refresh();
  52. isModifyTextString = false;
  53. }
  54. //if (isModifyWorkType && dObject != null)
  55. //{
  56. // if(numLab.Value > 0)
  57. // dObject.textboxMessage = numLab.Value.ToString();
  58. // drawArea.Controls.Remove(numLab);
  59. // drawArea.Refresh();
  60. // isModifyWorkType = false;
  61. //}
  62. Point pointscroll = GetEventPointInArea(drawArea, e.Location);
  63. if(e.Button == MouseButtons.Left)
  64. {
  65. for (int i = 0; i < drawArea.GraphicsList.Count; i++)
  66. {
  67. drawArea.GraphicsList[i].MouseDownPoint(pointscroll);
  68. }
  69. }
  70. commandChangeState = null;
  71. wasMove = false;
  72. selectMode = SelectionMode.None;
  73. // Test for resizing (only if control is selected, cursor is on the handle)
  74. foreach (DrawObject o in drawArea.GraphicsList.Selection)
  75. {
  76. int handleNumber = o.HitTest(pointscroll);
  77. if (handleNumber > 0)
  78. {
  79. selectMode = SelectionMode.Size;
  80. // keep resized object in class member
  81. resizedObject = o;
  82. resizedObjectHandle = handleNumber;
  83. // Since we want to resize only one object, unselect all other objects
  84. drawArea.GraphicsList.UnselectAll();
  85. o.Selected = true;
  86. commandChangeState = new CommandChangeState(drawArea.GraphicsList);
  87. drawArea.GraphicsList.Dirty = true;
  88. resizedObject.isHitTest = true;
  89. }
  90. }
  91. // Test for move (cursor is on the object)
  92. if (selectMode == SelectionMode.None)
  93. {
  94. int n1 = drawArea.GraphicsList.Count;
  95. DrawObject o = null;
  96. for (int i = 0; i < n1; i++)
  97. {
  98. if (drawArea.GraphicsList[i].HitTest(pointscroll) == 0)
  99. {
  100. o = drawArea.GraphicsList[i];
  101. break;
  102. }
  103. }
  104. if (o != null)
  105. {
  106. selectMode = SelectionMode.Move;
  107. // Unselect all if Ctrl is not pressed and clicked object is not selected yet
  108. if ((Control.ModifierKeys & Keys.Control) == 0 && !o.Selected)
  109. drawArea.GraphicsList.UnselectAll();
  110. // Select clicked object
  111. o.Selected = true;
  112. commandChangeState = new CommandChangeState(drawArea.GraphicsList);
  113. drawArea.Cursor = Cursors.SizeAll;
  114. drawArea.GraphicsList.Dirty = true;
  115. }
  116. }
  117. // Net selection
  118. if (selectMode == SelectionMode.None)
  119. {
  120. // click on background
  121. if ((Control.ModifierKeys & Keys.Control) == 0)
  122. drawArea.GraphicsList.UnselectAll();
  123. selectMode = SelectionMode.NetSelection;
  124. }
  125. lastPoint.X = e.X;
  126. lastPoint.Y = e.Y;
  127. startPoint.X = e.X;
  128. startPoint.Y = e.Y;
  129. //drawArea.Capture = true;
  130. drawArea.Refresh();
  131. if (selectMode == SelectionMode.NetSelection)
  132. {
  133. drawArea.DrawRectangleFlag = true;
  134. drawArea.DrawRectangle = new Rectangle(0, 0, 0, 0);
  135. // Draw selection rectangle in initial position
  136. /*ControlPaint.DrawReversibleFrame(
  137. drawArea.RectangleToScreen(DrawObject.GetNormalizedRectangle(startPoint, lastPoint)),
  138. Color.Black,
  139. FrameStyle.Dashed);*/
  140. }
  141. OnMouseDownOne(drawArea, e);
  142. if (e.Button == MouseButtons.Right)
  143. {
  144. int selectCount = 0;
  145. for (int i = 0; i < drawArea.GraphicsList.Count; i++)
  146. {
  147. if (drawArea.GraphicsList[i].Selected)
  148. {
  149. selectCount++;
  150. if (drawArea.GraphicsList[i].objectType == DrawClass.Measure)
  151. areaNow.ToolNumber = 1;
  152. else if (drawArea.GraphicsList[i].objectType == DrawClass.View)
  153. areaNow.ToolNumber = 2;
  154. }
  155. }
  156. if (selectCount == 0)
  157. areaNow.ToolNumber = 0;
  158. }
  159. }
  160. /// <summary>
  161. /// Mouse is moved.
  162. /// None button is pressed, or left button is pressed.
  163. /// </summary>
  164. /// <param name="drawArea"></param>
  165. /// <param name="e"></param>
  166. public static void OnMouseMove(ISurfaceBox drawArea, MouseEventArgs e)
  167. {
  168. Point pointscroll = GetEventPointInArea(drawArea, e.Location);
  169. Point oldPoint = lastPoint;
  170. wasMove = true;
  171. // set cursor when mouse button is not pressed
  172. if (e.Button == MouseButtons.None)
  173. {
  174. Cursor cursor = null;
  175. for (int i = 0; i < drawArea.GraphicsList.Count; i++)
  176. {
  177. int n = drawArea.GraphicsList[i].HitTest(pointscroll);
  178. if (n > 0)
  179. {
  180. cursor = drawArea.GraphicsList[i].GetHandleCursor(n);
  181. break;
  182. }
  183. }
  184. if (cursor == null)
  185. cursor = Cursors.Default;
  186. drawArea.Cursor = cursor;
  187. return;
  188. }
  189. if (e.Button != MouseButtons.Left)
  190. return;
  191. /// Left button is pressed
  192. // Find difference between previous and current position
  193. int dx = e.X - lastPoint.X;
  194. int dy = e.Y - lastPoint.Y;
  195. lastPoint.X = e.X;
  196. lastPoint.Y = e.Y;
  197. // resize
  198. if (selectMode == SelectionMode.Size)
  199. {
  200. if (resizedObject != null)
  201. {
  202. resizedObject.MoveHandleTo(pointscroll, resizedObjectHandle);
  203. drawArea.SetDirty();
  204. drawArea.Refresh();
  205. drawArea.GraphicsList.Dirty = true;
  206. }
  207. }
  208. // move
  209. if (selectMode == SelectionMode.Move)
  210. {
  211. foreach (DrawObject o in drawArea.GraphicsList.Selection)
  212. {
  213. o.Move(dx, dy);
  214. }
  215. drawArea.Cursor = Cursors.SizeAll;
  216. drawArea.SetDirty();
  217. drawArea.Refresh();
  218. drawArea.GraphicsList.Dirty = true;
  219. }
  220. if (selectMode == SelectionMode.NetSelection)
  221. {
  222. drawArea.DrawRectangle = DrawObject.GetNormalizedRectangle(startPoint, new Point(e.X, e.Y));
  223. drawArea.Refresh();
  224. /*// Remove old selection rectangle
  225. ControlPaint.DrawReversibleFrame(
  226. drawArea.RectangleToScreen(DrawObject.GetNormalizedRectangle(startPoint, oldPoint)),
  227. Color.Black,
  228. FrameStyle.Dashed);
  229. // Draw new selection rectangle
  230. ControlPaint.DrawReversibleFrame(
  231. drawArea.RectangleToScreen(DrawObject.GetNormalizedRectangle(startPoint, new Point(e.X, e.Y))),
  232. Color.Black,
  233. FrameStyle.Dashed);*/
  234. return;
  235. }
  236. OnMouseMoveOne(drawArea, e);
  237. }
  238. /// <summary>
  239. /// Right mouse button is released
  240. /// </summary>
  241. /// <param name="drawArea"></param>
  242. /// <param name="e"></param>
  243. public static void OnMouseUp(ISurfaceBox drawArea, MouseEventArgs e)
  244. {
  245. if (e.Button == MouseButtons.Left)
  246. {
  247. for (int i = 0; i < drawArea.GraphicsList.Count; i++)
  248. {
  249. drawArea.GraphicsList[i].MouseUp(false);
  250. }
  251. }
  252. if (selectMode == SelectionMode.NetSelection)
  253. {
  254. drawArea.DrawRectangleFlag = false;
  255. /*// Remove old selection rectangle
  256. ControlPaint.DrawReversibleFrame(
  257. drawArea.RectangleToScreen(DrawObject.GetNormalizedRectangle(startPoint, lastPoint)),
  258. Color.Black,
  259. FrameStyle.Dashed);*/
  260. //Point pointscroll = GetEventPointInArea(drawArea, e);
  261. // Make group selection
  262. drawArea.GraphicsList.SelectInRectangle(
  263. DrawRectangle.GetNormalizedRectangle(GetEventPointInArea(drawArea, new Point(startPoint.X, startPoint.Y)),
  264. GetEventPointInArea(drawArea, new Point(lastPoint.X, lastPoint.Y))));
  265. selectMode = SelectionMode.None;
  266. }
  267. if (resizedObject != null)
  268. {
  269. // after resizing
  270. resizedObject.Normalize();
  271. resizedObject.isHitTest = false;
  272. resizedObject = null;
  273. }
  274. drawArea.Capture = false;
  275. drawArea.Refresh();
  276. drawArea.GraphicsList.Dirty = true;
  277. if (commandChangeState != null && wasMove)
  278. {
  279. // Keep state after moving/resizing and add command to history
  280. commandChangeState.NewState(drawArea.GraphicsList);
  281. drawArea.AddCommandToHistory(commandChangeState);
  282. commandChangeState = null;
  283. }
  284. OnMouseUpOne(drawArea, e);
  285. }
  286. /// <summary>
  287. /// Remove selected object
  288. /// </summary>
  289. /// <param name="drawArea"></param>
  290. /// <param name="e"></param>
  291. public static void OnDelKeyDown(ISurfaceBox drawArea, MouseEventArgs e)
  292. {
  293. if (drawArea != null && drawArea.GraphicsList != null && drawArea.GraphicsList.Count > 0)
  294. {
  295. for (int i = drawArea.GraphicsList.Count - 1; i >= 0 ; i--)
  296. {
  297. if(drawArea.GraphicsList[i].Selected == true){
  298. drawArea.GraphicsList.RemoveObj(drawArea.GraphicsList[i]);
  299. }
  300. }
  301. drawArea.Refresh();
  302. }
  303. }
  304. public static void OnMouseLeftDoubleClick(ISurfaceBox drawArea, MouseEventArgs e)
  305. {
  306. if (drawArea != null && drawArea.GraphicsList != null && drawArea.GraphicsList.Count > 0)
  307. {
  308. areaNow = drawArea;
  309. }
  310. //if (drawArea.ViewMoveOnMouseLeftDoubleClickEnable)
  311. //{
  312. if (GetMouseLeftClickPoint != null)
  313. {
  314. PointF pointscroll = drawArea.GetRulerPointInPanel(e.Location);
  315. GetMouseLeftClickPoint(pointscroll, null);
  316. }
  317. //}
  318. }
  319. private static void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
  320. {
  321. TextBox textBox1 = (TextBox)sender;
  322. //判断按键是不是要输入的类型
  323. if (((int)e.KeyChar < 48 || (int)e.KeyChar > 57) && (int)e.KeyChar != 8 && (int)e.KeyChar != 46)
  324. e.Handled = true;
  325. //小数点的处理
  326. if ((int)e.KeyChar == 46)//小数点
  327. {
  328. if (textBox1.Text.Length <= 0)
  329. e.Handled = true; //小数点不能在第一位
  330. else
  331. {
  332. float f;
  333. float oldf;
  334. bool b1 = false, b2 = false;
  335. b1 = float.TryParse(textBox1.Text, out oldf);
  336. b2 = float.TryParse(textBox1.Text + e.KeyChar.ToString(), out f);
  337. if (b2 == false)
  338. {
  339. if (b1 == true)
  340. e.Handled = true;
  341. else
  342. e.Handled = false;
  343. }
  344. }
  345. }
  346. }
  347. private static void OnTextBoxLostFocus(object sender, EventArgs e)
  348. {
  349. if (areaNow != null && lab != null)
  350. {
  351. dObject.textboxMessage = lab.Text;
  352. areaNow.Controls.Remove(lab);
  353. areaNow.Refresh();
  354. isModifyTextString = false;
  355. }
  356. }
  357. //private static void OnNumbericLostFocus(object sender, EventArgs e)
  358. //{
  359. // if (areaNow != null && numLab != null)
  360. // {
  361. // if (numLab.Value > 0)
  362. // dObject.textboxMessage = numLab.Value.ToString();
  363. // areaNow.Controls.Remove(numLab);
  364. // areaNow.Refresh();
  365. // isModifyWorkType = false;
  366. // }
  367. //}
  368. public static void OnMouseClick(ISurfaceBox surfacebox, MouseEventArgs e)
  369. {
  370. }
  371. public static void beginWithNewObject()
  372. {
  373. }
  374. }
  375. }