using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TestRSUIFramework
{
public partial class SpliterContainerGrid : UserControl
{
public SpliterContainerGrid()
{
InitializeComponent();
}
#region Properties
public int Rows { get; set; }
public int Columns { get; set; }
BorderStyle _SplitContainerBorderStyle=BorderStyle.None;
public BorderStyle SplitContainerBorderStyle {
set
{
_SplitContainerBorderStyle = value;
}
}
public SortedList<int, SplitContainer> _SpliterContainerColumns;
public SortedList<int, SortedList<int, SplitContainer>> _SpliterContainerGrid;
#endregion
#region basic algorithm
private SortedList<int, SplitContainer> BuildSplitContainerChain(int NumOfSC, Orientation SCOrient)
{
SortedList<int, SplitContainer> list = new SortedList<int, SplitContainer>();
if (NumOfSC == 0)
{
SplitContainer sc = new SplitContainer();
sc.Orientation = SCOrient;
sc.BorderStyle = _SplitContainerBorderStyle;
sc.Dock = DockStyle.Fill;
sc.Panel1MinSize = 0;
sc.Panel2MinSize = 0;
sc.Panel2Collapsed = true;
list.Add(0, sc);
return list;
}
for (int i = 0; i < NumOfSC; i++)
{
SplitContainer sc = new SplitContainer();
sc.Orientation = SCOrient;
sc.BorderStyle = _SplitContainerBorderStyle;
sc.Dock = DockStyle.Fill;
sc.Panel1MinSize = 0;
sc.Panel2MinSize = 0;
list.Add(i, sc);
}
for (int i = 0; i < NumOfSC - 1; i++)
{
list[i].Panel2.Controls.Add(list[i + 1]);
}
return list;
}
SplitContainer WalkSplitContainerChain(SplitContainer sc, int step)
{
while (step >= 1)
{
SplitContainer sc2 = sc.Panel2.Controls[0] as SplitContainer;
return WalkSplitContainerChain(sc2, step - 1);
}
return sc;
}
#endregion
#region Build Columns
public void BuildSpliterContainerColumns()
{
_SpliterContainerColumns = BuildSplitContainerChain(Columns - 1, Orientation.Vertical);
this.Controls.Add(_SpliterContainerColumns[0]);
for (int i = 0; i < _SpliterContainerColumns.Count; i++)
{
_SpliterContainerColumns[i].SplitterDistance = Width / Columns;
}
}
#endregion
#region Build Grid
public void BuildSpliterContainerGrid()
{
_SpliterContainerGrid = new SortedList<int, SortedList<int, SplitContainer>>();
for (int k = 0; k < _SpliterContainerColumns.Count; k++)
{
_SpliterContainerGrid.Add(k,BuildSplitContainerChain(Rows - 1, Orientation.Horizontal));
_SpliterContainerColumns[k].Panel1.Controls.Add(_SpliterContainerGrid[k][0]);
for (int i = 0; i < Rows - 1; i++)
{
SplitContainer sc1 = WalkSplitContainerChain(_SpliterContainerGrid[k][0], i);
sc1.SplitterDistance = (Height - _SpliterContainerGrid[k][0].SplitterWidth * (Rows - 1)) / (Rows);
}
}
if (Columns >= 2)
{
_SpliterContainerGrid.Add(Columns - 1, BuildSplitContainerChain(Rows - 1, Orientation.Horizontal));
_SpliterContainerColumns[Columns - 2].Panel2.Controls.Add(_SpliterContainerGrid[Columns - 1][0]);
for (int i = 0; i < Rows - 1; i++)
{
SplitContainer sc1 = WalkSplitContainerChain(_SpliterContainerGrid[Columns - 1][0], i);
sc1.SplitterDistance = (Height - _SpliterContainerGrid[Columns - 1][0].SplitterWidth * (Rows - 1)) / (Rows);
}
}
}
#endregion
#region Layout Content
public void PerformLayout( SortedList<int, SortedList<int,UserControl>> contents)
{
SortedList<int, SortedList<int, UserControl>> ucs = contents;
for (int i = 0; i < Rows-1; i++)
{
for (int j = 0; j < Columns-1; j++)
{
_SpliterContainerGrid[j][i].Panel1.Controls.Add(ucs[i][j]);
}
}
for (int j = 0; j < Columns - 1; j++)
{
if (Rows == 1) _SpliterContainerGrid[j][0].Panel1.Controls.Add(ucs[0][j]);
else _SpliterContainerGrid[j][Rows - 2].Panel2.Controls.Add(ucs[Rows-1][j]);
}
for (int i = 0; i < Rows - 1; i++)
{
if (Columns == 1) _SpliterContainerGrid[0][i].Panel1.Controls.Add(ucs[i][0]);
else _SpliterContainerGrid[Columns - 1][i].Panel1.Controls.Add(ucs[i][Columns - 1]);
}
if (Rows == 1) _SpliterContainerGrid[Columns - 1][0].Panel1.Controls.Add(ucs[0][Columns - 1]);
else _SpliterContainerGrid[Columns - 1][Rows - 2].Panel2.Controls.Add(ucs[Rows - 1][Columns - 1]);
}
#endregion
}
}
Thursday, December 16, 2010
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment