264 lines
9.5 KiB
C#
264 lines
9.5 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Drawing;
|
|
using System.Windows.Forms.VisualStyles;
|
|
using DevComponents.UI.ContentManager;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Summary description for TabItemLayoutManager.
|
|
/// </summary>
|
|
public class TabItemLayoutManager:DevComponents.UI.ContentManager.BlockLayoutManager
|
|
{
|
|
private int m_TextPadding=4;
|
|
private int m_ImagePadding=2;
|
|
private int m_PaddingHeight=4;
|
|
private int m_PaddingWidth=0;
|
|
private bool m_HorizontalText=false;
|
|
private int m_SelectedPaddingWidth=0;
|
|
private Size m_FixedTabSize = Size.Empty;
|
|
private bool m_CloseButtonOnTabs = false;
|
|
private Size m_CloseButtonSize = new Size(11, 11);
|
|
private int m_CloseButtonSpacing = 3;
|
|
private TabStrip m_TabStrip = null;
|
|
|
|
public TabItemLayoutManager()
|
|
{
|
|
}
|
|
|
|
public TabItemLayoutManager(TabStrip tabStrip)
|
|
{
|
|
m_TabStrip = tabStrip;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Resizes the content block and sets it's Bounds property to reflect new size.
|
|
/// </summary>
|
|
/// <param name="block">Content block to resize.</param>
|
|
public override void Layout(IBlock block, Size availableSize)
|
|
{
|
|
if(this.Graphics==null)
|
|
throw(new InvalidOperationException("Graphics property must be set to valid instance of Graphics object."));
|
|
|
|
TabItem tab=block as TabItem;
|
|
if(!tab.Visible)
|
|
return;
|
|
|
|
int width=0;
|
|
int height=0;
|
|
bool isVertical = (tab.Parent != null && (tab.Parent.TabAlignment == eTabStripAlignment.Left || tab.Parent.TabAlignment == eTabStripAlignment.Right) && !m_HorizontalText);
|
|
|
|
eTabStripStyle style=tab.Parent.Style;
|
|
eTextFormat strFormat=eTextFormat.Default;
|
|
|
|
Image tabImage=tab.GetImage();
|
|
if(tab.Icon!=null)
|
|
{
|
|
width+=tab.IconSize.Width;
|
|
if (style != eTabStripStyle.OneNote && style != eTabStripStyle.Office2007Document)
|
|
width+=m_ImagePadding;
|
|
height=tab.IconSize.Height+m_PaddingHeight;
|
|
}
|
|
else if(tabImage!=null)
|
|
{
|
|
width+=Dpi.Width(tabImage.Width);
|
|
if (style != eTabStripStyle.OneNote && style != eTabStripStyle.Office2007Document)
|
|
width+=Dpi.Width(m_ImagePadding);
|
|
height=Dpi.Height(tabImage.Height)+Dpi.Height(m_PaddingHeight);
|
|
}
|
|
|
|
if((!tab.Parent.DisplaySelectedTextOnly || tab==tab.Parent.SelectedTab))
|
|
{
|
|
string text = tab.Text;
|
|
if (text == "")
|
|
text = "M";
|
|
Font font=tab.Parent.Font;
|
|
if (tab.Parent.SelectedTabFont != null && (tab == tab.Parent.SelectedTab ||
|
|
tab.Parent.CloseButtonOnTabsAlwaysDisplayed && tab.Parent.CloseButtonPosition == eTabCloseButtonPosition.Right ||
|
|
((tab.Parent.TabAlignment == eTabStripAlignment.Left || tab.Parent.TabAlignment == eTabStripAlignment.Right) && m_HorizontalText)))
|
|
font=tab.Parent.SelectedTabFont;
|
|
Size textSize = Size.Empty;
|
|
if(isVertical)
|
|
textSize = TextDrawing.MeasureStringLegacy(this.Graphics, text, font, Size.Empty, strFormat);
|
|
else
|
|
textSize=TextDrawing.MeasureString(this.Graphics,text,font,0,strFormat);
|
|
width+=textSize.Width;
|
|
if(style!=eTabStripStyle.OneNote)
|
|
width+=Dpi.Width(m_TextPadding);
|
|
if(textSize.Height>height)
|
|
height=(int)(textSize.Height+Dpi.Height(m_PaddingHeight));
|
|
}
|
|
|
|
if (m_CloseButtonOnTabs && tab.CloseButtonVisible)
|
|
width += m_CloseButtonSize.Width + m_CloseButtonSpacing * 2;
|
|
|
|
width+=m_PaddingWidth;
|
|
if(tab.IsSelected)
|
|
width+=m_SelectedPaddingWidth;
|
|
|
|
if (m_FixedTabSize.Width > 0)
|
|
width = m_FixedTabSize.Width;
|
|
if (m_FixedTabSize.Height > 0)
|
|
height = m_FixedTabSize.Height;
|
|
|
|
if (style == eTabStripStyle.OneNote || style == eTabStripStyle.Office2007Document)
|
|
width += (int)(height * .5)-4;
|
|
|
|
Rectangle bounds = new Rectangle(0, 0, width, height);
|
|
|
|
if (isVertical)
|
|
bounds = new Rectangle(0, 0, height, width);
|
|
|
|
if (m_TabStrip != null && m_TabStrip.HasMeasureTabItem)
|
|
{
|
|
MeasureTabItemEventArgs mea = new MeasureTabItemEventArgs(tab, bounds.Size);
|
|
m_TabStrip.InvokeMeasureTabItem(mea);
|
|
bounds.Size = mea.Size;
|
|
}
|
|
|
|
block.Bounds = bounds;
|
|
}
|
|
|
|
public override Rectangle FinalizeLayout(Rectangle containerBounds, Rectangle blocksBounds, ArrayList lines)
|
|
{
|
|
if (lines.Count > 1 && m_TabStrip.MultiLinePanelAlignSelectedTab)
|
|
{
|
|
// Make sure that selected tab is always at the bottom i.e. next to the tab panel
|
|
int selectedTabLine = GetSelectedTabLine(lines);
|
|
if (selectedTabLine >= 0)
|
|
{
|
|
if (m_TabStrip.TabAlignment == eTabStripAlignment.Bottom && selectedTabLine > 0)
|
|
SwitchTabLines(lines, selectedTabLine, 0);
|
|
else if(m_TabStrip.TabAlignment== eTabStripAlignment.Top && selectedTabLine<lines.Count-1)
|
|
SwitchTabLines(lines, selectedTabLine, lines.Count - 1);
|
|
else if (m_TabStrip.TabAlignment == eTabStripAlignment.Left && selectedTabLine < lines.Count - 1)
|
|
SwitchTabLines(lines, selectedTabLine, lines.Count - 1);
|
|
else if (m_TabStrip.TabAlignment == eTabStripAlignment.Right && selectedTabLine > 0)
|
|
SwitchTabLines(lines, selectedTabLine, 0);
|
|
}
|
|
}
|
|
|
|
return (blocksBounds);
|
|
}
|
|
|
|
private void SwitchTabLines(ArrayList lines, int fromLine, int toLine)
|
|
{
|
|
SerialContentLayoutManager.BlockLineInfo lineFrom = (SerialContentLayoutManager.BlockLineInfo)lines[fromLine];
|
|
SerialContentLayoutManager.BlockLineInfo lineTo = (SerialContentLayoutManager.BlockLineInfo)lines[toLine];
|
|
bool horizontalTabs = (m_TabStrip.TabAlignment == eTabStripAlignment.Top ||
|
|
m_TabStrip.TabAlignment == eTabStripAlignment.Bottom);
|
|
int fromPos = horizontalTabs ? ((IBlock) lineFrom.Blocks[0]).Bounds.Y
|
|
: ((IBlock) lineFrom.Blocks[0]).Bounds.X;
|
|
int toPos = horizontalTabs ? ((IBlock)lineTo.Blocks[0]).Bounds.Y
|
|
: ((IBlock)lineTo.Blocks[0]).Bounds.X;
|
|
lines[fromLine] = lineTo;
|
|
lines[toLine] = lineFrom;
|
|
foreach (IBlock item in lineTo.Blocks)
|
|
{
|
|
if (horizontalTabs)
|
|
item.Bounds = new Rectangle(item.Bounds.X, fromPos, item.Bounds.Width, item.Bounds.Height);
|
|
else
|
|
item.Bounds = new Rectangle(fromPos, item.Bounds.Y, item.Bounds.Width, item.Bounds.Height);
|
|
}
|
|
foreach (IBlock item in lineFrom.Blocks)
|
|
{
|
|
if (horizontalTabs)
|
|
item.Bounds = new Rectangle(item.Bounds.X, toPos, item.Bounds.Width, item.Bounds.Height);
|
|
else
|
|
item.Bounds = new Rectangle(toPos, item.Bounds.Y, item.Bounds.Width, item.Bounds.Height);
|
|
}
|
|
|
|
}
|
|
|
|
private int GetSelectedTabLine(ArrayList lines)
|
|
{
|
|
foreach (SerialContentLayoutManager.BlockLineInfo line in lines)
|
|
{
|
|
foreach (TabItem item in line.Blocks)
|
|
{
|
|
if (item.IsSelected)
|
|
return line.Line;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the padding in pixels for the measured text. Default is 4.
|
|
/// </summary>
|
|
public int TextPadding
|
|
{
|
|
get {return m_TextPadding;}
|
|
set {m_TextPadding=value;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the padding in pixels for the measured image size. Default is 4.
|
|
/// </summary>
|
|
public int ImagePadding
|
|
{
|
|
get {return m_ImagePadding;}
|
|
set {m_ImagePadding=value;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the padding in pixels that is added to the measured height of the tab. Default is 4.
|
|
/// </summary>
|
|
public int PaddingHeight
|
|
{
|
|
get {return m_PaddingHeight;}
|
|
set {m_PaddingHeight=value;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the padding in pixels that is added to the measured width of the tab. Default is 0.
|
|
/// </summary>
|
|
public int PaddingWidth
|
|
{
|
|
get {return m_PaddingWidth;}
|
|
set {m_PaddingWidth=value;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether text is always layed out horizontaly even if tabs are vertically aligned.
|
|
/// </summary>
|
|
public bool HorizontalText
|
|
{
|
|
get {return m_HorizontalText;}
|
|
set {m_HorizontalText=value;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the additional padding for the selected item.
|
|
/// </summary>
|
|
public int SelectedPaddingWidth
|
|
{
|
|
get {return m_SelectedPaddingWidth;}
|
|
set {m_SelectedPaddingWidth=value;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the fixed tab size in pixels. Either member can be set. Value of 0 indicates that size is automatically calculated which is
|
|
/// default behavior.
|
|
/// </summary>
|
|
public Size FixedTabSize
|
|
{
|
|
get { return m_FixedTabSize; }
|
|
set { m_FixedTabSize = value; }
|
|
}
|
|
|
|
public bool CloseButtonOnTabs
|
|
{
|
|
get { return m_CloseButtonOnTabs; }
|
|
set { m_CloseButtonOnTabs = value; }
|
|
}
|
|
|
|
public Size CloseButtonSize
|
|
{
|
|
get { return m_CloseButtonSize; }
|
|
set { m_CloseButtonSize = value; }
|
|
}
|
|
}
|
|
}
|