private void InitContainer(FieldContainerBase container) { if (container.Globals.Parent != null) { container.Globals.DepthDifference = container.Globals.Parent.DepthDifference - 1; } container.PerformingLoad += new DynamicContainerDelegate(Subblock_OnExpanding); if (container.Globals.BlockNode.Attributes["name"] != null) { container.Name = container.Globals.BlockNode.Attributes["name"].Value; container.ContainerName = StringOps.CapitalizeWords(container.Name); } container.FooterFont = new System.Drawing.Font("Segoe UI", 8.25F, FontStyle.Bold); container.Collapsed = true; XmlNode node = container.Globals.BlockNode; XmlNode shortDescNode = node.SelectSingleNode("shortdesc"); XmlNode longDescNode = node.SelectSingleNode("longdesc"); XmlNode warningNode = node.SelectSingleNode("warning"); if (shortDescNode != null) { container.ShortDescription = shortDescNode.InnerText; } if (longDescNode != null) { container.LongDescription = longDescNode.InnerText; } if (warningNode != null) { container.Warning = warningNode.InnerText; } container.ResumeLayout(true); //container.LayoutEngine.Layout(container, new LayoutEventArgs(container, "Size")); }
public void DatabindChildrenToBlock(IBlock block, IFieldControlContainer container) { #region Old Method /*linkedBlock = block; * * if (block != null) * { * int index = -1; * IFieldControl[] childFields = GetChildFields(); * foreach (FieldControlBase field in childFields) * { * index++; * field.Enabled = true; * * try * { * // If the field is not a block, we will need to databind it. * if (!(field is IBlockControl)) * { * IField binding = (LocateFieldByName(linkedBlock, field.BoundPropertyName) as IField); * if (binding != null) * { * field.DataBind(binding); * Binding[] bindings = field.GetDataBindings(); * foreach (Binding bind in bindings) * { * bind.Parse += bind_Parse; * } * } * } * // If it is a block, we need to recurse on the block so that its children get databound. * else * { * IBlockCollection binding = LocateFieldByName(linkedBlock, field.BoundPropertyName) as IBlockCollection; * if (binding != null) * { * (field as IBlockControl).DataBindCollection(binding); * (field as IBlockControl).Initialize(); * } * else * field.Enabled = false; * } * } * catch (Exception ex) * { * Interfaces.Output.Write(Interfaces.OutputTypes.Warning, "There was an error databinding to " + field.BoundPropertyName + ":" + ex.Message, ex); * //MessageBox.Show("There was an error binding \"" + field.BoundPropertyName + ":\" " + ex.Message); * } * } * } * else * { * foreach (FieldControlBase field in GetChildFields()) * field.Enabled = false; * }*/ #endregion #region New Method if (container is FieldContainerBase) { container = (container as FieldContainerBase).FieldPanel; } if (container == null) { return; } //(container as Control).Enabled = (block != null); if (block == null) { IFieldControl[] children = container.GetChildFields(); foreach (FieldControlBase field in children) { field.Enabled = false; } return; } Control control = container as Control; // This is a bug-fix. At some point along the line, databinding was attached to an FieldContainerBase... so to fix it, we relink to the FieldPanel property. if (container is FieldContainerBase) { control = (container as FieldContainerBase).FieldPanel; } for (int x = 0; x < control.Controls.Count; x++) { Control curControl = control.Controls[x]; curControl.Visible = true; // Determine whether or not the field is a FieldControlBase or not. FieldControlBase field = (curControl is FieldControlBase) ? curControl as FieldControlBase : null; #region the current control is a field if (field != null) { field.Enabled = true; #region If the field is not a block, we will need to databind it. if (!(field is IBlockControl)) { IField binding = (LocateFieldByName(block, field.BoundPropertyName) as IField); if (binding != null) { field.DataBind(binding); Binding[] bindings = field.GetDataBindings(); foreach (Binding bind in bindings) { bind.Parse += bind_Parse; } } else { field.Enabled = false; } } #endregion else // This shouldn't happen, EVER! { Interfaces.Output.Write(Interfaces.OutputTypes.Information, "DatabindChildrenToBlock came across an IBlockControl."); } } #endregion #region the current control is a block container. else if (curControl is Prometheus.Controls.BlockContainer) { Prometheus.Controls.BlockContainer blockContainer = curControl as Prometheus.Controls.BlockContainer; blockContainer.Enabled = true; IBlock nextBlock = null; BlockContainerPanel nextContainer = null; #region get the next container // We're getting all of the controls of type FieldContainerPanel, though there should only be one. /*Control[] fieldContainerPanels = GetChildControlsByType(blockContainer, typeof(BlockContainerPanel)); * if (fieldContainerPanels.Length > 0) * { * nextContainer = fieldContainerPanels[0] as BlockContainerPanel; * } * else * { * // This is a warning because the rest of the tag will work properly and execution can continue as normal. * Interfaces.Output.Write(Interfaces.OutputTypes.Warning, "During databinding, the block \"" + blockContainer.BoundPropertyName + "\" did not have a field container panel!"); * continue; * }*/ if (blockContainer.FieldPanel != null) { nextContainer = blockContainer.FieldPanel; } #endregion #region get the next block /*Control[] blocks = GetChildControlsByType(blockContainer, typeof(IBlockControl)); * if (blocks.Length > 0) * { * IBlockControl blockControl = blocks[0] as IBlockControl; * blockControl.Container = nextContainer as IFieldControlContainer; * IBlockCollection binding = LocateFieldByName(block, (blockControl as IBoundPropertyCapable).BoundPropertyName) as IBlockCollection; * if (binding != null) * { * blockControl.DataBindCollection(binding); * blockControl.Initialize(); * } * } * else * { * Interfaces.Output.Write(Interfaces.OutputTypes.Warning, "During databinding, the block \"" + blockContainer.BoundPropertyName + "\" did not have an IBlockControl!"); * continue; * }*/ if (blockContainer.Block != null) { IBlockControl blockControl = blockContainer.Block; if (blockContainer.FieldPanel == null) { blockControl.Container = blockContainer; } else { blockControl.Container = blockContainer.FieldPanel; } IBlockCollection binding = LocateFieldByName(block, (blockControl as IBoundPropertyCapable).BoundPropertyName) as IBlockCollection; if (binding != null) { blockControl.DataBindCollection(binding); blockControl.Initialize(); } if (blockControl.SelectedBlockIndex > -1) { nextBlock = blockControl.BlockCollection.GetBlock(blockControl.SelectedBlockIndex); } } #endregion if ((nextBlock != null) && (nextContainer != null)) { DatabindChildrenToBlock(nextBlock, nextContainer); } } else if (curControl is FieldContainerBase) { FieldContainerBase fieldContainer = curControl as FieldContainerBase; fieldContainer.Enabled = true; DatabindChildrenToBlock(block, fieldContainer.FieldPanel); } #endregion } #endregion }
public override bool Layout(object container, LayoutEventArgs layoutEventArgs) { bool dirty = false; if (container is FieldContainerPanel) { FieldContainerPanel panel = container as FieldContainerPanel; int minimumWidth = (BlockWidth + (panel.DepthDifference * (panel.Margin.Left * 2))) - 1; if (panel.Width < minimumWidth) { panel.Width = minimumWidth; dirty = true; } //panel.SuspendLayout(); bool controlFound = (layoutEventArgs.AffectedControl == panel); int maxWidth = 0; System.Drawing.Point lastLocation = new Point(); lastLocation = new System.Drawing.Point(panel.Margin.Left, panel.Margin.Top); bool inGroup = false; int groupCount = 0; // to prevent spacing of groups that don't have enough controls. for (int x = 0; x < panel.Controls.Count; x++) { if (!controlFound) { if (panel.Controls[x] == layoutEventArgs.AffectedControl) { controlFound = true; } } Point newLocation = lastLocation; // List's go from top to bottom, thus, we don't need to do any layout until we get to the control that's changed. if (controlFound) { if (panel.DrawBorder) { // if the current control is a field container... if (panel.Controls[x] is IFieldControl) { newLocation = new Point(lastLocation.X + panel.Margin.Left, lastLocation.Y + panel.Padding.Top); inGroup = true; groupCount++; } else { if ((inGroup) && (groupCount >= MinimumGroupCount)) { // put in some extra padding between groups. newLocation = new System.Drawing.Point(lastLocation.X, lastLocation.Y + 1); } else { newLocation = new System.Drawing.Point(lastLocation.X, lastLocation.Y); } inGroup = false; groupCount = 0; } } if (panel.Controls[x].Location != newLocation) { panel.Controls[x].Location = newLocation; dirty = true; } if (panel.Controls[x] is FieldContainerBase) { FieldContainerBase tempContainer = panel.Controls[x] as FieldContainerBase; bool isSuspended = tempContainer.LayoutSuspended; int newContainerWidth = 0; if (tempContainer.FieldPanel != null) { if (tempContainer.FieldPanel.DepthDifference > -1) { newContainerWidth = (BlockWidth + (tempContainer.FieldPanel.DepthDifference * (tempContainer.Location.X * 2))) - 1; } } else if (tempContainer.Globals.DepthDifference > -1) { newContainerWidth = (BlockWidth + (tempContainer.Globals.DepthDifference * (tempContainer.Location.X * 2))) - 1; } if (newContainerWidth != 0) { if (newContainerWidth != tempContainer.Width) { tempContainer.Width = newContainerWidth; dirty = true; } } if (tempContainer.Block != null) { (tempContainer.Block as Control).Width = tempContainer.Width - 2; } } else if (panel.Controls[x] is IFieldControl) { // Center the controls for Nick. This may need to be replaced if we ever desire the use of margins. panel.Controls[x].Width = panel.Width - (panel.Controls[x].Location.X * 2); } } lastLocation = new System.Drawing.Point(panel.Margin.Left, panel.Controls[x].Location.Y + panel.Controls[x].Height + panel.Padding.Top); if (panel.Controls[x] is BlockContainerPanel) { if (panel.Controls[x].Width > maxWidth) { maxWidth = panel.Controls[x].Width; } } else if (panel.Controls[x].Location.X + panel.Controls[x].Width + panel.Padding.Right > maxWidth) { maxWidth = panel.Controls[x].Location.X + panel.Controls[x].Width + panel.Padding.Right; } } #region Autosize the panel. if (panel.AutoSize == true) { AutoSizePanel(ref dirty, panel, ref maxWidth, ref lastLocation); } #endregion if (!(panel.Parent is BlockContainer)) { if (panel.Width < minimumWidth) { panel.Width = minimumWidth + 1; dirty = true; } } // Group controls... if (panel.DrawBorder) { groups = GroupControls(typeof(IFieldControl), panel.Controls); } else { groups = null; } //panel.Location = new Point(0, panel.Location.Y); //if (dirty) // panel.Invalidate(false); return(true); } return(false); }
public override bool Layout(object container, LayoutEventArgs layoutEventArgs) { if (!(container is FieldContainerBase)) { return(true); } FieldContainerBase @this = (FieldContainerBase)container; using (Graphics g = @this.CreateGraphics()) { if (@this.Width < FieldListLayout.BlockWidth) { @this.Width = FieldListLayout.BlockWidth + (@this.Globals.DepthDifference * (@this.Margin.Left * 2)) - 1; } // Calculate the header line height. SizeF s = MeasureCaptionString("A", @this.Font, 800, g); @this.LayoutValues.headerCaptionLineHeight = (int)s.Height; // Calculate the base header height. SizeF headerTextSize = MeasureCaptionString(@this.ContainerName, @this.Font, @this.Width, g); @this.LayoutValues.headerBaseHeight = (int)headerTextSize.Height + (@this.LayoutValues.padding * 2); //bool noDescription = String.IsNullOrEmpty(@this.LongDescription) && string.IsNullOrEmpty(@this.ShortDescription); string descriptionText = ""; // Calculate the MoreInfo text height. if ((!String.IsNullOrEmpty(@this.LongDescription)) && (@this.ShowingLongDescription)) { SizeF moreInfoTextSize = MeasureCaptionString(@this.LongDescription, @this.LongDescriptionFont, @this.Width - (@this.LayoutValues.padding * 2) - (@this.LayoutValues.moreInfoPadding * 2), g); @this.LayoutValues.moreInfoTextHeight = (int)moreInfoTextSize.Height; //+ @this.LayoutValues.moreInfoPadding + @this.LayoutValues.padding * 2; descriptionText = @this.LongDescription; @this.LayoutValues.headerBaseHeight += @this.LayoutValues.moreInfoTextHeight + (@this.LayoutValues.padding); } else if (!String.IsNullOrEmpty(@this.ShortDescription)) { SizeF moreInfoTextSize = MeasureCaptionString(@this.ShortDescription, @this.ShortDescriptionFont, @this.Width - (@this.LayoutValues.padding * 2) - (@this.LayoutValues.moreInfoPadding * 2), g); @this.LayoutValues.moreInfoTextHeight = (int)moreInfoTextSize.Height; //+ //@this.LayoutValues.moreInfoPadding + @this.LayoutValues.padding * 2; descriptionText = @this.ShortDescription; @this.LayoutValues.headerBaseHeight += @this.LayoutValues.moreInfoTextHeight + (@this.LayoutValues.padding); } else { @this.LayoutValues.moreInfoTextHeight = 0; } // Calculate full caption height. int fullCaptionHeight = @this.LayoutValues.headerBaseHeight + 1; int descriptionLocation = (int)headerTextSize.Height + 5; //fullCaptionHeight += @this.LayoutValues.moreInfoTextHeight; Control lblMoreInfo = null; DevComponents.DotNetBar.LabelX lblWarning = null; DevComponents.DotNetBar.LabelX lblDescription = null; Control btnCollapse = null; for (int x = 0; x < @this.Controls.Count; x++) { if (@this.Controls[x].Name == "lblMoreInfo") { // Calculate MoreInfo link position and text. // @this.Controls[x].Text = moreInfoLinkTet(@this); int linkPadding = ((@this.LayoutValues.headerCaptionLineHeight + @this.LayoutValues.padding * 2) - @this.Controls[x].Height) / 2 + 1; @this.Controls[x].Location = new Point((int)headerTextSize.Width + @this.LayoutValues.padding, linkPadding); lblMoreInfo = @this.Controls[x]; lblMoreInfo.Visible = !String.IsNullOrEmpty(@this.LongDescription); lblMoreInfo.Margin = new Padding(0, 0, 0, 0); } else if (@this.Controls[x].Name == "btnCollapse") { btnCollapse = @this.Controls[x]; // Calculate the ToggleButton position. int toggleButtonPadding = ((@this.LayoutValues.headerCaptionLineHeight + @this.LayoutValues.padding * 2) - @this.Controls[x].Height) / 2; @this.Controls[x].Location = new Point((@this.Width - @this.Controls[x].Width) - toggleButtonPadding, toggleButtonPadding); if (btnCollapse.Location.Y + btnCollapse.Height + @this.LayoutValues.padding > descriptionLocation) { descriptionLocation = btnCollapse.Location.Y + btnCollapse.Height + @this.LayoutValues.padding; } } else if (@this.Controls[x].Name == "lblWarning") { lblWarning = (DevComponents.DotNetBar.LabelX)@this.Controls[x]; } else if (@this.Controls[x].Name == "lblDescription") { lblDescription = (DevComponents.DotNetBar.LabelX)@this.Controls[x]; } } SizeF warningTextSize = new SizeF(0f, 0f); if (!String.IsNullOrEmpty(@this.Warning)) { warningTextSize = MeasureCaptionString(@this.Warning, @this.WarningFont, (@this.Width - lblWarning.Location.X + 1), g); @this.LayoutValues.headerBaseHeight += (int)warningTextSize.Height + @this.LayoutValues.padding; } // Calculate the warning label position, taking into account its size. int warningLabelX = (int)headerTextSize.Width + 10; if (warningTextSize.Height > @this.LayoutValues.headerCaptionLineHeight) // we'll see how well this goes... :x { if (lblMoreInfo != null) { lblMoreInfo.Location = new Point(@this.LayoutValues.padding, (int)headerTextSize.Height + (@this.LayoutValues.padding * 2)); if (descriptionLocation < lblMoreInfo.Location.Y + lblMoreInfo.Height + 5) { descriptionLocation = lblMoreInfo.Location.Y + lblMoreInfo.Height + 5; } } } else if (lblMoreInfo != null) { if (lblMoreInfo.Visible) { if (warningLabelX < lblMoreInfo.Location.X + lblMoreInfo.Width + 5) { warningLabelX = lblMoreInfo.Location.X + lblMoreInfo.Width + 5; } } } // setup the warning label if ((lblWarning != null) && (!String.IsNullOrEmpty(@this.Warning))) { lblWarning.Location = new Point(warningLabelX, @this.LayoutValues.padding); //lblWarning.Width = (btnCollapse.Location.X - lblWarning.Location.X) - 5; lblWarning.Height = (int)warningTextSize.Height + 2; lblWarning.MinimumSize = new Size((btnCollapse.Location.X - lblWarning.Location.X) - 5, 0); lblWarning.MaximumSize = new Size(lblWarning.MinimumSize.Width, 0); lblWarning.Visible = true; if (lblWarning.Location.Y + lblWarning.Height + (@this.LayoutValues.padding) > fullCaptionHeight) { fullCaptionHeight = lblWarning.Location.Y + lblWarning.Height + (@this.LayoutValues.padding * 2); } if (lblWarning.Location.Y + lblWarning.Height + 5 > descriptionLocation) { descriptionLocation = lblWarning.Location.Y + lblWarning.Height + 5; } } // Setup the description label if ((lblDescription != null) && (!String.IsNullOrEmpty(descriptionText))) { int locationY = descriptionLocation; lblDescription.Location = new Point(@this.LayoutValues.padding, locationY); lblDescription.MaximumSize = new Size(@this.Width - lblDescription.Location.X - @this.LayoutValues.padding, 0); lblDescription.Height = @this.LayoutValues.moreInfoTextHeight + 2; lblDescription.WordWrap = true; lblDescription.Visible = true; lblDescription.BringToFront(); //lblDescription.Text = descriptionText; } #region figure out the header size System.Collections.Generic.List <int> lowestPoints = new System.Collections.Generic.List <int>(); lowestPoints.Add((int)headerTextSize.Height + (@this.LayoutValues.padding * 2)); if (lblMoreInfo != null) { lowestPoints.Add(lblMoreInfo.Location.Y + lblMoreInfo.Height + lblMoreInfo.Location.Y); } if (!String.IsNullOrEmpty(descriptionText)) { lowestPoints.Add(lblDescription.Location.Y + lblDescription.Height + @this.LayoutValues.padding); } if (lblWarning != null) { if (!String.IsNullOrEmpty(@this.Warning)) { lowestPoints.Add(lblWarning.Location.Y + lblWarning.Height + @this.LayoutValues.padding); } } int lowestPoint = lowestPoints[0]; for (int x = 1; x < lowestPoints.Count; x++) { if (lowestPoints[x] > lowestPoint) { lowestPoint = lowestPoints[x]; } } @this.LayoutValues.headerBaseHeight = lowestPoint; fullCaptionHeight = lowestPoint; #endregion //fullCaptionHeight += @this.LayoutValues.padding; //@this.LayoutValues.headerBaseHeight = fullCaptionHeight - 1; @this.Location = new Point(4, @this.Location.Y); if (@this.Block != null) { (@this.Block as Control).Location = new Point(1, fullCaptionHeight); (@this.Block as Control).BringToFront(); @this.LayoutValues.blockControlHeight = (@this.Block as Control).Height + 2; } else { @this.LayoutValues.blockControlHeight = 0; } // Calculate the size of the control. if (@this.Collapsed) { @this.Height = fullCaptionHeight + @this.LayoutValues.footerHeight; } else { int height = fullCaptionHeight + @this.LayoutValues.blockControlHeight + @this.LayoutValues.footerHeight; if (@this.FieldPanel != null) { @this.LayoutValues.controlAreaHeight = @this.FieldPanel.Height + 1; @this.FieldPanel.Location = new Point(0, fullCaptionHeight + @this.LayoutValues.blockControlHeight + 2); } height += @this.LayoutValues.controlAreaHeight + 1; @this.Height = height; } @this.LayoutValues.fullCaptionHeight = fullCaptionHeight; // Redraw the control. //lblWarning.PerformLayout(); } @this.Invalidate(); return(true); }