using System;
using System.Text;
using System.ComponentModel;
using System.Drawing;
using DevComponents.UI.ContentManager;
using System.Collections;
using System.Drawing.Drawing2D;
namespace DevComponents.DotNetBar
{
///
/// Represents the class that provides Office 2007 style Gallery container with drop-down ability.
///
[ToolboxItem(false), DesignTimeVisible(false), ProvideProperty("GalleryGroup", typeof(BaseItem)), Designer("DevComponents.DotNetBar.Design.GalleryContainerDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
public class GalleryContainer : ItemContainer, IExtenderProvider
{
#region Private Variables
private bool m_EnableGalleryPopup = true;
private ButtonItem m_ScrollUp = null;
private ButtonItem m_ScrollDown = null;
private ButtonItem m_PopupGallery = null;
private Size m_ScrollButtonSize = new Size(15, 20);
private int m_ScrollButtonContentSpacing = 1;
private Size m_DefaultSize = Size.Empty;
private Point m_ScrollPosition = Point.Empty;
private Size m_PopupGallerySize = Size.Empty;
private ScrollBar.ScrollBarCore m_ScrollBar = null;
private bool m_PopupGalleryStyle = false;
private Rectangle m_ViewRectangle = Rectangle.Empty;
private Size m_RecommendedSize = Size.Empty;
private bool m_StretchGallery = false;
internal bool SystemGallery = false;
private bool m_IncrementalSizing = true;
private GalleryGroupCollection m_Groups = null;
private bool m_ScrollAnimation = true;
private ThreadUIOperation m_ThreadUI = null;
private bool m_PopupUsesStandardScrollbars = true;
#endregion
#region Events
///
/// Occurs when Gallery popup item is about to open.
///
[System.ComponentModel.Description("Occurs when Gallery popup item is about to open.")]
public event DotNetBarManager.PopupOpenEventHandler GalleryPopupOpen;
///
/// Occurs just before Gallery popup window is shown.
///
[System.ComponentModel.Description("Occurs just before Gallery popup window is shown.")]
public event EventHandler GalleryPopupShowing;
///
/// Occurs before the Gallery popup item is closed.
///
[System.ComponentModel.Description("Occurs before the Gallery popup item is closed")]
public event EventHandler GalleryPopupClose;
///
/// Occurs after Gallery popup item has been closed.
///
[System.ComponentModel.Description("Occurs after popup item has been closed.")]
public event EventHandler GalleryPopupFinalized;
#endregion
#region Constructor
///
/// Creates new instance of the class
///
public GalleryContainer()
: base()
{
m_DefaultSize = GetDefaultSize();
m_PopupGallerySize = GetDefaultPopupSize();
m_Groups = new GalleryGroupCollection();
m_Groups.Owner = this;
this.MultiLine = true;
//this.BackgroundStyle.Class = Rendering.ElementStyleClassKeys.RibbonGalleryContainerKey;
CreateButtons();
this.MinimumSize = new Size(Dpi.Width(42 + m_ScrollButtonSize.Width + m_ScrollButtonContentSpacing), Dpi.Height(m_DefaultSize.Height));
m_ThreadUI = new ThreadUIOperation(new EventHandler(this.RecordStartState), new EventHandler(this.UpdateThreadedUI), new EventHandler(this.CleanupState));
}
private Size GetDefaultSize()
{
return new Size(140 + m_ScrollButtonSize.Width + m_ScrollButtonContentSpacing, m_ScrollButtonSize.Height * 3 - 2);
}
private Size GetDefaultPopupSize()
{
return Size.Empty;
}
///
/// Returns copy of the item.
///
public override BaseItem Copy()
{
GalleryContainer objCopy = new GalleryContainer();
this.CopyToItem(objCopy);
return objCopy;
}
///
/// Copies the ButtonItem specific properties to new instance of the item.
///
/// New ButtonItem instance.
protected override void CopyToItem(BaseItem c)
{
GalleryContainer copy = c as GalleryContainer;
copy.DefaultSize = this.DefaultSize;
copy.PopupGallerySize = this.PopupGallerySize;
copy.StretchGallery = this.StretchGallery;
copy.PopupUsesStandardScrollbars = this.PopupUsesStandardScrollbars;
foreach (BaseItem item in this.PopupGalleryItems)
copy.PopupGalleryItems.Add(item.Copy());
base.CopyToItem(copy);
foreach (BaseItem item in copy.SubItems)
{
item.CollapseAllBeforeRaisingClick = false; // This ensures that item is not disposed (Command then set to null) before its click event is raised and command executed
}
// Copy Gallery Groups
foreach (GalleryGroup group in this.GalleryGroups)
{
GalleryGroup groupCopy = new GalleryGroup();
groupCopy.Name = group.Name;
groupCopy.Text = group.Text;
groupCopy.DisplayOrder = group.DisplayOrder;
copy.GalleryGroups.Add(groupCopy);
foreach (BaseItem item in group.Items)
{
copy.SetGalleryGroup(copy.SubItems[item.Name], groupCopy);
}
}
}
protected override void Dispose(bool disposing)
{
m_ScrollUp.Click -= ScrollUp_Click;
m_ScrollDown.Click -= ScrollDown_Click;
m_PopupGallery.Click -= PopupGallery_Click;
m_PopupGallery.PopupOpen -= PopupGallery_PopupOpen;
m_PopupGallery.PopupShowing -= PopupGallery_PopupShowing;
m_PopupGallery.PopupClose -= PopupGallery_PopupClose;
m_PopupGallery.PopupFinalized -= PopupGallery_PopupFinalized;
if (m_ScrollBar != null)
{
m_ScrollBar.Dispose();
m_ScrollBar = null;
}
m_ThreadUI.Stop();
base.Dispose(disposing);
}
private void CreateButtons()
{
m_ScrollUp = new ButtonItem("sysgalleryscrollup");
m_ScrollUp.Text = "";
m_ScrollUp.Style = this.Style;
m_ScrollUp.ColorTable = eButtonColor.OrangeWithBackground;
m_ScrollUp.SetParent(this);
m_ScrollUp.Click += new EventHandler(ScrollUp_Click);
m_ScrollUp.ClickAutoRepeat = true;
m_ScrollUp.ClickRepeatInterval = 200;
m_ScrollUp.CanCustomize = false;
m_ScrollUp.AutoCollapseOnClick = false;
m_ScrollDown = new ButtonItem("sysgalleryscrolldown");
m_ScrollDown.Text = "";
m_ScrollDown.Style = this.Style;
m_ScrollDown.ColorTable = eButtonColor.OrangeWithBackground;
m_ScrollDown.SetParent(this);
m_ScrollDown.Click += new EventHandler(ScrollDown_Click);
m_ScrollDown.ClickAutoRepeat = true;
m_ScrollDown.ClickRepeatInterval = 200;
m_ScrollDown.CanCustomize = false;
m_ScrollDown.AutoCollapseOnClick = false;
m_PopupGallery = new ButtonItem("sysgallerypopup");
m_PopupGallery.Text = "";
m_PopupGallery.ButtonStyle = eButtonStyle.TextOnlyAlways;
m_PopupGallery.Style = this.Style;
m_PopupGallery.ColorTable = eButtonColor.OrangeWithBackground;
m_PopupGallery.SetParent(this);
m_PopupGallery.Click += new EventHandler(PopupGallery_Click);
m_PopupGallery.CanCustomize = false;
m_PopupGallery.PopupOpen += new DotNetBarManager.PopupOpenEventHandler(PopupGallery_PopupOpen);
m_PopupGallery.PopupShowing += new EventHandler(PopupGallery_PopupShowing);
m_PopupGallery.PopupClose += new EventHandler(PopupGallery_PopupClose);
m_PopupGallery.PopupFinalized += new EventHandler(PopupGallery_PopupFinalized);
}
private void PopupGallery_PopupShowing(object sender, EventArgs e)
{
OnGalleryPopupShowing(sender, e);
}
private void PopupGallery_PopupOpen(object sender, PopupOpenEventArgs e)
{
OnGalleryPopupOpen(sender, e);
}
private void PopupGallery_Click(object sender, EventArgs e)
{
PopupGallery();
}
private Size GetPopupGallerySize(Point screenPos)
{
Size size = Size.Empty;
if (this.DisplayRectangle.Width < this.DefaultSize.Width || m_ViewRectangle.Size.IsEmpty)
{
int width = this.DefaultSize.Width;
int itemBasedWidth = 0;
foreach (BaseItem item in this.SubItems)
{
if (!item.Visible) continue;
itemBasedWidth += item.WidthInternal + this.ItemSpacing;
if (itemBasedWidth > width)
break;
}
if (itemBasedWidth > 0)
{
width = itemBasedWidth;
if (m_PopupUsesStandardScrollbars)
width += Dpi.Width(m_ScrollButtonContentSpacing + m_ScrollButtonSize.Width);
}
size = new Size(width, Math.Max(this.DefaultSize.Height, m_ViewRectangle.Height));
}
else
size = new Size(this.DisplayRectangle.Width, m_ViewRectangle.Height);
ScreenInformation screenInfo = null;
screenInfo = BarFunctions.ScreenFromPoint(screenPos);
// Give the grouped gallery max size since we do not know yet how tall it is
if (m_Groups.Count > 0 && screenInfo!=null && screenInfo.WorkingArea.Bottom - screenPos.Y>size.Height)
{
size.Height = screenInfo.WorkingArea.Bottom - screenPos.Y;
}
if (screenInfo != null)
{
int red = 16;
red += this.PopupGalleryItems.Count * 26;
int yDiff= 0, xDiff = 0;
if (screenPos.Y + size.Height > screenInfo.WorkingArea.Bottom - red)
yDiff = screenPos.Y + size.Height - (screenInfo.WorkingArea.Bottom - red);
if (screenPos.X + size.Width > screenInfo.WorkingArea.Right - red)
xDiff = screenPos.X + size.Width - (screenInfo.WorkingArea.Right - red);
if (size.Width - xDiff > this.MinimumSize.Width)
size.Width -= xDiff;
else
size.Width = this.MinimumSize.Width + Dpi.Width(m_ScrollButtonContentSpacing + m_ScrollButtonSize.Width);
if (size.Height - yDiff > this.MinimumSize.Height)
size.Height -= yDiff;
else
size.Height = this.MinimumSize.Height;
}
return size;
}
internal bool PopupGalleryStyle
{
get { return m_PopupGalleryStyle; }
set
{
m_PopupGalleryStyle = value;
if (m_ScrollBar != null)
{
m_ScrollBar.Dispose();
m_ScrollBar = null;
}
if (m_PopupGalleryStyle)
{
if (m_PopupUsesStandardScrollbars)
{
m_ScrollBar = new ScrollBar.ScrollBarCore();
m_ScrollBar.ValueChanged += new EventHandler(PopupScrollBar_ValueChanged);
}
}
}
}
/////
///// Adds the items that are not visible to the overflow popup.
/////
//private void AddItems(GalleryContainer c)
//{
// BaseItem[] items = new BaseItem[this.SubItems.Count];
// this.SubItems.CopyTo(items, 0);
// foreach (BaseItem objItem in items)
// {
// c.SubItems._Add(objItem);
// this.SubItems._Remove(objItem);
// objItem.SetParent(c);
// objItem.ContainerControl = null;
// }
// items = new BaseItem[m_PopupGalleryItems.Count];
// m_PopupGalleryItems.CopyTo(items, 0);
// foreach (BaseItem objItem in items)
// {
// m_PopupGallery.SubItems._Add(objItem);
// m_PopupGalleryItems._Remove(objItem);
// objItem.SetParent(c);
// objItem.ContainerControl = null;
// }
// c.NeedRecalcSize = true;
//}
private void ClearPopupGalleryItems()
{
if (!this.DesignMode)
{
// When copy is made this ensures the proper cleanup
foreach (BaseItem item in m_PopupGallery.SubItems)
{
GalleryContainer gc = item as GalleryContainer;
if (gc != null && gc.SystemGallery)
{
m_PopupGallery.SubItems.Remove(gc);
gc.Dispose();
break;
}
}
}
}
private void PopupGallery_PopupFinalized(object sender, EventArgs e)
{
OnGalleryPopupFinalized(sender, e);
ClearPopupGalleryItems();
}
private void PopupGallery_PopupClose(object sender, EventArgs e)
{
OnGalleryPopupClose(sender, e);
RestoreGalleryItems();
}
private void RestoreGalleryItems()
{
//GalleryContainer c = m_PopupGallery.SubItems[0] as GalleryContainer;
//if (c == null) return;
//BaseItem[] items = new BaseItem[c.SubItems.Count];
//c.SubItems.CopyTo(items, 0);
//foreach (BaseItem item in items)
//{
// this.SubItems._Add(item);
// c.SubItems._Remove(item);
// item.SetParent(this);
// item.ContainerControl = null;
//}
//for (int i = 1; i < m_PopupGallery.SubItems.Count; i++)
//{
// BaseItem item = m_PopupGallery.SubItems[i];
// m_PopupGalleryItems._Add(item);
// item.SetParent(this);
// item.ContainerControl = null;
//}
//m_PopupGallery.SubItems._Clear();
//this.NeedRecalcSize = true;
}
private void ScrollUp_Click(object sender, EventArgs e)
{
this.ScrollUp();
}
private void ScrollDown_Click(object sender, EventArgs e)
{
this.ScrollDown();
}
internal bool ScrollHitTest(int x, int y)
{
if (m_ScrollUp.Enabled && m_ScrollUp.DisplayRectangle.Contains(x, y))
return true;
else if (m_ScrollDown.Enabled && m_ScrollDown.DisplayRectangle.Contains(x,y))
return true;
else if (m_ScrollBar != null && m_ScrollBar.Visible)
{
if (m_ScrollBar.ThumbIncreaseRectangle.Contains(x,y))
return true;
else if (m_ScrollBar.ThumbDecreaseRectangle.Contains(x,y))
return true;
}
return false;
}
private bool m_MouseDownOnScrollBar = false;
public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
{
if (this.IsDisposed) return;
m_MouseDownOnScrollBar = false;
if (m_PopupGalleryStyle && m_PopupUsesStandardScrollbars)
{
m_ScrollBar.MouseDown(objArg);
if (m_ScrollBar.DisplayRectangle.Contains(objArg.X, objArg.Y))
m_MouseDownOnScrollBar = true;
}
base.InternalMouseDown(objArg);
if (this.DesignMode)
{
if (m_ScrollUp.Enabled && m_ScrollUp.DisplayRectangle.Contains(objArg.X, objArg.Y))
ScrollUp();
else if (m_ScrollDown.Enabled && m_ScrollDown.DisplayRectangle.Contains(objArg.X, objArg.Y))
ScrollDown();
else if (m_PopupGallery.Enabled && m_PopupGallery.DisplayRectangle.Contains(objArg.X, objArg.Y))
PopupGallery();
else if (m_ScrollBar != null && m_ScrollBar.Visible)
{
if(m_ScrollBar.ThumbIncreaseRectangle.Contains(objArg.X, objArg.Y))
ScrollDown();
else if (m_ScrollBar.ThumbDecreaseRectangle.Contains(objArg.X, objArg.Y))
ScrollUp();
}
}
}
public override void InternalMouseMove(System.Windows.Forms.MouseEventArgs objArg)
{
if (m_PopupGalleryStyle && !this.IsDisposed)
{
if (m_PopupUsesStandardScrollbars)
m_ScrollBar.MouseMove(objArg);
}
base.InternalMouseMove(objArg);
}
public override void InternalMouseUp(System.Windows.Forms.MouseEventArgs objArg)
{
if (m_PopupGalleryStyle && m_PopupUsesStandardScrollbars && !this.IsDisposed)
{
m_ScrollBar.MouseUp(objArg);
if (m_ScrollBar.DisplayRectangle.Contains(objArg.X, objArg.Y) || m_MouseDownOnScrollBar)
{
m_MouseDownOnScrollBar = false;
return;
}
}
base.InternalMouseUp(objArg);
}
public override void InternalMouseLeave()
{
if (m_PopupGalleryStyle && !this.IsDisposed)
{
if (m_PopupUsesStandardScrollbars)
m_ScrollBar.MouseLeave();
//else
//{
// if (m_ScrollUp.IsMouseOver)
// m_ScrollUp.InternalMouseLeave();
// if (m_ScrollDown.IsMouseOver)
// m_ScrollDown.InternalMouseLeave();
//}
}
base.InternalMouseLeave();
}
public override void InternalKeyDown(System.Windows.Forms.KeyEventArgs objArg)
{
if (this.IsGalleryPopupOpen)
{
m_PopupGallery.InternalKeyDown(objArg);
return;
}
//BaseItem oldHotSubItem = this.HotSubItem;
base.InternalKeyDown(objArg);
// Check whether new hot item is out of bounds and if it is scroll it into the view
//Rectangle displayRect = GetClientRectangle();
//if (this.HotSubItem != oldHotSubItem && this.HotSubItem != null && !displayRect.Contains(this.HotSubItem.Bounds))
//{
// EnsureVisible(this.HotSubItem);
//}
}
protected override void OnHotSubItemChanged(BaseItem newValue, BaseItem oldValue)
{
base.OnHotSubItemChanged(newValue, oldValue);
if (newValue != null && newValue != oldValue)
{
Rectangle displayRect = GetClientRectangle();
if (!displayRect.Contains(newValue.Bounds))
{
EnsureVisible(newValue);
}
}
}
///
/// Returns the client rectangle which is DisplayRectangle excluding scroll-bar bounds
///
///
private Rectangle GetClientRectangle()
{
Rectangle r = this.DisplayRectangle;
if (m_ScrollBar != null)
r.Width -= m_ScrollBar.DisplayRectangle.Width;
if (m_PopupGalleryStyle && !m_PopupUsesStandardScrollbars)
{
if (m_ScrollUp != null)
{
r.Y += m_ScrollUp.HeightInternal;
r.Height -= m_ScrollUp.HeightInternal;
}
if (m_ScrollDown != null)
{
r.Height -= m_ScrollDown.HeightInternal;
}
}
else
{
if (m_ScrollUp != null)
r.Width -= m_ScrollUp.WidthInternal;
}
return r;
}
internal Size RecommendedSize
{
get { return m_RecommendedSize; }
set { m_RecommendedSize = value; }
}
///
/// Invokes GalleryPopupOpen event.
///
///
protected virtual void OnGalleryPopupOpen(object sender, PopupOpenEventArgs e)
{
if (GalleryPopupOpen != null)
GalleryPopupOpen(sender, e);
}
///
/// Invokes GalleryPopupShowing event.
///
///
protected virtual void OnGalleryPopupShowing(object sender, EventArgs e)
{
if (GalleryPopupShowing != null)
GalleryPopupShowing(sender, e);
}
///
/// Invokes GalleryPopupClose event.
///
///
protected virtual void OnGalleryPopupClose(object sender, EventArgs e)
{
if (GalleryPopupClose != null)
GalleryPopupClose(sender, e);
}
///
/// Invokes GalleryPopupFinalized event.
///
///
protected virtual void OnGalleryPopupFinalized(object sender, EventArgs e)
{
if (GalleryPopupFinalized != null)
GalleryPopupFinalized(sender, e);
}
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle PopupGalleryButtonBounds
{
get { return m_PopupGallery.DisplayRectangle; }
}
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ButtonItem PopupGalleryItem
{
get { return m_PopupGallery; }
}
#endregion
#region Property Hidding
///
/// Gets or sets orientation inside the container. GalleryContainer automatically manages the layout orientation and this property should not be changed from its default value.
///
[Browsable(false), DefaultValue(eOrientation.Horizontal), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), Category("Layout")]
public override eOrientation LayoutOrientation
{
get { return base.LayoutOrientation; }
set { base.LayoutOrientation = value; }
}
///
/// Gets or sets the item alignment when container is in horizontal layout. Default value is Left.
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
public override eHorizontalItemsAlignment HorizontalItemAlignment
{
get { return base.HorizontalItemAlignment; }
set { base.HorizontalItemAlignment = value; }
}
///
/// Gets or sets the item vertical alignment. Default value is Top.
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
public override eVerticalItemsAlignment VerticalItemAlignment
{
get { return base.VerticalItemAlignment; }
set { base.VerticalItemAlignment = value; }
}
///
/// Gets or sets whether items in horizontal layout are wrapped into the new line when they cannot fit allotted container size. Default value is false.
///
[Browsable(true), DefaultValue(true), Category("Layout"), Description("Indicates whether items in horizontal layout are wrapped into the new line when they cannot fit allotted container size.")]
public override bool MultiLine
{
get { return base.MultiLine; }
set { base.MultiLine = value; }
}
///
/// Gets or sets whether items contained by container are resized to fit the container bounds. When container is in horizontal
/// layout mode then all items will have the same height. When container is in vertical layout mode then all items
/// will have the same width. Default value is true.
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
public override bool ResizeItemsToFit
{
get { return base.ResizeItemsToFit; }
set { base.ResizeItemsToFit = value; }
}
#endregion
#region Public Interface
///
/// Gets or sets whether Gallery when on popup is using standard scrollbars to scroll the content.
/// Standard scrollbars are displayed on right hand side of the Gallery. Default value for this property is true.
/// When set to false the scroll buttons are displayed only when needed and two buttons on top and bottom
/// of the Gallery are used to indicate the scrolling possibility and enable scrolling. Buttons are only
/// visible when needed. This scrolling button style can be used for example on Application Menu
/// to enable scrolling of list of most recently used files.
///
[Browsable(true), Category("Appearance"), DefaultValue(true), Description("Indicates whether Gallery when on popup is using standard scrollbars to scroll the content.")]
public bool PopupUsesStandardScrollbars
{
get { return m_PopupUsesStandardScrollbars; }
set
{
m_PopupUsesStandardScrollbars = value;
}
}
///
/// Gets or sets whether gallery is using incremental sizing when stretched. Default
/// value is true. Incremental sizing will resize the width of the gallery so it fits
/// completely the items it can contain in available space. That means that gallery will
/// occupy enough space to display the whole items within available space. When set to
/// false, it indicates that gallery will resize to fill all available space.
///
[Browsable(true), DefaultValue(true), Category("Layout"), Description("Indicates whether gallery is using incremental sizing when stretched.")]
public bool IncrementalSizing
{
get { return m_IncrementalSizing; }
set
{
m_IncrementalSizing = value;
this.NeedRecalcSize = true;
OnAppearanceChanged();
}
}
///
/// Gets or sets whether Gallery width is determined based on the RibbonBar width. This property is in effect when
/// Gallery is hosted directly the RibbonBar control. Default value is false.
/// When set to true the Gallery size is changed as the RibbonBar control is resized. The initial size of the Gallery is
/// determined by DefaultSize property. The MinimumSize property specifies the minimum size of the Gallery.
/// Note that only single Gallery can be stretched per RibbonBar control.
///
[Browsable(true), DefaultValue(false), Category("Layout"), Description("Indicates whether Gallery width is determined based on the Ribbon container size.")]
public bool StretchGallery
{
get { return m_StretchGallery; }
set
{
if (m_StretchGallery != value)
{
m_StretchGallery = value;
RibbonBar bar = this.ContainerControl as RibbonBar;
if (bar != null)
{
if (m_StretchGallery)
{
if (bar.GalleryStretch == null)
bar.GalleryStretch = this;
}
else
{
if (bar.GalleryStretch == this)
bar.GalleryStretch = null;
}
}
NeedRecalcSize = true;
OnAppearanceChanged();
}
}
}
///
/// Gets the collection of the items that are added to the popup gallery. The items displayed on the gallery are combined with the
/// items from this collection and they are displayed on the gallery popup. This collection can for example have items that are
/// customizing the choices of the commands in gallery etc.
///
[Browsable(false), DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
public SubItemsCollection PopupGalleryItems
{
get { return m_PopupGallery.SubItems; }
}
///
/// Gets or sets the default size of the gallery. The gallery height will be always enforced so all scroll buttons can be displayed.
/// Gallery width should allow display of both scroll buttons and the gallery content.
///
[Browsable(true), Category("Layout"), Description("Indicates the default size of the gallery.")]
public Size DefaultSize
{
get { return m_DefaultSize; }
set
{
m_DefaultSize = value;
this.NeedRecalcSize = true;
this.OnAppearanceChanged();
}
}
///
/// Gets whether DefaultSize property is serialized by Windows Forms designer based on its current value.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeDefaultSize()
{
return (m_DefaultSize != GetDefaultSize());
}
///
/// Resets DefaultSize property to its default value.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetDefaultSize()
{
TypeDescriptor.GetProperties(this)["DefaultSize"].SetValue(this, GetDefaultSize());
}
///
/// Gets or sets the default size of the gallery when gallery is displayed on the popup menu.
///
[Browsable(true), Category("Layout"), Description("Indicates the default size of the gallery when gallery is displayed on the popup menu.")]
public Size PopupGallerySize
{
get { return m_PopupGallerySize; }
set { m_PopupGallerySize = value; }
}
///
/// Gets whether PopupGallerySize property is serialized by Windows Forms designer based on its current value.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializePopupGallerySize()
{
return (m_PopupGallerySize != GetDefaultPopupSize());
}
///
/// Resets PopupGallerySize property to its default value.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetPopupGallerySize()
{
TypeDescriptor.GetProperties(this)["PopupGallerySize"].SetValue(this, GetDefaultPopupSize());
}
///
/// Gets or sets whether gallery can be displayed on the popup. Default value is true.
///
[Browsable(true), DefaultValue(true), Category("Gallery"), Description("Indicates whether gallery can be displayed on the popup.")]
public bool EnableGalleryPopup
{
get { return m_EnableGalleryPopup; }
set
{
m_EnableGalleryPopup = value;
this.NeedRecalcSize = true;
this.OnAppearanceChanged();
}
}
///
/// Scrolls the gallery if necessary to ensures that item is visible.
///
/// Reference to the items that is part of the gallery.
public void EnsureVisible(BaseItem item)
{
if (item == null) throw new NullReferenceException("Item must be non null value.");
int scrollPositionY = GetScrollPosition().Y;
Rectangle clientRectangle = GetClientRectangle();
if (clientRectangle.IsEmpty) return;
if (item.TopInternal + scrollPositionY < clientRectangle.Y || item.Bounds.Bottom > clientRectangle.Bottom)
{
int i = clientRectangle.Top - item.TopInternal + scrollPositionY;
if (item.Bounds.Bottom > clientRectangle.Bottom)
i = -((item.Bounds.Bottom - clientRectangle.Y) - clientRectangle.Height) + scrollPositionY;
if (Math.Abs(i) <= 4) i = 0;
SetScrollPosition(i);
}
}
///
/// Scrolls gallery down to show next line of items.
///
public void ScrollDown()
{
SetScrollPosition(GetNextScrollLine());
}
///
/// Scrolls gallery up to show previous line of items.
///
public void ScrollUp()
{
SetScrollPosition(GetPreviousScrollLine());
}
#endregion
#region Internal Implementation
public override BaseItem ItemAtLocation(int x, int y)
{
if (!this.DesignMode && (!m_PopupGalleryStyle || !m_PopupUsesStandardScrollbars))
{
if (m_ScrollUp.DisplayRectangle.Contains(x, y) && m_ScrollUp.Visible)
return m_ScrollUp;
else if (m_ScrollDown.DisplayRectangle.Contains(x, y) && m_ScrollDown.Visible)
return m_ScrollDown;
else if (m_EnableGalleryPopup && m_PopupGallery.DisplayRectangle.Contains(x, y))
return m_PopupGallery;
}
else if (!this.DesignMode && m_PopupGalleryStyle && m_PopupUsesStandardScrollbars && !SystemGallery && IsOnPopup(this))
{
if (m_ScrollBar != null && (m_ScrollBar.DisplayRectangle.Contains(x, y) || m_ScrollBar.IsMouseDown)) return this;
}
if (m_MouseDownOnScrollBar)
return this;
return base.ItemAtLocation(x, y);
}
internal ScrollBar.ScrollBarCore ScrollBarControl
{
get
{
return m_ScrollBar;
}
}
void PopupScrollBar_ValueChanged(object sender, EventArgs e)
{
if (!_SettingScrollPosition)
SetScrollPosition(-m_ScrollBar.Value);
}
private bool _SettingScrollPosition = false;
private void SetScrollPosition(int y)
{
if (m_ScrollPosition.Y == y) return;
_SettingScrollPosition = true;
int diff = y - m_ScrollPosition.Y;
int start = m_ScrollPosition.Y;
m_ScrollPosition.Y = y;
OffsetSubItems(new Point(0, diff));
if (!m_PopupGalleryStyle || !m_PopupUsesStandardScrollbars) EnableScrollButtons(this.DisplayRectangle);
if (IsAnimationEnabled)
StartAnimation(start, y);
else
this.Refresh();
if (m_ScrollBar != null && m_ScrollBar.Value != -y)
m_ScrollBar.Value = -y;
_SettingScrollPosition = false;
}
public override void Paint(ItemPaintArgs p)
{
m_ThreadUI.StartReadOperation();
try
{
if (m_StateBitmap != null)
{
base.PaintBackground(p);
Graphics g = p.Graphics;
Rectangle clip = GetClipRectangle();
Region oldClip = g.Clip;
g.SetClip(clip, CombineMode.Intersect);
p.Graphics.DrawImage(m_StateBitmap, clip.X, clip.Y + m_AnimationCurrentPos);
if (oldClip != null)
g.Clip = oldClip;
else
g.ResetClip();
}
else
base.Paint(p);
}
finally
{
m_ThreadUI.EndReadOperation();
}
//int cornerSize = 0;
//Office2007ButtonItemPainter painter = PainterFactory.CreateButtonPainter(m_ScrollUp) as Office2007ButtonItemPainter;
//if (painter != null)
//{
// cornerSize = painter.CornerSize;
// painter.CornerSize = 2;
//}
if (m_PopupGalleryStyle && m_PopupUsesStandardScrollbars)
{
if (m_ScrollBar.ParentControl == null) m_ScrollBar.ParentControl = p.ContainerControl;
m_ScrollBar.Paint(p);
}
else
{
if(m_ScrollUp.Visible)
m_ScrollUp.Paint(p);
if (m_ScrollDown.Visible)
m_ScrollDown.Paint(p);
if (m_EnableGalleryPopup)
m_PopupGallery.Paint(p);
}
//if (painter != null)
// painter.CornerSize = cornerSize;
}
private Point GetScrollPosition()
{
return m_ScrollPosition;
}
private Size GetLayoutSize()
{
if (!m_RecommendedSize.IsEmpty && m_RecommendedSize.Width >= this.MinimumSize.Width && m_RecommendedSize.Height >= this.MinimumSize.Height)
return m_RecommendedSize;
Size s = m_DefaultSize;
if (this.PopupGalleryStyle && !this.SystemGallery)
{
if (this.MinimumSize.Width > s.Width)
s.Width = this.MinimumSize.Width;
if (this.MinimumSize.Height > s.Height)
s.Height = this.MinimumSize.Height;
}
return Dpi.Size(s);
}
protected override System.Drawing.Rectangle GetLayoutRectangle(System.Drawing.Rectangle bounds)
{
Rectangle r = new Rectangle(bounds.Location, GetLayoutSize());
if (m_PopupUsesStandardScrollbars || !m_PopupGalleryStyle)
{
r.Width -= Dpi.Width(m_ScrollButtonSize.Width + m_ScrollButtonContentSpacing);
if (this.IsRightToLeft)
r.X += Dpi.Width(m_ScrollButtonSize.Width + m_ScrollButtonContentSpacing);
}
bool disposeStyle = false;
ElementStyle style = ElementStyleDisplay.GetElementStyle(BackgroundStyle, out disposeStyle);
r.X += ElementStyleLayout.LeftWhiteSpace(style);
r.Y += ElementStyleLayout.TopWhiteSpace(style);
r.Width -= ElementStyleLayout.HorizontalStyleWhiteSpace(style);
r.Height -= ElementStyleLayout.VerticalStyleWhiteSpace(style);
r.Offset(GetScrollPosition());
if(disposeStyle) style.Dispose();
return r;
}
protected override Rectangle LayoutItems(Rectangle bounds)
{
m_ViewRectangle = base.LayoutItems(bounds);
if (m_ViewRectangle.Height < Math.Abs(m_ScrollPosition.Y)) SetScrollPosition(0);
Size size = GetLayoutSize();
if (this.SystemGallery && !this.EnableGalleryPopup || this.IsOnMenu)
{
if(size.Height > m_ViewRectangle.Height)
size.Height = m_ViewRectangle.Height;
}
if (m_IncrementalSizing && !PopupGalleryStyle)
size.Width = m_ViewRectangle.Width + Dpi.Width(m_ScrollButtonSize.Width + m_ScrollButtonContentSpacing);
Rectangle r = new Rectangle(bounds.Location, size);
int minHeight = Dpi.Height(m_ScrollButtonSize.Height * 2) - 1;
if (m_EnableGalleryPopup) minHeight += Dpi.Height(m_ScrollButtonSize.Height) - 1;
r.Height = Math.Max(minHeight, r.Height);
RepositionButtons(r);
if (m_PopupGalleryStyle && m_PopupUsesStandardScrollbars)
{
if (m_ViewRectangle.Bottom - r.Bottom > 0)
{
m_ScrollBar.Enabled = true;
m_ScrollBar.Maximum = m_ViewRectangle.Bottom - r.Bottom;
m_ScrollBar.Minimum = 0;
m_ScrollBar.SmallChange = GetScrollLineHeight();
m_ScrollBar.LargeChange = (int)(m_ScrollBar.Maximum * ((float)r.Height / (float)m_ViewRectangle.Height));
}
else
m_ScrollBar.Enabled = false;
}
else
{
EnableScrollButtons(r);
}
return r;
}
protected override Size GetEmptyDesignTimeSize()
{
if (m_PopupGalleryStyle && !this.SystemGallery)
{
Size s = this.MinimumSize;
if(!s.IsEmpty)
return s;
}
return base.GetEmptyDesignTimeSize();
}
internal bool IsAtMinimumSize
{
get
{
if (m_IncrementalSizing && this.SubItems.Count>0)
{
return this.WidthInternal - this.SubItems[0].WidthInternal <= this.MinimumSize.Width;
}
else
{
return this.WidthInternal <= this.MinimumSize.Width;
}
}
}
private void EnableScrollButtons(Rectangle displayRect)
{
if (GetScrollPosition().Y == 0)
{
m_ScrollUp.Enabled = false;
}
else
m_ScrollUp.Enabled = true;
if (m_PopupGalleryStyle && !m_PopupUsesStandardScrollbars)
{
m_ScrollUp.Visible = m_ScrollUp.Enabled;
m_ScrollUp.Displayed = m_ScrollUp.Enabled;
}
if (m_ViewRectangle.Bottom + GetScrollPosition().Y > displayRect.Bottom)
m_ScrollDown.Enabled = true;
else
m_ScrollDown.Enabled = false;
if (m_PopupGalleryStyle && !m_PopupUsesStandardScrollbars)
{
m_ScrollDown.Visible = m_ScrollDown.Enabled;
m_ScrollDown.Displayed = m_ScrollDown.Enabled;
}
}
protected override void OnExternalSizeChange()
{
if (this.PopupGalleryStyle)
RepositionButtons(this.DisplayRectangle);
base.OnExternalSizeChange();
}
private void RepositionButtons(Rectangle r)
{
int x = r.Right - Dpi.Width(m_ScrollButtonSize.Width);
int y = r.Y;
if (this.IsRightToLeft)
x = r.X + Dpi.Width(m_ScrollButtonSize.Width);
if (!m_ViewRectangle.IsEmpty)
{
if (m_ViewRectangle.Y != r.Y)
m_ViewRectangle.Y = r.Y;
if (m_ViewRectangle.X != r.X)
m_ViewRectangle.X = r.X;
}
if (m_PopupGalleryStyle && m_ScrollBar != null)
{
bool disposeStyle = false;
ElementStyle style = ElementStyleDisplay.GetElementStyle(BackgroundStyle, out disposeStyle);
x -= ElementStyleLayout.RightWhiteSpace(style);
y += ElementStyleLayout.TopWhiteSpace(style);
r.Height -= ElementStyleLayout.VerticalStyleWhiteSpace(style);
m_ScrollBar.DisplayRectangle = new Rectangle(x, y, Dpi.Width(m_ScrollButtonSize.Width), r.Height);
if(disposeStyle) style.Dispose();
return;
}
else if (m_PopupGalleryStyle && !m_PopupUsesStandardScrollbars)
{
Size buttonSize = new Size(r.Width, Dpi.Height12);
//m_ScrollUp.Displayed = false;
//m_ScrollUp.Visible = false;
m_ScrollUp.RecalcSize();
m_ScrollUp.Size = buttonSize;
m_ScrollUp.SetDisplayRectangle(new Rectangle(r.X, r.Y,
buttonSize.Width, buttonSize.Height));
//m_ScrollDown.Displayed = false;
//m_ScrollDown.Visible = false;
m_ScrollDown.RecalcSize();
m_ScrollDown.Size = buttonSize;
m_ScrollDown.SetDisplayRectangle(new Rectangle(r.X, r.Bottom - buttonSize.Height,
buttonSize.Width, buttonSize.Height));
return;
}
Rectangle buttonRect = new Rectangle(x, y, Dpi.Width(m_ScrollButtonSize.Width), Dpi.Height(m_ScrollButtonSize.Height));
m_ScrollUp.Displayed = true;
m_ScrollUp.RecalcSize();
m_ScrollUp.Size = buttonRect.Size;
m_ScrollUp.SetDisplayRectangle(buttonRect);
if (m_EnableGalleryPopup)
{
y = r.Bottom - Dpi.Height(m_ScrollButtonSize.Height);
buttonRect = new Rectangle(x, y, Dpi.Width(m_ScrollButtonSize.Width), Dpi.Height(m_ScrollButtonSize.Height));
m_PopupGallery.Displayed = true;
m_PopupGallery.RecalcSize();
m_PopupGallery.Size = buttonRect.Size;
m_PopupGallery.SetDisplayRectangle(buttonRect);
buttonRect.Offset(0, -(Dpi.Height(m_ScrollButtonSize.Height) - 1));
}
else
{
m_PopupGallery.Displayed = false;
y = r.Bottom - Dpi.Height(m_ScrollButtonSize.Height);
buttonRect = new Rectangle(x, y, Dpi.Width(m_ScrollButtonSize.Width), Dpi.Height(m_ScrollButtonSize.Height));
}
m_ScrollDown.Displayed = true;
m_ScrollDown.RecalcSize();
m_ScrollDown.Size = buttonRect.Size;
m_ScrollDown.SetDisplayRectangle(buttonRect);
}
//
/// Called after LeftInternal property has changed
///
protected override void OnLeftLocationChanged(int oldValue)
{
base.OnLeftLocationChanged(oldValue);
RepositionButtons(this.DisplayRectangle);
}
public override Rectangle Bounds
{
get
{
return base.Bounds;
}
set
{
base.Bounds = value;
RepositionButtons(this.DisplayRectangle);
}
}
protected override void OnTopLocationChanged(int oldValue)
{
base.OnTopLocationChanged(oldValue);
RepositionButtons(this.DisplayRectangle);
}
protected override void OnStyleChanged()
{
m_ScrollUp.Style = this.Style;
m_ScrollDown.Style = this.Style;
m_PopupGallery.Style = this.Style;
if (BarFunctions.IsOffice2010Style(this.Style))
{
m_ScrollUp.Shape = new RoundRectangleShapeDescriptor();
m_ScrollDown.Shape = new RoundRectangleShapeDescriptor();
m_PopupGallery.Shape = new RoundRectangleShapeDescriptor();
}
else
{
m_ScrollUp.Shape = null;
m_ScrollDown.Shape = null;
m_PopupGallery.Shape = null;
}
base.OnStyleChanged();
}
private int GetScrollLineHeight()
{
int itemY = this.DisplayRectangle.Bottom + GetScrollPosition().Y;
foreach (BaseItem item in this.SubItems)
{
if (!item.Visible) continue;
if (item.TopInternal > itemY)
return item.HeightInternal;
}
return 24;
}
private int GetNextScrollLine()
{
bool firstVisibleFound = false;
int itemY = 0;
foreach (BaseItem item in this.SubItems)
{
if (!item.Visible) continue;
if (firstVisibleFound && item.TopInternal > itemY)
return GetScrollForItem(item);
if (!firstVisibleFound && item.TopInternal >= this.TopInternal)
{
firstVisibleFound = true;
itemY = item.TopInternal;
}
}
return GetScrollPosition().Y;
}
private int GetPreviousScrollLine()
{
if (GetScrollPosition().Y == 0)
return 0;
int c = this.SubItems.Count -1;
for (int i = c; i >= 0; i--)
{
BaseItem item = this.SubItems[i];
if (!item.Visible) continue;
if (item.TopInternal < this.TopInternal)
return GetScrollForItem(item);
}
return 0;
}
private int GetScrollForItem(BaseItem item)
{
int i = this.DisplayRectangle.Top - item.TopInternal + GetScrollPosition().Y;
if (Math.Abs(i) <= 4) i = 0;
return i;
}
///
/// 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 && m_PopupGallery.Expanded)
m_PopupGallery.Expanded = false;
}
}
///
/// Gets whether the Gallery popup is open.
///
[Browsable(false)]
public bool IsGalleryPopupOpen
{
get
{
return m_PopupGallery.Expanded;
}
}
///
/// Opens the Gallery popup menu.
///
public void PopupGallery()
{
if (m_PopupGallery.Expanded)
{
m_PopupGallery.Expanded = false;
}
else
{
if (!this.DesignMode)
{
System.Windows.Forms.Control ctrl = this.ContainerControl as System.Windows.Forms.Control;
Point p = ctrl.PointToScreen(this.DisplayRectangle.Location);
GalleryContainer c = null;
if (m_Groups.Count > 0)
{
c = new GalleryContainer();
c.DefaultSize = this.DefaultSize;
c.StretchGallery = this.StretchGallery;
c.MultiLine = false;
c.LayoutOrientation = eOrientation.Vertical;
foreach (BaseItem item in this.PopupGalleryItems)
c.PopupGalleryItems.Add(item.Copy());
ArrangePopupGroups(c);
}
else
c = this.Copy() as GalleryContainer;
c.EnableGalleryPopup = false;
c.SystemGallery = true;
c.IncrementalSizing = false;
c.PopupUsesStandardScrollbars = m_PopupUsesStandardScrollbars;
if (this.PopupGallerySize.IsEmpty)
c.DefaultSize = GetPopupGallerySize(p);
else
c.DefaultSize = this.PopupGallerySize;
c.BackgroundStyle.Reset();
c.PopupGalleryStyle = true;
m_PopupGallery.SubItems.Insert(0, c);
m_PopupGallery.PopupMenu(p);
}
else
m_PopupGallery.Expanded = true;
}
}
protected internal override void OnContainerChanged(object objOldContainer)
{
if (!this.SystemGallery)
{
if (BaseItem.IsOnPopup(this))
{
SetScrollPosition(0);
this.PopupGalleryStyle = true;
}
}
base.OnContainerChanged(objOldContainer);
}
private void ArrangePopupGroups(GalleryContainer gc)
{
ArrayList groupList = GetSortedGroupList();
foreach(GalleryGroup g in groupList)
{
if (g.Items.Count == 0)
continue;
LabelItem label = CreateLabelForGroup(g);
gc.SubItems.Add(label);
ItemContainer cont = CreateContainerFormGroup(g);
gc.SubItems.Add(cont);
}
}
private ItemContainer CreateContainerFormGroup(GalleryGroup g)
{
ItemContainer c = new ItemContainer();
c.LayoutOrientation = eOrientation.Horizontal;
c.MultiLine = true;
c.Name = "container_" + g.Name;
foreach (BaseItem item in g.Items)
{
c.SubItems.Add(item.Copy());
}
return c;
}
private LabelItem CreateLabelForGroup(GalleryGroup g)
{
LabelItem l = new LabelItem("label_" + g.Name, g.Text);
if (Rendering.GlobalManager.Renderer is Rendering.Office2007Renderer)
{
Rendering.Office2007ColorTable ct = ((Rendering.Office2007Renderer)Rendering.GlobalManager.Renderer).ColorTable;
l.BackColor = ct.Gallery.GroupLabelBackground;
l.ForeColor = ct.Gallery.GroupLabelText;
l.SingleLineColor= ct.Gallery.GroupLabelBorder;
l.BorderType = eBorderType.SingleLine;
l.BorderSide = eBorderSide.Bottom;
l.PaddingTop = 1;
l.PaddingLeft = 10;
l.PaddingBottom = 1;
}
return l;
}
private ArrayList GetSortedGroupList()
{
ArrayList groups = new ArrayList(m_Groups.Count);
foreach(GalleryGroup g in m_Groups)
groups.Add(g);
groups.Sort(new GroupDisplayOrderComparer());
return groups;
}
private class GroupDisplayOrderComparer : IComparer
{
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
int IComparer.Compare(object x, object y)
{
if (x is GalleryGroup && y is GalleryGroup)
{
return ((GalleryGroup)x).DisplayOrder - ((GalleryGroup)y).DisplayOrder;
}
else
return ((new CaseInsensitiveComparer()).Compare(x, y));
}
}
protected override InsertPosition GetContainerInsertPosition(Point pScreen, BaseItem dragItem)
{
InsertPosition pos = DesignTimeProviderContainer.GetInsertPosition(this, pScreen, dragItem);
if (pos == null && m_PopupGallery.Expanded)
pos = m_PopupGallery.GetInsertPosition(pScreen, dragItem);
return pos;
}
protected override IContentLayout GetContentLayout()
{
SerialContentLayoutManager lm = base.GetContentLayout() as SerialContentLayoutManager;
if (lm != null)
lm.HorizontalFitContainerHeight = false;
return lm;
}
///
/// Gets or sets the Key Tips access key or keys for the item when on Ribbon Control or Ribbon Bar. Use KeyTips property
/// when you want to assign the one or more letters to be used to access an item. For example assigning the FN to KeyTips property
/// will require the user to press F then N keys to select an item. Pressing the F letter will show only keytips for the items that start with letter F.
///
[Browsable(true), Category("Appearance"), DefaultValue(""), Description("Indicates the Key Tips access key or keys for the item when on Ribbon Control or Ribbon Bar.")]
public override string KeyTips
{
get { return base.KeyTips; }
set { base.KeyTips = value; }
}
#endregion
#region Scroll Animation
private Bitmap m_StateBitmap = null;
private int m_AnimationEndPos = 0;
private int m_AnimationCurrentPos = 0;
private int m_AnimationStep = 0;
private void StartAnimation(int start, int end)
{
m_AnimationEndPos = end;
m_AnimationCurrentPos = start;
m_AnimationStep = (int)Math.Max(8, Math.Abs(end - start) / 3);
//Console.WriteLine("Start ={0} End = {1} Step = {2}", start, end, m_AnimationStep);
if (end < start) m_AnimationStep *= -1;
m_ThreadUI.Start();
}
private void RecordStartState(object sender, EventArgs e)
{
m_StateBitmap = new Bitmap(m_ViewRectangle.Width, m_ViewRectangle.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Graphics g1 = Graphics.FromImage(m_StateBitmap);
BufferedBitmap bb = new BufferedBitmap(g1, new Rectangle(0, 0, m_ViewRectangle.Width, m_ViewRectangle.Height));
Graphics g = bb.Graphics;
Color transparentColor = Color.Empty;
try
{
bool disposeStyle = false;
ElementStyle style = ElementStyleDisplay.GetElementStyle(this.BackgroundStyle, out disposeStyle);
if (!style.BackColor.IsEmpty)
transparentColor = style.BackColor;
else if (style.BackColorBlend.Count > 0 && !style.BackColorBlend[0].Color.IsEmpty)
transparentColor = style.BackColorBlend[0].Color;
else
transparentColor = Color.WhiteSmoke;
if (!transparentColor.IsEmpty)
{
using (SolidBrush brush = new SolidBrush(transparentColor))
g.FillRectangle(brush, 0, 0, m_StateBitmap.Width, m_StateBitmap.Height);
}
System.Windows.Forms.Control cc = this.ContainerControl as System.Windows.Forms.Control;
bool antiAlias = false;
ItemPaintArgs pa = null;
if (cc is ItemControl)
{
antiAlias = ((ItemControl)cc).AntiAlias;
pa = ((ItemControl)cc).GetItemPaintArgs(g);
}
else if (cc is Bar)
{
antiAlias = ((Bar)cc).AntiAlias;
pa = ((Bar)cc).GetItemPaintArgs(g);
}
else if (cc is ButtonX)
{
antiAlias = ((ButtonX)cc).AntiAlias;
pa = ((ButtonX)cc).GetItemPaintArgs(g);
}
else if (cc is MenuPanel)
{
antiAlias = ((MenuPanel)cc).AntiAlias;
pa = ((MenuPanel)cc).GetItemPaintArgs(g);
}
Rectangle clip = GetClipRectangle();
System.Drawing.Drawing2D.Matrix myMatrix = new System.Drawing.Drawing2D.Matrix();
myMatrix.Translate( -(clip.X + +m_ScrollPosition.X),
-(clip.Y + m_ScrollPosition.Y),
System.Drawing.Drawing2D.MatrixOrder.Append);
g.Transform = myMatrix;
if (antiAlias)
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
}
if (pa == null)
{
m_StateBitmap.Dispose();
m_StateBitmap = null;
}
// Do not paint scrollbars just content
ItemDisplay display = GetItemDisplay();
display.Paint(this, pa);
bb.Render(g1);
if(disposeStyle) style.Dispose();
}
finally
{
g = null;
bb.Dispose();
g1.Dispose();
}
if (!transparentColor.IsEmpty)
m_StateBitmap.MakeTransparent(transparentColor);
}
private void CleanupState(object sender, EventArgs e)
{
if (m_StateBitmap != null)
{
m_StateBitmap.Dispose();
m_StateBitmap = null;
}
}
private void UpdateThreadedUI(object sender, EventArgs e)
{
m_AnimationCurrentPos += m_AnimationStep;
if (m_AnimationCurrentPos <= m_AnimationEndPos && m_AnimationEndPos < 0 && m_AnimationStep < 0 ||
m_AnimationCurrentPos >= m_AnimationEndPos && m_AnimationEndPos >= 0 && m_AnimationStep > 0 ||
m_AnimationCurrentPos >= m_AnimationEndPos && m_AnimationEndPos < 0 && m_AnimationStep > 0 ||
m_AnimationCurrentPos <= m_AnimationEndPos && m_AnimationEndPos >= 0 && m_AnimationStep < 0)
m_ThreadUI.Stop();
System.Windows.Forms.Control cc = this.ContainerControl as System.Windows.Forms.Control;
if (cc != null)
cc.Invalidate(this.DisplayRectangle);
}
private bool IsAnimationEnabled
{
get
{
if (this.DesignMode || !m_ScrollAnimation || !this.Displayed || TextDrawing.UseTextRenderer || NativeFunctions.IsTerminalSession())
return false;
//System.Windows.Forms.Control cc = this.ContainerControl as System.Windows.Forms.Control;
//if (cc != null)
//{
// if (cc is ItemControl)
// return ((ItemControl)cc).IsFadeEnabled;
// else if (cc is Bar)
// return ((Bar)cc).IsFadeEnabled;
// else if (cc is ButtonX)
// return ((ButtonX)cc).IsFadeEnabled;
//}
return m_ScrollAnimation;
}
}
protected override void OnDisplayedChanged()
{
if(!this.Displayed && !this.SystemGallery && this.PopupGalleryStyle)
SetScrollPosition(0);
base.OnDisplayedChanged();
}
protected internal override void OnVisibleChanged(bool newValue)
{
base.OnVisibleChanged(newValue);
if (!newValue)
{
m_ThreadUI.Stop();
}
}
///
/// Gets or sets whether scroll animation is enabled. Default value is true.
/// Scroll animation will be disabled if gallery is running under Remote Windows Terminal session or fade animation effect is disabled on the
/// container control.
///
[Browsable(true), DefaultValue(true), Category("Animation"), Description("Indicates whether scroll animation is enabled.")]
public bool ScrollAnimation
{
get { return m_ScrollAnimation; }
set { m_ScrollAnimation = value; }
}
///
/// Called on each item when ScaleControl method of parent control is called and gives opportunity to item to adjust its displayed based on current scaling.
///
/// Scale factor.
protected override void ScaleItem(SizeF factor)
{
base.ScaleItem(factor);
if (m_PopupGallery == null) return;
m_PopupGallery.NotifyScaleItem(factor);
}
#endregion
#region IExtenderProvider Implementation, GalleryGroup property extender
///
/// Returns whether Gallery can extend the object.
///
/// Object to test extensibility for.
/// Returns true if object can be extended otherwise false.
public bool CanExtend(object extendee)
{
BaseItem item = extendee as BaseItem;
if (item == null) return false;
return this.SubItems.Contains(item);
}
///
/// Gets the GalleryGroup item is assigned to.
///
/// Reference to item.
/// An instance of GalleryGroup object or null if item is not assigned to the group
[Editor("DevComponents.DotNetBar.Design.GalleryGroupTypeEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)), DefaultValue(null)]
public GalleryGroup GetGalleryGroup(BaseItem item)
{
if (item == null) return null;
return GetItemGalleryGroup(item);
}
///
/// Assigns the item to the gallery group.
///
/// Item to assign.
/// Group to assign item to. Can be null to remove item assignment.
public void SetGalleryGroup(BaseItem item, GalleryGroup group)
{
if (item == null)
throw new ArgumentNullException("item argument cannot be null.");
if (group == null)
{
GalleryGroup g = GetItemGalleryGroup(item);
if (g != null)
g.Items.Remove(item);
}
else
{
GalleryGroup g = GetItemGalleryGroup(item);
if (g != null)
g.Items.Remove(item);
group.Items.Add(item);
}
}
private GalleryGroup GetItemGalleryGroup(BaseItem item)
{
foreach (GalleryGroup g in m_Groups)
{
if (g.Items.Contains(item))
return g;
}
return null;
}
///
/// Gets the collection of GalleryGroup objects associated with this gallery. Groups are assigned optionally to one or more items
/// that are part of the GalleryContainer. Groups are used to visually group the items when gallery is displayed on the popup.
///
[Editor("DevComponents.DotNetBar.Design.GalleryGroupCollectionEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Category("Groups"), Browsable(false), Description("Gets the collection of GalleryGroup objects associated with this gallery.")]
public GalleryGroupCollection GalleryGroups
{
get { return m_Groups; }
}
#endregion
}
}