00001 #define COMPAT_REV1519
00002
00003 #region License
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #endregion
00029
00030 using System;
00031 using System.Collections.Generic;
00032 using System.Text;
00033 using System.Drawing;
00034 using System.ComponentModel;
00035
00036 namespace OpenTK.Input
00037 {
00041 public sealed class MouseDevice : IInputDevice
00042 {
00043 #region --- Fields ---
00044
00045 string description;
00046 IntPtr id;
00047 int numButtons, numWheels;
00048 readonly bool[] button_state = new bool[Enum.GetValues(typeof(MouseButton)).Length];
00049 float wheel, last_wheel;
00050 Point pos = new Point(), last_pos = new Point();
00051 MouseMoveEventArgs move_args = new MouseMoveEventArgs();
00052 MouseButtonEventArgs button_args = new MouseButtonEventArgs();
00053 MouseWheelEventArgs wheel_args = new MouseWheelEventArgs();
00054 #if COMPAT_REV1519
00055 int wheel_last_accessed = 0;
00056 Point pos_last_accessed = new Point();
00057 #endif
00058
00059 #endregion
00060
00061 #region --- IInputDevice Members ---
00062
00063 #region public string Description
00064
00068 public string Description
00069 {
00070 get { return description; }
00071 internal set { description = value; }
00072 }
00073
00074 #endregion
00075
00076 #region public InputDeviceType DeviceType
00077
00081 public InputDeviceType DeviceType
00082 {
00083 get { return InputDeviceType.Mouse; }
00084 }
00085
00086 #endregion
00087
00088 #endregion
00089
00090 #region --- Public Members ---
00091
00092 #region public int NumberOfButtons
00093
00097 public int NumberOfButtons
00098 {
00099 get { return numButtons; }
00100 internal set { numButtons = value; }
00101 }
00102
00103 #endregion
00104
00105 #region public int NumberOfWheels
00106
00110 public int NumberOfWheels
00111 {
00112 get { return numWheels; }
00113 internal set { numWheels = value; }
00114 }
00115
00116 #endregion
00117
00118 #region public IntPtr DeviceID
00119
00123 public IntPtr DeviceID
00124 {
00125 get { return id; }
00126 internal set { id = value; }
00127 }
00128
00129 #endregion
00130
00131 #region public int Wheel
00132
00137 public int Wheel
00138 {
00139 get { return (int)Math.Round(wheel, MidpointRounding.AwayFromZero); }
00140 internal set { WheelPrecise = value; }
00141 }
00142
00146 public float WheelPrecise
00147 {
00148 get { return wheel; }
00149 internal set
00150 {
00151 wheel = value;
00152
00153 wheel_args.X = pos.X;
00154 wheel_args.Y = pos.Y;
00155 wheel_args.ValuePrecise = wheel;
00156 wheel_args.DeltaPrecise = wheel - last_wheel;
00157
00158 WheelChanged(this, wheel_args);
00159
00160 last_wheel = wheel;
00161 }
00162 }
00163
00164 #endregion
00165
00166 #region public int X
00167
00171 public int X
00172 {
00173 get { return pos.X; }
00174 }
00175
00176 #endregion
00177
00178 #region public int Y
00179
00183 public int Y
00184 {
00185 get { return pos.Y; }
00186 }
00187
00188 #endregion
00189
00190 #region public bool this[MouseButton b]
00191
00197 public bool this[MouseButton button]
00198 {
00199 get
00200 {
00201 return button_state[(int)button];
00202 }
00203 internal set
00204 {
00205 bool previous_state = button_state[(int)button];
00206 button_state[(int)button] = value;
00207
00208 button_args.X = pos.X;
00209 button_args.Y = pos.Y;
00210 button_args.Button = button;
00211 button_args.IsPressed = value;
00212 if (value && !previous_state)
00213 ButtonDown(this, button_args);
00214 else if (!value && previous_state)
00215 ButtonUp(this, button_args);
00216 }
00217 }
00218
00219 #endregion
00220
00221 #endregion
00222
00223 #region --- Internal Members ---
00224
00225 #region internal Point Position
00226
00230 internal Point Position
00231 {
00232 set
00233 {
00234 pos = value;
00235 move_args.X = pos.X;
00236 move_args.Y = pos.Y;
00237 move_args.XDelta = pos.X - last_pos.X;
00238 move_args.YDelta = pos.Y - last_pos.Y;
00239 Move(this, move_args);
00240 last_pos = pos;
00241 }
00242 }
00243
00244 #endregion
00245
00246 #endregion
00247
00248 #region --- Events ---
00249
00253 public event EventHandler<MouseMoveEventArgs> Move = delegate { };
00254
00258 public event EventHandler<MouseButtonEventArgs> ButtonDown = delegate { };
00259
00263 public event EventHandler<MouseButtonEventArgs> ButtonUp = delegate { };
00264
00268 public event EventHandler<MouseWheelEventArgs> WheelChanged = delegate { };
00269
00270 #region --- Overrides ---
00271
00276 public override int GetHashCode()
00277 {
00278 return (int)(numButtons ^ numWheels ^ id.GetHashCode() ^ description.GetHashCode());
00279 }
00280
00285 public override string ToString()
00286 {
00287 return String.Format("ID: {0} ({1}). Buttons: {2}, Wheels: {3}",
00288 DeviceID, Description, NumberOfButtons, NumberOfWheels);
00289 }
00290
00291 #endregion
00292
00293 #endregion
00294
00295 #region COMPAT_REV1519
00296
00297 #if COMPAT_REV1519
00298
00299 #region public int WheelDelta
00300
00304 [Obsolete("WheelDelta is only defined for a single WheelChanged event. Use the OpenTK.Input.MouseWheelEventArgs::Delta property with the OpenTK.Input.MouseDevice::WheelChanged event.", false)]
00305 public int WheelDelta
00306 {
00307 get
00308 {
00309 int result = (int)Math.Round(wheel - wheel_last_accessed, MidpointRounding.AwayFromZero);
00310 wheel_last_accessed = (int)wheel;
00311 return result;
00312 }
00313 }
00314
00315 #endregion
00316
00317 #region public int XDelta
00318
00322 [Obsolete("XDelta is only defined for a single Move event. Use the OpenTK.Input.MouseMoveEventArgs::Delta property with the OpenTK.Input.MouseDevice::Move event.", false)]
00323 public int XDelta
00324 {
00325 get
00326 {
00327 int result = pos.X - pos_last_accessed.X;
00328 pos_last_accessed.X = pos.X;
00329 return result;
00330 }
00331 }
00332
00333 #endregion
00334
00335 #region public int YDelta
00336
00340 [Obsolete("YDelta is only defined for a single Move event. Use the OpenTK.Input.MouseMoveEventArgs::Delta property with the OpenTK.Input.MouseDevice::Move event.", false)]
00341 public int YDelta
00342 {
00343 get
00344 {
00345 int result = pos.Y - pos_last_accessed.Y;
00346 pos_last_accessed.Y = pos.Y;
00347 return result;
00348 }
00349 }
00350
00351 #endregion
00352
00353 #endif
00354
00355 #endregion
00356 }
00357
00358 #region Event Arguments
00359
00370 public class MouseEventArgs : EventArgs
00371 {
00372 #region Fields
00373
00374 int x, y;
00375
00376 #endregion
00377
00378 #region Constructors
00379
00383 public MouseEventArgs()
00384 {
00385 }
00386
00392 public MouseEventArgs(int x, int y)
00393 {
00394 this.x = x;
00395 this.y = y;
00396 }
00397
00402 public MouseEventArgs(MouseEventArgs args)
00403 : this(args.x, args.y)
00404 {
00405 }
00406
00407 #endregion
00408
00409 #region Public Members
00410
00414 public int X { get { return x; } internal set { x = value; } }
00415
00419 public int Y { get { return y; } internal set { y = value; } }
00420
00424 public Point Position { get { return new Point(x, y); } }
00425
00426 #endregion
00427 }
00428
00439 public class MouseMoveEventArgs : MouseEventArgs
00440 {
00441 #region Fields
00442
00443 int x_delta, y_delta;
00444
00445 #endregion
00446
00447 #region Constructors
00448
00452 public MouseMoveEventArgs() { }
00453
00461 public MouseMoveEventArgs(int x, int y, int xDelta, int yDelta)
00462 : base(x, y)
00463 {
00464 XDelta = xDelta;
00465 YDelta = yDelta;
00466 }
00467
00472 public MouseMoveEventArgs(MouseMoveEventArgs args)
00473 : this(args.X, args.Y, args.XDelta, args.YDelta)
00474 {
00475 }
00476
00477 #endregion
00478
00479 #region Public Members
00480
00484 public int XDelta { get { return x_delta; } internal set { x_delta = value; } }
00485
00489 public int YDelta { get { return y_delta; } internal set { y_delta = value; } }
00490
00491 #endregion
00492 }
00493
00504 public class MouseButtonEventArgs : MouseEventArgs
00505 {
00506 #region Fields
00507
00508 MouseButton button;
00509 bool pressed;
00510
00511 #endregion
00512
00513 #region Constructors
00514
00518 public MouseButtonEventArgs() { }
00519
00527 public MouseButtonEventArgs(int x, int y, MouseButton button, bool pressed)
00528 : base(x, y)
00529 {
00530 this.button = button;
00531 this.pressed = pressed;
00532 }
00533
00538 public MouseButtonEventArgs(MouseButtonEventArgs args)
00539 : this(args.X, args.Y, args.Button, args.IsPressed)
00540 {
00541 }
00542
00543 #endregion
00544
00545 #region Public Members
00546
00550 public MouseButton Button { get { return button; } internal set { button = value; } }
00551
00555 public bool IsPressed { get { return pressed; } internal set { pressed = value; } }
00556
00557 #endregion
00558 }
00559
00570 public class MouseWheelEventArgs : MouseEventArgs
00571 {
00572 #region Fields
00573
00574 float value;
00575 float delta;
00576
00577 #endregion
00578
00579 #region Constructors
00580
00584 public MouseWheelEventArgs() { }
00585
00593 public MouseWheelEventArgs(int x, int y, int value, int delta)
00594 : base(x, y)
00595 {
00596 this.value = value;
00597 this.delta = delta;
00598 }
00599
00604 public MouseWheelEventArgs(MouseWheelEventArgs args)
00605 : this(args.X, args.Y, args.Value, args.Delta)
00606 {
00607 }
00608
00609 #endregion
00610
00611 #region Public Members
00612
00617 public int Value { get { return (int)Math.Round(value, MidpointRounding.AwayFromZero); } }
00618
00623 public int Delta { get { return (int)Math.Round(delta, MidpointRounding.AwayFromZero); } }
00624
00628 public float ValuePrecise { get { return value; } internal set { this.value = value; } }
00629
00633 public float DeltaPrecise { get { return delta; } internal set { delta = value; } }
00634
00635 #endregion
00636 }
00637
00638 #endregion
00639 }