// 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;
#endregion // Local Variables
#region NotifyIconWindow Class
- internal class NotifyIconWindow : Control {
+ internal class NotifyIconWindow : Form {
NotifyIcon owner;
Rectangle rect;
CreateControl();
- Paint += new PaintEventHandler(HandlePaint);
SizeChanged += new EventHandler(HandleSizeChanged);
// Events that need to be sent to our parent
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
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);
}
#endregion // Private Methods
#region Public Instance Properties
+ [DefaultValue(null)]
public ContextMenu ContextMenu {
get {
return context_menu;
}
}
+ [Localizable(true)]
+ [DefaultValue(null)]
public Icon Icon {
get {
return icon;
set {
if (icon != value) {
- if (icon != null) {
- icon.Dispose();
- }
icon = value;
ShowSystray(true);
}
}
}
+ [Localizable(true)]
public string Text {
get {
return text;
}
}
+ [Localizable(true)]
+ [DefaultValue(false)]
public bool Visible {
get {
return visible;
#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;