133 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections;
 | |
| using System.Drawing;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace DevComponents.Tree.Layout
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Summary description for NodeTreeLayout.
 | |
| 	/// </summary>
 | |
| 	internal class NodeTreeLayout:NodeLayout
 | |
| 	{
 | |
| 		//private bool m_LayoutPerformed=false;
 | |
| 
 | |
| 		public NodeTreeLayout(TreeGX treeControl, Rectangle clientArea):base(treeControl,clientArea)
 | |
| 		{
 | |
| 			ExpandPartSize=new Size(9,9);
 | |
| 		}
 | |
| 
 | |
| 		public override void PerformLayout()
 | |
| 		{
 | |
| 			this.PrepareStyles();
 | |
| 
 | |
| 			// Get default Columns
 | |
| 			ArrayList defaultColInfoList=this.GetDefaultColumnInfo();
 | |
| 
 | |
| 			Graphics graphics=this.GetGraphics();
 | |
| 			try
 | |
| 			{
 | |
| 				// Loop through each top-level node
 | |
| 				Node[] topLevelNodes=this.GetTopLevelNodes();
 | |
| 				NodeLayoutContextInfo layoutInfo=GetDefaultNodeLayoutContextInfo(graphics);
 | |
| 
 | |
| 				foreach(Node childNode in topLevelNodes)
 | |
| 				{
 | |
| 					layoutInfo.ContextNode=childNode;
 | |
| 					ProcessNode(layoutInfo);
 | |
| 				}
 | |
| 			}
 | |
| 			finally
 | |
| 			{
 | |
| 				if(this.DisposeGraphics)
 | |
| 					graphics.Dispose();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		#region Node routines
 | |
| 		private void ProcessNode(NodeLayoutContextInfo layoutInfo)
 | |
| 		{
 | |
| 			Node node=layoutInfo.ContextNode;
 | |
| 			if(node.SizeChanged)
 | |
| 			{
 | |
| 				// Calculate size of the node itself...
 | |
| 				LayoutNode(layoutInfo);
 | |
| 
 | |
| 				// Calculate size and location of node column header if any
 | |
| //				if(node.NodesColumnHeaderVisible)
 | |
| //				{
 | |
| //					layoutInfo.Left+=this.NodeLevelOffset;
 | |
| //					LayoutColumnHeader(layoutInfo);
 | |
| //					layoutInfo.Left-=this.NodeLevelOffset;
 | |
| //				}
 | |
| 			}
 | |
| 			else if(node.BoundsRelative.Top!=layoutInfo.Top)
 | |
| 			{
 | |
| 				// Adjust top position
 | |
| 				node.SetBounds(new Rectangle(node.BoundsRelative.X,layoutInfo.Top,node.BoundsRelative.Width,node.BoundsRelative.Height));
 | |
| 				foreach(Cell c in node.Cells)
 | |
| 					c.SetBounds(new Rectangle(c.BoundsRelative.X,layoutInfo.Top,c.BoundsRelative.Width,c.BoundsRelative.Height));
 | |
| 			}
 | |
| 
 | |
| 			// Need to set the Top position properly
 | |
| 			layoutInfo.Top+=(node.BoundsRelative.Height+this.NodeVerticalSpacing);
 | |
| //			if(node.Expanded && node.NodesColumnHeaderVisible && node.NodesColumns.Count>0)
 | |
| //				layoutInfo.Top+=node.ColumnHeaderHeight;
 | |
| 			
 | |
| 			if(node.Expanded)
 | |
| 			{
 | |
| 				int originalLevelOffset=layoutInfo.Left;
 | |
| 				layoutInfo.Left+=this.NodeLevelOffset;
 | |
| 				
 | |
| 				ArrayList parentColumns=layoutInfo.ChildColumns;
 | |
| 				ArrayList childColumns=GetNodeColumnInfo(node);
 | |
| 
 | |
| 				foreach(Node childNode in node.Nodes)
 | |
| 				{
 | |
| 					layoutInfo.ContextNode=childNode;
 | |
| 					layoutInfo.ChildColumns=childColumns;
 | |
| 					ProcessNode(layoutInfo);
 | |
| 				}
 | |
| 				layoutInfo.ChildColumns=parentColumns;
 | |
| 
 | |
| 				layoutInfo.ContextNode=node;
 | |
| 				layoutInfo.Left=originalLevelOffset;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns true if expand part space should be accounted for even if they expand part is not visible or need to be displayed. Default value is false.
 | |
| 		/// </summary>
 | |
| 		protected override bool ReserveExpandPartSpace
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets whether the expand part of the node +/- is aligned to the left of the node in left-to-right layout.
 | |
| 		/// </summary>
 | |
| 		/// <param name="node">Node to get expand part alignment for</param>
 | |
| 		/// <returns>true if node expand part is aligned to the left in left-to-right layout.</returns>
 | |
| 		private bool ExpandPartAlignedNear(Node node)
 | |
| 		{
 | |
| 			return true; // If changed LayoutExpandPart needs to be updated as well
 | |
| 		}
 | |
| 
 | |
| //		private NodeCollection GetTopLevelNodes()
 | |
| //		{
 | |
| //			return m_Tree.Nodes;
 | |
| //		}
 | |
| 
 | |
| 		private int NodeLevelOffset
 | |
| 		{
 | |
| 			get {return 10;}
 | |
| 		}
 | |
| 
 | |
| 		#endregion
 | |
| 
 | |
| 		
 | |
| 	}
 | |
| }
 |