#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

545 lines
11 KiB

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Collections;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Gui
{
public enum SideTabStatus {
Normal,
Selected,
Dragged
}
public delegate void SideTabEventHandler(object source, SideTabEventArgs e);
public class SideTabEventArgs
{
AxSideTab tab;
public SideTabEventArgs(AxSideTab tab)
{
this.tab = tab;
}
public AxSideTab SideTab {
get {
return tab;
}
}
}
public delegate void SideTabItemEventHandler(object source, SideTabItemEventArgs e);
public class SideTabItemEventArgs
{
AxSideTabItem item;
public SideTabItemEventArgs(AxSideTabItem item)
{
this.item = item;
}
public AxSideTabItem Item {
get {
return item;
}
}
}
public delegate void SideTabItemExchangeEventHandler(object source, SideTabItemExchangeEventArgs e);
public class SideTabItemExchangeEventArgs
{
AxSideTabItem item1;
AxSideTabItem item2;
public SideTabItemExchangeEventArgs(AxSideTabItem item1, AxSideTabItem item2)
{
this.item1 = item1;
this.item2 = item2;
}
public AxSideTabItem Item1 {
get {
return item1;
}
}
public AxSideTabItem Item2 {
get {
return item2;
}
}
}
public class AxSideTab
{
string name;
bool canDragDrop = true;
bool canBeDeleted = true;
bool canBeRenamed = true;
bool isClipboardRing = false;
SideTabItemCollection items = new SideTabItemCollection();
SideTabStatus sideTabStatus;
AxSideTabItem selectedItem = null;
AxSideTabItem choosedItem = null;
ImageList largeImageList = null;
ImageList smallImageList = null;
int scrollIndex = 0;
public bool Hidden = false;
public bool IsClipboardRing {
get {
return isClipboardRing;
}
set {
isClipboardRing = value;
}
}
public int ScrollIndex {
get {
return scrollIndex;
}
set {
scrollIndex = value;
}
}
public ImageList LargeImageList {
get {
return largeImageList;
}
set {
largeImageList = value;
}
}
public ImageList SmallImageList {
get {
return smallImageList;
}
set {
smallImageList = value;
}
}
public SideTabStatus SideTabStatus {
get {
return sideTabStatus;
}
set {
sideTabStatus = value;
}
}
public bool CanBeDeleted {
get {
return canBeDeleted;
}
set {
canBeDeleted = value;
}
}
public bool CanBeRenamed {
get {
return canBeRenamed;
}
set {
canBeRenamed = value;
}
}
public string Name {
get {
return name;
}
set {
name = value;
}
}
public SideTabItemCollection Items {
get {
return items;
}
}
public bool CanDragDrop {
get {
return canDragDrop;
}
set {
canDragDrop = value;
}
}
bool canSaved = true;
public bool CanSaved {
get {
return canSaved;
}
set {
canSaved = value;
}
}
public AxSideTabItem SelectedItem {
get {
return selectedItem;
}
set {
if (selectedItem != null && selectedItem != choosedItem) {
selectedItem.SideTabItemStatus = SideTabItemStatus.Normal;
}
selectedItem = value;
if (selectedItem != null && selectedItem != choosedItem) {
selectedItem.SideTabItemStatus = SideTabItemStatus.Selected;
}
}
}
protected void OnChoosedItemChanged(EventArgs e)
{
if (ChoosedItemChanged != null) {
ChoosedItemChanged(this, e);
}
}
public event EventHandler ChoosedItemChanged;
public AxSideTabItem ChoosedItem {
get {
return choosedItem;
}
set {
if (choosedItem != null) {
choosedItem.SideTabItemStatus = SideTabItemStatus.Normal;
}
choosedItem = value;
if (choosedItem != null) {
choosedItem.SideTabItemStatus = SideTabItemStatus.Choosed;
}
OnChoosedItemChanged(null);
}
}
/// <summary>
/// A SideTabItem has been removed.
/// </summary>
public event SideTabItemEventHandler ItemRemoved;
/// <summary>
/// Two SideTabItems have exchanged locations.
/// </summary>
public event SideTabItemExchangeEventHandler ItemsExchanged;
public ISideTabItemFactory SideTabItemFactory {
get {
return items.SideTabItemFactory;
}
set {
items.SideTabItemFactory = value;
}
}
protected AxSideTab()
{
}
public AxSideTab(ISideTabItemFactory sideTabItemFactory)
{
SideTabItemFactory = sideTabItemFactory;
}
public AxSideTab(AxSideBar sideBar, string name) : this(sideBar.SideTabItemFactory)
{
this.name = name;
SetCanRename();
items.ItemRemoved += OnSideTabItemRemoved;
}
public AxSideTab(string name)
{
this.name = name;
SetCanRename();
items.ItemRemoved += OnSideTabItemRemoved;
}
public bool ScrollDownButtonActivated {
get {
return scrollIndex > 0;
}
}
public bool ScrollUpButtonActivated {
get {
return true;
}
}
public void DrawTabHeader(Graphics g, Font font, Point pos, int width)
{
switch (sideTabStatus) {
case SideTabStatus.Normal:
ControlPaint.DrawBorder3D(g, new Rectangle(0, pos.Y, width - 4, font.Height + 4), Border3DStyle.RaisedInner);
g.DrawString(StringParser.Parse(name), font, SystemBrushes.ControlText, new RectangleF(1, pos.Y + 1, width - 5, font.Height + 1));
break;
case SideTabStatus.Selected:
ControlPaint.DrawBorder3D(g, new Rectangle(0, pos.Y, width - 4, font.Height + 4), Border3DStyle.Sunken);
g.DrawString(StringParser.Parse(name), font, SystemBrushes.ControlText, new RectangleF(1 + 1, pos.Y + 2, width - 5, font.Height + 2));
break;
case SideTabStatus.Dragged:
Rectangle r = new Rectangle(0, pos.Y, width - 4, font.Height + 4);
ControlPaint.DrawBorder3D(g, r, Border3DStyle.RaisedInner);
r.X += 2;
r.Y += 1;
r.Width -= 4;
r.Height -= 2;
g.FillRectangle(SystemBrushes.ControlDarkDark, r);
g.DrawString(StringParser.Parse(name), font, SystemBrushes.HighlightText, new RectangleF(1 + 1, pos.Y + 2, width - 5, font.Height + 2));
break;
}
}
public int Height {
get {
return Items.Count * 20;
}
}
public Point GetLocation(AxSideTabItem whichItem)
{
for (int i = 0; i < Items.Count; ++i) {
AxSideTabItem item = (AxSideTabItem)Items[i];
if (item == whichItem) {
return new Point(0, i * 20);
}
}
return new Point(-1, -1);
}
public AxSideTabItem GetItemAt(int x, int y)
{
int index = ScrollIndex + y / 20;
return (index >= 0 && index < Items.Count) ? (AxSideTabItem)Items[index] : null;
}
public AxSideTabItem GetItemAt(Point pos)
{
return GetItemAt(pos.X, pos.Y);
}
public int ItemHeight {
get {
return 20;
}
}
public void DrawTabContent(Graphics g, Font f, Rectangle rectangle)
{
for (int i = 0; i + ScrollIndex < Items.Count; ++i) {
AxSideTabItem item = (AxSideTabItem)Items[ScrollIndex + i];
if (rectangle.Height < i * ItemHeight) {
break;
}
item.DrawItem(g, f, new Rectangle(rectangle.X,
rectangle.Y + i * ItemHeight,
rectangle.Width,
ItemHeight));
}
}
/// <summary>
/// Swaps two side tab items with the given indexes.
/// </summary>
public void Exchange(int a, int b)
{
AxSideTabItem itemA = Items[a];
AxSideTabItem itemB = Items[b];
Items[a] = itemB;
Items[b] = itemA;
OnExchange(itemA, itemB);
}
void SetCanRename()
{
if (name != null && name.StartsWith("${res:")) {
canBeRenamed = false;
}
}
void OnSideTabItemRemoved(object source, SideTabItemEventArgs e)
{
if (ItemRemoved != null) {
ItemRemoved(this, e);
}
}
void OnExchange(AxSideTabItem item1, AxSideTabItem item2)
{
if (ItemsExchanged != null) {
ItemsExchanged(this, new SideTabItemExchangeEventArgs(item1, item2));
}
}
public class SideTabItemCollection : ICollection, IEnumerable
{
ArrayList list = new ArrayList();
ISideTabItemFactory sideTabItemFactory = new DefaultSideTabItemFactory();
public event SideTabItemEventHandler ItemRemoved;
public ISideTabItemFactory SideTabItemFactory {
get {
return sideTabItemFactory;
}
set {
sideTabItemFactory = value;
}
}
public SideTabItemCollection()
{
}
public AxSideTabItem this[int index] {
get {
return (AxSideTabItem)list[index];
}
set {
list[index] = value;
}
}
public int DraggedIndex {
get {
for (int i = 0; i < Count; ++i) {
if (this[i].SideTabItemStatus == SideTabItemStatus.Drag)
return i;
}
return -1;
}
}
public int Count {
get {
return list.Count;
}
}
public virtual bool IsSynchronized {
get {
return false;
}
}
public virtual object SyncRoot {
get {
return this;
}
}
public virtual AxSideTabItem Add(AxSideTabItem item)
{
list.Add(item);
return item;
}
public virtual AxSideTabItem Add(string name, object content)
{
return Add(name, content, -1);
}
public virtual AxSideTabItem Add(string name, object content, int imageIndex)
{
AxSideTabItem item = sideTabItemFactory.CreateSideTabItem(name, imageIndex);
item.Tag = content;
return Add(item);
}
public virtual void Clear()
{
list.Clear();
}
public bool Contains(AxSideTabItem item)
{
return list.Contains(item);
}
public IEnumerator GetEnumerator()
{
return list.GetEnumerator();
}
public int IndexOf(AxSideTabItem item)
{
return list.IndexOf(item);
}
public void CopyTo(Array dest, int index)
{
list.CopyTo(dest, index);
}
public virtual AxSideTabItem Insert(int index, AxSideTabItem item)
{
list.Insert(index, item);
return item;
}
public virtual AxSideTabItem Insert(int index, string name, object content)
{
return Insert(index, name, content, -1);
}
public virtual AxSideTabItem Insert(int index, string name, object content, int imageIndex)
{
AxSideTabItem item = sideTabItemFactory.CreateSideTabItem(name, imageIndex);
item.Tag = content;
return Insert(index, item);
}
public virtual void Remove(AxSideTabItem item)
{
list.Remove(item);
OnItemRemoved(item);
}
public virtual void RemoveAt(int index)
{
if (index < 0 || index >= list.Count) {
return;
}
AxSideTabItem item = this[index];
list.Remove(item);
OnItemRemoved(item);
}
void OnItemRemoved(AxSideTabItem item)
{
if (ItemRemoved != null) {
ItemRemoved(this, new SideTabItemEventArgs(item));
}
}
}
}
}