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
titlebar_color = Color.FromArgb (255, 0, 0, 255);
this.form = form;
+ form.SizeChanged += new EventHandler (FormSizeChangedHandler);
+
CreateButtons ();
}
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; }
}
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;
}
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) {
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:
}
}
- 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)
}
}
- protected Size ButtonSize {
+ public Size ButtonSize {
get {
int height = TitleBarHeight;
if (IsToolWindow)
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)
{
#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,