Properly update the combo box selected text when the current item is changed, and...
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / InternalWindowManager.cs
index 70ab1ec7ab65734264bb91b6da69360dee584ff1..ea58417925e84ceedb6e206a1c7e674b14f49e53 100644 (file)
@@ -259,7 +259,7 @@ namespace System.Windows.Forms {
 
                                form.ActiveMenu.Draw (pe, new Rectangle (pnt.X, pnt.Y, form.ClientSize.Width, 0));
                        }
-                       if (HasBorders || IsMinimized) {
+                       if (HasBorders || IsMinimized && !(Form.IsMdiChild && IsMaximized)) {
                                // clip region is not correct on win32.
                                // use the entire form's area.
                                clip = new Rectangle (0, 0, form.Width, form.Height);
@@ -422,13 +422,31 @@ namespace System.Windows.Forms {
 
                public bool IconRectangleContains (int x, int y)
                {
+                       if (!ShowIcon)
+                               return false;
+
                        Rectangle icon = ThemeEngine.Current.ManagedWindowGetTitleBarIconArea (this);
                        return icon.Contains (x, y);
                }
 
+               public bool ShowIcon {
+                       get {
+                               if (!Form.ShowIcon)
+                                       return false;
+                               if (!HasBorders)
+                                       return false;
+                               if (IsMinimized)
+                                       return true;
+                               if (IsToolWindow || Form.FormBorderStyle == FormBorderStyle.FixedDialog)
+                                       return false;
+                               return true;
+                       }
+               }
+
                protected virtual void Activate ()
                {
-                       form.Refresh ();
+                       form.Invalidate (true);
+                       form.Update ();
                }
 
                public virtual bool IsActive {
@@ -565,16 +583,8 @@ namespace System.Windows.Forms {
                
                protected virtual void HandleTitleBarMouseMove (int x, int y)
                {
-                       bool any_change = false;
-                       
-                       any_change = title_buttons.MouseMove (x, y);
-                       
-                       if (any_change) {
-                               if (IsMaximized && form.IsMdiChild)
-                                       XplatUI.InvalidateNC (form.MdiParent.Handle);
-                               else
-                                       XplatUI.InvalidateNC (form.Handle);
-                       }
+                       if (title_buttons.MouseMove (x, y))
+                               XplatUI.InvalidateNC (form.Handle);
                }
                
                protected virtual void HandleTitleBarUp (int x, int y)
@@ -622,7 +632,7 @@ namespace System.Windows.Forms {
        
                protected virtual void HandleWindowMove (Message m)
                {
-                       Point move = MouseMove (m);
+                       Point move = MouseMove (Cursor.Position);
 
                        UpdateVP (virtual_position.X + move.X, virtual_position.Y + move.Y,
                                        virtual_position.Width, virtual_position.Height);
@@ -631,9 +641,17 @@ namespace System.Windows.Forms {
                private void HandleSizing (Message m)
                {
                        Rectangle pos = virtual_position;
-                       Size minimum_size = SystemInformation.MinWindowTrackSize;
-                       int mw = minimum_size.Width;
-                       int mh = minimum_size.Height;
+                       int mw;
+                       int mh;
+                       if (IsToolWindow) {
+                               int border_width = BorderWidth;
+                               mw = 2 * (border_width + Theme.ManagedWindowSpacingAfterLastTitleButton) + ThemeEngine.Current.ManagedWindowButtonSize (this).Width;
+                               mh = 2 * border_width + TitleBarHeight;
+                       } else {
+                               Size minimum_size = SystemInformation.MinWindowTrackSize;
+                               mw = minimum_size.Width;
+                               mh = minimum_size.Height;
+                       }
                        int x = Cursor.Position.X;
                        int y = Cursor.Position.Y;
 
@@ -695,7 +713,8 @@ namespace System.Windows.Forms {
                public bool IsToolWindow {
                        get {
                                if (form.FormBorderStyle == FormBorderStyle.SizableToolWindow ||
-                                               form.FormBorderStyle == FormBorderStyle.FixedToolWindow)
+                                   form.FormBorderStyle == FormBorderStyle.FixedToolWindow || 
+                                   form.GetCreateParams().IsSet (WindowExStyles.WS_EX_TOOLWINDOW))
                                        return true;
                                return false;
                        }
@@ -786,19 +805,16 @@ namespace System.Windows.Forms {
                        if (!button.Rectangle.IntersectsWith (clip))
                                return;
 
-                       dc.FillRectangle (SystemBrushes.Control, button.Rectangle);
-                       ControlPaint.DrawCaptionButton (dc, button.Rectangle,
-                                       button.Caption, button.State);
+                       ThemeEngine.Current.ManagedWindowDrawMenuButton (dc, button, clip, this);
                }
 
                public virtual void DrawMaximizedButtons (object sender, PaintEventArgs pe)
                {
                }
 
-               protected Point MouseMove (Message m)
+               protected Point MouseMove (Point pos)
                {
-                       Point cp = Cursor.Position;
-                       return new Point (cp.X - start.X, cp.Y - start.Y);
+                       return new Point (pos.X - start.X, pos.Y - start.Y);
                }
 
                protected virtual void DrawVirtualPosition (Rectangle virtual_position)
@@ -886,6 +902,7 @@ namespace System.Windows.Forms {
                public CaptionButton Caption;
                private EventHandler Clicked;
                public bool Visible;
+               bool entered;
 
                public TitleButton (CaptionButton caption, EventHandler clicked)
                {
@@ -899,6 +916,11 @@ namespace System.Windows.Forms {
                                Clicked (this, EventArgs.Empty);
                        }
                }
+
+               public bool Entered {
+                       get { return entered; }
+                       set { entered = value; }
+               }
        }
 
        internal class TitleButtons : System.Collections.IEnumerable
@@ -1090,7 +1112,10 @@ namespace System.Windows.Forms {
                        foreach (TitleButton button in this) {
                                if (button == null)
                                        continue;
-
+                               
+                               if (button.State == ButtonState.Inactive)
+                                       continue;
+                                       
                                if (button == over_button) {
                                        if (any_pushed_buttons) {
                                                any_change |= button.State != ButtonState.Pushed;
@@ -1098,11 +1123,21 @@ namespace System.Windows.Forms {
                                        }
                                        ToolTipStart (button);
                                        any_tooltip = true;
+                                       if (!button.Entered) {
+                                               button.Entered = true;
+                                               if (ThemeEngine.Current.ManagedWindowTitleButtonHasHotElementStyle (button, form))
+                                                       any_change = true;
+                                       }
                                } else {
                                        if (any_pushed_buttons) {
                                                any_change |= button.State != ButtonState.Normal;
                                                button.State = ButtonState.Normal;
                                        }
+                                       if (button.Entered) {
+                                               button.Entered = false;
+                                               if (ThemeEngine.Current.ManagedWindowTitleButtonHasHotElementStyle (button, form))
+                                                       any_change = true;
+                                       }
                                }
                        }
 
@@ -1121,12 +1156,12 @@ namespace System.Windows.Forms {
                        ToolTipHide (false);
 
                        foreach (TitleButton button in this) {
-                               if (button != null) {
+                               if (button != null && button.State != ButtonState.Inactive) {
                                        button.State = ButtonState.Normal;
                                }
                        }
                        TitleButton clicked_button = FindButton (x, y);
-                       if (clicked_button != null) {
+                       if (clicked_button != null && clicked_button.State != ButtonState.Inactive) {
                                clicked_button.State = ButtonState.Pushed;
                        }
                }
@@ -1138,12 +1173,12 @@ namespace System.Windows.Forms {
                        }
                        
                        TitleButton clicked_button = FindButton (x, y);
-                       if (clicked_button != null) {
+                       if (clicked_button != null && clicked_button.State != ButtonState.Inactive) {
                                clicked_button.OnClick ();
                        }
 
                        foreach (TitleButton button in this) {
-                               if (button == null)
+                               if (button == null || button.State == ButtonState.Inactive)
                                        continue;
 
                                button.State = ButtonState.Normal;
@@ -1151,6 +1186,8 @@ namespace System.Windows.Forms {
 
                        if (clicked_button == CloseButton && !form.closing)
                                XplatUI.InvalidateNC (form.Handle);
+                               
+                       ToolTipHide (true);
                }
 
                internal void MouseLeave (int x, int y)
@@ -1160,7 +1197,7 @@ namespace System.Windows.Forms {
                        }
                        
                        foreach (TitleButton button in this) {
-                               if (button == null)
+                               if (button == null || button.State == ButtonState.Inactive)
                                        continue;
 
                                button.State = ButtonState.Normal;