//ペインの分割 public SplitResult SplitPane(IPane target, IPane newpane, Direction direction) { Debug.Assert(newpane.AsDotNet().Parent == null); //分割可能かどうかのチェック1 総数 if (_count >= _countLimit) { return(SplitResult.F_TooManyPanes); } //分割可能かどうかのチェック2 分割対象が最小サイズを満たしているか if (SizeToLength(target.Size, direction) < _minimumEdgeLength * 2 + PaneSplitter.SPLITTER_WIDTH) { return(SplitResult.F_TooSmallToSplit); } Control parent = target.AsDotNet().Parent; bool splitting_root = _rootList == null; if (splitting_root) //空の状態からの構築 { _rootList = new DivisionList(this, null, direction, target, newpane, target.Size, target.Dock); UIUtil.ReplaceControl(parent, target.AsDotNet(), _rootList.HostingControl); } else { DivisionNode node = _rootList.FirstNode.FindNode(target); Debug.Assert(node != null); if (direction == node.ParentList.Direction) //同方向分割 { bool eq = node.ParentList.IsEquallyDivided; node.InsertNext(newpane); if (eq) { node.ParentList.AdjustRatioEqually(); } } else //異方向分割 { DivisionList newlist = new DivisionList(this, node, direction, target, newpane, target.Size, target.Dock); node.ReplacePaneByChildList(newlist); } } Rebuild(); DoLayout(); FindForm().MinimumSize = _rootList.FirstNode.RequiredMinimumSize; //!!TODO これはコントロールのサイズであり、フォームボーダーとは別の話 _count++; return(SplitResult.Success); }
//初期状態で2個作成 public DivisionList(PaneDivision division, DivisionNode parent, Direction direction, IPane pane1, IPane pane2, Size host_size, DockStyle host_dock) { _parentDivision = division; _parentNode = parent; _direction = direction; pane1.Dock = DockStyle.Fill; pane2.Dock = _direction == Direction.TB ? DockStyle.Bottom : DockStyle.Right; _first = new DivisionNode(this, pane1, 1.0); _first.InsertNext(pane2); _hostingControl = new IntermediateContainer(division); _hostingControl.Size = host_size; _hostingControl.Dock = host_dock; }
//������ԂłQ�쐬 public DivisionList(PaneDivision division, DivisionNode parent, Direction direction, IPane pane1, IPane pane2, Size host_size, DockStyle host_dock) { _parentDivision = division; _parentNode = parent; _direction = direction; pane1.Dock = DockStyle.Fill; pane2.Dock = _direction == Direction.TB ? DockStyle.Bottom : DockStyle.Right; _first = new DivisionNode(this, pane1, 1.0); _first.InsertNext(pane2); _hostingControl = new IntermediateContainer(division); _hostingControl.Size = host_size; _hostingControl.Dock = host_dock; }