using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Drawing2D; using DevComponents.DotNetBar.Ribbon; namespace DevComponents.DotNetBar.Rendering { internal class Office2010SwitchButtonPainter : SwitchButtonPainter, IOffice2007Painter { #region Internal Implementation private static readonly int SwitchCornerSize = 2; public override void Paint(SwitchButtonRenderEventArgs e) { SwitchButtonItem switchButton = e.SwitchButtonItem; bool enabled = switchButton.Enabled; SwitchButtonColorTable colorTable = enabled ? this.ColorTable.SwitchButton.Default : this.ColorTable.SwitchButton.Disabled; if (colorTable == null) colorTable = new SwitchButtonColorTable(); Rectangle bounds = switchButton.Bounds; int buttonWidth = Dpi.Width(switchButton.ButtonWidth); Padding margin = Dpi.Size(switchButton.Margin); if (e.ItemPaintArgs != null && e.ItemPaintArgs.ContainerControl is AdvTree.AdvTree) { if (switchButton.ItemAlignment == eItemAlignment.Far) bounds.X = bounds.Right - margin.Right - buttonWidth; else if (switchButton.ItemAlignment == eItemAlignment.Center) bounds.X += (bounds.Width - buttonWidth) / 2; } else bounds.X = bounds.Right - margin.Right - buttonWidth; bounds.Width = buttonWidth; int buttonHeight = Dpi.Height(switchButton.ButtonHeight); bounds.Y += margin.Top + (bounds.Height - margin.Vertical - buttonHeight) / 2; bounds.Height = buttonHeight; switchButton.ButtonBounds = bounds; bool rendersOnGlass = (e.ItemPaintArgs != null && e.ItemPaintArgs.GlassEnabled && (switchButton.Parent is CaptionItemContainer && !(e.ItemPaintArgs.ContainerControl is QatToolbar) || (switchButton.Parent is RibbonTabItemContainer && switchButton.EffectiveStyle == eDotNetBarStyle.Office2010))); Graphics g = e.Graphics; if (switchButton.TextVisible && !string.IsNullOrEmpty(switchButton.Text)) { Rectangle textRect = switchButton.Bounds; Padding textPadding = Dpi.Size(switchButton.TextPadding); textRect.Width -= buttonWidth + margin.Right + textPadding.Horizontal; textRect.Y += textPadding.Top; textRect.X += textPadding.Left; textRect.Height -= textPadding.Vertical; bool rtl = e.RightToLeft; Color textColor = (switchButton.TextColor.IsEmpty || !enabled) ? colorTable.TextColor : switchButton.TextColor; Font textFont = e.Font; eTextFormat tf = eTextFormat.Left | eTextFormat.VerticalCenter; if (switchButton.TextMarkupBody != null) { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, textFont, textColor, rtl); d.HotKeyPrefixVisible = !((tf & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); if ((tf & eTextFormat.VerticalCenter) == eTextFormat.VerticalCenter) textRect.Y = switchButton.TopInternal + (switchButton.Bounds.Height - switchButton.TextMarkupBody.Bounds.Height) / 2; else if ((tf & eTextFormat.Bottom) == eTextFormat.Bottom) textRect.Y += (switchButton.TextMarkupBody.Bounds.Height - textRect.Height) + 1; textRect.Height = switchButton.TextMarkupBody.Bounds.Height; switchButton.TextMarkupBody.Bounds = textRect; switchButton.TextMarkupBody.Render(d); } else { #if FRAMEWORK20 if(rendersOnGlass) { if (!e.ItemPaintArgs.CachedPaint) Office2007RibbonControlPainter.PaintTextOnGlass(g, switchButton.Text, textFont, textRect, TextDrawing.GetTextFormat(tf)); } else #endif TextDrawing.DrawString(g, switchButton.Text, textFont, textColor, textRect, tf); } } bool switchState = switchButton.Value; string offText = switchButton.OffText; string onText = switchButton.OnText; Font font = (switchButton.SwitchFont == null) ? new Font(e.Font, FontStyle.Bold) : switchButton.SwitchFont; Color textOffColor = (switchButton.OffTextColor.IsEmpty || !enabled) ? colorTable.OffTextColor : switchButton.OffTextColor; Color textOnColor = (switchButton.OnTextColor.IsEmpty || !enabled) ? colorTable.OnTextColor : switchButton.OnTextColor; int switchWidth = Dpi.Width(switchButton.SwitchWidth); int switchX = Math.Min(bounds.X + switchButton.SwitchOffset, bounds.Right); if (switchState) { switchX = Math.Max(bounds.Right - switchWidth - switchButton.SwitchOffset, bounds.X); } Color borderColor = (switchButton.BorderColor.IsEmpty || !enabled) ? colorTable.BorderColor : switchButton.BorderColor; Color offBackgroundColor = (switchButton.OffBackColor.IsEmpty || !enabled) ? colorTable.OffBackColor : switchButton.OffBackColor; Color onBackgroundColor = (switchButton.OnBackColor.IsEmpty || !enabled) ? colorTable.OnBackColor : switchButton.OnBackColor; // Set clip Rectangle innerBoundsClip = bounds; innerBoundsClip.Inflate(-1, -1); GraphicsPath innerClipPath = DisplayHelp.GetRoundedRectanglePath(innerBoundsClip, SwitchCornerSize - 1); Region oldClip = g.Clip; g.SetClip(innerClipPath, System.Drawing.Drawing2D.CombineMode.Intersect); innerClipPath.Dispose(); // Draw On Background, it is to the left of the switch Rectangle onBounds = new Rectangle(switchX - (bounds.Width - switchWidth), bounds.Y, bounds.Width - switchWidth + 2, bounds.Height); switchButton.OnPartBounds = onBounds; DisplayHelp.FillRoundedRectangle(g, onBounds, SwitchCornerSize - 1, onBackgroundColor); DisplayHelp.FillRoundedRectangle(g, onBounds, SwitchCornerSize - 1, Color.FromArgb(onBackgroundColor.GetBrightness() > .90f ? 8 : 24, Color.Black), Color.FromArgb(32, Color.White)); // Draw On Text if(rendersOnGlass && BarUtilities.UseTextRenderer) TextDrawing.DrawStringLegacy(g, onText, font, textOnColor, onBounds, eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter); else TextDrawing.DrawString(g, onText, font, textOnColor, onBounds, eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter); // Draw Off Background, it is on the right of the switch Rectangle offBounds = new Rectangle(switchX + switchWidth - 2, bounds.Y, bounds.Width - switchWidth + 2, bounds.Height); switchButton.OffPartBounds = offBounds; DisplayHelp.FillRoundedRectangle(g, offBounds, SwitchCornerSize, offBackgroundColor); DisplayHelp.FillRoundedRectangle(g, offBounds, SwitchCornerSize, Color.FromArgb(offBackgroundColor.GetBrightness() > .90f ? 12 : 32, Color.Black), Color.FromArgb(64, Color.White)); // Draw Off Text if (rendersOnGlass && BarUtilities.UseTextRenderer) TextDrawing.DrawStringLegacy(g, offText, font, textOffColor, offBounds, eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter); else TextDrawing.DrawString(g, offText, font, textOffColor, offBounds, eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter); // Restore old clip g.Clip = oldClip; oldClip.Dispose(); // Main control border DisplayHelp.DrawRoundedRectangle(g, borderColor, bounds, SwitchCornerSize); LinearGradientColorTable innerOverlay = new LinearGradientColorTable(Color.FromArgb(96, Color.DarkGray), Color.Transparent, 90); Rectangle overlayBounds = bounds; overlayBounds.Inflate(-SwitchCornerSize / 2, -1); DisplayHelp.DrawLine(g, overlayBounds.X, overlayBounds.Y, overlayBounds.Right, overlayBounds.Y, Color.FromArgb(24, Color.Black), 1); overlayBounds.Y++; DisplayHelp.DrawLine(g, overlayBounds.X, overlayBounds.Y, overlayBounds.Right, overlayBounds.Y, Color.FromArgb(8, Color.Black), 1); // Draw Switch on top Rectangle switchBounds = new Rectangle(switchX, bounds.Y, switchWidth, bounds.Height); switchButton.SwitchBounds = switchBounds; Color switchBorderColor = (switchButton.SwitchBorderColor.IsEmpty || !enabled) ? colorTable.SwitchBorderColor : switchButton.SwitchBorderColor; Color switchFillColor = (switchButton.SwitchBackColor.IsEmpty || !enabled) ? colorTable.SwitchBackColor : switchButton.SwitchBackColor; if (!colorTable.SwitchOnBackColor.IsEmpty && !switchButton.Value && switchButton.SwitchBackColor.IsEmpty) switchFillColor = colorTable.SwitchOnBackColor; if (switchBounds.Right + 2 < bounds.Right) { DisplayHelp.DrawLine(g, switchBounds.Right, switchBounds.Y + 3, switchBounds.Right, switchBounds.Bottom - 2, Color.FromArgb(24, Color.Black), 1); DisplayHelp.DrawLine(g, switchBounds.Right + 1, switchBounds.Y + 3, switchBounds.Right + 1, switchBounds.Bottom - 2, Color.FromArgb(8, Color.Black), 1); } DisplayHelp.DrawRoundedRectangle(g, switchBorderColor, switchFillColor, switchBounds, SwitchCornerSize); DisplayHelp.FillRoundedRectangle(g, switchBounds, SwitchCornerSize, Color.FromArgb(switchFillColor.GetBrightness() > .90f ? 42 : 72, Color.Black), Color.FromArgb(64, Color.White)); DisplayHelp.DrawLine(g, switchBounds.X + 2, switchBounds.Y + 1, switchBounds.Right - 3, switchBounds.Y + 1, Color.FromArgb(164, Color.White), 1); if (switchButton.IsReadOnly && switchButton.ShowReadOnlyMarker) { Color markerColor=switchButton.ReadOnlyMarkerColor; Rectangle marker = new Rectangle(switchBounds.X + (switchBounds.Width - 7) / 2, switchBounds.Y + (switchBounds.Height - 10) / 2, 7, 10); SmoothingMode sm = g.SmoothingMode; g.SmoothingMode = SmoothingMode.None; using (SolidBrush brush = new SolidBrush(markerColor)) { g.FillRectangle(brush, new Rectangle(marker.X, marker.Y + 4, marker.Width, marker.Height - 4)); g.FillRectangle(Brushes.White, new Rectangle(marker.X + 3, marker.Y + 5, 1, 2)); } using (Pen pen = new Pen(markerColor, 1)) { g.DrawLine(pen, marker.X + 2, marker.Y + 0, marker.X + 4, marker.Y + 0); g.DrawLine(pen, marker.X + 1, marker.Y + 1, marker.X + 1, marker.Y + 3); g.DrawLine(pen, marker.X + 5, marker.Y + 1, marker.X + 5, marker.Y + 3); } g.SmoothingMode = sm; } } #endregion #region IOffice2007Painter private Office2007ColorTable _ColorTable = null; /// /// Gets or sets color table used by renderer. /// public Office2007ColorTable ColorTable { get { return _ColorTable; } set { _ColorTable = value; } } #endregion } }