DrawObject.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Drawing;
  4. using System.Diagnostics;
  5. using System.Globalization;
  6. using System.Runtime.Serialization;
  7. namespace DrawTools
  8. {
  9. /// <summary>
  10. /// Base class for all draw objects
  11. /// </summary>
  12. abstract class DrawObject
  13. {
  14. #region Members
  15. // Object properties
  16. private bool selected;
  17. private Color color;
  18. private int penWidth;
  19. // Allows to write Undo - Redo functions and don't care about
  20. // objects order in the list.
  21. int id;
  22. // Last used property values (may be kept in the Registry)
  23. private static Color lastUsedColor = Color.Black;
  24. private static int lastUsedPenWidth = 1;
  25. // Entry names for serialization
  26. private const string entryColor = "Color";
  27. private const string entryPenWidth = "PenWidth";
  28. #endregion
  29. public DrawObject()
  30. {
  31. id = this.GetHashCode();
  32. }
  33. #region Properties
  34. /// <summary>
  35. /// Selection flag
  36. /// </summary>
  37. public bool Selected
  38. {
  39. get
  40. {
  41. return selected;
  42. }
  43. set
  44. {
  45. selected = value;
  46. }
  47. }
  48. /// <summary>
  49. /// Color
  50. /// </summary>
  51. public Color Color
  52. {
  53. get
  54. {
  55. return color;
  56. }
  57. set
  58. {
  59. color = value;
  60. }
  61. }
  62. /// <summary>
  63. /// Pen width
  64. /// </summary>
  65. public int PenWidth
  66. {
  67. get
  68. {
  69. return penWidth;
  70. }
  71. set
  72. {
  73. penWidth = value;
  74. }
  75. }
  76. /// <summary>
  77. /// Number of handles
  78. /// </summary>
  79. public virtual int HandleCount
  80. {
  81. get
  82. {
  83. return 0;
  84. }
  85. }
  86. /// <summary>
  87. /// Object ID
  88. /// </summary>
  89. public int ID
  90. {
  91. get { return id; }
  92. set { id = value; }
  93. }
  94. /// <summary>
  95. /// Last used color
  96. /// </summary>
  97. public static Color LastUsedColor
  98. {
  99. get
  100. {
  101. return lastUsedColor;
  102. }
  103. set
  104. {
  105. lastUsedColor = value;
  106. }
  107. }
  108. /// <summary>
  109. /// Last used pen width
  110. /// </summary>
  111. public static int LastUsedPenWidth
  112. {
  113. get
  114. {
  115. return lastUsedPenWidth;
  116. }
  117. set
  118. {
  119. lastUsedPenWidth = value;
  120. }
  121. }
  122. #endregion
  123. #region Virtual Functions
  124. /// <summary>
  125. /// Clone this instance.
  126. /// </summary>
  127. public abstract DrawObject Clone();
  128. /// <summary>
  129. /// Draw object
  130. /// </summary>
  131. /// <param name="g"></param>
  132. public virtual void Draw(Graphics g)
  133. {
  134. }
  135. /// <summary>
  136. /// Get handle point by 1-based number
  137. /// </summary>
  138. /// <param name="handleNumber"></param>
  139. /// <returns></returns>
  140. public virtual Point GetHandle(int handleNumber)
  141. {
  142. return new Point(0, 0);
  143. }
  144. /// <summary>
  145. /// Get handle rectangle by 1-based number
  146. /// </summary>
  147. /// <param name="handleNumber"></param>
  148. /// <returns></returns>
  149. public virtual Rectangle GetHandleRectangle(int handleNumber)
  150. {
  151. Point point = GetHandle(handleNumber);
  152. return new Rectangle(point.X - 3, point.Y - 3, 7, 7);
  153. }
  154. /// <summary>
  155. /// Draw tracker for selected object
  156. /// </summary>
  157. /// <param name="g"></param>
  158. public virtual void DrawTracker(Graphics g)
  159. {
  160. if ( ! Selected )
  161. return;
  162. SolidBrush brush = new SolidBrush(Color.Black);
  163. for ( int i = 1; i <= HandleCount; i++ )
  164. {
  165. g.FillRectangle(brush, GetHandleRectangle(i));
  166. }
  167. brush.Dispose();
  168. }
  169. /// <summary>
  170. /// Hit test.
  171. /// Return value: -1 - no hit
  172. /// 0 - hit anywhere
  173. /// > 1 - handle number
  174. /// </summary>
  175. /// <param name="point"></param>
  176. /// <returns></returns>
  177. public virtual int HitTest(Point point)
  178. {
  179. return -1;
  180. }
  181. /// <summary>
  182. /// Test whether point is inside of the object
  183. /// </summary>
  184. /// <param name="point"></param>
  185. /// <returns></returns>
  186. protected virtual bool PointInObject(Point point)
  187. {
  188. return false;
  189. }
  190. /// <summary>
  191. /// Get cursor for the handle
  192. /// </summary>
  193. /// <param name="handleNumber"></param>
  194. /// <returns></returns>
  195. public virtual Cursor GetHandleCursor(int handleNumber)
  196. {
  197. return Cursors.Default;
  198. }
  199. /// <summary>
  200. /// Test whether object intersects with rectangle
  201. /// </summary>
  202. /// <param name="rectangle"></param>
  203. /// <returns></returns>
  204. public virtual bool IntersectsWith(Rectangle rectangle)
  205. {
  206. return false;
  207. }
  208. /// <summary>
  209. /// Move object
  210. /// </summary>
  211. /// <param name="deltaX"></param>
  212. /// <param name="deltaY"></param>
  213. public virtual void Move(int deltaX, int deltaY)
  214. {
  215. }
  216. /// <summary>
  217. /// Move handle to the point
  218. /// </summary>
  219. /// <param name="point"></param>
  220. /// <param name="handleNumber"></param>
  221. public virtual void MoveHandleTo(Point point, int handleNumber)
  222. {
  223. }
  224. /// <summary>
  225. /// Dump (for debugging)
  226. /// </summary>
  227. public virtual void Dump()
  228. {
  229. Trace.WriteLine(this.GetType().Name);
  230. Trace.WriteLine("Selected = " +
  231. selected.ToString(CultureInfo.InvariantCulture)
  232. + " ID = " + id.ToString(CultureInfo.InvariantCulture));
  233. }
  234. /// <summary>
  235. /// Normalize object.
  236. /// Call this function in the end of object resizing.
  237. /// </summary>
  238. public virtual void Normalize()
  239. {
  240. }
  241. /// <summary>
  242. /// Save object to serialization stream
  243. /// </summary>
  244. /// <param name="info"></param>
  245. /// <param name="orderNumber"></param>
  246. public virtual void SaveToStream(SerializationInfo info, int orderNumber)
  247. {
  248. info.AddValue(
  249. String.Format(CultureInfo.InvariantCulture,
  250. "{0}{1}",
  251. entryColor, orderNumber),
  252. Color.ToArgb());
  253. info.AddValue(
  254. String.Format(CultureInfo.InvariantCulture,
  255. "{0}{1}",
  256. entryPenWidth, orderNumber),
  257. PenWidth);
  258. }
  259. /// <summary>
  260. /// Load object from serialization stream
  261. /// </summary>
  262. /// <param name="info"></param>
  263. /// <param name="orderNumber"></param>
  264. public virtual void LoadFromStream(SerializationInfo info, int orderNumber)
  265. {
  266. int n = info.GetInt32(
  267. String.Format(CultureInfo.InvariantCulture,
  268. "{0}{1}",
  269. entryColor, orderNumber));
  270. Color = Color.FromArgb(n);
  271. PenWidth = info.GetInt32(
  272. String.Format(CultureInfo.InvariantCulture,
  273. "{0}{1}",
  274. entryPenWidth, orderNumber));
  275. id = this.GetHashCode();
  276. }
  277. #endregion
  278. #region Other functions
  279. /// <summary>
  280. /// Initialization
  281. /// </summary>
  282. protected void Initialize()
  283. {
  284. color = lastUsedColor;
  285. penWidth = LastUsedPenWidth;
  286. }
  287. /// <summary>
  288. /// Copy fields from this instance to cloned instance drawObject.
  289. /// Called from Clone functions of derived classes.
  290. /// </summary>
  291. protected void FillDrawObjectFields(DrawObject drawObject)
  292. {
  293. drawObject.selected = this.selected;
  294. drawObject.color = this.color;
  295. drawObject.penWidth = this.penWidth;
  296. drawObject.ID = this.ID;
  297. }
  298. #endregion
  299. }
  300. }