DesignWorkspaceBase.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. using System;
  2. using System.Collections;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using FastReport.Utils;
  6. namespace FastReport.Design.PageDesigners
  7. {
  8. internal abstract class DesignWorkspaceBase : UserControl
  9. {
  10. #region Fields
  11. private PageDesignerBase pageDesigner;
  12. protected WorkspaceMode1 mode1;
  13. protected WorkspaceMode2 mode2;
  14. protected bool mouseDown;
  15. protected bool mouseMoved;
  16. private PointF lastMousePoint;
  17. protected RectangleF selectionRect;
  18. protected FRMouseEventArgs eventArgs;
  19. protected VirtualGuides virtualGuides;
  20. private System.Windows.Forms.ToolTip toolTip;
  21. private SmartTagButton smartTag;
  22. private InsertFrom insertionSource;
  23. private SelectedObjectCollection selectedObjectsAtMouseDown;
  24. private static Cursor FFormatToolCursor;
  25. #endregion
  26. #region Properties
  27. public PageDesignerBase PageDesigner
  28. {
  29. get { return pageDesigner; }
  30. }
  31. public Designer Designer
  32. {
  33. get { return pageDesigner.Designer; }
  34. }
  35. public bool Locked
  36. {
  37. get { return pageDesigner.Locked; }
  38. }
  39. public Report Report
  40. {
  41. get { return pageDesigner.Report; }
  42. }
  43. public virtual Point Offset
  44. {
  45. get
  46. {
  47. return new Point(0, 0);
  48. }
  49. }
  50. protected abstract float GridSnapSize
  51. {
  52. get;
  53. }
  54. private GraphicCache GraphicCache
  55. {
  56. get { return Report.GraphicCache; }
  57. }
  58. #endregion
  59. public abstract float GetScale();
  60. protected abstract bool CheckGridStep();
  61. protected RectangleF NormalizeSelectionRect()
  62. {
  63. RectangleF result = selectionRect;
  64. if (selectionRect.Left > selectionRect.Right)
  65. {
  66. result.X = selectionRect.Right;
  67. result.Width = -selectionRect.Width;
  68. }
  69. if (selectionRect.Top > selectionRect.Bottom)
  70. {
  71. result.Y = selectionRect.Bottom;
  72. result.Height = -selectionRect.Height;
  73. }
  74. return result;
  75. }
  76. protected void CloneSelectedObjects()
  77. {
  78. ObjectCollection list = new ObjectCollection();
  79. foreach (Base c in Designer.Objects)
  80. {
  81. if (Designer.SelectedObjects.IndexOf(c) != -1)
  82. if (c.HasFlag(Flags.CanCopy))
  83. list.Add(c);
  84. }
  85. // prepare to create unique name
  86. FastNameCreator nameCreator = new FastNameCreator(Report.AllNamedObjects);
  87. Designer.SelectedObjects.Clear();
  88. foreach (Base c in list)
  89. {
  90. Base clone = Activator.CreateInstance(c.GetType()) as Base;
  91. clone.AssignAll(c);
  92. clone.Name = "";
  93. clone.Parent = c.Parent;
  94. nameCreator.CreateUniqueName(clone);
  95. foreach (Base c1 in clone.AllObjects)
  96. {
  97. nameCreator.CreateUniqueName(c1);
  98. }
  99. Designer.Objects.Add(clone);
  100. Designer.SelectedObjects.Add(clone);
  101. }
  102. }
  103. protected void HandleDoubleClick()
  104. {
  105. if (Designer.SelectedObjects.Count == 1 && Designer.SelectedObjects[0] is ComponentBase)
  106. {
  107. ComponentBase c = Designer.SelectedObjects[0] as ComponentBase;
  108. c.HandleDoubleClick();
  109. }
  110. }
  111. protected void MoveSelectedObjects(int xDir, int yDir, bool smooth)
  112. {
  113. foreach (Base obj in Designer.SelectedObjects)
  114. {
  115. if (obj is ComponentBase && !(obj is PageBase))
  116. {
  117. ComponentBase c = obj as ComponentBase;
  118. c.Left += smooth ? xDir : xDir * GridSnapSize;
  119. c.Top += smooth ? yDir : yDir * GridSnapSize;
  120. c.CheckParent(true);
  121. }
  122. }
  123. virtualGuides.Check();
  124. Refresh();
  125. Designer.SetModified(pageDesigner, "Move");
  126. }
  127. protected void ResizeSelectedObjects(int xDir, int yDir, bool smooth)
  128. {
  129. foreach (Base obj in Designer.SelectedObjects)
  130. {
  131. if (obj is ComponentBase && !(obj is PageBase))
  132. {
  133. ComponentBase c = obj as ComponentBase;
  134. c.Width += smooth ? xDir : xDir * GridSnapSize;
  135. c.Height += smooth ? yDir : yDir * GridSnapSize;
  136. c.CheckNegativeSize(eventArgs);
  137. }
  138. }
  139. virtualGuides.Check();
  140. Refresh();
  141. Designer.SetModified(pageDesigner, "Size");
  142. }
  143. protected void SelectNextObject(bool forward)
  144. {
  145. int index = 0;
  146. if (Designer.SelectedObjects.Count != 0)
  147. index = Designer.Objects.IndexOf(Designer.SelectedObjects[0]);
  148. index += forward ? 1 : -1;
  149. if (index < 0)
  150. index = Designer.Objects.Count - 1;
  151. if (index > Designer.Objects.Count - 1)
  152. index = 0;
  153. Designer.SelectedObjects.Clear();
  154. Designer.SelectedObjects.Add(Designer.Objects[index]);
  155. Designer.SelectionChanged(null);
  156. }
  157. protected void ShowToolTip(string text, int x, int y)
  158. {
  159. if (toolTip == null)
  160. toolTip = new System.Windows.Forms.ToolTip();
  161. if (toolTip != null)
  162. toolTip.Show(text, this, x, y);
  163. }
  164. protected void HideToolTip()
  165. {
  166. if (toolTip != null)
  167. {
  168. toolTip.Hide(this);
  169. toolTip.Dispose();
  170. toolTip = null;
  171. }
  172. }
  173. protected abstract Base GetParentForPastedObjects();
  174. public virtual void Paste(ObjectCollection list, InsertFrom source)
  175. {
  176. insertionSource = source;
  177. pageDesigner.IsInsertingObject = true;
  178. // prepare to create unique name
  179. ObjectCollection allObjects = Report.AllNamedObjects;
  180. // prepare a list of existing names
  181. Hashtable names = new Hashtable();
  182. foreach (Base c in allObjects)
  183. {
  184. names[c.Name] = 0;
  185. }
  186. // since we are trying to preserve pasted object's name, add all names to the
  187. // allObjects list to guarantee that FastNameCreator will work correctly
  188. foreach (Base c in list)
  189. {
  190. allObjects.Add(c);
  191. // there is an existing object with the same name. Clear the name to indicate
  192. // that we should create an unique name for this object
  193. if (names.ContainsKey(c.Name))
  194. c.Name = "";
  195. if (c is IParent)
  196. {
  197. foreach (Base c1 in c.AllObjects)
  198. {
  199. allObjects.Add(c1);
  200. if (names.ContainsKey(c1.Name))
  201. c1.Name = "";
  202. }
  203. }
  204. }
  205. FastNameCreator nameCreator = new FastNameCreator(allObjects);
  206. // create unique names and add objects to designer's lists
  207. Designer.SelectedObjects.Clear();
  208. foreach (Base c in list)
  209. {
  210. c.Parent = GetParentForPastedObjects();
  211. if (c.Name == "")
  212. nameCreator.CreateUniqueName(c);
  213. Designer.Objects.Add(c);
  214. // reset group index
  215. if (c is ComponentBase)
  216. (c as ComponentBase).GroupIndex = 0;
  217. if (c is IParent)
  218. {
  219. foreach (Base c1 in c.AllObjects)
  220. {
  221. if (c1.Name == "")
  222. nameCreator.CreateUniqueName(c1);
  223. Designer.Objects.Add(c1);
  224. }
  225. }
  226. Designer.SelectedObjects.Add(c);
  227. }
  228. }
  229. public void CancelPaste()
  230. {
  231. pageDesigner.IsInsertingObject = false;
  232. if (mode1 != WorkspaceMode1.Select)
  233. {
  234. while (Designer.SelectedObjects.Count > 0)
  235. {
  236. Base c = Designer.SelectedObjects[0];
  237. Designer.SelectedObjects.Remove(c);
  238. Designer.Objects.Remove(c);
  239. c.Dispose();
  240. }
  241. mode1 = WorkspaceMode1.Select;
  242. mode2 = WorkspaceMode2.None;
  243. OnMouseUp(new MouseEventArgs(MouseButtons.None, 0, 0, 0, 0));
  244. Designer.ResetObjectsToolbar(true);
  245. }
  246. }
  247. protected override void Dispose(bool disposing)
  248. {
  249. CancelPaste();
  250. base.Dispose(disposing);
  251. }
  252. protected override void OnMouseDown(MouseEventArgs e)
  253. {
  254. base.OnMouseDown(e);
  255. if (Locked)
  256. return;
  257. Designer.SelectedObjects.CopyTo(selectedObjectsAtMouseDown);
  258. mouseDown = true;
  259. mouseMoved = false;
  260. eventArgs.x = e.X / GetScale() - Offset.X;
  261. eventArgs.y = e.Y / GetScale() - Offset.Y;
  262. eventArgs.button = e.Button;
  263. eventArgs.modifierKeys = ModifierKeys;
  264. eventArgs.handled = false;
  265. if (mode2 == WorkspaceMode2.None)
  266. {
  267. // find an object under the mouse
  268. for (int i = Designer.Objects.Count - 1; i >= 0; i--)
  269. {
  270. ComponentBase c = Designer.Objects[i] as ComponentBase;
  271. if (c != null)
  272. {
  273. c.HandleMouseDown(eventArgs);
  274. if (eventArgs.handled)
  275. {
  276. mode2 = eventArgs.mode;
  277. break;
  278. }
  279. }
  280. }
  281. }
  282. else if (eventArgs.activeObject != null)
  283. {
  284. eventArgs.activeObject.HandleMouseDown(eventArgs);
  285. }
  286. if (!selectedObjectsAtMouseDown.Equals(Designer.SelectedObjects))
  287. {
  288. Designer.SelectionChanged(pageDesigner);
  289. Designer.SelectedObjects.CopyTo(selectedObjectsAtMouseDown);
  290. }
  291. lastMousePoint.X = eventArgs.x;
  292. lastMousePoint.Y = eventArgs.y;
  293. selectionRect = new RectangleF(eventArgs.x, eventArgs.y, 0, 0);
  294. virtualGuides.Create();
  295. smartTag.Hide();
  296. Refresh();
  297. }
  298. protected override void OnMouseMove(MouseEventArgs e)
  299. {
  300. base.OnMouseMove(e);
  301. if (Locked || Designer.ActiveReport != Report)
  302. return;
  303. eventArgs.x = e.X / GetScale() - Offset.X;
  304. eventArgs.y = e.Y / GetScale() - Offset.Y;
  305. eventArgs.button = mode1 == WorkspaceMode1.Insert ? MouseButtons.Left : e.Button;
  306. if (mode1 == WorkspaceMode1.Insert && mode2 == WorkspaceMode2.Move)
  307. Cursor = Cursors.Default;
  308. eventArgs.delta = new PointF(eventArgs.x - lastMousePoint.X, eventArgs.y - lastMousePoint.Y);
  309. if (e.Button == MouseButtons.None && mode1 == WorkspaceMode1.Select)
  310. {
  311. mode2 = WorkspaceMode2.None;
  312. eventArgs.cursor = Cursors.Default;
  313. eventArgs.mode = mode2;
  314. eventArgs.activeObject = null;
  315. eventArgs.handled = false;
  316. // check object's sizing points
  317. for (int i = Designer.Objects.Count - 1; i >= 0; i--)
  318. {
  319. ComponentBase c = Designer.Objects[i] as ComponentBase;
  320. if (c != null)
  321. {
  322. c.HandleMouseMove(eventArgs);
  323. if (eventArgs.handled)
  324. {
  325. mode2 = eventArgs.mode;
  326. eventArgs.activeObject = c;
  327. break;
  328. }
  329. }
  330. }
  331. // no sizing points found, check hover
  332. if (!eventArgs.handled)
  333. {
  334. for (int i = Designer.Objects.Count - 1; i >= 0; i--)
  335. {
  336. ComponentBase c = Designer.Objects[i] as ComponentBase;
  337. if (c != null)
  338. {
  339. c.HandleMouseHover(eventArgs);
  340. if (eventArgs.handled)
  341. {
  342. if (Designer.FormatPainter)
  343. eventArgs.cursor = FFormatToolCursor;
  344. eventArgs.activeObject = c;
  345. if (c.HasFlag(Flags.HasSmartTag) && !c.HasRestriction(Restrictions.DontEdit))
  346. smartTag.Show(c);
  347. break;
  348. }
  349. }
  350. }
  351. }
  352. if (eventArgs.activeObject == null || !eventArgs.activeObject.HasFlag(Flags.HasSmartTag))
  353. smartTag.Hide();
  354. Cursor = eventArgs.cursor;
  355. }
  356. else if (mode2 == WorkspaceMode2.Move || mode2 == WorkspaceMode2.Size)
  357. {
  358. // handle drag&drop from the data tree
  359. bool dragHandled = false;
  360. if (mode1 == WorkspaceMode1.DragDrop)
  361. {
  362. eventArgs.dragTarget = null;
  363. eventArgs.handled = false;
  364. eventArgs.dragMessage = "";
  365. for (int i = Designer.Objects.Count - 1; i >= 0; i--)
  366. {
  367. ComponentBase c = Designer.Objects[i] as ComponentBase;
  368. if (c != null &&
  369. (eventArgs.dragSources == null || Array.IndexOf(eventArgs.dragSources, c) == -1) &&
  370. !c.HasRestriction(Restrictions.DontModify))
  371. {
  372. c.HandleDragOver(eventArgs);
  373. }
  374. if (eventArgs.handled)
  375. {
  376. eventArgs.dragTarget = c;
  377. dragHandled = true;
  378. eventArgs.handled = false;
  379. // handle remained objects to reset its state. To do this, invert mouse location
  380. eventArgs.x = -eventArgs.x;
  381. eventArgs.y = -eventArgs.y;
  382. }
  383. }
  384. if (dragHandled)
  385. {
  386. // revert back the mouse location
  387. eventArgs.x = -eventArgs.x;
  388. eventArgs.y = -eventArgs.y;
  389. }
  390. foreach (ComponentBase obj in eventArgs.dragSources)
  391. obj.SetFlags(Flags.CanDraw, !dragHandled);
  392. }
  393. if (!dragHandled && !CheckGridStep())
  394. return;
  395. // if insert is on and user press the mouse button and move the mouse, resize selected objects
  396. if (mode1 == WorkspaceMode1.Insert && e.Button == MouseButtons.Left && !mouseMoved)
  397. {
  398. mode2 = WorkspaceMode2.Size;
  399. foreach (Base c in Designer.SelectedObjects)
  400. {
  401. if (c is ComponentBase)
  402. {
  403. (c as ComponentBase).Width = 0;
  404. (c as ComponentBase).Height = 0;
  405. }
  406. }
  407. eventArgs.sizingPoint = SizingPoint.RightBottom;
  408. }
  409. // ctrl was pressed, clone selected objects
  410. if (mode1 == WorkspaceMode1.Select && ModifierKeys == Keys.Control && !mouseMoved)
  411. CloneSelectedObjects();
  412. mouseMoved = true;
  413. eventArgs.mode = mode2;
  414. eventArgs.handled = false;
  415. // first serve the active object
  416. if (eventArgs.activeObject != null)
  417. eventArgs.activeObject.HandleMouseMove(eventArgs);
  418. // if active object does not reset the handled flag, serve other objects
  419. if (!eventArgs.handled)
  420. {
  421. foreach (Base c in Designer.Objects)
  422. {
  423. if (c is ComponentBase)
  424. {
  425. if (c != eventArgs.activeObject)
  426. (c as ComponentBase).HandleMouseMove(eventArgs);
  427. }
  428. }
  429. }
  430. lastMousePoint.X += eventArgs.delta.X;
  431. lastMousePoint.Y += eventArgs.delta.Y;
  432. if (mode1 == WorkspaceMode1.DragDrop && !dragHandled)
  433. {
  434. // correct the location of the dragged object because we skip the GridCheck
  435. float offset = 0f;
  436. foreach (ComponentBase obj in eventArgs.dragSources)
  437. {
  438. if (offset == 0f)
  439. {
  440. obj.Left = (int)Math.Round(obj.Left / GridSnapSize) * GridSnapSize;
  441. obj.Top = (int)Math.Round(obj.Top / GridSnapSize) * GridSnapSize;
  442. }
  443. else
  444. {
  445. obj.Left = offset;
  446. obj.Top = (int)Math.Round(obj.Top / GridSnapSize) * GridSnapSize;
  447. }
  448. offset = obj.Right + GridSnapSize;
  449. }
  450. }
  451. if (mode1 != WorkspaceMode1.DragDrop || !dragHandled)
  452. {
  453. virtualGuides.Check();
  454. ShowLocationSizeToolTip(e.X + 20, e.Y + 20);
  455. }
  456. else
  457. {
  458. virtualGuides.Clear();
  459. if (String.IsNullOrEmpty(eventArgs.dragMessage))
  460. HideToolTip();
  461. else
  462. ShowToolTip(eventArgs.dragMessage, e.X + 20, e.Y + 20);
  463. }
  464. Refresh1();
  465. }
  466. else if (mode2 == WorkspaceMode2.SelectionRect)
  467. {
  468. selectionRect = new RectangleF(selectionRect.Left, selectionRect.Top,
  469. eventArgs.x - selectionRect.Left, eventArgs.y - selectionRect.Top);
  470. Refresh();
  471. }
  472. else if (mode2 == WorkspaceMode2.Custom)
  473. {
  474. if (!CheckGridStep())
  475. return;
  476. mouseMoved = true;
  477. eventArgs.mode = mode2;
  478. if (eventArgs.activeObject != null)
  479. eventArgs.activeObject.HandleMouseMove(eventArgs);
  480. lastMousePoint.X += eventArgs.delta.X;
  481. lastMousePoint.Y += eventArgs.delta.Y;
  482. Refresh();
  483. }
  484. }
  485. protected virtual void ShowLocationSizeToolTip(int x, int y)
  486. {
  487. }
  488. protected virtual void Refresh1()
  489. {
  490. Refresh();
  491. }
  492. protected override void OnMouseUp(MouseEventArgs e)
  493. {
  494. base.OnMouseUp(e);
  495. if (Locked)
  496. return;
  497. HideToolTip();
  498. pageDesigner.IsInsertingObject = false;
  499. eventArgs.x = e.X / GetScale() - Offset.X;
  500. eventArgs.y = e.Y / GetScale() - Offset.Y;
  501. eventArgs.button = e.Button;
  502. eventArgs.mode = mode2;
  503. eventArgs.handled = false;
  504. if (mode2 == WorkspaceMode2.Move || mode2 == WorkspaceMode2.Size)
  505. {
  506. // handle drag&drop from the data tree
  507. bool dragHandled = false;
  508. if (mode1 == WorkspaceMode1.DragDrop)
  509. {
  510. if (eventArgs.dragTarget != null)
  511. {
  512. dragHandled = true;
  513. eventArgs.dragTarget.HandleDragDrop(eventArgs);
  514. if (eventArgs.dragSources != null)
  515. {
  516. foreach (ComponentBase dragSource in eventArgs.dragSources)
  517. {
  518. Designer.Objects.Remove(dragSource);
  519. dragSource.Dispose();
  520. }
  521. eventArgs.dragSources = null;
  522. }
  523. Designer.SelectedObjects.Clear();
  524. Designer.SelectedObjects.Add(eventArgs.dragTarget);
  525. }
  526. }
  527. // change selected object when resizing band
  528. if (eventArgs.activeObject is BandBase && mode2 == WorkspaceMode2.Size)
  529. {
  530. Designer.SelectedObjects.Clear();
  531. Designer.SelectedObjects.Add(eventArgs.activeObject);
  532. }
  533. // serve all objects
  534. for (int i = 0; i < Designer.Objects.Count; i++)
  535. {
  536. ComponentBase c = Designer.Objects[i] as ComponentBase;
  537. if (c != null)
  538. c.HandleMouseUp(eventArgs);
  539. }
  540. // remove objects with zero size
  541. if (mode1 == WorkspaceMode1.Insert)
  542. {
  543. int i = 0;
  544. while (i < Designer.SelectedObjects.Count)
  545. {
  546. ComponentBase c = Designer.SelectedObjects[i] as ComponentBase;
  547. if (c != null && c.Width == 0 && c.Height == 0)
  548. {
  549. Designer.Objects.Remove(c);
  550. Designer.SelectedObjects.Remove(c);
  551. c.Dispose();
  552. i--;
  553. }
  554. i++;
  555. }
  556. }
  557. if (mode1 != WorkspaceMode1.Select && !dragHandled)
  558. {
  559. // during OnInsert call current context may be changed
  560. WorkspaceMode1 saveMode = mode1;
  561. mode1 = WorkspaceMode1.Select;
  562. ObjectCollection insertedObjects = new ObjectCollection();
  563. Designer.SelectedObjects.CopyTo(insertedObjects);
  564. foreach (Base c in insertedObjects)
  565. {
  566. c.OnAfterInsert(insertionSource);
  567. if ((c is Matrix.MatrixObject || c is AdvMatrix.AdvMatrixObject) &&
  568. (c.Parent is HeaderFooterBandBase || c.Parent is PageHeaderBand || c.Parent is PageFooterBand))
  569. {
  570. MyRes res = new MyRes("Messages");
  571. string message = String.Format(res.Get("WarningMatrixOnRepeatedBand"), c.ClassName, c.Parent.ClassName);
  572. FRMessageBox.Information(message);
  573. }
  574. }
  575. mode1 = saveMode;
  576. }
  577. // check if we actually move a mouse after we clicked it
  578. string action = mode1 != WorkspaceMode1.Select ? "Insert" : mode2 == WorkspaceMode2.Move ? "Move" : "Size";
  579. if (dragHandled)
  580. action = "Change";
  581. if (mouseMoved || mode1 != WorkspaceMode1.Select)
  582. Designer.SetModified(pageDesigner, action);
  583. }
  584. else if (mode2 == WorkspaceMode2.SelectionRect)
  585. {
  586. eventArgs.selectionRect = NormalizeSelectionRect();
  587. if (eventArgs.activeObject != null)
  588. eventArgs.activeObject.HandleMouseUp(eventArgs);
  589. }
  590. else if (mode2 == WorkspaceMode2.Custom)
  591. {
  592. if (eventArgs.activeObject != null)
  593. eventArgs.activeObject.HandleMouseUp(eventArgs);
  594. }
  595. bool needReset = mode1 != WorkspaceMode1.Select;
  596. if (!selectedObjectsAtMouseDown.Equals(Designer.SelectedObjects) || needReset)
  597. Designer.SelectionChanged(pageDesigner);
  598. mouseDown = false;
  599. mode1 = WorkspaceMode1.Select;
  600. mode2 = WorkspaceMode2.None;
  601. virtualGuides.Clear();
  602. Refresh2();
  603. if (needReset)
  604. Designer.ResetObjectsToolbar(false);
  605. if (e.Button == MouseButtons.Right && Designer.SelectedObjects.Count > 0)
  606. {
  607. ContextMenuBase menu = Designer.SelectedObjects[0].GetContextMenu();
  608. if (menu != null)
  609. {
  610. menu.Show(this, e.Location);
  611. }
  612. }
  613. }
  614. protected virtual void Refresh2()
  615. {
  616. Refresh();
  617. }
  618. protected override void OnMouseDoubleClick(MouseEventArgs e)
  619. {
  620. base.OnMouseDoubleClick(e);
  621. if (e.Button == MouseButtons.Left)
  622. HandleDoubleClick();
  623. }
  624. protected override bool IsInputKey(Keys keyData)
  625. {
  626. return (keyData & Keys.Up) != 0 || (keyData & Keys.Down) != 0 ||
  627. (keyData & Keys.Left) != 0 || (keyData & Keys.Right) != 0 ||
  628. (keyData & Keys.Tab) != 0;
  629. }
  630. protected override void OnKeyDown(KeyEventArgs e)
  631. {
  632. if (Config.DisableHotkeys)
  633. return;
  634. base.OnKeyDown(e);
  635. // serve all objects
  636. foreach (Base c in Designer.Objects)
  637. {
  638. if (c is ComponentBase)
  639. {
  640. (c as ComponentBase).HandleKeyDown(this, e);
  641. if (e.Handled)
  642. return;
  643. }
  644. }
  645. int xDir = 0;
  646. int yDir = 0;
  647. switch (e.KeyCode)
  648. {
  649. case Keys.Escape:
  650. Designer.ResetObjectsToolbar(true);
  651. CancelPaste();
  652. Designer.SelectedObjects.Clear();
  653. Designer.SelectedObjects.Add(PageDesigner.Page);
  654. Designer.SelectionChanged(null);
  655. break;
  656. case Keys.Enter:
  657. HandleDoubleClick();
  658. break;
  659. case Keys.Insert:
  660. if ((e.Modifiers & Keys.Control) != 0)
  661. Designer.cmdCopy.Invoke();
  662. else if ((e.Modifiers & Keys.Shift) != 0)
  663. Designer.cmdPaste.Invoke();
  664. break;
  665. case Keys.Delete:
  666. CancelPaste();
  667. if ((e.Modifiers & Keys.Shift) == 0)
  668. Designer.cmdDelete.Invoke();
  669. else
  670. Designer.cmdCut.Invoke();
  671. break;
  672. case Keys.Up:
  673. yDir = -1;
  674. break;
  675. case Keys.Down:
  676. yDir = 1;
  677. break;
  678. case Keys.Left:
  679. xDir = -1;
  680. break;
  681. case Keys.Right:
  682. xDir = 1;
  683. break;
  684. case Keys.Tab:
  685. SelectNextObject((e.Modifiers & Keys.Shift) == 0);
  686. break;
  687. }
  688. if ((e.Modifiers & Keys.Control) != 0)
  689. {
  690. switch (e.KeyCode)
  691. {
  692. case Keys.C:
  693. Designer.cmdCopy.Invoke();
  694. break;
  695. case Keys.X:
  696. Designer.cmdCut.Invoke();
  697. break;
  698. case Keys.V:
  699. Designer.cmdPaste.Invoke();
  700. break;
  701. case Keys.A:
  702. Designer.cmdSelectAll.Invoke();
  703. break;
  704. }
  705. }
  706. if (xDir != 0 || yDir != 0)
  707. {
  708. virtualGuides.Create();
  709. bool smooth = (e.Modifiers & Keys.Control) != 0;
  710. if ((e.Modifiers & Keys.Shift) != 0)
  711. ResizeSelectedObjects(xDir, yDir, smooth);
  712. else
  713. MoveSelectedObjects(xDir, yDir, smooth);
  714. virtualGuides.Clear();
  715. }
  716. }
  717. internal DesignWorkspaceBase(PageDesignerBase pageDesigner)
  718. {
  719. this.pageDesigner = pageDesigner;
  720. SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
  721. AllowDrop = true;
  722. eventArgs = new FRMouseEventArgs();
  723. selectedObjectsAtMouseDown = new SelectedObjectCollection();
  724. smartTag = new SmartTagButton(this);
  725. Controls.Add(smartTag);
  726. virtualGuides = new VirtualGuides(this);
  727. }
  728. static DesignWorkspaceBase()
  729. {
  730. FFormatToolCursor = ResourceLoader.GetCursor("Format.cur");
  731. }
  732. private class SmartTagButton : Button
  733. {
  734. private DesignWorkspaceBase workspace;
  735. private ComponentBase component;
  736. protected override void OnClick(EventArgs e)
  737. {
  738. base.OnClick(e);
  739. Point pt = PointToScreen(this.LogicalToDevice(new Point(10, 0)));
  740. SmartTagBase smartTag = component.GetSmartTag();
  741. if (smartTag != null)
  742. smartTag.Show(pt);
  743. }
  744. protected override bool IsInputKey(Keys keyData)
  745. {
  746. return (keyData & Keys.Up) != 0 || (keyData & Keys.Down) != 0 ||
  747. (keyData & Keys.Left) != 0 || (keyData & Keys.Right) != 0 ||
  748. (keyData & Keys.Tab) != 0;
  749. }
  750. protected override void OnKeyDown(KeyEventArgs kevent)
  751. {
  752. workspace.OnKeyDown(kevent);
  753. }
  754. public void Show(ComponentBase c)
  755. {
  756. BackgroundImage = this.GetImage(77);
  757. Point loc = new Point((int)Math.Round(c.AbsRight * workspace.GetScale()) - this.LogicalToDevice(14),
  758. (int)Math.Round(c.AbsTop * workspace.GetScale()) - this.LogicalToDevice(5));
  759. if (loc.Y < 0)
  760. loc.Y = 0;
  761. Location = loc;
  762. Size = this.LogicalToDevice(new Size(10, 10));
  763. Visible = true;
  764. component = c;
  765. }
  766. public SmartTagButton(DesignWorkspaceBase workspace)
  767. {
  768. this.workspace = workspace;
  769. Visible = false;
  770. Cursor = Cursors.Hand;
  771. BackgroundImageLayout = ImageLayout.Center;
  772. BackColor = Color.White;
  773. FlatStyle = FlatStyle.Flat;
  774. FlatAppearance.BorderSize = 0;
  775. }
  776. }
  777. }
  778. }