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 aaf7e179f7d77798aad3d6b65b934c494877ab2a..ea58417925e84ceedb6e206a1c7e674b14f49e53 100644 (file)
@@ -33,7 +33,6 @@ using System.Runtime.InteropServices;
 namespace System.Windows.Forms {
 
        internal abstract class InternalWindowManager {
-               private Size MinTitleBarSize = new Size (115, 25);
                private TitleButtons title_buttons;
                internal Form form;
 
@@ -107,8 +106,7 @@ namespace System.Windows.Forms {
                }
                internal Size IconicSize {
                        get {
-                               int bw = ThemeEngine.Current.ManagedWindowBorderWidth (this);
-                               return new Size (152 + bw * 2, TitleBarHeight + bw * 2);
+                               return SystemInformation.MinimizedWindowSize;
                        }
                }
                
@@ -231,8 +229,7 @@ namespace System.Windows.Forms {
                                break;
 
                        case Msg.WM_NCCALCSIZE:
-                               HandleNCCalcSize (ref m);
-                               break;
+                               return HandleNCCalcSize (ref m);
 
                        case Msg.WM_NCPAINT:
                                return HandleNCPaint (ref m);
@@ -262,42 +259,62 @@ namespace System.Windows.Forms {
 
                                form.ActiveMenu.Draw (pe, new Rectangle (pnt.X, pnt.Y, form.ClientSize.Width, 0));
                        }
-                       // clip region is not correct on win32.
-                       // use the entire form's area.
-                       clip = new Rectangle (0, 0, form.Width, form.Height);
-                       ThemeEngine.Current.DrawManagedWindowDecorations (pe.Graphics, clip, this);
+                       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);
+                               ThemeEngine.Current.DrawManagedWindowDecorations (pe.Graphics, clip, this);
+                       }
                        XplatUI.PaintEventEnd (ref m, form.Handle, false);
                        return true;
                }
 
-               protected virtual void HandleNCCalcSize (ref Message m)
+               protected virtual bool HandleNCCalcSize (ref Message m)
                {
                        XplatUIWin32.NCCALCSIZE_PARAMS ncp;
+                       XplatUIWin32.RECT rect;
 
                        if (m.WParam == (IntPtr)1) {
                                ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure (m.LParam,
                                                typeof (XplatUIWin32.NCCALCSIZE_PARAMS));
+                               
+                               ncp.rgrc1 = NCCalcSize (ncp.rgrc1);
 
-                               int bw = ThemeEngine.Current.ManagedWindowBorderWidth (this);
+                               Marshal.StructureToPtr (ncp, m.LParam, true);
+                       } else {
+                               rect = (XplatUIWin32.RECT) Marshal.PtrToStructure (m.LParam, typeof (XplatUIWin32.RECT));
+                               
+                               rect = NCCalcSize (rect);
+                               
+                               Marshal.StructureToPtr (rect, m.LParam, true);
+                       }
+                       
+                       return true;
+               }
 
-                               if (HasBorders) {
-                                       ncp.rgrc1.top += TitleBarHeight + bw;
-                                       ncp.rgrc1.bottom -= bw;
-                                       ncp.rgrc1.left += bw;
-                                       ncp.rgrc1.right -= bw;
-                               }
+               protected virtual XplatUIWin32.RECT NCCalcSize (XplatUIWin32.RECT proposed_window_rect)
+               {
+                       int bw = ThemeEngine.Current.ManagedWindowBorderWidth (this);
+
+                       if (HasBorders) {
+                               proposed_window_rect.top += TitleBarHeight + bw;
+                               proposed_window_rect.bottom -= bw;
+                               proposed_window_rect.left += bw;
+                               proposed_window_rect.right -= bw;
+                       }
 
+                       if (XplatUI.RequiresPositiveClientAreaSize) {
                                // This is necessary for Linux, can't handle <= 0-sized 
                                // client areas correctly.
-                               if (ncp.rgrc1.right <= ncp.rgrc1.left) {
-                                       ncp.rgrc1.right += ncp.rgrc1.left - ncp.rgrc1.right + 1;
-                               }       
-                               if (ncp.rgrc1.top >= ncp.rgrc1.bottom) {
-                                       ncp.rgrc1.bottom += ncp.rgrc1.top - ncp.rgrc1.bottom + 1;
+                               if (proposed_window_rect.right <= proposed_window_rect.left) {
+                                       proposed_window_rect.right += proposed_window_rect.left - proposed_window_rect.right + 1;
+                               }
+                               if (proposed_window_rect.top >= proposed_window_rect.bottom) {
+                                       proposed_window_rect.bottom += proposed_window_rect.top - proposed_window_rect.bottom + 1;
                                }
-                               
-                               Marshal.StructureToPtr (ncp, m.LParam, true);
                        }
+
+                       return proposed_window_rect;
                }
 
                protected virtual bool HandleNCHitTest (ref Message m)
@@ -405,17 +422,31 @@ namespace System.Windows.Forms {
 
                public bool IconRectangleContains (int x, int y)
                {
-                       if (form.Icon == null)
+                       if (!ShowIcon)
                                return false;
 
-                       int bw = ThemeEngine.Current.ManagedWindowBorderWidth (this);
-                       Rectangle icon = new Rectangle (bw + 3, bw + 2, IconWidth, IconWidth);
+                       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 {
@@ -552,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)
@@ -609,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);
@@ -618,9 +641,17 @@ namespace System.Windows.Forms {
                private void HandleSizing (Message m)
                {
                        Rectangle pos = virtual_position;
-                       int bw = ThemeEngine.Current.ManagedWindowBorderWidth (this);
-                       int mw = MinTitleBarSize.Width + (bw * 2);
-                       int mh = MinTitleBarSize.Height + (bw * 2);
+                       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;
 
@@ -682,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;
                        }
@@ -773,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)
@@ -873,6 +902,7 @@ namespace System.Windows.Forms {
                public CaptionButton Caption;
                private EventHandler Clicked;
                public bool Visible;
+               bool entered;
 
                public TitleButton (CaptionButton caption, EventHandler clicked)
                {
@@ -886,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
@@ -1077,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;
@@ -1085,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;
+                                       }
                                }
                        }
 
@@ -1108,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;
                        }
                }
@@ -1125,16 +1173,21 @@ 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;
                        }
+
+                       if (clicked_button == CloseButton && !form.closing)
+                               XplatUI.InvalidateNC (form.Handle);
+                               
+                       ToolTipHide (true);
                }
 
                internal void MouseLeave (int x, int y)
@@ -1144,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;