namespace DevComponents.DotNetBar
{
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
///
/// Defines the generic container item that is used by toolbar, menu bar and other control for item layout.
///
[System.ComponentModel.ToolboxItem(false),System.ComponentModel.DesignTimeVisible(false)]
public class GenericItemContainer:ImageItem, IDesignTimeProvider
{
#region Private Variables
protected int m_PaddingLeft, m_PaddingTop, m_PaddingBottom, m_PaddingRight, m_ItemSpacing;
private int m_FirstItemSpacing = 0;
protected eBorderType m_BorderType;
protected internal Color m_BackgroundColor;
protected bool m_WrapItems;
protected DisplayMoreItem m_MoreItems;
private bool m_MoreItemsOnMenu;
private bool m_EqualButtonSize;
private int m_DisplayedItems=0;
//private bool m_Stretch;
private bool m_SystemContainer;
private bool m_HaveCustomizeItem=false;
private eLayoutType m_LayoutType=eLayoutType.Toolbar;
private bool m_Scroll=false; // Indicates whether we use scrolling in container. Applies only to the "Task List" container.
private int m_ScrollTopPosition=0; // Indicates the first visible item from the top when scroll is used.
private bool m_TopScroll=false, m_BottomScroll=false;
private ScrollButton m_TopScrollButton=null,m_BottomScrollButton=null;
// Used to eat the mouse move messages when user is using the keyboard to browse through the
// top level menus. The problem was that on each repaint the mouse move was fired even though the
// mouse did not move at all. So if mouse was over an menu item it was not possible to switch to the
// new menu item becouse mouse was "holding" the focus.
private bool m_IgnoreDuplicateMouseMove=false;
private System.Windows.Forms.MouseEventArgs m_LastMouseMoveEvent=null;
private int m_MinWidth=0, m_MinHeight=0;
private bool m_Painting=false;
private bool m_EventHeight=true;
private bool m_UseMoreItemsButton=true;
private eContainerVerticalAlignment m_ToolbarItemsAlign = eContainerVerticalAlignment.Bottom;
private bool m_TrackSubItemsImageSize = true;
internal bool OverflowEnabled = true;
#endregion
#region Events
///
/// Occurs when new item is added to the container.
///
internal EventHandler ItemAdded;
#endregion
public GenericItemContainer()
{
// We contain other controls
m_IsContainer=true;
m_PaddingLeft=1;
m_PaddingTop=1;
m_PaddingBottom=1;
m_PaddingRight=1;
m_ItemSpacing=0;
m_BackgroundColor=Color.Empty;
m_BorderType=eBorderType.None;
m_WrapItems=false;
m_MoreItems=null;
m_EqualButtonSize=false;
//m_Stretch=false;
m_MoreItemsOnMenu=false;
m_SystemContainer=false;
this.AccessibleRole=System.Windows.Forms.AccessibleRole.Grouping;
}
protected override void Dispose(bool disposing)
{
if(m_TopScrollButton!=null)
{
if(m_TopScrollButton.Parent!=null)
m_TopScrollButton.Parent.Controls.Remove(m_TopScrollButton);
m_TopScrollButton.Dispose();
m_TopScrollButton=null;
}
if(m_BottomScrollButton!=null)
{
if(m_BottomScrollButton.Parent!=null)
m_BottomScrollButton.Parent.Controls.Remove(m_BottomScrollButton);
m_BottomScrollButton.Dispose();
m_BottomScrollButton=null;
}
base.Dispose(disposing);
}
internal int MinHeight
{
get {return m_MinHeight;}
set {m_MinHeight=value;}
}
internal int MinWidth
{
get {return m_MinWidth;}
set {m_MinWidth=value;}
}
///
/// Returns copy of GenericItemContainer item
///
public override BaseItem Copy()
{
GenericItemContainer objCopy=new GenericItemContainer();
this.CopyToItem(objCopy);
return objCopy;
}
protected override void CopyToItem(BaseItem copy)
{
GenericItemContainer objCopy=copy as GenericItemContainer;
base.CopyToItem(objCopy);
objCopy.WrapItems=m_WrapItems;
objCopy.EqualButtonSize=m_EqualButtonSize;
}
///
/// Paints this base container
///
public override void Paint(ItemPaintArgs pa)
{
if (this.SuspendLayout || m_Painting)
return;
eDotNetBarStyle effectiveStyle = EffectiveStyle;
m_Painting = true;
try
{
System.Drawing.Graphics g = pa.Graphics;
if (m_NeedRecalcSize)
{
RecalcSize();
}
int x = m_Rect.Left, y = m_Rect.Top;
Rectangle thisRect = new Rectangle(m_Rect.Left, m_Rect.Top, m_Rect.Width, m_Rect.Height);
switch (m_BorderType)
{
case eBorderType.Bump:
System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.Bump, System.Windows.Forms.Border3DSide.All);
thisRect.Inflate(-2, -2);
break;
case eBorderType.Etched:
System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.All);
thisRect.Inflate(-2, -2);
break;
case eBorderType.Raised:
System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.RaisedInner, System.Windows.Forms.Border3DSide.All);
thisRect.Inflate(-2, -2);
break;
case eBorderType.Sunken:
System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.SunkenOuter, System.Windows.Forms.Border3DSide.All);
thisRect.Inflate(-2, -2);
break;
case eBorderType.SingleLine:
// TODO: Beta 2 fix --> g.DrawRectangle(new Pen(SystemBrushes.ControlDark,1),m_Rect);
Pen pen = new Pen(SystemBrushes.ControlDark, 1);
NativeFunctions.DrawRectangle(g, pen, m_Rect);
pen.Dispose();
thisRect.Inflate(-1, -1);
break;
default:
break;
}
if (!m_BackgroundColor.IsEmpty)
{
SolidBrush brush = new SolidBrush(m_BackgroundColor);
g.FillRectangle(brush, thisRect);
brush.Dispose();
}
//else if(m_Style==eDotNetBarStyle.Office2000 || this.IsOnMenuBar)
// g.FillRectangle(SystemBrushes.Control,thisRect);
//else
// g.FillRectangle(new SolidBrush(ColorFunctions.ToolMenuFocusBackColor(g)),thisRect);
g.SetClip(thisRect);
if (m_SubItems != null)
{
BaseItem objItem = null;
int iDisplayed = 0;
ThemeToolbar theme = null;
ThemeToolbarParts part = ThemeToolbarParts.Separator;
ThemeToolbarStates state = ThemeToolbarStates.Normal;
if (this.IsThemed)
theme = pa.ThemeToolbar;
for (int iCurrentItem = 0; iCurrentItem < m_SubItems.Count; iCurrentItem++)
{
objItem = m_SubItems[iCurrentItem] as BaseItem;
if (objItem.Visible && objItem.Displayed)
{
if (objItem.BeginGroup && iDisplayed > 0 && m_LayoutType != eLayoutType.DockContainer && !(objItem is ItemContainer && BarFunctions.IsOffice2007Style(objItem.EffectiveStyle)))
{
if (m_Orientation == eOrientation.Vertical || m_LayoutType == eLayoutType.TaskList)
{
if (objItem.TopInternal == m_PaddingTop + m_Rect.Top || objItem.LeftInternal > m_PaddingLeft + m_Rect.Left)
{
// Vertical line on the left side
if (effectiveStyle == eDotNetBarStyle.Office2000)
System.Windows.Forms.ControlPaint.DrawBorder3D(g, objItem.LeftInternal - 4, objItem.TopInternal + 1, 2, m_Rect.Height - m_PaddingTop - m_PaddingBottom - 4, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Left);
else
{
if (theme != null)
{
part = ThemeToolbarParts.Separator;
theme.DrawBackground(g, part, state, new Rectangle(objItem.LeftInternal - 4, objItem.TopInternal + 1, 6, m_Rect.Height - m_PaddingBottom - 2));
}
else
{
using (Pen pen = new Pen(pa.Colors.ItemSeparator))
{
if (effectiveStyle == eDotNetBarStyle.OfficeXP)
g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 1, objItem.LeftInternal - 2, m_Rect.Bottom - m_PaddingBottom - 2);
else
{
g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 2, objItem.LeftInternal - 2, m_Rect.Bottom - m_PaddingBottom - 4);
Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1);
g.DrawLine(penLight, objItem.LeftInternal - 1, objItem.TopInternal + 3, objItem.LeftInternal - 1, m_Rect.Bottom - m_PaddingBottom - 5);
penLight.Dispose();
}
}
}
}
}
else
{
Point start = new Point(objItem.LeftInternal + m_PaddingLeft, objItem.TopInternal - 2);
Point end = new Point(objItem.DisplayRectangle.Right - m_PaddingRight, objItem.TopInternal - 2);
if (this.LayoutType == eLayoutType.TaskList)
{
start.X = this.LeftInternal + 1;
end.X = this.DisplayRectangle.Right - 2;
}
// Horizontal line
if (effectiveStyle == eDotNetBarStyle.Office2000)
System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 4, objItem.WidthInternal - 2, 2, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Top);
else
{
if (theme != null)
{
part = ThemeToolbarParts.SeparatorVert;
theme.DrawBackground(g, part, state, new Rectangle(start.X, start.Y, end.X - start.X, 6));
}
else
{
using (Pen pen = new Pen(pa.Colors.ItemSeparator))
{
if (effectiveStyle == eDotNetBarStyle.OfficeXP)
g.DrawLine(pen, start, end);
else
{
g.DrawLine(pen, start, end);
start.Offset(0, 1);
end.Offset(0, 1);
using (Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1))
g.DrawLine(penLight, start, end);
}
}
}
}
}
}
else
{
if (objItem.TopInternal == m_PaddingTop + m_Rect.Top || objItem.LeftInternal > m_PaddingLeft + m_Rect.Left)
{
// Vertical line on the left side
if (effectiveStyle == eDotNetBarStyle.Office2000)
System.Windows.Forms.ControlPaint.DrawBorder3D(g, objItem.LeftInternal - 4, objItem.TopInternal + 1, 2, objItem.HeightInternal - 2, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Left);
else
{
if (theme != null)
{
part = ThemeToolbarParts.Separator;
theme.DrawBackground(g, part, state, new Rectangle(objItem.LeftInternal - 4, objItem.TopInternal + 1, 6, objItem.HeightInternal - 3));
}
else
{
using (Pen pen = new Pen(pa.Colors.ItemSeparator))
{
if (effectiveStyle == eDotNetBarStyle.OfficeXP)
g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 1, objItem.LeftInternal - 2, objItem.TopInternal + 1 + objItem.HeightInternal - 3);
else
{
g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 4, objItem.LeftInternal - 2, objItem.TopInternal + 4 + objItem.HeightInternal - 8);
Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1);
g.DrawLine(penLight, objItem.LeftInternal - 1, objItem.TopInternal + 5, objItem.LeftInternal - 1, objItem.TopInternal + 5 + objItem.HeightInternal - 8);
penLight.Dispose();
}
}
}
}
}
else
{
// Horizontal line
if (effectiveStyle == eDotNetBarStyle.Office2000)
System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 4, m_Rect.Width - m_PaddingLeft - m_PaddingRight - 4, 2, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Top);
else
{
if (theme != null)
{
part = ThemeToolbarParts.SeparatorVert;
theme.DrawBackground(g, part, state, new Rectangle(m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 4, m_Rect.Width - m_PaddingRight - 2, 6));
}
else
{
using (Pen pen = new Pen(pa.Colors.ItemSeparator))
{
if (effectiveStyle == eDotNetBarStyle.OfficeXP)
g.DrawLine(pen, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 2, m_Rect.Right - m_PaddingRight - 2, objItem.TopInternal - 2);
else
{
g.DrawLine(pen, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 2, m_Rect.Right - m_PaddingRight - 2, objItem.TopInternal - 2);
Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1);
g.DrawLine(penLight, m_Rect.Left + m_PaddingLeft + 6, objItem.TopInternal - 1, m_Rect.Right - m_PaddingRight - 4, objItem.TopInternal - 1);
penLight.Dispose();
}
}
}
}
}
}
}
if (g.ClipBounds.IntersectsWith(objItem.DisplayRectangle))
objItem.Paint(pa);
iDisplayed++;
}
// Paint the Display More Items button if needed
if (m_MoreItems != null)
{
//Point loc = GetMoreItemsLocation();
//m_MoreItems.LeftInternal = loc.X;
//m_MoreItems.TopInternal = loc.Y;
//if(m_Orientation==eOrientation.Vertical)
//{
// m_MoreItems.LeftInternal=m_Rect.Left+m_PaddingLeft;
// m_MoreItems.TopInternal=m_Rect.Bottom-m_MoreItems.HeightInternal-m_PaddingBottom;
//}
//else
//{
// m_MoreItems.LeftInternal=m_Rect.Right-m_MoreItems.WidthInternal-m_PaddingRight;
// m_MoreItems.TopInternal=m_Rect.Top+m_PaddingTop;
//}
m_MoreItems.Paint(pa);
}
// if(m_LayoutType==eLayoutType.TaskList && m_Scroll)
// {
//
// }
}
}
g.ResetClip();
}
finally
{
m_Painting = false;
}
}
public eBorderType BorderType
{
get
{
return m_BorderType;
}
set
{
m_BorderType=value;
}
}
///
/// Set/Get does container wraps item into the new line when they exceed the container size
///
public bool WrapItems
{
get
{
return m_WrapItems;
}
set
{
m_WrapItems=value;
}
}
public int ItemSpacing
{
get
{
return m_ItemSpacing;
}
set
{
if(m_ItemSpacing==value)
return;
m_ItemSpacing=value;
NeedRecalcSize=true;
}
}
protected virtual int FirstItemSpacing
{
get { return m_FirstItemSpacing; }
set { m_FirstItemSpacing = value; }
}
///
/// Specifies whether to display more items on popup menu or Bar.
///
public bool MoreItemsOnMenu
{
get
{
return m_MoreItemsOnMenu;
}
set
{
m_MoreItemsOnMenu=value;
}
}
internal DisplayMoreItem MoreItems
{
get
{
return m_MoreItems;
}
}
public override void RecalcSize()
{
if(this.SuspendLayout)
return;
this.IsLayoutPass = true;
m_RecalculatingSize=true;
switch(m_LayoutType)
{
case eLayoutType.Toolbar:
RecalcSizeToolbar();
break;
case eLayoutType.TaskList:
RecalcSizeTaskList();
break;
case eLayoutType.DockContainer:
RecalcSizeDockContainer(false);
break;
}
base.RecalcSize();
m_RecalculatingSize=false;
this.IsLayoutPass = false;
}
private void RecalcSizeDockContainer(bool bFitContainer)
{
int iX=0, iY=0, iMaxWidth=0, iMaxHeight=0;
bool bOneDisplayed=false;
if(this.SuspendLayout)
return;
m_DisplayedItems=0;
int paddingLeft = Dpi.Width(m_PaddingLeft);
iX=paddingLeft+m_Rect.Left;
int paddingTop = Dpi.Height(m_PaddingTop);
iY=paddingTop+m_Rect.Top;
if(m_SubItems!=null)
{
for(int itemIndex=0;itemIndexiMaxWidth)
iMaxWidth=item.WidthInternal;
if(item.HeightInternal>iMaxHeight)
iMaxHeight=item.HeightInternal;
item.LeftInternal=iX;
item.TopInternal=iY;
if(!item.Visible)
{
item.Displayed=false;
continue;
}
else
m_DisplayedItems++;
if(!bOneDisplayed && (item.Displayed || itemIndex==this.SubItems.Count-1))
{
item.Displayed=true;
bOneDisplayed=true;
}
else
{
item.Displayed=false;
}
}
if(!bOneDisplayed)
{
foreach(BaseItem item in m_SubItems)
if(item.Visible)
{
item.Displayed=true;
break;
}
}
}
int paddingRight = Dpi.Width(m_PaddingRight);
int paddingBottom = Dpi.Height(m_PaddingBottom);
if((bFitContainer || this.Stretch))
{
if(iMaxWidth+paddingLeft+paddingRight0 && iMaxWidth+paddingLeft+paddingRight0 && iMaxHeight+paddingTop+paddingBottom
/// Recalculate Size of this item
///
private void RecalcSizeToolbar()
{
if(this.SuspendLayout)
return;
bool isRightToLeft = false;
Control containerControl = this.ContainerControl as Control;
if (containerControl != null)
isRightToLeft = (containerControl.RightToLeft == RightToLeft.Yes);
// This object for now have only border but it will have more potentially
int iX=0, iY=0, iMaxItem=0, iMaxItemWidth=0, iMaxItemHeight=0;
int iWidth=0, iHeight=0;
int iGroupLineSize=3;
int iLines=0;
bool bDisplayed=true;
bool bAdjustSize=false, bSetSize=false; // If horizontal orientation we need to make sure that Height of all items is same
int iDisplayed=0;
BaseItem objItem=null;
ArrayList FarAlignLines=null;
Stack FarAlignItems=null;
ArrayList StretchLines=null;
ArrayList StretchLinesISCount=null; // Holds the count of number of items stretched per line
ArrayList ItemsToStretch=null;
if(m_MoreItems!=null && m_MoreItems.Expanded)
m_MoreItems.Expanded=false;
if (EffectiveStyle == eDotNetBarStyle.Office2000)
iGroupLineSize=6;
int paddingLeft = Dpi.Width(m_PaddingLeft);
iX=paddingLeft+m_Rect.Left;
int paddingTop = Dpi.Height(m_PaddingTop);
iY=paddingTop+m_Rect.Top;
int iVisibleCount=this.VisibleSubItems;
int iVisible=0;
int paddingRight = Dpi.Width(m_PaddingRight);
int paddingBottom = Dpi.Height(m_PaddingBottom);
if(m_SubItems!=null)
{
bool bRepeat=false;
int iRepeatCount=0;
if(m_WrapItems || this.Stretch)
FarAlignLines=new ArrayList(3);
if(this.Stretch)
{
StretchLines=new ArrayList(3);
StretchLinesISCount=new ArrayList(3);
}
bool callRecalcSize = OnBeforeLayout();
int mItemSpacing = Dpi.Width(m_ItemSpacing);
int firstItemSpacing = Dpi.Width(m_FirstItemSpacing);
do
{
iDisplayed=0;
for (int iCurrentItem=0;iCurrentItem 1 || firstItemSpacing == 0) ? mItemSpacing : firstItemSpacing;
if(callRecalcSize)
objItem.RecalcSize();
if(bSetSize)
{
if(m_Orientation==eOrientation.Vertical)
objItem.WidthInternal=iMaxItemWidth;
else
objItem.HeightInternal=iMaxItemHeight;
}
switch(m_Orientation)
{
case eOrientation.Horizontal:
{
// Wrap to next line if needed
if(m_WrapItems)
{
if(objItem.BeginGroup && iDisplayed>0)
iX+=iGroupLineSize;
if (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right && iX > paddingLeft + m_Rect.Left)
{
iY += (iMaxItem + itemSpacing);
if(objItem.BeginGroup)
iY+=iGroupLineSize;
iX=paddingLeft+m_Rect.Left;
iMaxItem=0;
iLines++;
if(FarAlignItems!=null)
FarAlignItems=null;
if(ItemsToStretch!=null)
ItemsToStretch=null;
}
}
else if(bDisplayed)
{
if(objItem.BeginGroup && iDisplayed>0)
iX+=iGroupLineSize;
// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
if (OverflowEnabled && (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right - paddingRight && iX > paddingLeft + m_Rect.Left || (iX + objItem.WidthInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Right && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount)))
{
if(iCurrentItem==0)
iMaxItem=objItem.HeightInternal;
// Items don't fit any more the rest won't be visible
iX += (itemSpacing + DisplayMoreItem.FixedSize);
bDisplayed=false;
}
}
if(bDisplayed)
{
if(iDisplayed>0)
iX += itemSpacing;
objItem.LeftInternal = GetItemLayoutX(objItem, iX);
objItem.TopInternal = GetItemLayoutY(objItem, iY);
//iX+=objItem.WidthInternal+m_ItemSpacing;
iX+=GetItemLayoutWidth(objItem);
if(objItem.HeightInternal>iMaxItem)
{
iMaxItem=objItem.HeightInternal;
}
}
break;
}
case eOrientation.Vertical:
{
// Wrap to next line if needed
if(m_WrapItems)
{
if(objItem.BeginGroup && iDisplayed>0)
iY+=iGroupLineSize;
if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + m_Rect.Top)
{
iX += (iMaxItem + itemSpacing);
if(objItem.BeginGroup)
iX+=iGroupLineSize;
iY=paddingTop+m_Rect.Top;
iMaxItem=0;
iLines++;
if(FarAlignItems!=null)
FarAlignItems=null;
if(ItemsToStretch!=null)
ItemsToStretch=null;
}
}
else if(bDisplayed)
{
if(objItem.BeginGroup && iDisplayed>0)
iY+=iGroupLineSize;
// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + m_Rect.Top || (iY + objItem.HeightInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Bottom && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount))
{
if(iCurrentItem==0)
iMaxItem=objItem.WidthInternal;
// Items don't fit any more the rest won't be visible
iY += (itemSpacing + DisplayMoreItem.FixedSize);
bDisplayed=false;
}
}
if(bDisplayed)
{
if(iDisplayed>0)
iY += itemSpacing;
objItem.LeftInternal=iX;
objItem.TopInternal=iY;
iY+=GetItemLayoutHeight(objItem);
if(objItem.WidthInternal>iMaxItem)
{
iMaxItem=objItem.WidthInternal;
}
}
break;
}
default:
break;
}
if(bDisplayed)
{
if(objItem.WidthInternal!=iMaxItemWidth)
{
if(m_Orientation==eOrientation.Vertical && iMaxItemWidth!=0 && !bSetSize)
bAdjustSize=true;
if(objItem.WidthInternal>iMaxItemWidth)
iMaxItemWidth=objItem.WidthInternal;
}
if(objItem.HeightInternal!=iMaxItemHeight)
{
if(m_Orientation==eOrientation.Horizontal && iMaxItemHeight!=0 && !bSetSize)
bAdjustSize=true;
if(objItem.HeightInternal>iMaxItemHeight)
iMaxItemHeight=objItem.HeightInternal;
}
iDisplayed++;
}
objItem.Displayed=bDisplayed;
// Save right (Far) aligned items so we can adjust thiere position at the end
if(bDisplayed && FarAlignLines!=null && objItem.ItemAlignment==eItemAlignment.Far || FarAlignItems!=null)
{
if(FarAlignItems==null)
{
FarAlignItems=new Stack();
FarAlignLines.Add(FarAlignItems);
}
FarAlignItems.Push(objItem);
// no stretch after item has been far aligned
StretchLines=null;
}
// Save Items that we need to stretch
if(bDisplayed && objItem.Stretch && StretchLines!=null || ItemsToStretch!=null)
{
if(ItemsToStretch==null)
{
ItemsToStretch=new ArrayList(5);
StretchLines.Add(ItemsToStretch);
StretchLinesISCount.Add(0);
}
ItemsToStretch.Add(objItem);
if(objItem.Stretch)
StretchLinesISCount[StretchLinesISCount.Count-1]=(int)StretchLinesISCount[StretchLinesISCount.Count-1]+1;
}
// Track the size if this container
if(iX>iWidth)
iWidth=iX;
if(iY>iHeight)
iHeight=iY;
}
else if(objItem!=null)
objItem.Displayed=false;
}
// Check do we have to repeat the process
// This is needed if container is in wrap mode and some items do not fit
// This is done to ensure the minimum size of the container for example
// if container with is smaller than width of one single item inside the
// container width has to be set to widest item in the list and then the
// size has to be recalculated again.
if(m_WrapItems && iLines>0 && iRepeatCount<1)
{
if(m_Orientation==eOrientation.Horizontal && (iWidth>m_Rect.Width || bAdjustSize))
{
bRepeat=true;
m_Rect.Width=iWidth+paddingLeft+paddingRight;
iX=paddingLeft+m_Rect.Left;
iY=paddingTop+m_Rect.Top;
iWidth=0;
iHeight=0;
}
else if(m_Orientation==eOrientation.Vertical && (iHeight>m_Rect.Height || bAdjustSize))
{
bRepeat=true;
m_Rect.Height=iHeight+paddingTop+paddingBottom;
iX=paddingLeft+m_Rect.Left;
iY=paddingTop+m_Rect.Top;
iWidth=0;
iHeight=0;
}
if(bAdjustSize)
{
if(m_EventHeight)
bSetSize=true;
bAdjustSize=false;
}
// Reset alignment collections since new iteration can cause different lines
if(bRepeat && iRepeatCount+1<2)
{
if(FarAlignLines!=null && FarAlignLines.Count>0)
FarAlignLines=new ArrayList(3);
// Reset stretch collection for same reason
if(StretchLines!=null && StretchLines.Count>0)
{
StretchLines=new ArrayList(3);
StretchLinesISCount=new ArrayList(3);
}
}
}
iRepeatCount++;
} while (bRepeat && iRepeatCount<2);
}
if(m_EqualButtonSize)
{
// Make all buttons same width, do the same thing as loop above
iX=paddingLeft+m_Rect.Left;
iY=paddingTop+m_Rect.Top;
iWidth=0;
iHeight=0;
bDisplayed=true;
iLines=0;
bAdjustSize=false; // Size will be adjusted reset
iDisplayed=0;
// Reset alignment collections since new iteration can cause different lines
if(FarAlignLines!=null && FarAlignLines.Count>0)
FarAlignLines=new ArrayList(3);
// Reset stretch collection for same reason
if(StretchLines!=null && StretchLines.Count>0)
{
StretchLines=new ArrayList(3);
StretchLinesISCount=new ArrayList(3);
}
for (int iCurrentItem=0;iCurrentItem 1 || m_FirstItemSpacing == 0) ? m_ItemSpacing : m_FirstItemSpacing;
if(objItem.SystemItem)
{
if(m_Orientation==eOrientation.Vertical)
objItem.WidthInternal=iMaxItemWidth;
else
objItem.HeightInternal=iMaxItemHeight;
}
else
{
objItem.WidthInternal=iMaxItemWidth;
objItem.HeightInternal=iMaxItemHeight;
}
switch(m_Orientation)
{
case eOrientation.Horizontal:
{
// Wrap to next line if needed
if(m_WrapItems)
{
if(objItem.BeginGroup)
iX+=iGroupLineSize;
if (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right && iX > paddingLeft + paddingRight)
{
iY += (iMaxItem + itemSpacing);
if(objItem.BeginGroup)
iY+=iGroupLineSize;
iX=paddingLeft+m_Rect.Left;
iMaxItem=0;
iLines++;
if(FarAlignItems!=null)
FarAlignItems=null;
if(ItemsToStretch!=null)
ItemsToStretch=null;
}
}
else if(bDisplayed)
{
if(objItem.BeginGroup)
iX+=iGroupLineSize;
// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
if (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right && iX > paddingLeft + m_Rect.Left || (iX + objItem.WidthInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Right && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount))
{
// Items don't fit any more the rest won't be visible
iX += (itemSpacing + DisplayMoreItem.FixedSize);
bDisplayed=false;
}
}
if(bDisplayed)
{
objItem.LeftInternal=iX;
objItem.TopInternal=iY;
iX += objItem.WidthInternal + itemSpacing;
if(objItem.HeightInternal>iMaxItem)
{
iMaxItem=objItem.HeightInternal;
}
}
break;
}
case eOrientation.Vertical:
{
// Wrap to next line if needed
if(m_WrapItems)
{
if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + paddingBottom)
{
iX += (iMaxItem + itemSpacing);
iY=paddingTop+m_Rect.Top;
iMaxItem=0;
iLines++;
if(FarAlignItems!=null)
FarAlignItems=null;
if(ItemsToStretch!=null)
ItemsToStretch=null;
}
}
else if(bDisplayed)
{
// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + m_Rect.Top || (iY + objItem.HeightInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Bottom && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount))
{
// Items don't fit any more the rest won't be visible
iY += (itemSpacing + DisplayMoreItem.FixedSize);
bDisplayed=false;
}
}
if(bDisplayed)
{
objItem.LeftInternal=iX;
objItem.TopInternal=iY;
iY += objItem.HeightInternal + itemSpacing;
if(objItem.WidthInternal>iMaxItem)
{
iMaxItem=objItem.WidthInternal;
}
}
break;
}
default:
break;
}
objItem.Displayed=bDisplayed;
if(bDisplayed)
iDisplayed++;
// Save right (Far) aligned items so we can adjust thiere position at the end
if(bDisplayed && FarAlignLines!=null && objItem.ItemAlignment==eItemAlignment.Far || FarAlignItems!=null)
{
if(FarAlignItems==null)
{
FarAlignItems=new Stack();
FarAlignLines.Add(FarAlignItems);
}
FarAlignItems.Push(objItem);
// no stretch after item has been far aligned
StretchLines=null;
}
// Save Items that we need to stretch, but not after item is far aligned
if(bDisplayed && objItem.Stretch && StretchLines!=null || ItemsToStretch!=null)
{
if(ItemsToStretch==null)
{
ItemsToStretch=new ArrayList(5);
StretchLines.Add(ItemsToStretch);
StretchLinesISCount.Add(0);
}
ItemsToStretch.Add(objItem);
if(objItem.Stretch)
StretchLinesISCount[StretchLinesISCount.Count-1]=(int)StretchLinesISCount[StretchLinesISCount.Count-1]+1;
}
// Track the size if this container
if(iX>iWidth)
iWidth=iX;
if(iY>iHeight)
iHeight=iY;
}
}
}
m_DisplayedItems=iDisplayed;
if (_FillsContainerControl)
{
if (m_Orientation == eOrientation.Vertical)
iMaxItemWidth = m_Rect.Width - paddingLeft;
else
iMaxItemHeight = m_Rect.Height - paddingTop;
bAdjustSize = true;
}
if (bAdjustSize)
{
if(m_Orientation==eOrientation.Vertical)
{
foreach(BaseItem objTmp in this.SubItems)
{
if(m_EventHeight)
objTmp.WidthInternal=iMaxItemWidth;
else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Bottom)
objTmp.LeftInternal+=(iMaxItemWidth-objTmp.WidthInternal);
else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Middle)
objTmp.LeftInternal += (iMaxItemWidth - objTmp.WidthInternal) / 2;
}
}
else
{
foreach(BaseItem objTmp in this.SubItems)
{
if (m_EventHeight)
objTmp.HeightInternal = iMaxItemHeight;
else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Bottom)
objTmp.TopInternal += (iMaxItemHeight - objTmp.HeightInternal);
else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Middle && iMaxItemHeight != objTmp.HeightInternal)
objTmp.TopInternal += (int)Math.Ceiling((float)(iMaxItemHeight - objTmp.HeightInternal) / 2) /*+ 1*/;
}
}
}
// Add max width or height depending on arrange type...
switch(m_Orientation)
{
case eOrientation.Horizontal:
{
iHeight+=iMaxItem;
break;
}
case eOrientation.Vertical:
{
iWidth+=iMaxItem;
break;
}
default:
break;
}
if(this.Stretch)
{
if(m_Orientation==eOrientation.Horizontal)
{
m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
// Only if suggested Width is less than our width change it
// This will disable stretchable items support for wrapable containers, every line width
// would have to be tracked so stretchable items can work
if(StretchLines!=null && StretchLines.Count>0)
StretchItems(StretchLines,StretchLinesISCount,iWidth+paddingRight-m_Rect.Left);
if(m_Rect.Width0)
// StretchItems(StretchLines,StretchLinesISCount,iWidth+m_PaddingRight-m_Rect.Left);
}
else if(m_Orientation==eOrientation.Vertical)
{
m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
if(StretchLines!=null && StretchLines.Count>0)
StretchItems(StretchLines,StretchLinesISCount,iHeight+paddingBottom-m_Rect.Top);
// Only if suggested Height is less than our height change it
if(m_Rect.Height0)
// StretchItems(StretchLines,StretchLinesISCount,iHeight+m_PaddingBottom-m_Rect.Top);
}
else
{
m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
}
}
else
{
// If all items did not fit and we are not wrapping take suggested sizes
if(!m_WrapItems && !bDisplayed)
{
// Horizontal, just adjust Height, we will honor width
if(m_Orientation==eOrientation.Horizontal)
m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
else if(m_Orientation==eOrientation.Vertical)
m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
}
else
{
// If there are no items take suggested width by container control
if(m_DisplayedItems>0)
{
m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
}
/*else
{
m_Rect.Width=m_PaddingLeft+m_PaddingRight;
m_Rect.Height=m_PaddingTop+m_PaddingBottom;
}*/
}
}
// If we don't wrap and there are items left to display
if(!m_WrapItems && !bDisplayed && m_UseMoreItemsButton)
CreateMoreItemsButton(isRightToLeft);
else if(m_MoreItems!=null)
{
// Clean up, we don't need this anymore
m_MoreItems.Dispose();
m_MoreItems=null;
}
// Align Items if needed
if(FarAlignLines!=null && FarAlignLines.Count>0)
AlignItemsFar(FarAlignLines);
if (isRightToLeft && m_Orientation == eOrientation.Horizontal)
MirrorPositionItems();
m_NeedRecalcSize=false;
if(m_Parent!=null)
{
m_Parent.SubItemSizeChanged(this);
}
}
protected virtual int GetItemLayoutX(BaseItem objItem, int iX)
{
return iX;
}
protected virtual int GetItemLayoutY(BaseItem objItem, int iY)
{
return iY;
}
protected virtual int GetItemLayoutHeight(BaseItem objItem)
{
return objItem.HeightInternal;
}
protected virtual int GetItemLayoutWidth(BaseItem objItem)
{
return objItem.WidthInternal;
}
protected virtual bool OnBeforeLayout()
{
return true;
}
protected void MirrorPositionItems()
{
Rectangle bounds = this.DisplayRectangle;
foreach (BaseItem item in this.SubItems)
{
item.LeftInternal = bounds.Right - ((item.DisplayRectangle.X-bounds.X) + item.DisplayRectangle.Width);
}
}
private void RecalcSizeTaskList()
{
int paddingTop = Dpi.Width(m_PaddingTop);
int paddingLeft = Dpi.Height(m_PaddingLeft);
int iX=m_Rect.Left+paddingLeft, iY=m_Rect.Top+paddingTop, iMaxItemWidth=0, iMaxItemHeight=0;
int iWidth=0, iHeight=0;
int iGroupLineSize=3;
bool bDisplayed=true;
int iDisplayed=0;
Stack FarAlignItems=null;
if (EffectiveStyle == eDotNetBarStyle.Office2000)
iGroupLineSize=6;
if(m_EqualButtonSize)
{
foreach(BaseItem item in m_SubItems)
{
item.Orientation=eOrientation.Horizontal;
item.RecalcSize();
if(item.WidthInternal>iMaxItemWidth)
iMaxItemWidth=item.WidthInternal;
if(item.HeightInternal>iMaxItemHeight)
iMaxItemHeight=item.HeightInternal;
}
}
for(int iCurrentItem=0;iCurrentItem0)
iY+=iGroupLineSize;
if(!m_EqualButtonSize)
{
if(objItem.WidthInternal>iMaxItemWidth)
iMaxItemWidth=objItem.WidthInternal;
if(objItem.HeightInternal>iMaxItemHeight)
iMaxItemHeight=objItem.HeightInternal;
}
else
{
objItem.WidthInternal=iMaxItemWidth;
objItem.HeightInternal=iMaxItemHeight;
}
objItem.TopInternal=iY;
objItem.LeftInternal=iX;
iY+=objItem.HeightInternal;
objItem.Displayed=bDisplayed;
if(!bDisplayed)
continue;
if(iY>m_Rect.Bottom)
{
bDisplayed=false;
FarAlignItems=null;
objItem.Displayed=false;
continue;
}
if(FarAlignItems!=null && FarAlignItems.Count>0)
FarAlignItems.Push(objItem);
iDisplayed++;
if(objItem.ItemAlignment==eItemAlignment.Far)
{
if(FarAlignItems==null)
FarAlignItems=new Stack(10);
FarAlignItems.Push(objItem);
}
}
int paddingRight = Dpi.Width(m_PaddingRight);
iWidth=iMaxItemWidth+paddingLeft+paddingRight;
int paddingBottom = Dpi.Width(m_PaddingBottom);
iHeight=iY+paddingBottom-m_Rect.Top;
m_DisplayedItems=iDisplayed;
if(this.Stretch)
{
if(bDisplayed && FarAlignItems!=null && FarAlignItems.Count>0)
{
// We need to move "far" align items to the appropriate position at the bottom
AlignItemsFar(FarAlignItems, eOrientation.Vertical); // Vertical becouse this is "vertical layout"
}
Bar bar=this.ContainerControl as Bar;
if(bar==null || bar!=null && bar.DockSide!=eDockSide.Top && bar.DockSide!=eDockSide.Bottom)
m_Rect.Width=iWidth;
if(m_Rect.HeightiHeight && bDisplayed)
m_Rect.Height=iHeight;
if(!bDisplayed)
{
if(m_Rect.Height<36)
m_Rect.Height=36;
// We need to scroll content
m_Scroll=true;
RepositionItems();
}
else
{
m_Scroll=false;
m_ScrollTopPosition=0;
}
}
if(m_MoreItems!=null)
{
m_MoreItems.Dispose();
m_MoreItems=null;
}
SetupScrollButtons();
}
private int GroupLineSize
{
get
{
if (EffectiveStyle == eDotNetBarStyle.Office2000)
return 6;
return 3;
}
}
private void RepositionItems()
{
int iTop=0;
int iDisplayed=0;
int iGroupLineSize=this.GroupLineSize;
bool bDisplayed=true;
m_TopScroll=false;
m_BottomScroll=false;
// Move "invisible" items up
for(int i=m_ScrollTopPosition-1;i>=0;i--)
{
BaseItem objItem=m_SubItems[i];
if(!objItem.Visible)
continue;
iTop-=objItem.HeightInternal;
objItem.TopInternal=iTop;
objItem.Displayed=false;
if(objItem.BeginGroup && i>0)
iTop-=iGroupLineSize;
}
// Move visible items down
iTop=m_Rect.Top;
for(int i=m_ScrollTopPosition;i0)
iTop+=iGroupLineSize;
objItem.TopInternal=iTop;
iTop+=objItem.HeightInternal;
if(iTop>m_Rect.Bottom)
{
objItem.Displayed=false;
bDisplayed=false;
continue;
}
iDisplayed++;
}
m_DisplayedItems=iDisplayed;
if(!bDisplayed)
m_BottomScroll=true;
if(m_ScrollTopPosition>0)
m_TopScroll=true;
}
private void SetupScrollButtons()
{
bool bDestroyTop=false,bDestroyBottom=false;
if(!m_Scroll)
{
bDestroyTop=true;
bDestroyBottom=true;
}
else
{
if(!m_TopScroll)
bDestroyTop=true;
if(!m_BottomScroll)
bDestroyBottom=true;
}
if(bDestroyTop)
{
if(m_TopScrollButton!=null)
{
if(m_TopScrollButton.Parent!=null)
m_TopScrollButton.Parent.Controls.Remove(m_TopScrollButton);
m_TopScrollButton.Dispose();
m_TopScrollButton=null;
}
}
else
{
if(m_TopScrollButton==null)
{
System.Windows.Forms.Control ctrl=this.ContainerControl as System.Windows.Forms.Control;
if(ctrl!=null)
{
m_TopScrollButton=new ScrollButton();
m_TopScrollButton.Orientation=eOrientation.Vertical;
m_TopScrollButton.ButtonAlignment=eItemAlignment.Near;
ctrl.Controls.Add(m_TopScrollButton);
m_TopScrollButton.Click+=new EventHandler(ScrollClick);
}
}
if(m_TopScrollButton!=null)
{
m_TopScrollButton.Location=m_Rect.Location;
m_TopScrollButton.Size=new Size(m_Rect.Width,10);
m_TopScrollButton.BringToFront();
}
}
if(bDestroyBottom)
{
if(m_BottomScrollButton!=null)
{
if(m_BottomScrollButton.Parent!=null)
m_BottomScrollButton.Parent.Controls.Remove(m_BottomScrollButton);
m_BottomScrollButton.Dispose();
m_BottomScrollButton=null;
}
}
else
{
if(m_BottomScrollButton==null)
{
System.Windows.Forms.Control ctrl=this.ContainerControl as System.Windows.Forms.Control;
if(ctrl!=null)
{
m_BottomScrollButton=new ScrollButton();
m_BottomScrollButton.Orientation=eOrientation.Vertical;
m_BottomScrollButton.ButtonAlignment=eItemAlignment.Far;
ctrl.Controls.Add(m_BottomScrollButton);
m_BottomScrollButton.Click+=new EventHandler(ScrollClick);
}
}
if(m_BottomScrollButton!=null)
{
m_BottomScrollButton.Location=new Point(m_Rect.X,m_Rect.Bottom-10);
m_BottomScrollButton.Size=new Size(m_Rect.Width,10);
m_BottomScrollButton.BringToFront();
}
}
}
private void ScrollClick(object sender, EventArgs e)
{
if(sender==m_TopScrollButton)
{
m_ScrollTopPosition--;
}
else
{
m_ScrollTopPosition++;
}
RepositionItems();
SetupScrollButtons();
this.Refresh();
}
private void AlignItemsFar(Stack FarAlignItems, eOrientation orientation)
{
int iPos=0;
int iGroupLineSize=this.GroupLineSize;
if(orientation==eOrientation.Horizontal)
{
int paddingRight = Dpi.Width(m_PaddingRight);
iPos=m_Rect.Right-paddingRight;
if(m_MoreItems!=null)
iPos-=m_MoreItems.WidthInternal;
while(FarAlignItems.Count>0)
{
BaseItem objItem=FarAlignItems.Pop() as BaseItem;
if(objItem.Displayed && objItem.Visible)
{
objItem.LeftInternal=iPos- GetItemLayoutWidth(objItem);
iPos=objItem.LeftInternal-m_ItemSpacing;
if(objItem.BeginGroup)
iPos-=iGroupLineSize;
}
}
}
else
{
int paddingBottom = Dpi.Height(m_PaddingBottom);
iPos=m_Rect.Bottom-paddingBottom;
if(m_MoreItems!=null)
iPos-=m_MoreItems.HeightInternal;
while(FarAlignItems.Count>0)
{
BaseItem objItem=FarAlignItems.Pop() as BaseItem;
if(objItem.Displayed && objItem.Visible)
{
objItem.TopInternal=iPos-GetItemLayoutHeight(objItem);
iPos=objItem.TopInternal-m_ItemSpacing;
if(objItem.BeginGroup)
iPos-=iGroupLineSize;
}
}
}
}
private void AlignItemsFar(ArrayList FarAlignLines, eOrientation orientation)
{
if(orientation==eOrientation.Horizontal)
{
foreach(Stack FarAlignItems in FarAlignLines)
AlignItemsFar(FarAlignItems,orientation);
}
else
{
foreach(Stack FarAlignItems in FarAlignLines)
AlignItemsFar(FarAlignItems,orientation);
}
}
private void AlignItemsFar(ArrayList FarAlignLines)
{
AlignItemsFar(FarAlignLines, this.Orientation);
}
private void StretchItems(ArrayList StretchLines, ArrayList StretchLinesISCount, int CalculatedSize)
{
int iOffset=0;
int iStretch=0;
for(int i=0;i
/// This must be called by child item to let the parent know that its size
/// has been changed.
///
public override void SubItemSizeChanged(BaseItem objChildItem)
{
//if(!objChildItem.Visible || !objChildItem.Displayed)
//{
// return;
//}
NeedRecalcSize=true;
if(this.Displayed)
{
if(m_Parent==null)
{
if(this.ContainerControl is Bar)
((Bar)this.ContainerControl).RecalcLayout();
else if(this.ContainerControl is MenuPanel)
((MenuPanel)this.ContainerControl).RecalcSize();
}
else
m_Parent.SubItemSizeChanged(this);
}
else
{
if(m_Parent==null)
this.RecalcSize();
else
m_Parent.SubItemSizeChanged(this);
}
}
public override void InternalMouseHover()
{
if(m_MoreItems!=null && m_MoreItems.Expanded && m_HotSubItem!=m_MoreItems && this.DesignMode)
{
m_MoreItems.Expanded=false;
}
base.InternalMouseHover();
}
public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
{
if(m_MoreItems!=null && m_MoreItems.Expanded && m_HotSubItem!=m_MoreItems && !this.DesignMode)
{
m_MoreItems.Expanded=false;
}
base.InternalMouseDown(objArg);
}
///
/// Occurs when the mouse pointer is over the item and a mouse button is released. This is used by internal implementation only.
///
[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override void InternalMouseUp(System.Windows.Forms.MouseEventArgs objArg)
{
base.InternalMouseUp(objArg);
if(m_HotSubItem==null && (this.IsOnMenuBar || this.LayoutType==eLayoutType.Toolbar))
{
BaseItem expanded=this.ExpandedItem();
if(expanded!=null && expanded is PopupItem)
expanded.InternalMouseUp(objArg);
}
}
public override void InternalMouseMove(System.Windows.Forms.MouseEventArgs objArg)
{
if(m_IgnoreDuplicateMouseMove)
{
if(m_LastMouseMoveEvent==null)
{
m_LastMouseMoveEvent=new System.Windows.Forms.MouseEventArgs(objArg.Button,objArg.Clicks,objArg.X,objArg.Y,objArg.Delta);
return;
}
if(m_LastMouseMoveEvent.X!=objArg.X || m_LastMouseMoveEvent.Y!=objArg.Y ||
m_LastMouseMoveEvent.Button!=objArg.Button)
{
m_IgnoreDuplicateMouseMove=false;
m_LastMouseMoveEvent=null;
}
else
return;
}
//DotNetBarManager owner=this.GetOwner();
//if(!this.DesignMode && owner!=null && owner.GetFocusItem()!=null)
// return;
// Call base implementation if we don't have the more items button
if(m_MoreItems==null || !m_MoreItems.DisplayRectangle.Contains(objArg.X,objArg.Y) || this.DesignMode)
{
bool bMenuBar=this.IsOnMenuBar;
if (bMenuBar || this.LayoutType == eLayoutType.Toolbar)
{
BaseItem expanded = this.ExpandedItem();
if (expanded != null)
expanded.InternalMouseMove(objArg);
m_CheckMouseMovePressed = true;
}
else
m_CheckMouseMovePressed = false;
if(objArg.Button==System.Windows.Forms.MouseButtons.None || this.DesignMode || (bMenuBar || this.LayoutType==eLayoutType.Toolbar))
base.InternalMouseMove(objArg);
return;
}
// Mouse is over our more items button
BaseItem objNew=m_MoreItems;
if(objNew!=m_HotSubItem)
{
if(m_HotSubItem!=null)
{
m_HotSubItem.InternalMouseLeave();
//if(objNew!=null && m_AutoExpand && m_HotSubItem.Expanded)
if(objNew!=null && m_HotSubItem.Expanded)
m_HotSubItem.Expanded=false;
}
if(objNew!=null)
{
if(m_AutoExpand)
{
BaseItem objItem=ExpandedItem();
if(objItem!=null && objItem!=objNew)
objItem.Expanded=false;
}
objNew.InternalMouseEnter();
objNew.InternalMouseMove(objArg);
if (m_AutoExpand && objNew.GetEnabled() && objNew.ShowSubItems)
{
if(objNew is PopupItem)
{
PopupItem pi=objNew as PopupItem;
ePopupAnimation oldAnim=pi.PopupAnimation;
pi.PopupAnimation=ePopupAnimation.None;
objNew.Expanded=true;
pi.PopupAnimation=oldAnim;
}
else
objNew.Expanded=true;
}
m_HotSubItem=objNew;
}
else
m_HotSubItem=null;
}
else if(m_HotSubItem!=null)
{
m_HotSubItem.InternalMouseMove(objArg);
}
}
public override void InternalKeyDown(System.Windows.Forms.KeyEventArgs objArg)
{
base.InternalKeyDown(objArg);
if(SubItems.Count==0 || objArg.Handled)
return;
BaseItem objExpanded=this.ExpandedItem();
if(objExpanded!=null)
{
objExpanded.InternalKeyDown(objArg);
if(objArg.Handled)
return;
}
if(objArg.KeyCode==System.Windows.Forms.Keys.Right || objArg.KeyCode==System.Windows.Forms.Keys.Tab || objArg.KeyCode==System.Windows.Forms.Keys.Left)
{
m_IgnoreDuplicateMouseMove=true;
// Select next object
if(m_HotSubItem!=null)
{
m_HotSubItem.InternalMouseLeave();
if(m_AutoExpand && m_HotSubItem.Expanded)
{
m_HotSubItem.Expanded=false;
}
}
if(objArg.KeyCode==System.Windows.Forms.Keys.Left)
{
int iIndex=0;
if(m_HotSubItem!=null)
iIndex=this.SubItems.IndexOf(m_HotSubItem)-1;
if(iIndex<0)
iIndex=this.SubItems.Count-1;
BaseItem objNew=null;
bool bRepeat=false;
do
{
for(int i=iIndex;i>=0;i--)
{
objNew=this.SubItems[i];
if (objNew.Visible && objNew.GetEnabled())
{
iIndex=i;
break;
}
}
if (!this.SubItems[iIndex].Visible || !this.SubItems[iIndex].GetEnabled())
{
if(!bRepeat)
{
iIndex=this.SubItems.Count-1;
bRepeat=true;
}
else
bRepeat=false;
}
else
bRepeat=false;
} while(bRepeat);
m_HotSubItem=this.SubItems[iIndex];
}
else
{
int iIndex=0;
if(m_HotSubItem!=null)
iIndex=this.SubItems.IndexOf(m_HotSubItem)+1;
while (iIndex < this.SubItems.Count && (!this.SubItems[iIndex].Visible || !this.SubItems[iIndex].GetEnabled()))
iIndex++;
if(iIndex>=this.SubItems.Count)
iIndex=0;
BaseItem objNew=null;
for(int i=iIndex;i0))
{
m_HotSubItem.Expanded=true;
if(m_HotSubItem is PopupItem && ((PopupItem)m_HotSubItem).PopupControl is MenuPanel)
((MenuPanel)((PopupItem)m_HotSubItem).PopupControl).SelectFirstItem();
}
objArg.Handled=true;
}
if (objArg.KeyCode == System.Windows.Forms.Keys.Down && this.IsOnMenuBar)
{
m_IgnoreDuplicateMouseMove = true;
// Select next object
if (m_HotSubItem != null && !m_HotSubItem.Expanded && m_HotSubItem.VisibleSubItems > 0)
m_HotSubItem.Expanded = true;
}
else if (objArg.KeyCode == System.Windows.Forms.Keys.Escape)
{
if (objExpanded != null)
{
objExpanded.Expanded = false;
objArg.Handled = true;
}
else
{
Control cc = this.ContainerControl as Control;
if (cc is Bar)
{
Bar bar = cc as Bar;
if (bar.BarState == eBarState.Popup)
{
bar.ParentItem.Expanded = false;
}
else
{
if (this.AutoExpand)
this.AutoExpand = false;
else if (bar.Focused || bar.MenuFocus)
{
bar.MenuFocus = false;
bar.ReleaseFocus();
}
}
objArg.Handled = true;
}
else if (cc is ItemControl)
{
ItemControl ic = cc as ItemControl;
if (this.AutoExpand)
this.AutoExpand = false;
else if (ic.Focused || ic.MenuFocus)
{
ic.MenuFocus = false;
ic.ReleaseFocus();
}
}
}
}
else
{
BaseItem objItem = this.ExpandedItem();
if (objItem != null)
objItem.InternalKeyDown(objArg);
else
{
int key = 0;
if (objArg.Shift)
{
try
{
byte[] keyState = new byte[256];
if (NativeFunctions.GetKeyboardState(keyState))
{
byte[] chars = new byte[2];
if (NativeFunctions.ToAscii((uint)objArg.KeyValue, 0, keyState, chars, 0) != 0)
{
key = chars[0];
}
}
}
catch (Exception)
{
key = 0;
}
}
if (key == 0)
key = (int)NativeFunctions.MapVirtualKey((uint)objArg.KeyValue, 2);
bool b = false;
if (key > 0)
b = AccessKeyDown(key);
if (b)
objArg.Handled = true;
if (!b && m_HotSubItem != null)
m_HotSubItem.InternalKeyDown(objArg);
}
}
}
// Checks whether Access key is pressed and expands item if it was. Applies to menu bar items only
// Assumes that NO item is expanded when call is made
private bool AccessKeyDown(int KeyCode)
{
char[] ch=new char[1];
byte[] by=new byte[1];
try
{
by[0]=System.Convert.ToByte(KeyCode);
System.Text.Encoding.Default.GetDecoder().GetChars(by,0,1,ch,0);
}
catch(Exception)
{
return false;
}
string s=ch[0].ToString();
if(s=="")
return false;
ch[0]=(s.ToLower())[0];
BaseItem expandedItem=this.ExpandedItem();
if(expandedItem!=null && expandedItem is PopupItem && ((PopupItem)expandedItem).PopupType==ePopupType.Menu)
{
System.Windows.Forms.KeyEventArgs ke=new System.Windows.Forms.KeyEventArgs((System.Windows.Forms.Keys)KeyCode);
expandedItem.InternalKeyDown(ke);
if(ke.Handled)
{
m_IgnoreDuplicateMouseMove=true;
return true;
}
}
foreach(BaseItem objItem in this.SubItems)
{
if (objItem.Visible && objItem.GetEnabled() && objItem.Displayed && objItem.AccessKey == ch[0])
{
if(objItem is ButtonItem && ((ButtonItem)objItem).ButtonStyle==eButtonStyle.Default && !this.IsOnMenuBar && !this.IsOnMenu)
continue;
if (objItem.SubItems.Count > 0 && objItem.ShowSubItems && objItem.GetEnabled())
{
if(objItem.Expanded)
{
objItem.InternalKeyDown(new System.Windows.Forms.KeyEventArgs((System.Windows.Forms.Keys)KeyCode));
}
else
ExpandItem(objItem);
}
else
objItem.RaiseClick();
m_IgnoreDuplicateMouseMove=true;
return true;
}
}
return false;
}
internal bool SysKeyDown(int KeyCode)
{
return AccessKeyDown(KeyCode);
// char[] ch=new char[1];
// byte[] by=new byte[1];
// by[0]=System.Convert.ToByte(KeyCode);
// System.Text.Encoding.Default.GetDecoder().GetChars(by,0,1,ch,0);
// string s=ch[0].ToString();
// ch[0]=(s.ToLower())[0];
// foreach(BaseItem objItem in this.SubItems)
// {
// if(objItem.Displayed && objItem.AccessKey==ch[0])
// {
// if(!objItem.Expanded)
// {
// ExpandItem(objItem);
//// // Set the focus here so it can be properly released...
//// Bar bar=this.ContainerControl as Bar;
//// if(bar!=null)
//// bar.Focus();
//// if(m_HotSubItem!=null)
//// m_HotSubItem.InternalMouseLeave();
//// m_HotSubItem=objItem;
//// objItem.InternalMouseEnter();
//// objItem.Expanded=true;
//// if(objItem is PopupItem)
//// this.AutoExpand=true;
// }
// return true;
// }
// }
// return false;
}
private void ExpandItem(BaseItem objItem)
{
// Set the focus here so it can be properly released...
Control cc = this.ContainerControl as Control;
//if(bar!=null && !bar.Focused) // Commented out to fix menu bar taking the focus
// bar.Focus();
if (cc is Bar && !cc.Focused)
((Bar)cc).MenuFocus = true;
if(m_HotSubItem!=null)
m_HotSubItem.InternalMouseLeave();
m_HotSubItem=objItem;
objItem.InternalMouseEnter();
objItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, objItem.LeftInternal + 2, objItem.TopInternal + 2, 0));
objItem.Expanded=true;
if(objItem is PopupItem)
{
this.AutoExpand=true;
// If it is a menu select first menu item inside...
PopupItem popup=objItem as PopupItem;
if(popup.PopupType==ePopupType.Menu && popup.PopupControl is MenuPanel)
{
((MenuPanel)popup.PopupControl).SelectFirstItem();
}
}
}
public bool EqualButtonSize
{
get
{
return m_EqualButtonSize;
}
set
{
if(m_EqualButtonSize!=value)
{
m_EqualButtonSize=value;
NeedRecalcSize=true;
}
}
}
/*public bool Stretch
{
get
{
return m_Stretch;
}
set
{
if(m_Stretch!=value)
{
m_Stretch=value;
m_NeedRecalcSize=true;
}
}
}*/
public override void ContainerLostFocus(bool appLostFocus)
{
base.ContainerLostFocus(appLostFocus);
if(m_MoreItems!=null)
m_MoreItems.ContainerLostFocus(appLostFocus);
IOwnerMenuSupport ownersupport=this.GetOwner() as IOwnerMenuSupport;
if(this.IsOnMenuBar && ownersupport!=null)
ownersupport.PersonalizedAllVisible=false;
}
///
/// Called when item owner has changed.
///
protected override void OnOwnerChanged()
{
base.OnOwnerChanged();
if(this.GetOwner() is Bar)
{
this.RefreshImageSize();
}
}
protected internal override void OnSubItemExpandChange(BaseItem objItem)
{
base.OnSubItemExpandChange(objItem);
if(objItem.Expanded)
{
foreach(BaseItem objExp in this.SubItems)
{
if(objExp!=objItem && objExp is PopupItem && objExp.Expanded)
objExp.Expanded=false;
}
}
}
///
/// Gets or sets a value indicating whether the item is expanded or not. For Popup items this would indicate whether the item is popped up or not.
///
[System.ComponentModel.Browsable(false),System.ComponentModel.DefaultValue(false),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
public override bool Expanded
{
get
{
return m_Expanded;
}
set
{
base.Expanded=value;
if(!value && this.ContainerControl is ItemControl)
BaseItem.CollapseSubItems(this);
}
}
internal void SetSystemFocus()
{
if(m_HotSubItem!=null || this.SubItems.Count==0)
return;
BaseItem exp = this.ExpandedItem();
if (exp != null)
{
m_HotSubItem = exp;
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
return;
}
foreach(BaseItem objItem in this.SubItems)
{
if(!objItem.SystemItem && objItem.Displayed && objItem.Visible)
{
m_HotSubItem=objItem;
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
break;
}
}
}
internal void ReleaseSystemFocus()
{
CollapseSubItems(this);
if(m_HotSubItem!=null)
{
Control c = this.ContainerControl as Control;
if (c != null)
{
Point p = c.PointToClient(Control.MousePosition);
if (m_HotSubItem.DisplayRectangle.Contains(p))
return;
}
m_HotSubItem.InternalMouseLeave();
m_HotSubItem=null;
}
}
///
/// Gets or sets whether container is system container used internally by DotNetBar.
///
[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public bool SystemContainer
{
get
{
return m_SystemContainer;
}
set
{
m_SystemContainer=value;
}
}
public bool HaveCustomizeItem
{
get
{
return m_HaveCustomizeItem;
}
}
protected internal override void OnItemAdded(BaseItem objItem)
{
base.OnItemAdded(objItem);
if (ItemAdded != null)
ItemAdded(objItem, new EventArgs());
if(objItem is CustomizeItem)
m_HaveCustomizeItem=true;
else if(this.SystemContainer && objItem is DockContainerItem)
{
Bar bar=this.ContainerControl as Bar;
if(bar!=null && bar.LayoutType==eLayoutType.DockContainer)
{
if(this.VisibleSubItems>1)
{
objItem.Displayed=false;
}
bar.RefreshDockTab(true);
}
}
}
protected internal override void OnAfterItemRemoved(BaseItem objItem, int itemIndex)
{
base.OnAfterItemRemoved(objItem, itemIndex);
if(objItem is CustomizeItem)
m_HaveCustomizeItem=false;
else if(this.SystemContainer)
{
Bar bar=this.ContainerControl as Bar;
if(bar!=null)
bar.OnSubItemRemoved(objItem);
}
}
protected internal override bool IsAnyOnHandle(IntPtr iHandle)
{
if(m_MoreItems!=null)
{
if(m_MoreItems.IsAnyOnHandle(iHandle))
return true;
}
return base.IsAnyOnHandle(iHandle);
}
///
/// Return Sub Item at specified location
///
public override BaseItem ItemAtLocation(int x, int y)
{
if (m_SubItems != null)
{
foreach (BaseItem objSub in m_SubItems)
{
if (objSub.IsContainer)
{
BaseItem item = objSub.ItemAtLocation(x, y);
if (item != null)
return item;
}
else
{
if ((objSub.Visible || this.IsOnCustomizeMenu) && objSub.Displayed && objSub.DisplayRectangle.Contains(x, y))
{
return objSub;
}
}
}
}
return null;
}
public override bool AutoExpand
{
get
{
return base.AutoExpand;
}
set
{
base.AutoExpand=value;
if(this.SystemContainer)
{
Bar bar=this.ContainerControl as Bar;
if(bar!=null)
{
// TODO: To fix the focus menu expand comment this out
// if(this.AutoExpand && !bar.Focused)
// bar.Focus();
// else if(!this.AutoExpand && bar.Focused)
// bar.ReleaseFocus();
if(this.AutoExpand && !bar.MenuFocus)
bar.MenuFocus=true;
else if(!this.AutoExpand && bar.MenuFocus)
bar.MenuFocus=false;
}
}
}
}
internal bool EventHeight
{
get {return m_EventHeight;}
set {m_EventHeight=value;}
}
internal bool UseMoreItemsButton
{
get {return m_UseMoreItemsButton;}
set {m_UseMoreItemsButton=value;}
}
internal eContainerVerticalAlignment ToolbarItemsAlign
{
get { return m_ToolbarItemsAlign; }
set { m_ToolbarItemsAlign = value; }
}
public virtual eLayoutType LayoutType
{
get
{
return m_LayoutType;
}
set
{
if(m_LayoutType==value)
return;
m_LayoutType=value;
NeedRecalcSize=true;
if(m_LayoutType==eLayoutType.TaskList)
{
base.Orientation=eOrientation.Horizontal;
}
else
{
if(this.ContainerControl!=null && this.ContainerControl is Bar)
{
Bar bar=this.ContainerControl as Bar;
if(bar.DockedSite!=null && bar.DockedSite is DockSite)
base.Orientation=((DockSite)bar.DockedSite).DockOrientation;
}
}
}
}
[System.ComponentModel.Browsable(false)]
public override eOrientation Orientation
{
get
{
if(m_LayoutType==eLayoutType.TaskList)
return eOrientation.Vertical;
return base.Orientation;
}
set
{
if(m_LayoutType==eLayoutType.TaskList)
return;
base.Orientation=value;
}
}
public Color BackColor
{
get
{
if(!m_BackgroundColor.IsEmpty)
return m_BackgroundColor;
else if (EffectiveStyle == eDotNetBarStyle.Office2000 || this.IsOnMenuBar)
return SystemColors.Control;
else
return ColorFunctions.ToolMenuFocusBackColor();
}
set
{
if(m_BackgroundColor!=value)
{
m_BackgroundColor=value;
this.Refresh();
}
}
}
///
/// When parent items does recalc size for its sub-items it should query
/// image size and store biggest image size into this property.
///
[System.ComponentModel.Browsable(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override System.Drawing.Size SubItemsImageSize
{
get
{
return base.SubItemsImageSize;
}
set
{
if(m_TrackSubItemsImageSize)
base.SubItemsImageSize = value;
}
}
internal bool TrackSubItemsImageSize
{
get { return m_TrackSubItemsImageSize; }
set
{
m_TrackSubItemsImageSize = value;
if (!m_TrackSubItemsImageSize)
base.SubItemsImageSize = new Size(16, 16);
}
}
//***********************************************
// IDesignTimeProvider Implementation
//***********************************************
public InsertPosition GetInsertPosition(Point pScreen, BaseItem DragItem)
{
return DesignTimeProviderContainer.GetInsertPosition(this, pScreen, DragItem);
}
public void DrawReversibleMarker(int iPos, bool Before)
{
DesignTimeProviderContainer.DrawReversibleMarker(this, iPos, Before);
return;
}
public void InsertItemAt(BaseItem objItem, int iPos, bool Before)
{
DesignTimeProviderContainer.InsertItemAt(this, objItem, iPos, Before);
return;
}
private int GetAppendPosition(BaseItem objParent)
{
int iPos=-1;
for(int i=objParent.SubItems.Count-1;i>=0;i--)
{
if(objParent.SubItems[i].SystemItem)
iPos=i;
else
break;
}
return iPos;
}
public int PaddingLeft
{
get{return m_PaddingLeft;}
set{m_PaddingLeft=value;}
}
public int PaddingRight
{
get{return m_PaddingRight;}
set{m_PaddingRight=value;}
}
public int PaddingTop
{
get{return m_PaddingTop;}
set{m_PaddingTop=value;}
}
public int PaddingBottom
{
get{return m_PaddingBottom;}
set{m_PaddingBottom=value;}
}
private bool _FillsContainerControl = false;
///
/// Gets or sets whether item container fills the container control completely.
///
public bool FillsContainerControl
{
get { return _FillsContainerControl; }
set { _FillsContainerControl = value; }
}
}
}