// *********************************
// Message from Original Author:
//
// 2008 Jose Menendez Poo
// Please give me credit if you use this code. It's all I ask.
// Contact me for more info: menendezpoo@gmail.com
// *********************************
//
// Original project from http://ribbon.codeplex.com/
// Continue to support and maintain by http://officeribbon.codeplex.com/
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms.VisualStyles;
namespace System.Windows.Forms
{
///
/// Represents a list of buttons that can be navigated, an example being the Style Gallery in Word/Excel.
///
[Designer(typeof(RibbonButtonListDesigner))]
public sealed class RibbonButtonList : RibbonItem,
IContainsSelectableRibbonItems, IScrollableRibbonItem, IContainsRibbonComponents
{
#region Subtypes
public enum ListScrollType
{
UpDownButtons,
Scrollbar
}
#endregion
#region Fields
private int _itemsInLargeMode;
private int _itemsInMediumMode;
private Size _ItemsInDropwDownMode;
private Rectangle _contentBounds;
private int _controlButtonsWidth;
private RibbonElementSizeMode _buttonsSizeMode;
private int _jumpDownSize;
private int _jumpUpSize;
private int _offset;
private RibbonDropDown _dropDown;
private bool _dropDownVisible;
private Rectangle _thumbBounds;
private int _scrollValue;
private Rectangle fullContentBounds;
private int _thumbOffset;
private bool _avoidNextThumbMeasure;
private RibbonItem _selectedItem;
public event RibbonItemEventHandler ButtonItemClicked;
public event RibbonItemEventHandler DropDownItemClicked;
public delegate void RibbonItemEventHandler(object sender, RibbonItemEventArgs e);
#endregion
#region Ctor
public RibbonButtonList()
{
Buttons = new RibbonButtonCollection(this);
DropDownItems = new RibbonItemCollection();
DropDownItems.SetOwnerItem(this);
_controlButtonsWidth = 16;
_itemsInLargeMode = 7;
_itemsInMediumMode = 3;
_ItemsInDropwDownMode = new Size(7, 5);
_buttonsSizeMode = RibbonElementSizeMode.Large;
ScrollType = ListScrollType.UpDownButtons;
}
public RibbonButtonList(IEnumerable buttons)
: this(buttons, null)
{
}
public RibbonButtonList(IEnumerable buttons, IEnumerable dropDownItems)
: this()
{
if (buttons != null)
{
List items = new List(buttons);
Buttons.AddRange(items.ToArray());
//add the handlers
foreach (RibbonItem item in buttons)
{
item.Click += item_Click;
}
}
if (dropDownItems != null)
{
DropDownItems.AddRange(dropDownItems);
//add the handlers
foreach (RibbonItem item in dropDownItems)
{
item.Click += item_Click;
}
}
}
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing)
{
foreach (RibbonItem item in Buttons)
{
item.Click -= item_Click;
}
foreach (RibbonItem item in DropDownItems)
{
item.Click -= item_Click;
}
}
base.Dispose(disposing);
}
#endregion
#region Props
[Category("Layout")]
[Description("If activated, buttons will flow to bottom inside the list")]
public bool FlowToBottom { get; set; }
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle ScrollBarBounds => Rectangle.FromLTRB(ButtonUpBounds.Left, ButtonUpBounds.Top, ButtonDownBounds.Right, ButtonDownBounds.Bottom);
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ScrollBarEnabled { get; private set; }
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ListScrollType ScrollType { get; private set; }
///
/// Gets the percent of scrolled content
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public double ScrolledPercent
{
get => (ContentBounds.Top - (double)fullContentBounds.Top) /
(fullContentBounds.Height - (double)ContentBounds.Height);
set
{
_avoidNextThumbMeasure = true;
ScrollTo(-Convert.ToInt32((fullContentBounds.Height - ContentBounds.Height) * value));
}
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int ScrollMinimum
{
get
{
if (ScrollType == ListScrollType.Scrollbar)
{
return ButtonUpBounds.Bottom;
}
return 0;
}
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int ScrollMaximum
{
get
{
if (ScrollType == ListScrollType.Scrollbar)
{
//return ButtonDownBounds.Top - ThumbBounds.Height;
return ButtonDownBounds.Top - ThumbBounds.Height;
}
return 0;
}
}
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int ScrollValue
{
get => _scrollValue;
set
{
if (value > ScrollMaximum || value < ScrollMinimum)
{
throw new ArgumentOutOfRangeException(nameof(ScrollValue), "Scroll value must exist between ScrollMinimum and Scroll Maximum");
}
_thumbBounds.Y = value;
double scrolledPixels = value - ScrollMinimum;
double pixelsAvailable = ScrollMaximum - ScrollMinimum;
ScrolledPercent = scrolledPixels / pixelsAvailable;
_scrollValue = value;
}
}
///
/// Redraws the scroll part of the list
///
private void RedrawScroll()
{
if (Canvas != null)
Canvas.Invalidate(Rectangle.FromLTRB(ButtonDownBounds.X, ButtonUpBounds.Y, ButtonDownBounds.Right, ButtonDownBounds.Bottom));
}
///
/// Gets if the scrollbar thumb is currently selected
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ThumbSelected { get; private set; }
///
/// Gets if the scrollbar thumb is currently pressed
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ThumbPressed { get; private set; }
///
/// Gets the bounds of the scrollbar thumb
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle ThumbBounds => _thumbBounds;
///
/// Gets if the DropDown button is present on thelist
///
[Browsable(false)]
public bool ButtonDropDownPresent => ButtonDropDownBounds.Height > 0;
///
/// Gets the collection of items shown on the dropdown pop-up when Style allows it
///
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public RibbonItemCollection DropDownItems { get; }
///
/// Gets or sets the size that the buttons on the list should be
///
[Category("Appearance")]
public RibbonElementSizeMode ButtonsSizeMode
{
get => _buttonsSizeMode;
set { _buttonsSizeMode = value; if (Owner != null) Owner.OnRegionsChanged(); }
}
///
/// Gets a value indicating if the button that scrolls up the content is currently enabled
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonUpEnabled { get; private set; }
///
/// Gets a value indicating if the button that scrolls down the content is currently enabled
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonDownEnabled { get; private set; }
///
/// Gets a value indicating if the DropDown button is currently selected
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonDropDownSelected { get; private set; }
///
/// Gets a value indicating if the DropDown button is currently pressed
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonDropDownPressed { get; private set; }
///
/// Gets a vaule indicating if the button that scrolls down the content is currently selected
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonDownSelected { get; private set; }
///
/// Gets a vaule indicating if the button that scrolls down the content is currently pressed
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonDownPressed { get; private set; }
///
/// Gets a vaule indicating if the button that scrolls up the content is currently selected
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonUpSelected { get; private set; }
///
/// Gets a vaule indicating if the button that scrolls up the content is currently pressed
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool ButtonUpPressed { get; private set; }
///
/// Gets the bounds of the content where items are shown
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override Rectangle ContentBounds => _contentBounds;
///
/// Gets the bounds of the button that scrolls the items up
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle ButtonUpBounds { get; private set; }
///
/// Gets the bounds of the button that scrolls the items down
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle ButtonDownBounds { get; private set; }
///
/// Gets the bounds of the button that scrolls
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle ButtonDropDownBounds { get; private set; }
///
/// Gets or sets the with of the buttons that allow to navigate thru the list
///
[DefaultValue(16)]
[Browsable(false)]
public int ControlButtonsWidth
{
get => _controlButtonsWidth;
set { _controlButtonsWidth = value; if (Owner != null) Owner.OnRegionsChanged(); }
}
///
/// Gets or sets a value indicating the amount of items to show
/// (wide) when SizeMode is Large
///
[DefaultValue(7)]
[Category("Appearance")]
public int ItemsWideInLargeMode
{
get => _itemsInLargeMode;
set { _itemsInLargeMode = value; if (Owner != null) Owner.OnRegionsChanged(); }
}
///
/// Gets or sets a value indicating the amount of items to show
/// (wide) when SizeMode is Medium
///
[DefaultValue(3)]
[Category("Appearance")]
public int ItemsWideInMediumMode
{
get => _itemsInMediumMode;
set { _itemsInMediumMode = value; if (Owner != null) Owner.OnRegionsChanged(); }
}
///
/// Gets or sets a value indicating the amount of items to show
/// (wide) when SizeMode is Medium
///
[Category("Appearance")]
public Size ItemsSizeInDropwDownMode
{
get => _ItemsInDropwDownMode;
set { _ItemsInDropwDownMode = value; if (Owner != null) Owner.OnRegionsChanged(); }
}
///
/// Gets the collection of buttons of the list
///
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public RibbonButtonCollection Buttons { get; }
#endregion
#region Methods
///
/// Ignores deactivation of canvas if it is a volatile window
///
private void IgnoreDeactivation()
{
if (Canvas is RibbonPanelPopup)
{
(Canvas as RibbonPanelPopup).IgnoreNextClickDeactivation();
}
if (Canvas is RibbonDropDown)
{
(Canvas as RibbonDropDown).IgnoreNextClickDeactivation();
}
}
///
/// Redraws the control buttons: up, down and dropdown
///
private void RedrawControlButtons()
{
if (Canvas != null)
{
if (ScrollType == ListScrollType.Scrollbar)
{
Canvas.Invalidate(ScrollBarBounds);
}
else
{
Canvas.Invalidate(Rectangle.FromLTRB(ButtonUpBounds.Left, ButtonUpBounds.Top, ButtonDropDownBounds.Right, ButtonDropDownBounds.Bottom));
}
}
}
///
/// Pushes the amount of _offset of the top of items
///
///
private void ScrollOffset(int amount)
{
ScrollTo(_offset + amount);
}
///
/// Scrolls the content to the specified offset
///
///
private void ScrollTo(int offset)
{
int minOffset = ContentBounds.Height - fullContentBounds.Height;
if (offset < minOffset)
{
offset = minOffset;
}
_offset = offset;
SetBounds(Bounds);
RedrawItem();
}
///
/// Scrolls the list down
///
public void ScrollDown()
{
ScrollOffset(-(_jumpDownSize + 1));
}
///
/// Scrolls the list up
///
public void ScrollUp()
{
ScrollOffset(_jumpDownSize + 1);
}
///
/// Shows the drop down items of the button, as if the dropdown part has been clicked
///
public void ShowDropDown()
{
if (DropDownItems.Count == 0)
{
SetPressed(false);
return;
}
IgnoreDeactivation();
_dropDown = new RibbonDropDown(this, DropDownItems, Owner)
{
//_dropDown.FormClosed += new FormClosedEventHandler(dropDown_FormClosed);
//_dropDown.StartPosition = FormStartPosition.Manual;
ShowSizingGrip = true
};
Point location = Canvas.PointToScreen(new Point(Bounds.Left, Bounds.Top));
SetDropDownVisible(true);
_dropDown.Show(location);
}
private void dropDown_FormClosed(object sender, FormClosedEventArgs e)
{
SetDropDownVisible(false);
}
///
/// Closes the DropDown if opened
///
public void CloseDropDown()
{
if (_dropDown != null)
{
//RibbonDropDown.DismissTo(_dropDown);
}
SetDropDownVisible(false);
}
///
/// Sets the value of DropDownVisible
///
///
internal void SetDropDownVisible(bool visible)
{
_dropDownVisible = visible;
}
#endregion
#region Overrides
public override void OnCanvasChanged(EventArgs e)
{
base.OnCanvasChanged(e);
if (Canvas is RibbonDropDown)
{
ScrollType = ListScrollType.Scrollbar;
}
else
{
ScrollType = ListScrollType.UpDownButtons;
}
}
protected override bool ClosesDropDownAt(Point p)
{
return !(
ButtonDropDownBounds.Contains(p) ||
ButtonDownBounds.Contains(p) ||
ButtonUpBounds.Contains(p) ||
(ScrollType == ListScrollType.Scrollbar && ScrollBarBounds.Contains(p))
);
}
internal override void SetOwner(Ribbon owner)
{
base.SetOwner(owner);
Buttons.SetOwner(owner);
DropDownItems.SetOwner(owner);
}
internal override void SetOwnerPanel(RibbonPanel ownerPanel)
{
base.SetOwnerPanel(ownerPanel);
Buttons.SetOwnerPanel(ownerPanel);
DropDownItems.SetOwnerPanel(ownerPanel);
}
internal override void SetOwnerTab(RibbonTab ownerTab)
{
base.SetOwnerTab(ownerTab);
Buttons.SetOwnerTab(ownerTab);
DropDownItems.SetOwnerTab(OwnerTab);
}
internal override void SetOwnerItem(RibbonItem ownerItem)
{
base.SetOwnerItem(ownerItem);
}
internal override void ClearOwner()
{
List oldItems = new List(Buttons.Count + DropDownItems.Count);
oldItems.AddRange(Buttons);
oldItems.AddRange(DropDownItems);
base.ClearOwner();
foreach (RibbonItem item in oldItems)
{
item.ClearOwner();
}
}
public override void OnPaint(object sender, RibbonElementPaintEventArgs e)
{
Owner.Renderer.OnRenderRibbonItem(new RibbonItemRenderEventArgs(Owner, e.Graphics, e.Clip, this));
if (e.Mode != RibbonElementSizeMode.Compact)
{
Region lastClip = e.Graphics.Clip;
Region newClip = new Region(lastClip.GetBounds(e.Graphics));
newClip.Intersect(ContentBounds);
e.Graphics.SetClip(newClip.GetBounds(e.Graphics));
foreach (RibbonButton button in Buttons)
{
if (!button.Bounds.IsEmpty)
button.OnPaint(this, new RibbonElementPaintEventArgs(button.Bounds, e.Graphics, ButtonsSizeMode));
}
e.Graphics.SetClip(lastClip.GetBounds(e.Graphics));
}
}
public override void SetBounds(Rectangle bounds)
{
base.SetBounds(bounds);
#region Assign control buttons bounds
if (ScrollType != ListScrollType.Scrollbar)
{
#region Custom Buttons
int cbtns = 3; // Canvas is RibbonDropDown ? 2 : 3;
int buttonHeight = bounds.Height / cbtns;
int buttonWidth = _controlButtonsWidth;
ButtonUpBounds = Rectangle.FromLTRB(bounds.Right - buttonWidth,
bounds.Top, bounds.Right, bounds.Top + buttonHeight);
ButtonDownBounds = Rectangle.FromLTRB(ButtonUpBounds.Left, ButtonUpBounds.Bottom,
bounds.Right, ButtonUpBounds.Bottom + buttonHeight);
if (cbtns == 2)
{
ButtonDropDownBounds = Rectangle.Empty;
}
else
{
ButtonDropDownBounds = Rectangle.FromLTRB(ButtonDownBounds.Left, ButtonDownBounds.Bottom,
bounds.Right, bounds.Bottom + 1);
}
_thumbBounds.Location = Point.Empty;
#endregion
}
else
{
#region Scrollbar
int bwidth = ThumbBounds.Width;
int bheight = ThumbBounds.Width;
ButtonUpBounds = Rectangle.FromLTRB(bounds.Right - bwidth,
bounds.Top + 1, bounds.Right, bounds.Top + bheight + 1);
ButtonDownBounds = Rectangle.FromLTRB(ButtonUpBounds.Left, bounds.Bottom - bheight,
bounds.Right, bounds.Bottom);
ButtonDropDownBounds = Rectangle.Empty;
_thumbBounds.X = ButtonUpBounds.Left;
#endregion
}
_contentBounds = Rectangle.FromLTRB(bounds.Left + 1, bounds.Top + 1, ButtonUpBounds.Left - 1, bounds.Bottom - 1);
#endregion
#region Assign buttons regions
ButtonUpEnabled = _offset < 0;
if (!ButtonUpEnabled) _offset = 0;
ButtonDownEnabled = false;
int curLeft = ContentBounds.Left + 1;
int curTop = ContentBounds.Top + 1 + _offset;
int maxBottom = curTop; // int.MinValue;
int iniTop = curTop;
foreach (RibbonItem item in Buttons)
{
item.SetBounds(Rectangle.Empty);
}
for (int i = 0; i < Buttons.Count; i++)
{
RibbonButton button = Buttons[i] as RibbonButton; if (button == null) break;
if (curLeft + button.LastMeasuredSize.Width > ContentBounds.Right)
{
curLeft = ContentBounds.Left + 1;
curTop = maxBottom + 1;
}
button.SetBounds(new Rectangle(curLeft, curTop, button.LastMeasuredSize.Width, button.LastMeasuredSize.Height));
curLeft = button.Bounds.Right + 1;
maxBottom = Math.Max(maxBottom, button.Bounds.Bottom);
if (button.Bounds.Bottom > ContentBounds.Bottom) ButtonDownEnabled = true;
_jumpDownSize = button.Bounds.Height;
_jumpUpSize = button.Bounds.Height;
}
//Kevin - The bottom row of buttons were always getting cropped off a tiny bit
maxBottom += 1;
#endregion
#region Adjust thumb size
double contentHeight = maxBottom - iniTop;
double viewHeight = ContentBounds.Height;
if (contentHeight > viewHeight && contentHeight != 0)
{
double viewPercent = viewHeight / contentHeight;
double availHeight = ButtonDownBounds.Top - ButtonUpBounds.Bottom;
double thumbHeight = Math.Ceiling(viewPercent * availHeight);
if (thumbHeight < 30)
{
if (availHeight >= 30)
{
thumbHeight = 30;
}
else
{
thumbHeight = availHeight;
}
}
_thumbBounds.Height = Convert.ToInt32(thumbHeight);
fullContentBounds = Rectangle.FromLTRB(ContentBounds.Left, iniTop, ContentBounds.Right, maxBottom);
ScrollBarEnabled = true;
UpdateThumbPos();
}
else
{
ScrollBarEnabled = false;
}
#endregion
}
///
/// Updates the position of the scroll thumb depending on the current offset
///
private void UpdateThumbPos()
{
if (_avoidNextThumbMeasure)
{
_avoidNextThumbMeasure = false;
return;
}
double scrolledp = ScrolledPercent;
if (!double.IsInfinity(scrolledp))
{
double availSpace = ScrollMaximum - ScrollMinimum;
double scrolledSpace = Math.Ceiling(availSpace * ScrolledPercent);
_thumbBounds.Y = ScrollMinimum + Convert.ToInt32(scrolledSpace);
}
else
{
_thumbBounds.Y = ScrollMinimum;
}
if (_thumbBounds.Y > ScrollMaximum)
{
_thumbBounds.Y = ScrollMaximum;
}
}
public override Size MeasureSize(object sender, RibbonElementMeasureSizeEventArgs e)
{
if (!Visible && !Owner.IsDesignMode())
{
SetLastMeasuredSize(new Size(0, 0));
return LastMeasuredSize;
}
#region Determine items
int itemsWide = 0;
switch (e.SizeMode)
{
case RibbonElementSizeMode.DropDown:
itemsWide = ItemsSizeInDropwDownMode.Width;
break;
case RibbonElementSizeMode.Large:
itemsWide = ItemsWideInLargeMode;
break;
case RibbonElementSizeMode.Medium:
itemsWide = ItemsWideInMediumMode;
break;
case RibbonElementSizeMode.Compact:
itemsWide = 0;
break;
}
#endregion
int height = OwnerPanel.ContentBounds.Height - Owner.ItemPadding.Vertical - 4;
int scannedItems = 0;
int widthSum = 1;
int buttonHeight = 0;
int heightSum = 0;
bool sumWidth = true;
foreach (RibbonButton button in Buttons)
{
Size s = button.MeasureSize(this,
new RibbonElementMeasureSizeEventArgs(e.Graphics, ButtonsSizeMode));
if (sumWidth)
widthSum += s.Width + 1;
buttonHeight = button.LastMeasuredSize.Height;
heightSum += buttonHeight;
if (++scannedItems == itemsWide) sumWidth = false;
}
if (e.SizeMode == RibbonElementSizeMode.DropDown)
{
height = buttonHeight * ItemsSizeInDropwDownMode.Height;
}
if (ScrollBarRenderer.IsSupported)
{
_thumbBounds = new Rectangle(Point.Empty, ScrollBarRenderer.GetSizeBoxSize(e.Graphics, ScrollBarState.Normal));
}
else
{
_thumbBounds = new Rectangle(Point.Empty, new Size(16, 16));
}
//if (height < 0)
//{
// throw new Exception("???");
//}
//Got off the patch site from logicalerror
//SetLastMeasuredSize(new Size(widthSum + ControlButtonsWidth, height));
SetLastMeasuredSize(new Size(Math.Max(0, widthSum + ControlButtonsWidth), Math.Max(0, height)));
return LastMeasuredSize;
}
internal override void SetSizeMode(RibbonElementSizeMode sizeMode)
{
base.SetSizeMode(sizeMode);
foreach (RibbonItem item in Buttons)
{
item.SetSizeMode(ButtonsSizeMode);
}
}
public override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (ButtonDownPressed && ButtonDownSelected && ButtonDownEnabled)
{
ScrollOffset(-1);
}
if (ButtonUpPressed && ButtonUpSelected && ButtonUpEnabled)
{
ScrollOffset(1);
}
bool upCache = ButtonUpSelected;
bool downCache = ButtonDownSelected;
bool dropCache = ButtonDropDownSelected;
bool thumbCache = ThumbSelected;
ButtonUpSelected = ButtonUpBounds.Contains(e.Location);
ButtonDownSelected = ButtonDownBounds.Contains(e.Location);
ButtonDropDownSelected = ButtonDropDownBounds.Contains(e.Location);
ThumbSelected = _thumbBounds.Contains(e.Location) && ScrollType == ListScrollType.Scrollbar && ScrollBarEnabled;
if ((upCache != ButtonUpSelected)
|| (downCache != ButtonDownSelected)
|| (dropCache != ButtonDropDownSelected)
|| (thumbCache != ThumbSelected))
{
RedrawControlButtons();
}
if (ThumbPressed)
{
int newval = e.Y - _thumbOffset;
if (newval < ScrollMinimum)
{
newval = ScrollMinimum;
}
else if (newval > ScrollMaximum)
{
newval = ScrollMaximum;
}
ScrollValue = newval;
RedrawScroll();
}
}
public override void OnMouseLeave(MouseEventArgs e)
{
base.OnMouseLeave(e);
bool mustRedraw = ButtonUpSelected || ButtonDownSelected || ButtonDropDownSelected;
ButtonUpSelected = false;
ButtonDownSelected = false;
ButtonDropDownSelected = false;
if (mustRedraw)
RedrawControlButtons();
}
public override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (ButtonDownSelected || ButtonUpSelected || ButtonDropDownSelected)
{
IgnoreDeactivation();
}
if (ButtonDownSelected && ButtonDownEnabled)
{
ButtonDownPressed = true;
ScrollDown();
}
if (ButtonUpSelected && ButtonUpEnabled)
{
ButtonUpPressed = true;
ScrollUp();
}
if (ButtonDropDownSelected)
{
ButtonDropDownPressed = true;
ShowDropDown();
}
if (ThumbSelected)
{
ThumbPressed = true;
_thumbOffset = e.Y - _thumbBounds.Y;
}
if (
ScrollType == ListScrollType.Scrollbar &&
ScrollBarBounds.Contains(e.Location) &&
e.Y >= ButtonUpBounds.Bottom && e.Y <= ButtonDownBounds.Y &&
!ThumbBounds.Contains(e.Location) &&
!ButtonDownBounds.Contains(e.Location) &&
!ButtonUpBounds.Contains(e.Location))
{
//clicked the scroll area above or below the thumb
if (e.Y < ThumbBounds.Y)
{
ScrollOffset(ContentBounds.Height);
}
else
{
ScrollOffset(-ContentBounds.Height);
}
}
}
public override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
ButtonDownPressed = false;
ButtonUpPressed = false;
ButtonDropDownPressed = false;
ThumbPressed = false;
}
public override void OnClick(EventArgs e)
{
//we need to override the onclick otherwise clicking on the scrollbar will close the popup window
RibbonPopup pop = Canvas as RibbonPopup;
if (pop == null)
{
base.OnClick(e);
}
}
public void OnDropDownItemClicked(ref RibbonItemEventArgs e)
{
if (DropDownItemClicked != null)
{
DropDownItemClicked(e.Item, e);
}
}
public void OnButtonItemClicked(ref RibbonItemEventArgs e)
{
if (ButtonItemClicked != null)
{
ButtonItemClicked(e.Item, e);
}
}
#endregion
internal void item_Click(object sender, EventArgs e)
{
// Steve
_selectedItem = (sender as RibbonItem);
//Kevin Carbis
RibbonItemEventArgs ev = new RibbonItemEventArgs(_selectedItem);
if (DropDownItems.Contains(_selectedItem))
OnDropDownItemClicked(ref ev);
else
OnButtonItemClicked(ref ev);
}
#region IContainsRibbonItems Members
public IEnumerable GetItems()
{
return Buttons;
}
public Rectangle GetContentBounds()
{
return ContentBounds;
}
#endregion
#region IContainsRibbonComponents Members
public IEnumerable GetAllChildComponents()
{
List result = new List(Buttons.ToArray());
result.AddRange(DropDownItems.ToArray());
return result;
}
#endregion
}
}