protected virtual IDisposable DrawRibbonTabContext(RenderContext context,
Rectangle rect,
IPaletteRibbonGeneral paletteGeneral,
IPaletteRibbonBack paletteBack,
IDisposable memento)
{
if ((rect.Width > 0) && (rect.Height > 0))
{
Color c1 = paletteGeneral.GetRibbonTabSeparatorContextColor(PaletteState.Normal);
Color c2 = paletteBack.GetRibbonBackColor5(PaletteState.ContextCheckedNormal);
bool generate = true;
MementoRibbonTabContext cache;
// Access a cache instance and decide if cache resources need generating
if ((memento == null) || !(memento is MementoRibbonTabContext))
{
if (memento != null)
memento.Dispose();
cache = new MementoRibbonTabContext(rect, c1, c2);
memento = cache;
}
else
{
cache = (MementoRibbonTabContext)memento;
generate = !cache.UseCachedValues(rect, c1, c2);
}
// Do we need to generate the contents of the cache?
if (generate)
{
// Dispose of existing values
cache.Dispose();
Rectangle borderRect = new Rectangle(rect.X - 1, rect.Y - 1, rect.Width + 2, rect.Height + 2);
cache.fillRect = new Rectangle(rect.X + 1, rect.Y, rect.Width - 2, rect.Height - 1);
LinearGradientBrush borderBrush = new LinearGradientBrush(borderRect, c1, Color.Transparent, 270f);
borderBrush.Blend = _ribbonGroup5Blend;
cache.borderPen = new Pen(borderBrush);
LinearGradientBrush underlineBrush = new LinearGradientBrush(borderRect, Color.Transparent, Color.FromArgb(200, c2), 0f);
underlineBrush.Blend = _ribbonGroup7Blend;
cache.underlinePen = new Pen(underlineBrush);
cache.fillBrush = new LinearGradientBrush(borderRect, Color.FromArgb(196, c2), Color.Transparent, 270f);
cache.fillBrush.Blend = _ribbonGroup6Blend;
}
// Draw the left and right border lines
context.Graphics.DrawLine(cache.borderPen, rect.X, rect.Y, rect.X, rect.Bottom - 1);
context.Graphics.DrawLine(cache.borderPen, rect.Right - 1, rect.Y, rect.Right - 1, rect.Bottom - 1);
// Fill the inner area with a gradient context specific color
context.Graphics.FillRectangle(cache.fillBrush, cache.fillRect);
// Overdraw the brighter line at bottom
context.Graphics.DrawLine(cache.underlinePen, rect.X + 1, rect.Bottom - 1, rect.Right - 2, rect.Bottom - 1);
}
return memento;
}