202 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.Xml;
 | 
						|
 | 
						|
#if AdvTree
 | 
						|
namespace DevComponents.Tree.TextMarkup
 | 
						|
#elif DOTNETBAR
 | 
						|
namespace DevComponents.DotNetBar.TextMarkup
 | 
						|
#elif SUPERGRID
 | 
						|
namespace DevComponents.SuperGrid.TextMarkup
 | 
						|
#elif LAYOUT
 | 
						|
namespace DevComponents.DotNetBar.Layout.TextMarkup
 | 
						|
#endif
 | 
						|
{
 | 
						|
    internal class ExpandElement : MarkupElement
 | 
						|
    {
 | 
						|
        #region Internal Implementation
 | 
						|
        private Size m_DefaultSize = new Size(5, 4);
 | 
						|
        private eExpandDirection m_Direction = eExpandDirection.Default;
 | 
						|
 | 
						|
        public override void Measure(System.Drawing.Size availableSize, MarkupDrawContext d)
 | 
						|
        {
 | 
						|
            this.Bounds = new Rectangle(Point.Empty, m_DefaultSize);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void ArrangeCore(System.Drawing.Rectangle finalRect, MarkupDrawContext d) { }
 | 
						|
 | 
						|
        public override void Render(MarkupDrawContext d)
 | 
						|
        {
 | 
						|
            Rectangle r = this.Bounds;
 | 
						|
            r.Offset(d.Offset);
 | 
						|
 | 
						|
            if (!d.ClipRectangle.IsEmpty && !r.IntersectsWith(d.ClipRectangle))
 | 
						|
                return;
 | 
						|
 | 
						|
            Graphics g = d.Graphics;
 | 
						|
            Color color = d.CurrentForeColor;
 | 
						|
            //Color shadeColor = Color.FromArgb(96, Color.White);
 | 
						|
 | 
						|
            eExpandDirection direction = eExpandDirection.Bottom;
 | 
						|
            if (m_Direction != eExpandDirection.Default)
 | 
						|
                direction = m_Direction;
 | 
						|
 | 
						|
            #if DOTNETBAR
 | 
						|
            if(d.ContextObject is ButtonItem)
 | 
						|
            {
 | 
						|
                if (m_Direction == eExpandDirection.Default)
 | 
						|
                {
 | 
						|
                    ButtonItem item = d.ContextObject as ButtonItem;
 | 
						|
                    if (item.IsOnMenu)
 | 
						|
                    {
 | 
						|
                        direction = eExpandDirection.Right;
 | 
						|
                        if (item.PopupSide == ePopupSide.Default && d.RightToLeft || item.PopupSide == ePopupSide.Left)
 | 
						|
                            direction = eExpandDirection.Left;
 | 
						|
                    }
 | 
						|
                    else if (item.PopupSide == ePopupSide.Default)
 | 
						|
                        direction = eExpandDirection.Bottom;
 | 
						|
                    else if (item.PopupSide == ePopupSide.Left)
 | 
						|
                        direction = eExpandDirection.Left;
 | 
						|
                    else if (item.PopupSide == ePopupSide.Right)
 | 
						|
                        direction = eExpandDirection.Right;
 | 
						|
                    else if (item.PopupSide == ePopupSide.Bottom)
 | 
						|
                        direction = eExpandDirection.Bottom;
 | 
						|
                    else if (item.PopupSide == ePopupSide.Top)
 | 
						|
                        direction = eExpandDirection.Top;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            #endif
 | 
						|
 | 
						|
            SmoothingMode sm = g.SmoothingMode;
 | 
						|
            g.SmoothingMode = SmoothingMode.None;
 | 
						|
 | 
						|
            Rectangle shadeRect = r;
 | 
						|
            if (direction == eExpandDirection.Bottom || direction == eExpandDirection.PopupDropDown)
 | 
						|
                shadeRect.Offset(0, 1);
 | 
						|
            else if (direction == eExpandDirection.Top)
 | 
						|
                shadeRect.Offset(0, -1);
 | 
						|
            else if (direction == eExpandDirection.Left)
 | 
						|
                shadeRect.Offset(1, 0);
 | 
						|
            else if (direction == eExpandDirection.Right)
 | 
						|
                shadeRect.Offset(-1, 0);
 | 
						|
            Point[] p = GetExpandPolygon(shadeRect, direction);
 | 
						|
            //using (SolidBrush brush = new SolidBrush(shadeColor))
 | 
						|
            //    g.FillPolygon(brush, p);
 | 
						|
 | 
						|
            p = GetExpandPolygon(r, direction);
 | 
						|
            using(SolidBrush brush = new SolidBrush(color))
 | 
						|
                g.FillPolygon(brush, p);
 | 
						|
 | 
						|
            if (direction == eExpandDirection.PopupDropDown)
 | 
						|
            {
 | 
						|
                using (Pen pen = new Pen(color, 1))
 | 
						|
                    g.DrawLine(pen, r.X, r.Y - 2, r.Right - 1, r.Y - 2);
 | 
						|
                //using (Pen pen = new Pen(shadeColor, 1))
 | 
						|
                //    g.DrawLine(pen, r.X, r.Y - 1, r.Right - 1, r.Y - 1);
 | 
						|
            }
 | 
						|
 | 
						|
            g.SmoothingMode = sm;
 | 
						|
 | 
						|
            this.RenderBounds = r;
 | 
						|
        }
 | 
						|
 | 
						|
        private Point[] GetExpandPolygon(Rectangle r, eExpandDirection direction)
 | 
						|
        {
 | 
						|
            Point[] p = new Point[3];
 | 
						|
            switch (direction)
 | 
						|
            {
 | 
						|
                case eExpandDirection.Right:
 | 
						|
                    {
 | 
						|
                        p[0].X = r.Left + 1;
 | 
						|
                        p[0].Y = r.Top + (r.Height - m_DefaultSize.Height) / 2 - 1;
 | 
						|
                        p[1].X = p[0].X;
 | 
						|
                        p[1].Y = p[0].Y + 6;
 | 
						|
                        p[2].X = p[0].X + 3;
 | 
						|
                        p[2].Y = p[0].Y + 3;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                case eExpandDirection.Left:
 | 
						|
                    {
 | 
						|
                        p[0].X = r.Left + 3;
 | 
						|
                        p[0].Y = r.Top + (r.Height - m_DefaultSize.Height) / 2 - 1;
 | 
						|
                        p[1].X = p[0].X;
 | 
						|
                        p[1].Y = p[0].Y + 6;
 | 
						|
                        p[2].X = p[0].X - 3;
 | 
						|
                        p[2].Y = p[0].Y + 3;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                case eExpandDirection.Top:
 | 
						|
                    {
 | 
						|
                        p[0].X = r.Left - 1;
 | 
						|
                        p[0].Y = r.Top + (r.Height - m_DefaultSize.Height) / 2 + m_DefaultSize.Height;
 | 
						|
                        p[1].X = p[0].X + 6;
 | 
						|
                        p[1].Y = p[0].Y;
 | 
						|
                        p[2].X = p[0].X + 3;
 | 
						|
                        p[2].Y = p[0].Y - 4;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                case eExpandDirection.Bottom:
 | 
						|
                case eExpandDirection.PopupDropDown:
 | 
						|
                    {
 | 
						|
                        p[0].X = r.Left;
 | 
						|
                        p[0].Y = r.Top + (r.Height - m_DefaultSize.Height) / 2 + 1;
 | 
						|
                        p[1].X = p[0].X + 5;
 | 
						|
                        p[1].Y = p[0].Y;
 | 
						|
                        p[2].X = p[0].X + 2;
 | 
						|
                        p[2].Y = p[0].Y + 3;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
            }
 | 
						|
            return p;
 | 
						|
        }
 | 
						|
 | 
						|
        public override void ReadAttributes(XmlTextReader reader)
 | 
						|
        {
 | 
						|
            m_Direction = eExpandDirection.Default;
 | 
						|
 | 
						|
            for (int i = 0; i < reader.AttributeCount; i++)
 | 
						|
            {
 | 
						|
                reader.MoveToAttribute(i);
 | 
						|
                if (reader.Name.ToLower() == "direction")
 | 
						|
                {
 | 
						|
                    string s = reader.Value.ToLower();
 | 
						|
                    if (s == "left")
 | 
						|
                        m_Direction = eExpandDirection.Left;
 | 
						|
                    else if (s == "right")
 | 
						|
                        m_Direction = eExpandDirection.Right;
 | 
						|
                    else if (s == "top")
 | 
						|
                        m_Direction = eExpandDirection.Top;
 | 
						|
                    else if (s == "bottom")
 | 
						|
                        m_Direction = eExpandDirection.Bottom;
 | 
						|
                    else if (s == "popup")
 | 
						|
                        m_Direction = eExpandDirection.PopupDropDown;
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private enum eExpandDirection
 | 
						|
        {
 | 
						|
            Left,
 | 
						|
            Right,
 | 
						|
            Top,
 | 
						|
            Bottom,
 | 
						|
            Default,
 | 
						|
            PopupDropDown
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns whether layout manager can start new line with this element.
 | 
						|
        /// </summary>
 | 
						|
        public override bool CanStartNewLine
 | 
						|
        {
 | 
						|
            get { return false; }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
}
 |