194 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
using DevComponents.DotNetBar;
 | 
						|
 | 
						|
namespace DevComponents.AdvTree.Layout
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Class that is used to layout column header.
 | 
						|
	/// </summary>
 | 
						|
	internal class ColumnHeaderLayout
 | 
						|
	{
 | 
						|
		public ColumnHeaderLayout()
 | 
						|
		{
 | 
						|
		}
 | 
						|
 | 
						|
		// Assumes that layoutInfo is up-to-date and that Node that is connected with
 | 
						|
		// columns is already processed and it's size and location calculated.
 | 
						|
		// layoutInfo.Top member reflects the next position below the node
 | 
						|
		// layoutInfo.LevelOffset should reflect the X offset for the child nodes.
 | 
						|
		public static int LayoutColumnHeader(NodeLayoutContextInfo layoutInfo,int x, int y, int clientWidth, int cellHorizontalSpacing)
 | 
						|
		{
 | 
						|
            ColumnHeaderCollection columns = null;
 | 
						|
			Node node=layoutInfo.ContextNode;
 | 
						|
            if (node == null)
 | 
						|
                columns = layoutInfo.TreeColumns;
 | 
						|
            else
 | 
						|
                columns = node.NodesColumns;
 | 
						|
            columns.UsesRelativeSize = false;
 | 
						|
            int height=0;
 | 
						|
            bool adjustHeight = false;
 | 
						|
            Rectangle totalBounds = Rectangle.Empty;
 | 
						|
            ColumnHeader lastVisibleColumn = null;
 | 
						|
            ColumnHeader stretchToFillColumn = null;
 | 
						|
            bool allRelative = true;
 | 
						|
            bool firstVisible = true;
 | 
						|
            for (int i = 0; i < columns.Count; i++)
 | 
						|
			{
 | 
						|
                ColumnHeader col = columns.ColumnAtDisplayIndex(i);
 | 
						|
                col.IsLastVisible = false;
 | 
						|
				if(!col.Visible)
 | 
						|
					continue;
 | 
						|
                col.IsFirstVisible = firstVisible;
 | 
						|
                firstVisible = false;
 | 
						|
				//if(col.SizeChanged)
 | 
						|
				{
 | 
						|
					// Column for child nodes is always placed below the current node and
 | 
						|
					// is not included in the node's rectangle
 | 
						|
					Rectangle bounds=Rectangle.Empty;
 | 
						|
					bounds.X=x;
 | 
						|
					bounds.Y=y;
 | 
						|
                    if (col.Width.AutoSize)
 | 
						|
                    {
 | 
						|
                        int autoWidth = col.Width.AutoSizeWidth;
 | 
						|
                        if (col.Width.AutoSizeMinHeader)
 | 
						|
                        {
 | 
						|
                            Font headerFont = layoutInfo.DefaultFont;
 | 
						|
                            if (!string.IsNullOrEmpty(col.StyleNormal))
 | 
						|
                            {
 | 
						|
                                ElementStyle style = layoutInfo.Styles[col.StyleNormal];
 | 
						|
                                if (style != null && style.Font != null)
 | 
						|
                                    headerFont = style.Font;
 | 
						|
                            }
 | 
						|
                            else if (layoutInfo.ColumnStyle != null && layoutInfo.ColumnStyle.Font != null)
 | 
						|
                                headerFont = layoutInfo.ColumnStyle.Font;
 | 
						|
                            if (headerFont != null)
 | 
						|
                            {
 | 
						|
                                int columnHeaderTextWidth = (int)Math.Ceiling(layoutInfo.Graphics.MeasureString(col.Text, headerFont).Width) + 2;
 | 
						|
                                autoWidth = Math.Max(autoWidth, columnHeaderTextWidth);
 | 
						|
                                col.Width.SetAutoSizeWidth(autoWidth);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        bounds.Width = autoWidth;
 | 
						|
                        allRelative = false;
 | 
						|
                    }
 | 
						|
                    else if (col.Width.Absolute > 0)
 | 
						|
                    {
 | 
						|
                        bounds.Width = col.Width.Absolute;
 | 
						|
                        allRelative = false;
 | 
						|
                    }
 | 
						|
                    else if (col.Width.Absolute == -1)
 | 
						|
                    {
 | 
						|
                        bounds.Width = 0;
 | 
						|
                        allRelative = false;
 | 
						|
                    }
 | 
						|
                    else if (col.Width.Relative > 0)
 | 
						|
                    {
 | 
						|
                        if (col.IsFirstVisible)
 | 
						|
                        {
 | 
						|
                            clientWidth -= layoutInfo.ExpandPartWidth;
 | 
						|
                            bounds.Width = (clientWidth * col.Width.Relative) / 100 - cellHorizontalSpacing;
 | 
						|
                            bounds.Width += layoutInfo.ExpandPartWidth;
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                            bounds.Width = (clientWidth * col.Width.Relative) / 100 - cellHorizontalSpacing;
 | 
						|
                        columns.UsesRelativeSize = true;
 | 
						|
                    }
 | 
						|
                    lastVisibleColumn = col;
 | 
						|
 | 
						|
                    if (col.StretchToFill)
 | 
						|
                    {
 | 
						|
                        stretchToFillColumn = col;
 | 
						|
                        columns.UsesRelativeSize = true;
 | 
						|
                    }
 | 
						|
 | 
						|
					if(col.StyleNormal=="" && col.StyleMouseDown=="" && col.StyleMouseOver=="")
 | 
						|
					{
 | 
						|
						bounds.Height=layoutInfo.DefaultHeaderSize.Height;
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						Size sz=Size.Empty;
 | 
						|
						if(col.StyleNormal!="")
 | 
						|
						{
 | 
						|
							ElementStyleLayout.CalculateStyleSize(layoutInfo.Styles[col.StyleNormal],layoutInfo.DefaultFont);
 | 
						|
							sz=layoutInfo.Styles[col.StyleNormal].Size;
 | 
						|
						}
 | 
						|
												
 | 
						|
						if(sz.Height==0)
 | 
						|
							bounds.Height=layoutInfo.DefaultHeaderSize.Height;
 | 
						|
						else
 | 
						|
							bounds.Height=sz.Height;
 | 
						|
					}
 | 
						|
 | 
						|
                    if (col.Image != null && col.Image.Height+4>bounds.Height)
 | 
						|
                    {
 | 
						|
                        bounds.Height = col.Image.Height + 4;
 | 
						|
                    }
 | 
						|
 | 
						|
					col.SetBounds(bounds);
 | 
						|
					col.SizeChanged=false;
 | 
						|
 | 
						|
                    x += (bounds.Width + cellHorizontalSpacing);
 | 
						|
 | 
						|
                    if (bounds.Height > height)
 | 
						|
                    {
 | 
						|
                        if (height > 0)
 | 
						|
                            adjustHeight = true;
 | 
						|
                        height = bounds.Height;
 | 
						|
                    }
 | 
						|
                    else if (bounds.Height < height)
 | 
						|
                        adjustHeight = true;
 | 
						|
				}
 | 
						|
                
 | 
						|
                if (totalBounds.IsEmpty)
 | 
						|
                    totalBounds = col.Bounds;
 | 
						|
                else
 | 
						|
                    totalBounds = Rectangle.Union(totalBounds, col.Bounds);
 | 
						|
			}
 | 
						|
            if (adjustHeight)
 | 
						|
            {
 | 
						|
                foreach (ColumnHeader col in columns)
 | 
						|
                {
 | 
						|
                    col.SetBounds(new Rectangle(col.Bounds.X, col.Bounds.Y, col.Bounds.Width, height));
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (lastVisibleColumn != null && allRelative)
 | 
						|
            {
 | 
						|
                lastVisibleColumn.SetBounds(new Rectangle(lastVisibleColumn.Bounds.X, lastVisibleColumn.Bounds.Y, lastVisibleColumn.Bounds.Width + cellHorizontalSpacing, lastVisibleColumn.Bounds.Height));
 | 
						|
                totalBounds = Rectangle.Union(totalBounds, lastVisibleColumn.Bounds);
 | 
						|
            }
 | 
						|
 | 
						|
            if (lastVisibleColumn != null) lastVisibleColumn.IsLastVisible = true;
 | 
						|
 | 
						|
            if (stretchToFillColumn != null && totalBounds.Width < clientWidth)
 | 
						|
            {
 | 
						|
                int stretch = clientWidth - totalBounds.Width;
 | 
						|
                if (stretchToFillColumn.IsFirstVisible && stretchToFillColumn.IsLastVisible) // Single column visible only case
 | 
						|
                    stretch -= layoutInfo.Indent;
 | 
						|
                else if (stretchToFillColumn.Parent != null && stretchToFillColumn.Parent.ParentNode != null)
 | 
						|
                    stretch -= layoutInfo.Indent;
 | 
						|
                stretchToFillColumn.SetBounds(new Rectangle(stretchToFillColumn.Bounds.X, stretchToFillColumn.Bounds.Y,
 | 
						|
                    stretchToFillColumn.Bounds.Width + stretch, stretchToFillColumn.Bounds.Height));
 | 
						|
                totalBounds = Rectangle.Union(totalBounds, stretchToFillColumn.Bounds);
 | 
						|
                if (!stretchToFillColumn.IsLastVisible) // Offset columns to the right if this was not last visible column
 | 
						|
                {
 | 
						|
                    int startIndex = columns.GetDisplayIndex(stretchToFillColumn) + 1;
 | 
						|
                    for (int i = startIndex; i < columns.Count; i++)
 | 
						|
                    {
 | 
						|
                        ColumnHeader col = columns.ColumnAtDisplayIndex(i);
 | 
						|
                        if (!col.Visible) continue;
 | 
						|
                        col.SetBounds(new Rectangle(col.Bounds.X + stretch, col.Bounds.Y, col.Bounds.Width, col.Bounds.Height));
 | 
						|
                        totalBounds = Rectangle.Union(totalBounds, col.Bounds);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            
 | 
						|
            columns.SetBounds(totalBounds);
 | 
						|
			return height;
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
}
 |