/// <summary> /// Docks specified bar by appending it to the container. Bar will be added according to the container's orientation. /// </summary> /// <param name="barToDock">Bar to dock.</param> /// <param name="dockSide">Side to dock bar at.</param> public void Dock(Bar referenceBar, Bar barToDock, eDockSide dockSide) { if(dockSide==eDockSide.None && barToDock.Parent==m_Container) { ApplyBarStyle(barToDock); return; } if(barToDock.Parent is DockSite && ((DockSite)barToDock.Parent).DocumentDockContainer!=null) ((DockSite)barToDock.Parent).GetDocumentUIManager().UnDock(barToDock); else if(barToDock.Parent is DockSite && barToDock.Parent!=m_Container) ((DockSite)barToDock.Parent).RemoveBar(barToDock); else if (barToDock.Parent != null && barToDock.Parent != m_Container) { if (barToDock.Parent is FloatingContainer) { barToDock.RemoveFromFloatingContainer(); barToDock.SetBarState(eBarState.Docked); } else barToDock.Parent.Controls.Remove(barToDock); } if(!m_LoadingLayout) { // TODO: Add Docking as Document, i.e. add DockContainerItems from barToDock... DocumentBarContainer doc=this.CreateDocumentBarContainer(barToDock); DocumentBaseContainer referenceDoc = this.GetDocumentFromBar(referenceBar); if (referenceBar == null || dockSide == eDockSide.None || referenceBar == barToDock || referenceDoc == null) { if (m_Container.Dock == DockStyle.Fill) m_DocumentDockContainer.Documents.Add(doc); else { eOrientation containerOrientation = eOrientation.Horizontal; // Needed container orientation if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom) containerOrientation = eOrientation.Vertical; // Switch orientation when adding new bar if possible if (m_DocumentDockContainer.Orientation != containerOrientation) { if (m_DocumentDockContainer.Documents.Count <= 1) { m_DocumentDockContainer.Orientation = containerOrientation; if (IsAddedInFront(dockSide)) m_DocumentDockContainer.Documents.Insert(0, doc); else m_DocumentDockContainer.Documents.Add(doc); } else { DocumentBaseContainer[] docs = new DocumentBaseContainer[m_DocumentDockContainer.Documents.Count]; m_DocumentDockContainer.Documents.CopyTo(docs); m_DocumentDockContainer.Documents.Clear(); DocumentDockContainer newParent = new DocumentDockContainer(docs, m_DocumentDockContainer.Orientation); newParent.SetLayoutBounds(m_DocumentDockContainer.DisplayBounds); m_DocumentDockContainer.Orientation = containerOrientation; m_DocumentDockContainer.Documents.Add(newParent); if (IsAddedInFront(dockSide)) m_DocumentDockContainer.Documents.Insert(0, doc); else m_DocumentDockContainer.Documents.Add(doc); } } else { if (IsAddedInFront(dockSide)) m_DocumentDockContainer.Documents.Insert(0, doc); else m_DocumentDockContainer.Documents.Add(doc); } } } else { DocumentDockContainer parent=referenceDoc.Parent as DocumentDockContainer; referenceDoc.SetLayoutBounds(Rectangle.Empty); doc.SetLayoutBounds(Rectangle.Empty); if((parent.Orientation==eOrientation.Horizontal && (dockSide==eDockSide.Left || dockSide==eDockSide.Right)) || (parent.Orientation==eOrientation.Vertical && (dockSide==eDockSide.Top || dockSide==eDockSide.Bottom))) { if(dockSide==eDockSide.Right || dockSide==eDockSide.Bottom) parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc)+1,doc); else parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc),doc); } else if(parent.Documents.Count==1) { // Orientation of the parent dock container can be changed if(parent.Orientation==eOrientation.Vertical) parent.Orientation=eOrientation.Horizontal; else parent.Orientation=eOrientation.Vertical; if(dockSide==eDockSide.Right || dockSide==eDockSide.Bottom) parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc)+1,doc); else parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc),doc); } else { // New DocumentDockContainer needs to be inserted with appropriate orientation and referenceBar needs // to be moved into it. DocumentDockContainer newParent=new DocumentDockContainer(); if(parent.Orientation==eOrientation.Horizontal) newParent.Orientation=eOrientation.Vertical; else newParent.Orientation=eOrientation.Horizontal; parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc),newParent); parent.Documents.Remove(referenceDoc); if(dockSide==eDockSide.Right || dockSide==eDockSide.Bottom) { newParent.Documents.Add(referenceDoc); newParent.Documents.Add(doc); } else { newParent.Documents.Add(doc); newParent.Documents.Add(referenceDoc); } } } AdjustContainerSize(barToDock, false); } if(m_Container!=null) { if(barToDock.Parent==null) m_Container.Controls.Add(barToDock); ApplyBarStyle(barToDock); m_Container.RecalcLayout(); } else ApplyBarStyle(barToDock); }
private void DeserializeDocumentDockContainer(ItemSerializationContext context, DocumentDockContainer instance, bool deserializeDefinition) { XmlElement docElement = context.ItemXmlElement; if(docElement.Name!=DocumentSerializationXml.DockContainer) return; instance.Documents.Clear(); instance.Orientation=(eOrientation)XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Orientation)); if (docElement.HasAttribute(DocumentSerializationXml.Width) && docElement.HasAttribute(DocumentSerializationXml.Height)) { instance.SetLayoutBounds(new Rectangle(0,0, XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Width)), XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Height)))); } foreach(XmlElement elem in docElement.ChildNodes) { bool add=true; DocumentBaseContainer doc=DocumentSerializationXml.CreateDocument(elem.Name); context.ItemXmlElement = elem; if(doc is DocumentDockContainer) DeserializeDocumentDockContainer(context,(DocumentDockContainer)doc,deserializeDefinition); else if(doc is DocumentBarContainer) add=DeserializeDocumentBarContainer(context,(DocumentBarContainer)doc,deserializeDefinition); if(add) instance.Documents.Add(doc); } }