ProgressBar.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. // Permission is hereby granted, free of charge, to any person obtaining
  2. // a copy of this software and associated documentation files (the
  3. // "Software"), to deal in the Software without restriction, including
  4. // without limitation the rights to use, copy, modify, merge, publish,
  5. // distribute, sublicense, and/or sell copies of the Software, and to
  6. // permit persons to whom the Software is furnished to do so, subject to
  7. // the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be
  10. // included in all copies or substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  13. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  15. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  16. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  17. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  18. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  19. //
  20. // Copyright (C) 2004-2006 Novell, Inc.
  21. //
  22. // Authors:
  23. // Jordi Mas i Hernandez [email protected]
  24. // Peter Dennis Bartok [email protected]
  25. //
  26. //
  27. using System.Drawing;
  28. using System.ComponentModel;
  29. using System.Drawing.Imaging;
  30. using System.Drawing.Drawing2D;
  31. using System.Runtime.InteropServices;
  32. namespace System.Windows.Forms
  33. {
  34. [DefaultProperty ("Value")]
  35. #if NET_2_0
  36. [DefaultBindingProperty ("Value")]
  37. [ClassInterface (ClassInterfaceType.AutoDispatch)]
  38. [ComVisible (true)]
  39. #endif
  40. public
  41. #if !NET_2_0
  42. sealed
  43. #endif
  44. class ProgressBar : Control
  45. {
  46. #region Local Variables
  47. private int maximum;
  48. private int minimum;
  49. internal int step;
  50. internal int val;
  51. internal DateTime start = DateTime.Now;
  52. internal Rectangle client_area = new Rectangle ();
  53. #if NET_2_0
  54. internal ProgressBarStyle style;
  55. Timer marquee_timer;
  56. #endif
  57. #if NET_2_0
  58. private static readonly Color defaultForeColor = SystemColors.Highlight;
  59. #endif
  60. #endregion // Local Variables
  61. #region events
  62. #if ONLY_1_1
  63. [Browsable (false)]
  64. [EditorBrowsable (EditorBrowsableState.Never)]
  65. public new event EventHandler BackColorChanged {
  66. add { base.BackColorChanged += value; }
  67. remove { base.BackColorChanged -= value; }
  68. }
  69. #endif
  70. [Browsable (false)]
  71. [EditorBrowsable (EditorBrowsableState.Never)]
  72. public new event EventHandler BackgroundImageChanged {
  73. add { base.BackgroundImageChanged += value; }
  74. remove { base.BackgroundImageChanged -= value; }
  75. }
  76. [Browsable (false)]
  77. [EditorBrowsable (EditorBrowsableState.Never)]
  78. public new event EventHandler CausesValidationChanged {
  79. add { base.CausesValidationChanged += value; }
  80. remove { base.CausesValidationChanged -= value; }
  81. }
  82. [Browsable (false)]
  83. [EditorBrowsable (EditorBrowsableState.Never)]
  84. public new event EventHandler DoubleClick {
  85. add { base.DoubleClick += value; }
  86. remove { base.DoubleClick -= value; }
  87. }
  88. [Browsable (false)]
  89. [EditorBrowsable (EditorBrowsableState.Never)]
  90. public new event EventHandler Enter {
  91. add { base.Enter += value; }
  92. remove { base.Enter -= value; }
  93. }
  94. [Browsable (false)]
  95. [EditorBrowsable (EditorBrowsableState.Never)]
  96. public new event EventHandler FontChanged {
  97. add { base.FontChanged += value; }
  98. remove { base.FontChanged -= value; }
  99. }
  100. #if ONLY_1_1
  101. [Browsable (false)]
  102. [EditorBrowsable (EditorBrowsableState.Never)]
  103. public new event EventHandler ForeColorChanged {
  104. add { base.ForeColorChanged += value; }
  105. remove { base.ForeColorChanged -= value; }
  106. }
  107. #endif
  108. [Browsable (false)]
  109. [EditorBrowsable (EditorBrowsableState.Never)]
  110. public new event EventHandler ImeModeChanged {
  111. add { base.ImeModeChanged += value; }
  112. remove { base.ImeModeChanged -= value; }
  113. }
  114. [Browsable (false)]
  115. [EditorBrowsable (EditorBrowsableState.Never)]
  116. public new event KeyEventHandler KeyDown {
  117. add { base.KeyDown += value; }
  118. remove { base.KeyDown -= value; }
  119. }
  120. [Browsable (false)]
  121. [EditorBrowsable (EditorBrowsableState.Never)]
  122. public new event KeyPressEventHandler KeyPress {
  123. add { base.KeyPress += value; }
  124. remove { base.KeyPress -= value; }
  125. }
  126. [Browsable (false)]
  127. [EditorBrowsable (EditorBrowsableState.Never)]
  128. public new event KeyEventHandler KeyUp {
  129. add { base.KeyUp += value; }
  130. remove { base.KeyUp -= value; }
  131. }
  132. [Browsable (false)]
  133. [EditorBrowsable (EditorBrowsableState.Never)]
  134. public new event EventHandler Leave {
  135. add { base.Leave += value; }
  136. remove { base.Leave -= value; }
  137. }
  138. [Browsable (false)]
  139. [EditorBrowsable (EditorBrowsableState.Never)]
  140. public new event PaintEventHandler Paint {
  141. add { base.Paint += value; }
  142. remove { base.Paint -= value; }
  143. }
  144. #if ONLY_1_1
  145. [Browsable (false)]
  146. [EditorBrowsable (EditorBrowsableState.Never)]
  147. public new event EventHandler RightToLeftChanged {
  148. add { base.RightToLeftChanged += value; }
  149. remove { base.RightToLeftChanged -= value; }
  150. }
  151. #endif
  152. [Browsable (false)]
  153. [EditorBrowsable (EditorBrowsableState.Never)]
  154. public new event EventHandler TabStopChanged {
  155. add { base.TabStopChanged += value; }
  156. remove { base.TabStopChanged -= value; }
  157. }
  158. [Browsable (false)]
  159. [EditorBrowsable (EditorBrowsableState.Never)]
  160. public new event EventHandler TextChanged {
  161. add { base.TextChanged += value; }
  162. remove { base.TextChanged -= value; }
  163. }
  164. #endregion Events
  165. #region Public Constructors
  166. public ProgressBar()
  167. {
  168. maximum = 100;
  169. minimum = 0;
  170. step = 10;
  171. val = 0;
  172. base.Resize += new EventHandler (OnResizeTB);
  173. SetStyle (ControlStyles.UserPaint |
  174. ControlStyles.Selectable |
  175. ControlStyles.ResizeRedraw |
  176. ControlStyles.Opaque
  177. #if NET_2_0
  178. | ControlStyles.UseTextForAccessibility
  179. #endif
  180. , false);
  181. #if NET_2_0
  182. ForeColor = defaultForeColor;
  183. #endif
  184. }
  185. #endregion // Public Constructors
  186. #region Public Instance Properties
  187. [Browsable (false)]
  188. [EditorBrowsable (EditorBrowsableState.Never)]
  189. public override bool AllowDrop
  190. {
  191. get { return base.AllowDrop; }
  192. set {
  193. base.AllowDrop = value;
  194. }
  195. }
  196. // Setting this property in MS .Net 1.1 does not have any visual effect and it
  197. // does not fire a BackColorChanged event
  198. [Browsable (false)]
  199. [EditorBrowsable (EditorBrowsableState.Never)]
  200. public override Color BackColor
  201. {
  202. get { return base.BackColor; }
  203. set { base.BackColor = value; }
  204. }
  205. // Setting this property in MS .Net 1.1 does not have any visual effect and it
  206. // does not fire a BackgroundImageChanged event
  207. [Browsable (false)]
  208. [EditorBrowsable (EditorBrowsableState.Never)]
  209. public override Image BackgroundImage
  210. {
  211. get { return base.BackgroundImage; }
  212. set { base.BackgroundImage = value; }
  213. }
  214. [Browsable (false)]
  215. [EditorBrowsable (EditorBrowsableState.Never)]
  216. public new bool CausesValidation
  217. {
  218. get { return base.CausesValidation; }
  219. set { base.CausesValidation = value; }
  220. }
  221. protected override CreateParams CreateParams
  222. {
  223. get { return base.CreateParams; }
  224. }
  225. protected override ImeMode DefaultImeMode
  226. {
  227. get { return base.DefaultImeMode; }
  228. }
  229. protected override Size DefaultSize
  230. {
  231. get { return ThemeEngine.Current.ProgressBarDefaultSize; }
  232. }
  233. // Setting this property in MS .Net 1.1 does not have any visual effect and it
  234. // does not fire a FontChanged event
  235. [Browsable (false)]
  236. [EditorBrowsable (EditorBrowsableState.Never)]
  237. public override Font Font
  238. {
  239. get { return base.Font; }
  240. set { base.Font = value; }
  241. }
  242. #if ONLY_1_1
  243. // Setting this property in MS .Net 1.1 does not have any visual effect and it
  244. // does not fire a FontChanged event
  245. [Browsable (false)]
  246. [EditorBrowsable (EditorBrowsableState.Never)]
  247. public override Color ForeColor
  248. {
  249. get { return base.ForeColor; }
  250. set { base.ForeColor = value; }
  251. }
  252. #endif
  253. [Browsable (false)]
  254. [EditorBrowsable (EditorBrowsableState.Never)]
  255. public new ImeMode ImeMode
  256. {
  257. get { return base.ImeMode; }
  258. set { base.ImeMode = value; }
  259. }
  260. [RefreshProperties(RefreshProperties.Repaint)]
  261. [DefaultValue (100)]
  262. public int Maximum
  263. {
  264. get {
  265. return maximum;
  266. }
  267. set {
  268. if (value < 0)
  269. throw new ArgumentException(
  270. string.Format("Value '{0}' must be greater than or equal to 0.", value ));
  271. maximum = value;
  272. Refresh ();
  273. }
  274. }
  275. [RefreshProperties(RefreshProperties.Repaint)]
  276. [DefaultValue (0)]
  277. public int Minimum {
  278. get {
  279. return minimum;
  280. }
  281. set {
  282. if (value < 0)
  283. throw new ArgumentException(
  284. string.Format("Value '{0}' must be greater than or equal to 0.", value ));
  285. minimum = value;
  286. Refresh ();
  287. }
  288. }
  289. #if ONLY_1_1
  290. [Browsable (false)]
  291. [EditorBrowsable (EditorBrowsableState.Never)]
  292. public override RightToLeft RightToLeft
  293. {
  294. get { return base.RightToLeft; }
  295. set { base.RightToLeft = value; }
  296. }
  297. #endif
  298. [DefaultValue (10)]
  299. public int Step
  300. {
  301. get { return step; }
  302. set {
  303. step = value;
  304. Refresh ();
  305. }
  306. }
  307. #if NET_2_0
  308. [Browsable (true)]
  309. [DefaultValue (ProgressBarStyle.Blocks)]
  310. [EditorBrowsable (EditorBrowsableState.Always)]
  311. public ProgressBarStyle Style {
  312. get {
  313. return style;
  314. }
  315. set {
  316. style = value;
  317. if (style == ProgressBarStyle.Marquee) {
  318. if (marquee_timer == null) {
  319. marquee_timer = new Timer ();
  320. marquee_timer.Interval = 10;
  321. marquee_timer.Tick += new EventHandler (marquee_timer_Tick);
  322. }
  323. marquee_timer.Start ();
  324. } else {
  325. if (marquee_timer != null) {
  326. marquee_timer.Stop ();
  327. }
  328. }
  329. }
  330. }
  331. void marquee_timer_Tick (object sender, EventArgs e)
  332. {
  333. Invalidate ();
  334. }
  335. int marquee_animation_speed = 100;
  336. [DefaultValue (100)]
  337. public int MarqueeAnimationSpeed {
  338. get {
  339. return marquee_animation_speed;
  340. }
  341. set {
  342. marquee_animation_speed = value;
  343. }
  344. }
  345. #endif
  346. [Browsable (false)]
  347. [EditorBrowsable (EditorBrowsableState.Never)]
  348. public new bool TabStop
  349. {
  350. get { return base.TabStop; }
  351. set { base.TabStop = value; }
  352. }
  353. [Browsable (false)]
  354. [EditorBrowsable (EditorBrowsableState.Never)]
  355. [Bindable(false)]
  356. public override string Text
  357. {
  358. get { return base.Text; }
  359. set { base.Text = value; }
  360. }
  361. [Bindable(true)]
  362. [DefaultValue (0)]
  363. public int Value
  364. {
  365. get {
  366. return val;
  367. }
  368. set {
  369. if (value < Minimum || value > Maximum)
  370. #if NET_2_0
  371. throw new ArgumentOutOfRangeException ("Value", string.Format("'{0}' is not a valid value for 'Value'. 'Value' should be between 'Minimum' and 'Maximum'", value));
  372. #else
  373. throw new ArgumentException(string.Format("'{0}' is not a valid value for 'Value'. 'Value' should be between 'Minimum' and 'Maximum'", value));
  374. #endif
  375. val = value;
  376. Refresh ();
  377. }
  378. }
  379. #endregion // Protected Instance Properties
  380. #region Public Instance Methods
  381. protected override void CreateHandle ()
  382. {
  383. base.CreateHandle ();
  384. }
  385. public void Increment (int value)
  386. {
  387. int newValue = Value + value;
  388. if (newValue < Minimum)
  389. newValue = Minimum;
  390. if (newValue > Maximum)
  391. newValue = Maximum;
  392. Value = newValue;
  393. Refresh ();
  394. }
  395. protected override void OnHandleCreated (EventArgs e)
  396. {
  397. base.OnHandleCreated (e);
  398. UpdateAreas ();
  399. }
  400. public void PerformStep ()
  401. {
  402. if (Value >= Maximum)
  403. return;
  404. Value = Maximum < Value + Step ? Maximum : Value + Step;
  405. Refresh (); // FIXME - calculate delta and only expose that
  406. }
  407. #if NET_2_0
  408. public override void ResetForeColor ()
  409. {
  410. ForeColor = defaultForeColor;
  411. }
  412. #endif
  413. public override string ToString()
  414. {
  415. return string.Format ("{0}, Minimum: {1}, Maximum: {2}, Value: {3}",
  416. GetType().FullName.ToString (),
  417. Minimum.ToString (),
  418. Maximum.ToString (),
  419. Value.ToString () );
  420. }
  421. #endregion // Public Instance Methods
  422. #region Private Instance Methods
  423. private void UpdateAreas ()
  424. {
  425. client_area.X = client_area.Y = 2;
  426. client_area.Width = Width - 4;
  427. client_area.Height = Height - 4;
  428. }
  429. private void OnResizeTB (Object o, EventArgs e)
  430. {
  431. if (Width <= 0 || Height <= 0)
  432. return;
  433. UpdateAreas ();
  434. Invalidate(); // Invalidate the full surface, blocks will not match
  435. }
  436. internal override void OnPaintInternal (PaintEventArgs pevent)
  437. {
  438. ThemeEngine.Current.DrawProgressBar (pevent.Graphics, pevent.ClipRectangle, this);
  439. }
  440. #endregion
  441. }
  442. }