This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / System.Windows.Forms / System.Windows.Forms / ScrollBar.cs
1 //
2 // System.Windows.Forms.ScrollBar.cs
3 //
4 // Author:
5 //   stubbed out by Daniel Carrera (dcarrera@math.toronto.edu)
6 //   Dennis Hayes (dennish@raytek.com)
7 //   Aleksey Ryabchuk (ryabchuk@yahoo.com)
8 //
9 // (C) 2002 Ximian, Inc
10 //
11
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33 //public void add_Click(EventHandler value);
34 //public void add_MouseDown(MouseEventHandler value);
35 //public void add_MouseMove(MouseEventHandler value);
36 //public void add_MouseUp(MouseEventHandler value);
37 //public void add_Paint(PaintEventHandler value);
38 //
39 //public Font Font {get; set;}
40
41
42 using System.Drawing;
43 using System.ComponentModel;
44 using System.Runtime.InteropServices;
45
46 namespace System.Windows.Forms {
47
48         // <summary>
49         // Implements the basic functionality of a scroll bar control.
50         // </summary>
51
52         public class ScrollBar : Control {
53
54                 int value_;
55                 int minimum;
56                 int maximum;
57                 int largeChange;
58                 int smallChange;
59
60                 public ScrollBar() : base()
61                 {
62                         //spec says tabstop defaults to false.
63                         base.TabStop = false;
64                         value_ = 0;
65                         minimum = 0;
66                         maximum = 100;
67                         largeChange = 10;
68                         smallChange = 1;        
69                 }
70
71                 [EditorBrowsable (EditorBrowsableState.Never)]   
72                 public override Color BackColor {
73                         get { return base.BackColor; }
74                         set { base.BackColor = value;}
75                 }
76
77                 [EditorBrowsable (EditorBrowsableState.Never)]   
78                 public override Image BackgroundImage {
79                         get { return base.BackgroundImage;  }
80                         set { base.BackgroundImage = value; }
81                 }
82
83                 [EditorBrowsable (EditorBrowsableState.Never)]   
84                 public override Color ForeColor {
85                         get { return base.ForeColor;  }
86                         set { base.ForeColor = value; }
87                 }
88
89                 [EditorBrowsable (EditorBrowsableState.Never)]   
90                 public new ImeMode ImeMode {
91                         get { return base.ImeMode; }
92                         set { base.ImeMode = value; }
93                 }
94
95                 [MonoTODO]
96                 public int LargeChange {
97                         get { return largeChange; }
98                         set {
99                                 if ( value < 0 )
100                                         throw new Exception( string.Format("Value '{0}' must be greater than or equal to 0.", value));
101
102                                 largeChange = value;    
103                         }
104                 }
105
106                 [MonoTODO]
107                 public int Maximum {
108                         get { return maximum; }
109                         set {
110                                 maximum = value;
111
112                                 if ( maximum < minimum )
113                                         minimum = maximum;
114
115                                 if ( IsHandleCreated )
116                                         setScrollRange ( Minimum, maximum );
117                         }
118                 }
119
120                 [MonoTODO]
121                 public int Minimum {
122                         get { return minimum; }
123                         set {
124                                 minimum = value;
125
126                                 if ( minimum > maximum )
127                                         maximum = minimum;
128
129                                 if ( IsHandleCreated )
130                                         setScrollRange ( minimum, Maximum );
131                         }
132                 }
133
134                 [MonoTODO]
135                 public int SmallChange {
136                         get { return smallChange; }
137                         set {
138                                 if ( value < 0 )
139                                         throw new Exception( string.Format("Value '{0}' must be greater than or equal to 0.", value));
140
141                                 smallChange = value;
142                         }
143                 }
144
145                 [EditorBrowsable (EditorBrowsableState.Never)]   
146                 public override string Text {
147                          get { return base.Text;  }
148                          set { base.Text = value; }
149                  }
150
151                 [MonoTODO]
152                 public int Value {
153                         get { return value_; }
154                         set {
155                                 if ( value < Minimum || value > Maximum )
156                                         throw new ArgumentException(
157                                                 string.Format("'{0}' is not a valid value for 'Value'. 'Value' should be between 'Minimum' and 'Maximum'", value));
158
159                                 bool raiseEvent = ( value_ != value );
160
161                                 value_ = value;
162                                         
163                                 if ( IsHandleCreated )
164                                         setScrollPos ( value_ );
165
166                                 if ( raiseEvent )
167                                         OnValueChanged ( EventArgs.Empty );
168                         }
169                 }
170
171                 public override string ToString()
172                 {       
173                         return string.Format("{0}, Minimum: {1}, Maximum: {2}, Value: {3}",
174                                                 GetType( ).FullName.ToString( ), Minimum, Maximum, Value);
175                 }
176
177                 public event ScrollEventHandler Scroll;
178                 public event EventHandler ValueChanged;
179
180                 protected override CreateParams CreateParams {
181                         get {
182                                 CreateParams createParams = base.CreateParams;
183                                 createParams.ClassName = "SCROLLBAR";
184                                 createParams.Style |= (int) (WindowStyles.WS_CHILD);
185                                 return createParams;
186                         }
187                 }
188
189                 protected override ImeMode DefaultImeMode {
190                         get { return ImeMode.Disable; }
191                 }
192
193                 [MonoTODO]
194                 protected override void OnEnabledChanged(EventArgs e)
195                 {
196                         //FIXME:
197                         base.OnEnabledChanged(e);
198                 }
199
200                 protected virtual void OnValueChanged( EventArgs e )
201                 {
202                         if ( ValueChanged != null )
203                                 ValueChanged ( this, e );
204                 }
205
206                 protected virtual void OnScroll( ScrollEventArgs se ) 
207                 {
208                         Value = se.NewValue;
209                         if ( Scroll != null )
210                                 Scroll ( this, se );
211                 }
212
213                 [MonoTODO]
214                 protected override void OnHandleCreated(EventArgs e)
215                 {
216                         //FIXME:
217                         base.OnHandleCreated(e);
218                         setScrollRange ( Minimum, Maximum );
219                         setScrollPos ( Value );
220                 }
221
222                 [MonoTODO]
223                 protected void UpdateScrollInfo()
224                 {
225                 }
226                 [MonoTODO]
227                 protected override void WndProc(ref Message m) {
228                         switch ((Msg) m.Msg ) {
229                                 case Msg.WM_HSCROLL:
230                                 case Msg.WM_VSCROLL:
231                                         switch ( (ScrollBarRequests) Win32.LOW_ORDER ( m.WParam.ToInt32 ( ) ) ) {
232                                         case ScrollBarRequests.SB_LEFT /*SB_TOP*/:
233                                                 fireScroll ( ScrollEventType.First, Minimum );
234                                         break;
235                                         case ScrollBarRequests.SB_RIGHT /*SB_BOTTOM*/:
236                                                 fireScroll ( ScrollEventType.Last, Minimum  );
237                                         break;
238                                         case ScrollBarRequests.SB_LINELEFT /*SB_LINEUP*/:
239                                                 fireScroll ( ScrollEventType.SmallDecrement, Value - SmallChange );
240                                         break;
241                                         case ScrollBarRequests.SB_LINERIGHT /*SB_LINEDOWN*/:
242                                                 fireScroll ( ScrollEventType.SmallIncrement, Value + SmallChange );
243                                         break;
244                                         case ScrollBarRequests.SB_PAGELEFT /*SB_PAGEUP*/:
245                                                 fireScroll ( ScrollEventType.LargeDecrement, Value - LargeChange );
246                                         break;
247                                         case ScrollBarRequests.SB_PAGERIGHT /*SB_PAGEDOWN*/:
248                                                 fireScroll ( ScrollEventType.LargeIncrement, Value + LargeChange );
249                                         break;
250                                         case ScrollBarRequests.SB_THUMBTRACK:
251                                                 fireScroll ( ScrollEventType.ThumbTrack, getTrackPos ( ) );
252                                         break;
253                                         case ScrollBarRequests.SB_THUMBPOSITION:
254                                                 fireScroll ( ScrollEventType.ThumbPosition, getScrollPos ( ) );
255                                         break;
256                                         case ScrollBarRequests.SB_ENDSCROLL:
257                                                 fireScroll ( ScrollEventType.EndScroll, getScrollPos ( ) );
258                                         break;
259                                         }
260                                 break;
261                                 default:
262                                         CallControlWndProc( ref m );
263                                 break;
264                         }
265                 }
266
267                 private void setScrollRange ( int minimum, int maximum )
268                 {
269                         SCROLLINFO scrinfo = new SCROLLINFO ( );
270                         scrinfo.cbSize = Marshal.SizeOf ( scrinfo );
271                         scrinfo.fMask = (int) ScrollBarInfoFlags.SIF_RANGE;
272                         scrinfo.nMin = minimum;
273                         scrinfo.nMax = maximum;
274                         Win32.SetScrollInfo ( Handle, (int) ScrollBarTypes.SB_CTL, ref scrinfo, 1 );
275                 }
276
277                 private void setScrollPos ( int val )
278                 {
279                         SCROLLINFO scrinfo = new SCROLLINFO ( );
280                         scrinfo.cbSize = Marshal.SizeOf ( scrinfo );
281                         scrinfo.fMask = (int) ScrollBarInfoFlags.SIF_POS;
282                         scrinfo.nPos = val;
283                         Win32.SetScrollInfo ( Handle, (int) ScrollBarTypes.SB_CTL, ref scrinfo, 1 );
284                 }
285
286                 private int getScrollPos ( )
287                 {
288                         SCROLLINFO scrinfo = new SCROLLINFO ( );
289                         scrinfo.cbSize = Marshal.SizeOf ( scrinfo );
290                         scrinfo.fMask = (int) ScrollBarInfoFlags.SIF_POS;
291                         Win32.GetScrollInfo ( Handle, (int) ScrollBarTypes.SB_CTL, ref scrinfo);
292                         return scrinfo.nPos;
293                 }
294
295                 private int getTrackPos (  )
296                 {
297                         SCROLLINFO scrinfo = new SCROLLINFO ( );
298                         scrinfo.cbSize = Marshal.SizeOf ( scrinfo );
299                         scrinfo.fMask = (int) ScrollBarInfoFlags.SIF_TRACKPOS;
300                         Win32.GetScrollInfo ( Handle, (int) ScrollBarTypes.SB_CTL, ref scrinfo);
301                         return scrinfo.nTrackPos;
302                 }
303
304                 private void fireScroll ( ScrollEventType type, int Val )
305                 {
306                         OnScroll ( new ScrollEventArgs ( type, clip ( Val ) ) );
307                 }
308
309                 private int clip ( int val )
310                 {
311                         if ( val < Minimum )
312                                 return Minimum;
313                         if ( val > Maximum )
314                                 return Maximum;
315                         return val;
316                 }
317          }
318 }