namespace System.Windows.Forms {
[DefaultProperty("Text")]
+#if NET_2_0
+ [DefaultEvent("MouseDoubleClick")]
+#else
[DefaultEvent("MouseDown")]
+#endif
[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 {
+ public sealed class NotifyIcon : Component {
#region Local Variables
private ContextMenu context_menu;
private Icon icon;
is_visible = false;
rect = new Rectangle(0, 0, 1, 1);
- CreateControl();
+ FormBorderStyle = FormBorderStyle.None;
+
+ //CreateControl();
SizeChanged += new EventHandler(HandleSizeChanged);
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_USER: {
switch ((Msg)m.LParam.ToInt32()) {
case Msg.WM_LBUTTONDOWN: {
- HandleMouseDown(this, new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+ owner.OnMouseDown (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);
+ owner.OnMouseUp (new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+ owner.OnClick (EventArgs.Empty);
return;
}
case Msg.WM_LBUTTONDBLCLK: {
- HandleDoubleClick(this, EventArgs.Empty);
+ owner.OnDoubleClick (EventArgs.Empty);
return;
}
case Msg.WM_MOUSEMOVE: {
- HandleMouseMove(this, new MouseEventArgs(MouseButtons.None, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+ owner.OnMouseMove (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));
+ owner.OnMouseDown (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);
+ owner.OnMouseUp (new MouseEventArgs(MouseButtons.Right, 1, Control.MousePosition.X, Control.MousePosition.Y, 0));
+ owner.OnClick (EventArgs.Empty);
return;
}
case Msg.WM_RBUTTONDBLCLK: {
- HandleDoubleClick(this, EventArgs.Empty);
+ owner.OnDoubleClick (EventArgs.Empty);
return;
}
}
}
internal void CalculateIconRect() {
- if (owner != null && owner.icon != null) {
- int x;
- int y;
- 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;
- }
+ int x;
+ int y;
+ 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);
+
+ Bounds = new Rectangle (0, 0, size, 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);
+ e.Graphics.DrawImage(owner.icon_bitmap,
+ rect,
+ new Rectangle (0, 0, owner.icon_bitmap.Width, owner.icon_bitmap.Height),
+ GraphicsUnit.Pixel);
}
}
private void HandleSizeChanged(object sender, EventArgs e) {
- CalculateIconRect();
+ owner.Recalculate ();
}
- private void HandleClick(object sender, EventArgs e) {
- if (owner.Click != null) {
- owner.Click(owner, e);
- }
+ private void HandleClick (object sender, EventArgs e)
+ {
+ owner.OnClick (e);
}
- private void HandleDoubleClick(object sender, EventArgs e) {
- if (owner.DoubleClick != null) {
- owner.DoubleClick(owner, e);
- }
+ private void HandleDoubleClick (object sender, EventArgs e)
+ {
+ owner.OnDoubleClick (e);
}
- private void HandleMouseDown(object sender, MouseEventArgs e) {
- if (owner.MouseDown != null) {
- owner.MouseDown(owner, e);
- }
+ private void HandleMouseDown (object sender, MouseEventArgs e)
+ {
+ owner.OnMouseDown (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 HandleMouseUp (object sender, MouseEventArgs e)
+ {
+ owner.OnMouseUp (e);
}
- private void HandleMouseMove(object sender, MouseEventArgs e) {
- if (owner.MouseMove != null) {
- owner.MouseMove(owner, e);
- }
+ private void HandleMouseMove (object sender, MouseEventArgs e)
+ {
+ owner.OnMouseMove (e);
}
}
#endregion // NotifyIconWindow Class
#endregion // Public Constructors
#region Private Methods
- private void ShowSystray(bool property_changed) {
- if (property_changed) {
- window.CalculateIconRect();
- }
+ private void OnClick (EventArgs e)
+ {
+ EventHandler eh = (EventHandler)(Events [ClickEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
- if (systray_active) {
- if (property_changed) {
- UpdateSystray();
- }
- return;
- }
+ private void OnDoubleClick (EventArgs e)
+ {
+ EventHandler eh = (EventHandler)(Events [DoubleClickEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
+
+ private void OnMouseDown (MouseEventArgs e)
+ {
+ MouseEventHandler eh = (MouseEventHandler)(Events [MouseDownEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
+
+ private void OnMouseUp (MouseEventArgs e)
+ {
+ if ((e.Button & MouseButtons.Right) == MouseButtons.Right && context_menu != null)
+ context_menu.Show (window, new Point(e.X, e.Y));
+
+ MouseEventHandler eh = (MouseEventHandler)(Events [MouseUpEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
+
+ private void OnMouseMove (MouseEventArgs e)
+ {
+ MouseEventHandler eh = (MouseEventHandler)(Events [MouseMoveEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
+
+ private void Recalculate ()
+ {
+ window.CalculateIconRect ();
- if (icon == null) {
+ if (systray_active)
+ UpdateSystray ();
+ }
+
+ private void ShowSystray()
+ {
+ systray_active = true;
+
+ if (icon == null)
return;
- }
icon_bitmap = icon.ToBitmap();
- systray_active = true;
XplatUI.SystrayAdd(window.Handle, text, icon, out tooltip);
}
- private void HideSystray() {
+ private void HideSystray()
+ {
if (!systray_active) {
return;
}
XplatUI.SystrayRemove(window.Handle, ref tooltip);
}
- private void UpdateSystray() {
+ private void UpdateSystray()
+ {
if (icon_bitmap != null) {
icon_bitmap.Dispose();
}
#region Public Instance Properties
[DefaultValue(null)]
+#if NET_2_0
+ [Browsable (false)]
+#endif
public ContextMenu ContextMenu {
get {
return context_menu;
set {
if (icon != value) {
icon = value;
- ShowSystray(true);
+ if (text == string.Empty && icon == null) {
+ HideSystray ();
+ }
+ else {
+ Recalculate ();
+ }
}
}
}
- [Localizable(true)]
+#if NET_2_0
+ [DefaultValue ("")]
+ [Editor ("System.ComponentModel.Design.MultilineStringEditor, " + Consts.AssemblySystem_Design,
+ typeof (System.Drawing.Design.UITypeEditor))]
+#endif
+ [Localizable (true)]
public string Text {
get {
return text;
if (text == string.Empty && icon == null) {
HideSystray();
} else {
- ShowSystray(true);
+ Recalculate ();
}
}
}
window.is_visible = value;
if (visible) {
- ShowSystray(false);
+ ShowSystray ();
} else {
HideSystray();
}
#endregion // Protected Instance Methods
#region Events
+ static object ClickEvent = new object ();
+ static object DoubleClickEvent = new object ();
+ static object MouseDownEvent = new object ();
+ static object MouseMoveEvent = new object ();
+ static object MouseUpEvent = new object ();
+
+#if NET_2_0
+ [MWFCategory("Action")]
+#else
[Category("Action")]
- public event EventHandler Click;
+#endif
+ public event EventHandler Click {
+ add { Events.AddHandler (ClickEvent, value); }
+ remove { Events.RemoveHandler (ClickEvent, value); }
+ }
+#if NET_2_0
+ [MWFCategory("Action")]
+#else
[Category("Action")]
- public event EventHandler DoubleClick;
+#endif
+ public event EventHandler DoubleClick {
+ add { Events.AddHandler (DoubleClickEvent, value); }
+ remove { Events.RemoveHandler (DoubleClickEvent, value); }
+ }
+
+ public event MouseEventHandler MouseDown {
+ add { Events.AddHandler (MouseDownEvent, value); }
+ remove { Events.RemoveHandler (MouseDownEvent, value); }
+ }
+
+ public event MouseEventHandler MouseMove {
+ add { Events.AddHandler (MouseMoveEvent, value); }
+ remove { Events.RemoveHandler (MouseMoveEvent, value); }
+ }
+
+ public event MouseEventHandler MouseUp {
+ add { Events.AddHandler (MouseUpEvent, value); }
+ remove { Events.RemoveHandler (MouseUpEvent, value); }
+ }
- public event MouseEventHandler MouseDown;
- public event MouseEventHandler MouseMove;
- public event MouseEventHandler MouseUp;
#endregion // Events
}
}