* Theme.cs:
authorJackson Harper <jackson@novell.com>
Thu, 18 May 2006 23:03:59 +0000 (23:03 -0000)
committerJackson Harper <jackson@novell.com>
Thu, 18 May 2006 23:03:59 +0000 (23:03 -0000)
        * ThemeWin32Classic.cs:
        * InternalWindowManager.cs: Move the drawing into the theme,
        expose everything the theme should need from the window manager.

svn path=/trunk/mcs/; revision=60848

mcs/class/Managed.Windows.Forms/System.Windows.Forms/InternalWindowManager.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/MdiWindowManager.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs

index df4466065f3644e23b5995f9327dbfce54e0c3d5..78635530bbe388190cd053e737cb808803340d32 100644 (file)
@@ -41,10 +41,11 @@ namespace System.Windows.Forms {
 
                internal Form form;
 
-               protected TitleButton close_button;
-               protected TitleButton maximize_button;
-               protected TitleButton minimize_button;
-
+               internal TitleButton close_button;
+               internal TitleButton maximize_button;
+               internal TitleButton minimize_button;
+               protected Rectangle icon_rect;
+               
                private TitleButton [] title_buttons = new TitleButton [3];
                
                // moving windows
@@ -98,6 +99,8 @@ namespace System.Windows.Forms {
                        titlebar_color = Color.FromArgb (255, 0, 0, 255);
                        this.form = form;
 
+                       form.SizeChanged += new EventHandler (FormSizeChangedHandler);
+
                        CreateButtons ();
                }
 
@@ -105,6 +108,26 @@ namespace System.Windows.Forms {
                        get { return form; }
                }
 
+               public Rectangle CloseButtonRect {
+                       get { return close_button.Rectangle; }
+                       set { close_button.Rectangle = value; }
+               }
+
+               public Rectangle MinimizeButtonRect {
+                       get { return minimize_button.Rectangle; }
+                       set { minimize_button.Rectangle = value; }
+               }
+
+               public Rectangle MaximizeButtonRect {
+                       get { return maximize_button.Rectangle; }
+                       set { maximize_button.Rectangle = value; }
+               }
+
+               public Rectangle IconRect {
+                       get { return icon_rect; }
+                       set { value = icon_rect; }
+               }
+
                public int IconWidth {
                        get { return TitleBarHeight - 5; }
                }
@@ -213,13 +236,11 @@ namespace System.Windows.Forms {
 
                        case Msg.WM_NCPAINT:
                                PaintEventArgs pe;
-
                                pe = XplatUI.PaintEventStart(m.HWnd, false);
-                               PaintWindowDecorations (pe);
+                               ThemeEngine.Current.DrawManagedWindowDecorations (pe.Graphics, pe.ClipRectangle, this);
+//                             PaintWindowDecorations (pe);
                                XplatUI.PaintEventEnd(m.HWnd, false);
 
-                               // We don't want the form.WndProc to handle this because it
-                               // will call a PaintEventEnd
                                
                                return true;
                        }
@@ -282,11 +303,16 @@ namespace System.Windows.Forms {
                        form.Refresh ();
                }
 
-               protected virtual bool IsActive ()
+               public virtual bool IsActive ()
                {
                        return true;
                }
 
+               private void FormSizeChangedHandler (object sender, EventArgs e)
+               {
+                       ThemeEngine.Current.ManagedWindowSetButtonLocations (this);
+               }
+
                private void CreateButtons ()
                {
                        switch (form.FormBorderStyle) {
@@ -489,11 +515,11 @@ namespace System.Windows.Forms {
                        UpdateVP (pos);
                }
 
-               private bool IsMaximized {
+               public bool IsMaximized {
                        get { return GetWindowState () == FormWindowState.Maximized; }
                }
 
-               private bool IsSizable {
+               public bool IsSizable {
                        get {
                                switch (form.FormBorderStyle) {
                                case FormBorderStyle.Sizable:
@@ -505,13 +531,13 @@ namespace System.Windows.Forms {
                        }
                }
 
-               private bool HasBorders {
+               public bool HasBorders {
                        get {
                                return form.FormBorderStyle != FormBorderStyle.None;
                        }
                }
 
-               private bool IsToolWindow {
+               public bool IsToolWindow {
                        get {
                                if (form.FormBorderStyle == FormBorderStyle.SizableToolWindow ||
                                                form.FormBorderStyle == FormBorderStyle.FixedToolWindow)
@@ -530,7 +556,7 @@ namespace System.Windows.Forms {
                        }
                }
 
-               protected Size ButtonSize {
+               public Size ButtonSize {
                        get {
                                int height = TitleBarHeight;
                                if (IsToolWindow)
@@ -596,82 +622,6 @@ namespace System.Windows.Forms {
 
                        return true;
                }
-
-               private void PaintWindowDecorations (PaintEventArgs pe)
-               {
-                       Graphics dc = pe.Graphics;
-
-                       if (HasBorders) {
-                               Rectangle borders = new Rectangle (0, 0, form.Width, form.Height);
-                       
-                               ControlPaint.DrawBorder3D (dc, borders, Border3DStyle.Raised);
-                       }
-
-                       Color color = ThemeEngine.Current.ColorControlDark;
-
-                       if (IsActive () && !IsMaximized)
-                               color = titlebar_color;
-
-                       Rectangle tb = new Rectangle (BorderWidth, BorderWidth,
-                                       form.Width - (BorderWidth * 2), TitleBarHeight - 1);
-
-                       // HACK: For now always draw the titlebar until we get updates better
-                       // Rectangle vis = Rectangle.Intersect (tb, pe.ClipRectangle);  
-                       //if (vis != Rectangle.Empty)
-                               dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (color), tb);
-
-                       dc.DrawLine (new Pen (SystemColors.ControlLight, 1), BorderWidth,
-                                       TitleBarHeight + BorderWidth, form.Width - (BorderWidth * 2),
-                                       TitleBarHeight + BorderWidth);
-
-                       if (!IsToolWindow) {
-                               tb.X += 18; // Room for the icon and the buttons
-                               tb.Width = (form.Width - 62) - tb.X;
-                       }
-
-                       if (form.Text != null) {
-                               StringFormat format = new StringFormat ();
-                               format.FormatFlags = StringFormatFlags.NoWrap;
-                               format.Trimming = StringTrimming.EllipsisCharacter;
-                               format.LineAlignment = StringAlignment.Center;
-
-                               if (tb.IntersectsWith (pe.ClipRectangle))
-                                       dc.DrawString (form.Text, form.Font,
-                                               ThemeEngine.Current.ResPool.GetSolidBrush (Color.White),
-                                               tb, format);
-                       }
-
-                       if (!IsToolWindow && HasBorders) {
-                               if (form.Icon != null) {
-                                       Rectangle icon = new Rectangle (BorderWidth + 3,
-                                                       BorderWidth + 2, IconWidth, IconWidth);
-                                       if (icon.IntersectsWith (pe.ClipRectangle))
-                                               dc.DrawIcon (form.Icon, icon);
-                               }
-
-                               if (!IsMaximized) {
-                                       Size bs = ButtonSize;
-                                       close_button.Rectangle = new Rectangle (form.Width - BorderWidth - bs.Width - 2,
-                                                       BorderWidth + 2, bs.Width, bs.Height);
-                                       maximize_button.Rectangle = new Rectangle (close_button.Rectangle.Left - 2 - bs.Width,
-                                                       BorderWidth + 2, bs.Width, bs.Height);
-                                       minimize_button.Rectangle = new Rectangle (maximize_button.Rectangle.Left - bs.Width,
-                                                       BorderWidth + 2, bs.Width, bs.Height);
-
-                                       DrawTitleButton (dc, minimize_button, pe.ClipRectangle);
-                                       DrawTitleButton (dc, maximize_button, pe.ClipRectangle);
-                                       DrawTitleButton (dc, close_button, pe.ClipRectangle);
-                               } else {
-                                       //      DrawMaximizedButtons (pe, form.ActiveMenu);
-                               }
-
-                       } else if (IsToolWindow) {
-                               Size bs = ButtonSize;
-                               close_button.Rectangle = new Rectangle (form.Width - BorderWidth - 2 - bs.Width,
-                                               BorderWidth + 2, bs.Width, bs.Height);
-                               DrawTitleButton (dc, close_button, pe.ClipRectangle);
-                       }
-               }
                
                protected void DrawTitleButton (Graphics dc, TitleButton button, Rectangle clip)
                {
index 0647763fba75b534087d59186e3b30e52f9f0e34..8d1568c654e8da90d3bb17709b91e0874f8f2164 100644 (file)
@@ -346,7 +346,7 @@ namespace System.Windows.Forms {
                        form.Refresh ();
                }
 
-               protected override bool IsActive ()
+               public override bool IsActive ()
                {
                        return mdi_container.ActiveMdiChild == form;
                }
index 142419f2ebceb05c8b6675ab2242fa3136a8732e..ea7aa806e56c0a40f23a3f045d421bc650d4e6c7 100644 (file)
@@ -862,6 +862,34 @@ namespace System.Windows.Forms
                public abstract Size TreeViewDefaultSize { get; }
                #endregion
 
+               public virtual void DrawManagedWindowDecorations (Graphics dc, Rectangle clip, InternalWindowManager wm)
+               {
+                       // Just making virtual for now so all the themes still build.
+               }
+
+               public virtual int ManagedWindowTitleBarHeight (InternalWindowManager wm)
+               {
+                       // Just making virtual for now so all the themes still build.
+                       return 15;
+               }
+
+               public virtual int ManagedWindowBorderWidth (InternalWindowManager wm)
+               {
+                       // Just making virtual for now so all the themes still build.
+                       return 3;
+               }
+
+               public virtual int ManagedWindowIconWidth (InternalWindowManager wm)
+               {
+                       // Just making virtual for now so all the themes still build.
+                       return ManagedWindowTitleBarHeight (wm) - 5;
+               }
+
+               public virtual void ManagedWindowSetButtonLocations (InternalWindowManager wm)
+               {
+                       // Just making virtual for now so all the themes still build.
+               }
+
                #region ControlPaint Methods
                public abstract void CPDrawBorder (Graphics graphics, Rectangle bounds, Color leftColor, int leftWidth,
                        ButtonBorderStyle leftStyle, Color topColor, int topWidth, ButtonBorderStyle topStyle,
index cddf5392d689ccf678e35b9882ed17df0e876f7d..5516ebb8f0449613f008037801774845a49af8f0 100644 (file)
@@ -4219,6 +4219,139 @@ namespace System.Windows.Forms
 
                #endregion
 
+               public override int ManagedWindowTitleBarHeight (InternalWindowManager wm)
+               {
+                       if (wm.IsToolWindow)
+                               return SystemInformation.ToolWindowCaptionHeight;
+                       if (wm.Form.FormBorderStyle == FormBorderStyle.None)
+                               return 0;
+                       return SystemInformation.CaptionHeight;
+               }
+
+               public override int ManagedWindowBorderWidth (InternalWindowManager wm)
+               {
+                       return 3;
+               }
+
+               public override int ManagedWindowIconWidth (InternalWindowManager wm)
+               {
+                       return ManagedWindowTitleBarHeight (wm) - 5;
+               }
+
+               public override void ManagedWindowSetButtonLocations (InternalWindowManager wm)
+               {
+                       int bw = ManagedWindowBorderWidth (wm);
+                       Size btsize = ManagedWindowButtonSize (wm);
+                       int btw = btsize.Width;
+                       int bth = btsize.Height;
+
+                       if (!wm.IsToolWindow && wm.HasBorders) {
+                               if (!wm.IsMaximized) {
+                                       wm.close_button.Rectangle = new Rectangle (wm.Form.Width - bw - btw - 2,
+                                                       bw + 2, btw, bth);
+                                       wm.maximize_button.Rectangle = new Rectangle (wm.close_button.Rectangle.Left - 2 - btw,
+                                                       bw + 2, btw, bth);
+                                       wm.minimize_button.Rectangle = new Rectangle (wm.maximize_button.Rectangle.Left - btw,
+                                                       bw + 2, btw, bth);
+                               } else {
+                                       // Maximized
+                               }
+                       } else if (wm.IsToolWindow) {
+                               wm.close_button.Rectangle = new Rectangle (wm.Form.Width - bw - 2 - btw, bw + 2, btw, bth);
+                       }
+               }
+
+               public override void DrawManagedWindowDecorations (Graphics dc, Rectangle clip, InternalWindowManager wm)
+               {
+                       Form form = wm.Form;
+                       int tbheight = ManagedWindowTitleBarHeight (wm);
+                       int bdwidth = ManagedWindowBorderWidth (wm);
+                       Color titlebar_color = Color.FromArgb (255, 0, 0, 255);
+                       
+                       if (wm.HasBorders) {
+                               Rectangle borders = new Rectangle (0, 0, form.Width, form.Height);
+                               // The 3d border is only 2 pixels wide, so we draw the innermost pixel ourselves
+                               dc.DrawRectangle (new Pen (ColorControl, 1), 2, 2, form.Width - 3, form.Height - 3);
+                               ControlPaint.DrawBorder3D (dc, borders, Border3DStyle.Raised);
+                       }
+
+                       Color color = ThemeEngine.Current.ColorControlDark;
+
+                       if (wm.IsActive () && !wm.IsMaximized)
+                               color = titlebar_color;
+
+                       Rectangle tb = new Rectangle (bdwidth, bdwidth,
+                                       form.Width - (bdwidth * 2), tbheight);
+
+                       // HACK: For now always draw the titlebar until we get updates better
+                       // Rectangle vis = Rectangle.Intersect (tb, pe.ClipRectangle);  
+                       //if (vis != Rectangle.Empty)
+                       dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (color), tb);
+
+                       dc.DrawLine (new Pen (SystemColors.ControlLight, 1), bdwidth,
+                                       tbheight + bdwidth, form.Width - (bdwidth * 2),
+                                       tbheight + bdwidth);
+
+                       if (!wm.IsToolWindow) {
+                               tb.X += 18; // Room for the icon and the buttons
+                               tb.Width = (form.Width - 62) - tb.X;
+                       }
+
+                       if (form.Text != null) {
+                               StringFormat format = new StringFormat ();
+                               format.FormatFlags = StringFormatFlags.NoWrap;
+                               format.Trimming = StringTrimming.EllipsisCharacter;
+                               format.LineAlignment = StringAlignment.Center;
+
+                               if (tb.IntersectsWith (clip))
+                                       dc.DrawString (form.Text, form.Font,
+                                               ThemeEngine.Current.ResPool.GetSolidBrush (Color.White),
+                                               tb, format);
+                       }
+
+                       if (wm.HasBorders) {
+                               if (!wm.IsToolWindow && form.Icon != null) {
+                                       Rectangle icon = new Rectangle (bdwidth + 3,
+                                                       bdwidth + 2, wm.IconWidth, wm.IconWidth);
+                                       if (icon.IntersectsWith (clip))
+                                               dc.DrawIcon (form.Icon, icon);
+                               }
+
+                               if (!wm.IsMaximized) {
+                                       if (!wm.IsToolWindow) {
+                                               DrawTitleButton (dc, wm.minimize_button, clip);
+                                               DrawTitleButton (dc, wm.maximize_button, clip);
+                                       }
+                                       DrawTitleButton (dc, wm.close_button, clip);
+                               } else {
+                                       //      DrawMaximizedButtons (pe, form.ActiveMenu);
+                               }
+                       }
+               }
+
+               private void DrawTitleButton (Graphics dc, InternalWindowManager.TitleButton button, Rectangle clip)
+               {
+                       if (!button.Rectangle.IntersectsWith (clip))
+                               return;
+
+                       dc.FillRectangle (SystemBrushes.Control, button.Rectangle);
+
+                       ControlPaint.DrawCaptionButton (dc, button.Rectangle,
+                                       button.Caption, ButtonState.Normal);
+               }
+
+               private Size ManagedWindowButtonSize (InternalWindowManager wm)
+               {
+                       int height = wm.TitleBarHeight;
+                       if (wm.IsToolWindow)
+                               return new Size (SystemInformation.ToolWindowCaptionButtonSize.Width - 2,
+                                               height - 5);
+                       if (wm.Form.FormBorderStyle == FormBorderStyle.None)
+                               return Size.Empty;
+                       return new Size (SystemInformation.CaptionButtonSize.Width - 2,
+                                       height - 5);
+               }
+
                #region ControlPaint
                public override void CPDrawBorder (Graphics graphics, Rectangle bounds, Color leftColor, int leftWidth,
                        ButtonBorderStyle leftStyle, Color topColor, int topWidth, ButtonBorderStyle topStyle,