New test.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / NotifyIcon.cs
index a8e675f47e49fa1a9b6bce66dd6946fc9b948bb0..ceac86723eddd41bc80921dd26e1e1de2730a050 100644 (file)
 // NOT COMPLETE
 
 using System;
+using System.ComponentModel;
+using System.ComponentModel.Design;
 using System.Drawing;
 
 namespace System.Windows.Forms {
+       [DefaultProperty("Text")]
+       [DefaultEvent("MouseDown")]
+       [Designer ("System.Windows.Forms.Design.NotifyIconDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
+       [ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Allow)]
        public sealed class NotifyIcon : System.ComponentModel.Component {
                #region Local Variables
                private ContextMenu             context_menu;
@@ -43,7 +49,7 @@ namespace System.Windows.Forms {
                #endregion      // Local Variables
 
                #region NotifyIconWindow Class
-               internal class NotifyIconWindow : Control {
+               internal class NotifyIconWindow : Form {
                        NotifyIcon      owner;
                        Rectangle       rect;
 
@@ -54,7 +60,6 @@ namespace System.Windows.Forms {
 
                                CreateControl();
 
-                               Paint += new PaintEventHandler(HandlePaint);
                                SizeChanged += new EventHandler(HandleSizeChanged);
 
                                // Events that need to be sent to our parent
@@ -64,142 +69,164 @@ namespace System.Windows.Forms {
                                MouseUp +=new MouseEventHandler(HandleMouseUp);
                                MouseMove +=new MouseEventHandler(HandleMouseMove);
                                ContextMenu = owner.context_menu;
-                       }\r
-\r
-                       protected override CreateParams CreateParams {\r
-                               get {\r
-                                       CreateParams cp;\r
-\r
-                                       cp = base.CreateParams;\r
-\r
-                                       cp.Parent = IntPtr.Zero;\r
-                                       cp.Style = (int)WindowStyles.WS_POPUP;\r
-                                       cp.Style |= (int)WindowStyles.WS_CLIPSIBLINGS;\r
-\r
-                                       cp.ExStyle = (int)(WindowStyles.WS_EX_TOOLWINDOW);
-\r
-                                       return cp;\r
-                               }\r
-                       }\r
-\r
-                       protected override void WndProc(ref Message m) {\r
-                               switch((Msg)m.Msg) {\r
-                                       case Msg.WM_USER: {\r
-                                               switch ((Msg)m.LParam.ToInt32()) {\r
-                                                       case Msg.WM_LBUTTONDOWN: {\r
-                                                               HandleMouseDown(this, new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));\r
-                                                               return;\r
-                                                       }\r
-\r
-                                                       case Msg.WM_LBUTTONUP: {\r
-                                                               HandleMouseUp(this, new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));\r
-                                                               HandleClick(this, EventArgs.Empty);\r
-                                                               return;\r
-                                                       }\r
-\r
-                                                       case Msg.WM_LBUTTONDBLCLK: {\r
-                                                               HandleDoubleClick(this, EventArgs.Empty);\r
-                                                               return;\r
-                                                       }\r
-\r
-                                                       case Msg.WM_MOUSEMOVE: {\r
-                                                               HandleMouseMove(this, new MouseEventArgs(MouseButtons.None, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));\r
-                                                               return;\r
-                                                       }\r
-\r
-                                                       case Msg.WM_RBUTTONDOWN: {\r
-                                                               HandleMouseDown(this, new MouseEventArgs(MouseButtons.Right, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));\r
-                                                               return;\r
-                                                       }\r
-\r
-                                                       case Msg.WM_RBUTTONUP: {\r
-                                                               HandleMouseUp(this, new MouseEventArgs(MouseButtons.Right, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));\r
-                                                               HandleClick(this, EventArgs.Empty);\r
-                                                               return;\r
-                                                       }\r
-\r
-                                                       case Msg.WM_RBUTTONDBLCLK: {\r
-                                                               HandleDoubleClick(this, EventArgs.Empty);\r
-                                                               return;\r
-                                                       }\r
-                                               }\r
-                                               return;\r
-                                       }\r
-                               }\r
-                               base.WndProc (ref m);\r
-                       }\r
-\r
-                       internal void CalculateIconRect() {\r
-                               if (owner != null && owner.icon != null) {\r
+                       }
+
+                       protected override CreateParams CreateParams {
+                               get {
+                                       CreateParams cp;
+
+                                       cp = base.CreateParams;
+
+                                       cp.Parent = IntPtr.Zero;
+                                       cp.Style = (int)WindowStyles.WS_POPUP;
+                                       cp.Style |= (int)WindowStyles.WS_CLIPSIBLINGS;
+
+                                       cp.ExStyle = (int)(WindowExStyles.WS_EX_TOOLWINDOW);
+
+                                       return cp;
+                               }
+                       }
+
+                       protected override void WndProc(ref Message m) {
+                               switch((Msg)m.Msg) {
+                                       case Msg.WM_NCPAINT: {
+                                               PaintEventArgs  paint_event;
+
+                                               paint_event = XplatUI.PaintEventStart(Handle, false);
+                                               OnPaintInternal (paint_event);
+                                               XplatUI.PaintEventEnd(Handle, false);
+                                               break;
+                                       }
+
+                                               //
+                                               //  NotifyIcon does CONTEXTMENU on mouse up, not down
+                                               //  so we swallow the message here, and handle it on our own
+                                               // 
+                                       case Msg.WM_CONTEXTMENU:
+                                               return;
+
+                                       case Msg.WM_USER: {
+                                               switch ((Msg)m.LParam.ToInt32()) {
+                                                       case Msg.WM_LBUTTONDOWN: {
+                                                               HandleMouseDown(this, new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+                                                               return;
+                                                       }
+
+                                                       case Msg.WM_LBUTTONUP: {
+                                                               HandleMouseUp(this, new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+                                                               HandleClick(this, EventArgs.Empty);
+                                                               return;
+                                                       }
+
+                                                       case Msg.WM_LBUTTONDBLCLK: {
+                                                               HandleDoubleClick(this, EventArgs.Empty);
+                                                               return;
+                                                       }
+
+                                                       case Msg.WM_MOUSEMOVE: {
+                                                               HandleMouseMove(this, new MouseEventArgs(MouseButtons.None, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+                                                               return;
+                                                       }
+
+                                                       case Msg.WM_RBUTTONDOWN: {
+                                                               HandleMouseDown(this, new MouseEventArgs(MouseButtons.Right, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+                                                               return;
+                                                       }
+
+                                                       case Msg.WM_RBUTTONUP: {
+                                                               HandleMouseUp(this, new MouseEventArgs(MouseButtons.Right, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+                                                               HandleClick(this, EventArgs.Empty);
+                                                               return;
+                                                       }
+
+                                                       case Msg.WM_RBUTTONDBLCLK: {
+                                                               HandleDoubleClick(this, EventArgs.Empty);
+                                                               return;
+                                                       }
+                                               }
+                                               return;
+                                       }
+                               }
+                               base.WndProc (ref m);
+                       }
+
+                       internal void CalculateIconRect() {
+                               if (owner != null && owner.icon != null) {
                                        int             x;
                                        int             y;
-                                       int             size;\r
-\r
-                                       // Icons are always square. Try to center them in the window\r
-                                       if (ClientRectangle.Width < ClientRectangle.Height) {\r
-                                               size = ClientRectangle.Width;\r
-                                       } else {\r
-                                               size = ClientRectangle.Height;\r
-                                       }\r
-                                       x = this.ClientRectangle.Width / 2 - size / 2;\r
-                                       y = this.ClientRectangle.Height / 2 - size / 2;\r
-                                       rect = new Rectangle(x, y, size, size);\r
-\r
-                                       // Force our window to be square\r
-                                       if (Width != size) {\r
-                                               this.Width = size;\r
-                                       }\r
-\r
-                                       if (Height != size) {\r
-                                               this.Height = size;\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       private void HandlePaint(object sender, PaintEventArgs e) {\r
-                               if (owner.icon != null) {\r
-                                       e.Graphics.DrawImage(owner.icon_bitmap, rect);\r
-\r
-                               }\r
-                       }\r
-\r
-                       private void HandleSizeChanged(object sender, EventArgs e) {\r
-                               CalculateIconRect();\r
-                       }\r
-\r
-                       private void HandleClick(object sender, EventArgs e) {\r
-                               if (owner.Click != null) {\r
-                                       owner.Click(owner, e);\r
-                               }\r
-                       }\r
-\r
-                       private void HandleDoubleClick(object sender, EventArgs e) {\r
-                               if (owner.DoubleClick != null) {\r
-                                       owner.DoubleClick(owner, e);\r
-                               }\r
-                       }\r
-\r
-                       private void HandleMouseDown(object sender, MouseEventArgs e) {\r
-                               if (owner.MouseDown != null) {\r
-                                       owner.MouseDown(owner, e);\r
-                               }\r
-                       }\r
-
-                       private void HandleMouseUp(object sender, MouseEventArgs e) {\r
-                               if (owner.context_menu != null) {\r
-                                       owner.context_menu.Show(this, new Point(e.X, e.Y));\r
-                               }\r
-\r
-                               if (owner.MouseUp != null) {\r
-                                       owner.MouseUp(owner, e);\r
-                               }\r
-                       }\r
-\r
-                       private void HandleMouseMove(object sender, MouseEventArgs e) {\r
-                               if (owner.MouseMove != null) {\r
-                                       owner.MouseMove(owner, e);\r
-                               }\r
-                       }\r
+                                       int             size;
+
+                                       // Icons are always square. Try to center them in the window
+                                       if (ClientRectangle.Width < ClientRectangle.Height) {
+                                               size = ClientRectangle.Width;
+                                       } else {
+                                               size = ClientRectangle.Height;
+                                       }
+                                       x = this.ClientRectangle.Width / 2 - size / 2;
+                                       y = this.ClientRectangle.Height / 2 - size / 2;
+                                       rect = new Rectangle(x, y, size, size);
+
+                                       // Force our window to be square
+                                       if (Width != size) {
+                                               this.Width = size;
+                                       }
+
+                                       if (Height != size) {
+                                               this.Height = size;
+                                       }
+                               }
+                       }
+
+                       internal override void OnPaintInternal (PaintEventArgs e) {
+                               if (owner.icon != null) {
+                                       e.Graphics.FillRectangle(ThemeEngine.Current.ResPool.GetSolidBrush(SystemColors.Window), rect);
+                                       e.Graphics.DrawImage(owner.icon_bitmap, rect);
+
+                               }
+                       }
+
+                       internal void InternalRecreateHandle () {
+                               base.RecreateHandle ();
+                       }
+
+
+                       private void HandleSizeChanged(object sender, EventArgs e) {
+                               CalculateIconRect();
+                       }
+
+                       private void HandleClick(object sender, EventArgs e) {
+                               if (owner.Click != null) {
+                                       owner.Click(owner, e);
+                               }
+                       }
+
+                       private void HandleDoubleClick(object sender, EventArgs e) {
+                               if (owner.DoubleClick != null) {
+                                       owner.DoubleClick(owner, e);
+                               }
+                       }
+
+                       private void HandleMouseDown(object sender, MouseEventArgs e) {
+                               if (owner.MouseDown != null) {
+                                       owner.MouseDown(owner, e);
+                               }
+                       }
+
+                       private void HandleMouseUp(object sender, MouseEventArgs e) {
+                               if (owner.context_menu != null) {
+                                       owner.context_menu.Show(this, new Point(e.X, e.Y));
+                               }
+
+                               if (owner.MouseUp != null) {
+                                       owner.MouseUp(owner, e);
+                               }
+                       }
+
+                       private void HandleMouseMove(object sender, MouseEventArgs e) {
+                               if (owner.MouseMove != null) {
+                                       owner.MouseMove(owner, e);
+                               }
+                       }
                }
                #endregion      // NotifyIconWindow Class
 
@@ -226,10 +253,12 @@ namespace System.Windows.Forms {
                                return;
                        }
 
-                       if (icon != null) {
-                               icon_bitmap = icon.ToBitmap();
+                       if (icon == null) {
+                               return;
                        }
 
+                       icon_bitmap = icon.ToBitmap();
+
                        systray_active = true;
                        XplatUI.SystrayAdd(window.Handle, text, icon, out tooltip);
                }
@@ -258,6 +287,7 @@ namespace System.Windows.Forms {
                #endregion      // Private Methods
 
                #region Public Instance Properties
+               [DefaultValue(null)]
                public ContextMenu ContextMenu {
                        get {
                                return context_menu;
@@ -271,6 +301,8 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Localizable(true)]
+               [DefaultValue(null)]
                public Icon Icon {
                        get {
                                return icon;
@@ -278,15 +310,13 @@ namespace System.Windows.Forms {
 
                        set {
                                if (icon != value) {
-                                       if (icon != null) {
-                                               icon.Dispose();
-                                       }
                                        icon = value;
                                        ShowSystray(true);
                                }
                        }
                }
 
+               [Localizable(true)]
                public string Text {
                        get {
                                return text;
@@ -307,6 +337,8 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Localizable(true)]
+               [DefaultValue(false)]
                public bool Visible {
                        get {
                                return visible;
@@ -330,22 +362,26 @@ namespace System.Windows.Forms {
                #endregion      // Public Instance Properties
 
                #region Protected Instance Methods
-               protected override void Dispose(bool disposing) {\r
-                       if (icon != null) {\r
-                               icon.Dispose();\r
-                       }\r
-\r
-                       if (icon_bitmap != null) {\r
-                               icon_bitmap.Dispose();\r
-                       }\r
-                       base.Dispose (disposing);\r
-               }\r
+               protected override void Dispose(bool disposing) {
+                       if (icon_bitmap != null) {
+                               icon_bitmap.Dispose();
+                       }
+
+                       if (disposing)
+                               icon = null;
+
+                       base.Dispose (disposing);
+               }
 
                #endregion      // Protected Instance Methods
 
                #region Events
+               [Category("Action")]
                public event EventHandler       Click;
+
+               [Category("Action")]
                public event EventHandler       DoubleClick;
+
                public event MouseEventHandler  MouseDown;
                public event MouseEventHandler  MouseMove;
                public event MouseEventHandler  MouseUp;