- Now Redraws on MouseUp for FlatStyle Flat and Popup
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / HandleData.cs
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 Novell, Inc.
21 //
22 // Authors:
23 //      Jackson Harper (jackson@ximian.com)
24 //
25 //
26
27
28 using System;
29 using System.Drawing;
30 using System.Collections;
31
32 namespace System.Windows.Forms {
33
34         internal class HandleData : IDisposable {
35
36                 private Queue message_queue;
37                 private Rectangle invalid = Rectangle.Empty;
38                 private Object dc;
39                 private bool has_expose;
40
41                 #region Constructors and destructors
42                 public HandleData ()
43                 {
44                 }
45
46                 public void Dispose () {
47                         DeviceContext = null;
48                 }
49                 #endregion
50
51                 #region Paint area handling
52                 public Object DeviceContext {
53                         get { return dc; }
54                         set {
55                                 if (value is Graphics) {
56                                         if (dc != null) {
57                                                 ((Graphics)dc).Dispose ();
58                                         }
59                                 }
60                                 dc = value;
61                         }
62                 }
63
64                 public bool HasExpose {
65                         get {
66                                 return has_expose;
67                         }
68                         set {
69                                 has_expose = value;
70                         }
71                 }
72
73                 public Rectangle InvalidArea {
74                         get {
75                                 return invalid;
76                         }
77                 }
78                 public void AddToInvalidArea (int x, int y, int width, int height)
79                 {
80                         if (invalid == Rectangle.Empty) {
81                                 invalid = new Rectangle (x, y, width, height);
82                                 return;
83                         }
84                         invalid = Rectangle.Union (invalid, new Rectangle (x, y, width, height));
85                 }
86
87                 public void AddToInvalidArea (Rectangle r)
88                 {
89                         if (invalid == Rectangle.Empty) {
90                                 invalid = r;
91                                 return;
92                         }
93                         invalid = Rectangle.Union (invalid, r);
94                 }
95
96                 public void ClearInvalidArea ()
97                 {
98                         invalid = Rectangle.Empty;
99                         has_expose = false;
100                 }
101                 #endregion      // Paint area methods
102
103                 #region Message storage and retrieval
104                 public bool MessageWaiting {
105                         get {
106                                 if ((message_queue == null) || (message_queue.Count == 0)) {
107                                         return false;
108                                 }
109                                 return true;
110                         }
111                 }
112
113                 public bool GetMessage(ref MSG msg) {
114                         MSG     message;
115
116                         if ((message_queue == null) || (message_queue.Count == 0)) {
117                                 return false;
118                         }
119
120                         message = (MSG)message_queue.Dequeue();
121                         msg = message;
122
123                         return true;
124                 }
125
126                 public bool StoreMessage(ref MSG msg) {
127                         MSG message = new MSG();
128
129                         if (message_queue == null) {
130                                 message_queue = new Queue();
131                         }
132
133                         message = msg;
134                         message_queue.Enqueue(message);
135
136                         return true;
137                 }
138                 #endregion      // Message storage and retrieval
139         }
140 }
141