/DrawingBoard/Shapes/ShapesCollection.cs

# · C# · 992 lines · 706 code · 126 blank · 160 comment · 102 complexity · f1ced0ba07b60db5f6a4645b02eece0a MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Windows.Forms;
  6. namespace DrawingBoard
  7. {
  8. /// <summary>
  9. /// shapes collection
  10. /// </summary>
  11. [Serializable]
  12. public class ShapesCollection
  13. {
  14. // List of objects on the canvas
  15. public readonly List<Element> List = new List<Element>();
  16. // The Handles Obj
  17. public int minDim = 10;
  18. public Element selectedElement;
  19. public AbstractSel sRec;
  20. //the undo/redo buffer
  21. [NonSerialized]
  22. private UndoBuffer undoB;
  23. public ShapesCollection()
  24. {
  25. InitUndoBuff();
  26. }
  27. private void InitUndoBuff()
  28. {
  29. undoB = new UndoBuffer(20); // set dim of undo buffer
  30. }
  31. public bool IsEmpty()
  32. {
  33. return (List.Count > 0);
  34. }
  35. public void AfterLoad()
  36. {
  37. // UndoBuff is not serialized, I must reinit it after LOAD from file
  38. InitUndoBuff();
  39. foreach (var e in List)
  40. e.AfterLoad();
  41. }
  42. /// <summary>
  43. /// Copy all selected Items
  44. /// </summary>
  45. public void CopyMultiSelected(int dx, int dy)
  46. {
  47. var tmpList = new List<Element>();
  48. foreach (var elem in List)
  49. {
  50. if (!elem.IsSelected)
  51. continue;
  52. var eL = elem.Copy();
  53. elem.IsSelected = false;
  54. eL.move(dx, dy);
  55. tmpList.Add(eL);
  56. sRec = new SelRect(eL);
  57. selectedElement = eL;
  58. selectedElement.endMoveRedim();
  59. }
  60. foreach (var tmpElem in tmpList)
  61. {
  62. List.Add(tmpElem);
  63. // store the operation in undo/redo buffer
  64. storeDo("I", tmpElem);
  65. }
  66. }
  67. /// <summary>
  68. /// returns a Copy of selected element
  69. /// </summary>
  70. public Element GetCopyOfSelectedElement()
  71. {
  72. if (selectedElement == null)
  73. return null;
  74. var L = selectedElement.Copy();
  75. return L;
  76. }
  77. /// <summary>
  78. /// Copy selected Item
  79. /// </summary>
  80. public void CopySelected(int dx, int dy)
  81. {
  82. if (selectedElement == null)
  83. return;
  84. var element = GetCopyOfSelectedElement();
  85. element.move(dx, dy);
  86. deSelect();
  87. List.Add(element);
  88. // store the operation in undo/redo buffer
  89. storeDo("I", element);
  90. sRec = new SelRect(element);
  91. //sRec.IsLine = L.IsLine;
  92. selectedElement = element;
  93. selectedElement.endMoveRedim();
  94. }
  95. /// <summary>
  96. /// Get direct access to the selected elements
  97. /// </summary>
  98. public List<Element> SelectedElements
  99. {
  100. get
  101. {
  102. var tmpList = new List<Element>();
  103. foreach (var elem in List)
  104. if (elem.IsSelected)
  105. tmpList.Add(elem);
  106. return tmpList;
  107. }
  108. }
  109. /// <summary>
  110. /// Elimina oggetto selezioanto
  111. /// </summary>
  112. public void RemoveSelected()
  113. {
  114. var tmpList = SelectedElements;
  115. if (selectedElement != null)
  116. {
  117. //this.List.Remove(selectedElement);
  118. selectedElement = null;
  119. sRec = null;
  120. }
  121. foreach (var tmpElem in tmpList)
  122. {
  123. List.Remove(tmpElem);
  124. // store the operation in undo/redo buffer
  125. storeDo("D", tmpElem);
  126. }
  127. }
  128. /// <summary>
  129. /// Group selected objs
  130. /// </summary>
  131. public void GroupSelected()
  132. {
  133. var tmpList = SelectedElements;
  134. if (selectedElement != null)
  135. {
  136. //this.List.Remove(selectedElement);
  137. selectedElement = null;
  138. sRec = null;
  139. }
  140. foreach (var tmpElem in tmpList)
  141. {
  142. List.Remove(tmpElem);
  143. // store the operation in undo/redo buffer
  144. //storeDo("D", tmpElem);
  145. }
  146. var g = new Group(tmpList);
  147. List.Add(g);
  148. // store the operation in undo/redo buffer
  149. //storeDo("I", g);
  150. sRec = new SelRect(g);
  151. //sRec.showHandles(true);
  152. selectedElement = g;
  153. selectedElement.Select();
  154. // when grouping / ungrouping, reset the undoBuffer
  155. undoB = new UndoBuffer(20);
  156. }
  157. /// <summary>
  158. /// Grup selected objs
  159. /// </summary>
  160. public void UnGroupSelected()
  161. {
  162. var tmpList = SelectedElements;
  163. if (selectedElement != null)
  164. {
  165. //this.List.Remove(selectedElement);
  166. selectedElement = null;
  167. sRec = null;
  168. }
  169. bool found = false;
  170. foreach (var tmpElem in tmpList)
  171. {
  172. var ungroupedElements = tmpElem.UnGroup();
  173. if (ungroupedElements == null || ungroupedElements.Count <= 0)
  174. continue;
  175. List.AddRange(ungroupedElements);
  176. List.Remove(tmpElem);
  177. found = true;
  178. }
  179. if (found) // when grouping / ungrouping reset undoBuffer
  180. undoB = new UndoBuffer(20);
  181. }
  182. public void MovePoint(int dx, int dy)
  183. {
  184. ((SelPoly)sRec).movePoints(dx, dy);
  185. ((SelPoly)sRec).reCreateCreationHandles((PointSet)selectedElement);
  186. //sRec = new SelPoly(selectedElement);//create handling rect
  187. }
  188. public void AddPoint()
  189. {
  190. if (!(sRec is SelPoly))
  191. return;
  192. var p = ((SelPoly)sRec).getNewPoint();
  193. int i = ((SelPoly)sRec).getIndex();
  194. if (i <= 0)
  195. return;
  196. ((PointSet)selectedElement).points.Insert(i - 1, p);
  197. sRec = new SelPoly(selectedElement); //create handling rect
  198. }
  199. public void RemovePoint()
  200. {
  201. if (!(sRec is SelPoly))
  202. return;
  203. var tmp = ((SelPoly)sRec).getSelPoints();
  204. if (tmp.Count < ((PointSet)selectedElement).points.Count - 1)
  205. foreach (var p in tmp)
  206. ((PointSet)selectedElement).points.Remove(p);
  207. sRec = new SelPoly(selectedElement); //create handling rect
  208. }
  209. //Creates new polys from selected points
  210. public void PolysFromSelectedPoints()
  211. {
  212. if (!(sRec is SelPoly))
  213. return;
  214. var tmp = ((SelPoly)sRec).getSelPoints();
  215. if (tmp.Count > 1)
  216. {
  217. var newL = new List<PointWr>();
  218. foreach (var p in tmp)
  219. {
  220. //((PointSet)this.selectedElement).points.Remove(p);
  221. newL.Add(new PointWr(p.point));
  222. }
  223. addPoly(sRec.getX(), sRec.getY(), sRec.getX1(), sRec.getY1(), sRec.PenColor, sRec.FillColor,
  224. sRec.PenWidth, sRec.IsFilled, newL, false);
  225. }
  226. //sRec = new SelPoly(selectedElement);//create handling rect
  227. }
  228. public void Move(int dx, int dy)
  229. {
  230. foreach (var e in List)
  231. if (e.IsSelected)
  232. e.move(dx, dy);
  233. }
  234. public void FitToGrid(int gridsize)
  235. {
  236. foreach (var e in List)
  237. if (e.IsSelected)
  238. e.FitToGrid(gridsize);
  239. }
  240. public void EndMove()
  241. {
  242. foreach (var e in List)
  243. {
  244. if (!e.IsSelected)
  245. continue;
  246. e.endMoveRedim();
  247. if (!e.IsGroup)
  248. storeDo("U", e);
  249. }
  250. }
  251. public void Propertychanged()
  252. {
  253. foreach (var e in List)
  254. if (e.IsSelected)
  255. storeDo("U", e);
  256. }
  257. private int CountSelected()
  258. {
  259. int i = 0;
  260. foreach (var e in List)
  261. if (e.IsSelected)
  262. i++;
  263. return i;
  264. }
  265. /// <summary>
  266. /// Returns an array with the selected item. Used for property grid.
  267. /// </summary>
  268. public Element[] getSelectedArray()
  269. {
  270. var myArray = new Element[CountSelected()];
  271. int i = 0;
  272. foreach (var e in List)
  273. {
  274. if (!e.IsSelected)
  275. continue;
  276. myArray[i] = e;
  277. i++;
  278. }
  279. return myArray;
  280. }
  281. /// <summary>
  282. /// Returns a List with the selected items. Used for SaveObj.
  283. /// </summary>
  284. public List<Element> getSelectedList()
  285. {
  286. var tmpL = new List<Element>();
  287. foreach (var e in List)
  288. if (e.IsSelected)
  289. tmpL.Add(e);
  290. return tmpL;
  291. }
  292. /// <summary>
  293. /// Returns a List with the selected items. Used for SaveObj.
  294. /// </summary>
  295. public void setList(List<Element> a)
  296. {
  297. foreach (var e in a)
  298. List.Add(e);
  299. }
  300. /// <summary>
  301. /// 2 front
  302. /// </summary>
  303. public void ToFront()
  304. {
  305. if (selectedElement != null)
  306. {
  307. List.Remove(selectedElement);
  308. List.Add(selectedElement);
  309. }
  310. }
  311. /// <summary>
  312. /// 2 back
  313. /// </summary>
  314. public void ToBack()
  315. {
  316. if (selectedElement == null)
  317. return;
  318. List.Remove(selectedElement);
  319. List.Insert(0, selectedElement);
  320. deSelect();
  321. }
  322. public void XMirror()
  323. {
  324. if (!(selectedElement is PointSet))
  325. return;
  326. ((PointSet)selectedElement).CommitMirror(true, false);
  327. sRec = new SelPoly(selectedElement); //create handling rect
  328. }
  329. public void YMirror()
  330. {
  331. if (!(selectedElement is PointSet))
  332. return;
  333. ((PointSet)selectedElement).CommitMirror(false, true);
  334. sRec = new SelPoly(selectedElement); //create handling rect
  335. }
  336. public void Mirror()
  337. {
  338. if (!(selectedElement is PointSet))
  339. return;
  340. ((PointSet)selectedElement).CommitMirror(true, true);
  341. //((PointSet)selectedElement).setupSize();
  342. sRec = new SelPoly(selectedElement); //create handling rect
  343. }
  344. /// <summary>
  345. /// Deselect
  346. /// </summary>
  347. public void deSelect()
  348. {
  349. foreach (var obj in List)
  350. obj.IsSelected = false;
  351. selectedElement = null;
  352. sRec = null;
  353. }
  354. /// <summary>
  355. /// Selects last shape containing x,y
  356. /// </summary>
  357. public void click(int x, int y, RichTextBox r)
  358. {
  359. sRec = null;
  360. selectedElement = null;
  361. foreach (var obj in List)
  362. {
  363. obj.IsSelected = false;
  364. obj.DeSelect();
  365. if (obj.Contains(x, y))
  366. selectedElement = obj; //salvo il riferimento dell'ogg trovato
  367. }
  368. if (selectedElement == null)
  369. return;
  370. selectedElement.IsSelected = true;
  371. selectedElement.Select();
  372. selectedElement.Select(r);
  373. sRec = selectedElement is PointSet
  374. ? (AbstractSel)new SelPoly(selectedElement)
  375. : new SelRect(selectedElement);
  376. //sRec.IsLine = selectedElement.IsLine;
  377. //sRec.showHandles(selectedElement.AmIaGroup());
  378. }
  379. public void mergePolygons()
  380. {
  381. bool first = true;
  382. int minX = 0;
  383. int minY = 0;
  384. var tmpPointList = new List<PointWr>();
  385. var tmpDelPolys = new List<Element>();
  386. PointSet tmpPS = null;
  387. foreach (var obj in List)
  388. {
  389. if (!(obj.IsSelected && obj is PointSet))
  390. continue;
  391. if (first)
  392. {
  393. first = false;
  394. minX = obj.getX();
  395. minY = obj.getY();
  396. tmpPS = (PointSet)obj;
  397. }
  398. else
  399. {
  400. if (minX > obj.getX())
  401. minX = obj.getX();
  402. if (minY > obj.getY())
  403. minY = obj.getY();
  404. }
  405. tmpDelPolys.Add(obj);
  406. tmpPointList.AddRange(((PointSet)obj).getRealPosPoints());
  407. }
  408. if (tmpDelPolys.Count <= 1)
  409. return;
  410. foreach (var obj in tmpDelPolys)
  411. List.Remove(obj);
  412. if (tmpPS != null)
  413. addPoly(0, 0, tmpPS.getX1(), tmpPS.getY1(), tmpPS.PenColor, tmpPS.FillColor, tmpPS.PenWidth,
  414. tmpPS.IsFilled, tmpPointList, false);
  415. }
  416. /// <summary>
  417. /// Sanitize a rectangle's corners to be normally ordered
  418. /// </summary>
  419. /// <param name="_startX"></param>
  420. /// <param name="_startY"></param>
  421. /// <param name="_endX"></param>
  422. /// <param name="_endY"></param>
  423. public static void SanitizeRect(ref int _startX, ref int _startY, ref int _endX, ref int _endY)
  424. {
  425. int startX = Math.Min(_startX, _endX);
  426. int startY = Math.Min(_startY, _endY);
  427. int endX = Math.Max(_startX, _endX);
  428. int endY = Math.Max(_startY, _endY);
  429. _startX = startX;
  430. _startY = startY;
  431. _endX = endX;
  432. _endY = endY;
  433. }
  434. /// <summary>
  435. /// Selects all shapes in imput rectangle
  436. /// </summary>
  437. public void multiSelect(int startX, int startY, int endX, int endY, RichTextBox r)
  438. {
  439. SanitizeRect(ref startX, ref startY, ref endX, ref endY);
  440. sRec = null;
  441. selectedElement = null;
  442. foreach (var obj in List)
  443. {
  444. obj.IsSelected = false;
  445. obj.DeSelect(); // to deselect points in polys
  446. int x = obj.getX();
  447. int x1 = obj.getX1();
  448. int y = obj.getY();
  449. int y1 = obj.getY1();
  450. int c;
  451. if (x > x1)
  452. {
  453. c = x;
  454. x = x1;
  455. x1 = c;
  456. }
  457. if (y > y1)
  458. {
  459. c = y;
  460. y = y1;
  461. y1 = c;
  462. }
  463. //if (obj.getX() <= endX && obj.getX1() >= Start.X && obj.getY() <= endY && obj.getY1() >= Start.Y)
  464. if (!(x <= endX && x1 >= startX && y <= endY && y1 >= startY))
  465. continue;
  466. selectedElement = obj; //salvo il riferimento dell'ogg trovato
  467. obj.IsSelected = true; //indico l'oggetto trovato come selezionato
  468. obj.Select();
  469. obj.Select(r);
  470. obj.Select(startX, startY, endX, endY);
  471. }
  472. if (selectedElement != null)
  473. {
  474. if (selectedElement is PointSet)
  475. sRec = new SelPoly(selectedElement); //create handling rect
  476. else
  477. sRec = new SelRect(selectedElement); //creo un gestore con maniglie
  478. //sRec.IsLine = selectedElement.IsLine;//indico se il gestore è per una linea
  479. //sRec.showHandles(selectedElement.AmIaGroup());
  480. }
  481. }
  482. #region DRAW
  483. /// <summary>
  484. /// Draw all shapes
  485. /// </summary>
  486. public void Draw(Graphics gfx, int dx, int dy, float zoom)
  487. {
  488. bool almostOneSelected = false;
  489. // note how we choose a for() loop here, not a foreach(), because it's about 40% faster (!)... the main shapes could be quite numerous, so they deserve the best speed.
  490. int len = List.Count;
  491. for (int t = 0; t < len; t++)
  492. {
  493. var obj = List[t];
  494. obj.Draw(gfx, dx, dy, zoom);
  495. if (obj.IsSelected)
  496. almostOneSelected = true;
  497. }
  498. if (almostOneSelected)
  499. if (sRec != null)
  500. sRec.Draw(gfx, dx, dy, zoom);
  501. }
  502. /// <summary>
  503. /// Draw all Unselected shapes
  504. /// </summary>
  505. public void DrawUnselected(Graphics gfx, int dx, int dy, float zoom)
  506. {
  507. gfx.PageScale = 10;
  508. // note how we choose a for() loop here, not a foreach(), because it's about 40% faster (!)... the main shapes could be quite numerous, so they deserve the best speed.
  509. int len = List.Count;
  510. for (int t = 0; t < len; t++)
  511. {
  512. var obj = List[t];
  513. if (!obj.IsSelected)
  514. obj.Draw(gfx, dx, dy, zoom);
  515. }
  516. }
  517. /// <summary>
  518. /// Draw all Unselected shapes
  519. /// </summary>
  520. public void DrawUnselected(Graphics gfx)
  521. {
  522. gfx.PageScale = 10;
  523. //bool almostOneSelected = false;
  524. // note how we choose a for() loop here, not a foreach(), because it's about 40% faster (!)... the main shapes could be quite numerous, so they deserve the best speed.
  525. int len = List.Count;
  526. for (int t = 0; t < len; t++)
  527. {
  528. var obj = List[t];
  529. if (!obj.IsSelected)
  530. obj.Draw(gfx, 0, 0, 1);
  531. }
  532. }
  533. /// <summary>
  534. /// Draw all IsSelected shapes
  535. /// </summary>
  536. public void DrawSelected(Graphics gfx, int dx, int dy, float zoom)
  537. {
  538. bool almostOneSelected = false;
  539. // note how we choose a for() loop here, not a foreach(), because it's about 40% faster (!)... the main shapes could be quite numerous, so they deserve the best speed.
  540. int len = List.Count;
  541. for (int t = 0; t < len; t++)
  542. {
  543. var obj = List[t];
  544. if (!obj.IsSelected)
  545. continue;
  546. obj.Draw(gfx, dx, dy, zoom);
  547. almostOneSelected = true;
  548. }
  549. if (almostOneSelected && sRec != null)
  550. sRec.Draw(gfx, dx, dy, zoom);
  551. }
  552. /// <summary>
  553. /// Draw all IsSelected shapes
  554. /// </summary>
  555. public void DrawSelected(Graphics gfx)
  556. {
  557. bool almostOneSelected = false;
  558. // note how we choose a for() loop here, not a foreach(), because it's about 40% faster (!)... the main shapes could be quite numerous, so they deserve the best speed.
  559. int len = List.Count;
  560. for (int t = 0; t < len; t++)
  561. {
  562. var obj = List[t];
  563. if (!obj.IsSelected)
  564. continue;
  565. obj.Draw(gfx, 0, 0, 1);
  566. almostOneSelected = true;
  567. }
  568. if (almostOneSelected && sRec != null)
  569. sRec.Draw(gfx, 0, 0, 1);
  570. }
  571. #endregion
  572. #region ADD ELEMENTS METHODS
  573. /// <summary>
  574. /// Adds Polygon
  575. /// </summary>
  576. public void addPoly(int x, int y, int x1, int y1, Color penC, Color fillC, float penW, bool filled,
  577. List<PointWr> aa,
  578. bool curv)
  579. {
  580. /*if (x1 - minDim <= x)
  581. x1 = x + minDim;
  582. if (y1 - minDim <= y)
  583. y1 = y + minDim;*/
  584. deSelect();
  585. var r = new PointSet(x, y, x1, y1, aa)
  586. {
  587. PenColor = penC,
  588. PenWidth = penW,
  589. FillColor = fillC,
  590. IsFilled = filled,
  591. Curved = curv
  592. };
  593. List.Add(r);
  594. // store the operation in undo/redo buffer
  595. storeDo("I", r);
  596. sRec = new SelPoly(r);
  597. selectedElement = r;
  598. selectedElement.Select();
  599. }
  600. /// <summary>
  601. /// Adds Polygon
  602. /// </summary>
  603. public void addColorPoinySet(int x, int y, int x1, int y1, Color penC, Color fillC, float penW, bool filled,
  604. List<PointWr> aa, bool curv)
  605. {
  606. deSelect();
  607. var r = new PointColorSet(x, y, x1, y1, aa)
  608. {
  609. PenColor = penC,
  610. PenWidth = penW,
  611. FillColor = fillC,
  612. IsFilled = filled,
  613. Curved = curv
  614. };
  615. List.Add(r);
  616. // store the operation in undo/redo buffer
  617. storeDo("I", r);
  618. sRec = new SelPoly(r);
  619. selectedElement = r;
  620. selectedElement.Select();
  621. }
  622. /// <summary>
  623. /// Adds Rect
  624. /// </summary>
  625. public void addRect(int x, int y, int x1, int y1, Color penC, Color fillC, float penW, bool filled)
  626. {
  627. if (x1 - minDim <= x)
  628. x1 = x + minDim;
  629. if (y1 - minDim <= y)
  630. y1 = y + minDim;
  631. deSelect();
  632. var r = new Rect(x, y, x1, y1) { PenColor = penC, PenWidth = penW, FillColor = fillC, IsFilled = filled };
  633. List.Add(r);
  634. // store the operation in undo/redo buffer
  635. storeDo("I", r);
  636. sRec = new SelRect(r);
  637. selectedElement = r;
  638. selectedElement.Select();
  639. }
  640. /// <summary>
  641. /// Adds Arc
  642. /// </summary>
  643. public void addArc(int x, int y, int x1, int y1, Color penC, Color fillC, float penW, bool filled)
  644. {
  645. if (x1 - minDim <= x)
  646. x1 = x + minDim;
  647. if (y1 - minDim <= y)
  648. y1 = y + minDim;
  649. deSelect();
  650. var r = new Arc(x, y, x1, y1) { PenColor = penC, PenWidth = penW, FillColor = fillC, IsFilled = filled };
  651. List.Add(r);
  652. // store the operation in undo/redo buffer
  653. storeDo("I", r);
  654. sRec = new SelRect(r);
  655. selectedElement = r;
  656. selectedElement.Select();
  657. }
  658. /// <summary>
  659. /// Adds Rect
  660. /// </summary>
  661. public void addLine(int x, int y, int x1, int y1, Color penC, float penW)
  662. {
  663. /*
  664. if ((x1 == x) && (y1 == y))
  665. {
  666. x1 = x + minDim;
  667. y1 = y + minDim;
  668. }
  669. */
  670. deSelect();
  671. var r = new Line(x, y, x1, y1) { PenColor = penC, PenWidth = penW };
  672. List.Add(r);
  673. // store the operation in undo/redo buffer
  674. storeDo("I", r);
  675. sRec = new SelRect(r);
  676. selectedElement = r;
  677. selectedElement.Select();
  678. }
  679. /// <summary>
  680. /// Adds TextBox
  681. /// </summary>
  682. public void addTextBox(int x, int y, int x1, int y1, RichTextBox t, Color penC, Color fillC, float penW,
  683. bool filled)
  684. {
  685. if (x1 - minDim <= x)
  686. x1 = x + minDim;
  687. if (y1 - minDim <= y)
  688. y1 = y + minDim;
  689. deSelect();
  690. var r = new BoxText(x, y, x1, y1)
  691. {
  692. PenColor = penC,
  693. PenWidth = penW,
  694. FillColor = fillC,
  695. IsFilled = filled,
  696. rtf = t.Rtf
  697. };
  698. //Stext r = new Stext(x, y, x1, y1);
  699. List.Add(r);
  700. // store the operation in undo/redo buffer
  701. storeDo("I", r);
  702. sRec = new SelRect(r);
  703. selectedElement = r;
  704. selectedElement.Select();
  705. }
  706. /// <summary>
  707. /// Adds SimpleTextBox
  708. /// </summary>
  709. public void addSimpleTextBox(int x, int y, int x1, int y1, RichTextBox t, Color penC, Color fillC, float penW,
  710. bool filled)
  711. {
  712. if (x1 - minDim <= x)
  713. x1 = x + minDim;
  714. if (y1 - minDim <= y)
  715. y1 = y + minDim;
  716. deSelect();
  717. var r = new SimpleText(x, y, x1, y1)
  718. {
  719. Text = t.Text,
  720. CharFont = t.SelectionFont,
  721. PenColor = penC,
  722. PenWidth = penW,
  723. FillColor = fillC,
  724. IsFilled = filled
  725. };
  726. //r.CharFont = (Font)t.Font.Clone();
  727. List.Add(r);
  728. // store the operation in undo/redo buffer
  729. storeDo("I", r);
  730. sRec = new SelRect(r);
  731. selectedElement = r;
  732. selectedElement.Select();
  733. }
  734. /// <summary>
  735. /// Adds RoundRect
  736. /// </summary>
  737. public void addRRect(int x, int y, int x1, int y1, Color penC, Color fillC, float penW, bool filled)
  738. {
  739. if (x1 - minDim <= x)
  740. x1 = x + minDim;
  741. if (y1 - minDim <= y)
  742. y1 = y + minDim;
  743. deSelect();
  744. var r = new RoundedRect(x, y, x1, y1) { PenColor = penC, PenWidth = penW, FillColor = fillC, IsFilled = filled };
  745. List.Add(r);
  746. // store the operation in undo/redo buffer
  747. storeDo("I", r);
  748. sRec = new SelRect(r);
  749. selectedElement = r;
  750. selectedElement.Select();
  751. }
  752. public void addImgBox(int x, int y, int x1, int y1, Bitmap bitmap, Color penC, float penW)
  753. {
  754. if (bitmap == null)
  755. return;
  756. if (x1 - minDim <= x)
  757. x1 = x + minDim;
  758. if (y1 - minDim <= y)
  759. y1 = y + minDim;
  760. deSelect();
  761. var r = new ImageBox(x, y, x1, y1) { PenColor = penC, PenWidth = penW };
  762. List.Add(r);
  763. // store the operation in undo/redo buffer
  764. storeDo("I", r);
  765. r.img = bitmap;
  766. sRec = new SelRect(r);
  767. selectedElement = r;
  768. selectedElement.Select();
  769. }
  770. /// <summary>
  771. /// Adds ImageBox
  772. /// </summary>
  773. public void addImgBox(int x, int y, int x1, int y1, string st, Color penC, float penW)
  774. {
  775. if (string.IsNullOrEmpty(st) || !File.Exists(st))
  776. return;
  777. var bmp = new Bitmap(st);
  778. addImgBox(x, y, x1, y1, bmp, penC, penW);
  779. }
  780. /// <summary>
  781. /// Adds Ellipse
  782. /// </summary>
  783. public void addEllipse(int x, int y, int x1, int y1, Color penC, Color fillC, float penW, bool filled)
  784. {
  785. if (x1 - minDim <= x)
  786. x1 = x + minDim;
  787. if (y1 - minDim <= y)
  788. y1 = y + minDim;
  789. deSelect();
  790. var r = new Ellipse(x, y, x1, y1) { PenColor = penC, PenWidth = penW, FillColor = fillC, IsFilled = filled };
  791. List.Add(r);
  792. // store the operation in undo/redo buffer
  793. storeDo("I", r);
  794. sRec = new SelRect(r);
  795. selectedElement = r;
  796. selectedElement.Select();
  797. }
  798. #endregion
  799. #region undo/redo
  800. public bool UndoEnabled()
  801. {
  802. return undoB.unDoable();
  803. }
  804. public bool RedoEnabled()
  805. {
  806. return undoB.unRedoable();
  807. }
  808. public void storeDo(string option, Element e)
  809. {
  810. Element olde = null;
  811. if (e.UndoElement != null)
  812. olde = e.UndoElement.Copy();
  813. Element newe = e.Copy();
  814. var buff = new BuffElement(e, newe, olde, option);
  815. undoB.Add(buff);
  816. e.UndoElement = e.Copy();
  817. }
  818. public void Undo()
  819. {
  820. var buff = (BuffElement)undoB.Undo();
  821. if (buff != null)
  822. {
  823. switch (buff.op)
  824. {
  825. case "U":
  826. buff.objRef.CopyFrom(buff.oldE);
  827. break;
  828. case "I":
  829. //buff.objRef.CopyFrom(buff.oldE);
  830. List.Remove(buff.objRef);
  831. break;
  832. case "D":
  833. //buff.objRef.CopyFrom(buff.oldE);
  834. List.Add(buff.objRef);
  835. break;
  836. default:
  837. break;
  838. }
  839. }
  840. }
  841. public void Redo()
  842. {
  843. var buff = (BuffElement)undoB.Redo();
  844. if (buff != null)
  845. {
  846. switch (buff.op)
  847. {
  848. case "U":
  849. buff.objRef.CopyFrom(buff.newE);
  850. break;
  851. case "I":
  852. //buff.objRef.CopyFrom(buff.oldE);
  853. List.Add(buff.objRef);
  854. break;
  855. case "D":
  856. //buff.objRef.CopyFrom(buff.oldE);
  857. List.Remove(buff.objRef);
  858. break;
  859. default:
  860. break;
  861. }
  862. }
  863. }
  864. #endregion
  865. }
  866. }