internal static LayoutFarm.HtmlBoxes.CssBox CreateCssBox( LayoutFarm.WebDom.IHtmlElement domE, LayoutFarm.HtmlBoxes.CssBox parentBox, LayoutFarm.Css.BoxSpec spec, LayoutFarm.HtmlBoxes.HtmlHost htmlhost) { //create cssbox //test only! var newspec = new BoxSpec(); BoxSpec.InheritStyles(newspec, spec); newspec.BackgroundColor = Color.Blue; newspec.Width = new CssLength(50, CssUnitOrNames.Pixels); newspec.Height = new CssLength(50, CssUnitOrNames.Pixels); newspec.Position = CssPosition.Absolute; newspec.Freeze(); //freeze before use HtmlElement htmlElement = (HtmlElement)domE; var newBox = new CssBox(newspec, parentBox.RootGfx); newBox.SetController(domE); htmlElement.SetPrincipalBox(newBox); //auto set bc of the element parentBox.AppendChild(newBox); htmlhost.UpdateChildBoxes(htmlElement, true); //---------- return newBox; }
public static CssBox CreateTableColumnOrColumnGroup(CssBox parent, HtmlElement childElement, bool fixDisplayType, CssDisplay selectedCssDisplayType) { CssBox col = null; if (fixDisplayType) { col = new CssBox(childElement.Spec, parent.RootGfx, selectedCssDisplayType); } else { col = new CssBox(childElement.Spec, parent.RootGfx); } col.SetController(childElement); parent.AppendChild(col); string spanValue; int spanNum = 1;//default if (childElement.TryGetAttribute(WellknownName.Span, out spanValue)) { if (!int.TryParse(spanValue, out spanNum)) { spanNum = 1; } if (spanNum < 0) { spanNum = -spanNum; } } col.SetRowSpanAndColSpan(1, spanNum); return col; }
public static CssBox CreateTableColumnOrColumnGroup(CssBox parent, HtmlElement childElement, bool fixDisplayType, CssDisplay selectedCssDisplayType) { CssBox col = null; if (fixDisplayType) { col = new CssBox(childElement.Spec, parent.RootGfx, selectedCssDisplayType); } else { col = new CssBox(childElement.Spec, parent.RootGfx); } col.SetController(childElement); parent.AppendChild(col); string spanValue; int spanNum = 1;//default if (childElement.TryGetAttribute(WellknownName.Span, out spanValue)) { if (!int.TryParse(spanValue, out spanNum)) { spanNum = 1; } if (spanNum < 0) { spanNum = -spanNum; } } col.SetRowSpanAndColSpan(1, spanNum); return(col); }
public static CssBox CreateOtherPredefinedTableElement(CssBox parent, HtmlElement childElement, CssDisplay selectedCssDisplayType) { var newBox = new CssBox(childElement.Spec, parent.RootGfx, selectedCssDisplayType); newBox.SetController(childElement); parent.AppendChild(newBox); return newBox; }
public static CssBox CreateOtherPredefinedTableElement(CssBox parent, HtmlElement childElement, CssDisplay selectedCssDisplayType) { var newBox = new CssBox(childElement.Spec, parent.RootGfx, selectedCssDisplayType); newBox.SetController(childElement); parent.AppendChild(newBox); return(newBox); }
//TODO: review here, fixed position can be reference sibling? #if DEBUG ///// <summary> ///// ToString override. ///// </summary> ///// <returns></returns> //public override string ToString() //{ // var tag = HtmlElement != null ? string.Format("<{0}>", HtmlElement.Name) : "anon"; // if (IsBlock) // { // return string.Format("{0}{1} Block {2}, Children:{3}", ParentBox == null ? "Root: " : string.Empty, tag, FontSize, Boxes.Count); // } // else if (this.CssDisplay == CssDisplay.None) // { // return string.Format("{0}{1} None", ParentBox == null ? "Root: " : string.Empty, tag); // } // else // { // if (this.MayHasSomeTextContent) // { // return string.Format("{0}{1} {2}: {3}", ParentBox == null ? "Root: " : string.Empty, tag, // this.CssDisplay.ToCssStringValue(), this.dbugCopyTextContent()); // } // else // { // return string.Format("{0}{1} {2}: {3}", ParentBox == null ? "Root: " : string.Empty, tag, // this.CssDisplay.ToCssStringValue(), ""); // } // } //} #endif //----------------------------------------------------------------- public static CssBox AddNewAnonInline(CssBox parent) { BoxSpec spec = CssBox.UnsafeGetBoxSpec(parent); CssBox newBox = new CssBox(spec.GetAnonVersion(), parent._rootgfx); parent.AppendChild(newBox); CssBox.ChangeDisplayType(newBox, Css.CssDisplay.Inline); return(newBox); }
public override LayoutFarm.HtmlBoxes.CssBox CreateCssBox( DomElement domE, LayoutFarm.HtmlBoxes.CssBox parentBox, BoxSpec spec, HtmlHost host) { switch (domE.Name) { case "input": { var inputBox = CreateInputBox(domE, parentBox, spec, myHost.RootGfx, host); if (inputBox != null) { return(inputBox); } } break; case "canvas": { //test only //TODO: review here var canvas = new LayoutFarm.CustomWidgets.MiniAggCanvasBox(400, 400); var wrapperBox = CreateWrapper( canvas, canvas.GetPrimaryRenderElement(myHost.RootGfx), spec, true); parentBox.AppendChild(wrapperBox); return(wrapperBox); } } //default unknown var simpleBox = new LayoutFarm.CustomWidgets.Box(100, 20); simpleBox.BackColor = PixelFarm.Drawing.Color.LightGray; var wrapperBox2 = CreateWrapper( simpleBox, simpleBox.GetPrimaryRenderElement(myHost.RootGfx), spec, false); parentBox.AppendChild(wrapperBox2); return(wrapperBox2); }
public static CssBoxSvgRoot CreateSvgBox(CssBox parentBox, HtmlElement elementNode, Css.BoxSpec spec) { SvgFragment fragment = new SvgFragment(); SvgRootEventPortal svgRootController = new SvgRootEventPortal(elementNode); CssBoxSvgRoot svgRoot = new CssBoxSvgRoot( elementNode.Spec, parentBox.RootGfx, fragment); svgRoot.SetController(svgRootController); svgRootController.SvgRoot = svgRoot; parentBox.AppendChild(svgRoot); CreateSvgBoxContent(fragment, elementNode); return svgRoot; }
public static CssBox CreateTableCell(CssBox parent, HtmlElement childElement, bool fixDisplayType) { CssBox tableCell = null; if (fixDisplayType) { tableCell = new CssBox(childElement.Spec, parent.RootGfx, CssDisplay.TableCell); } else { tableCell = new CssBox(childElement.Spec, parent.RootGfx); } tableCell.SetController(childElement); parent.AppendChild(tableCell); //---------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------- //get rowspan and colspan here int nRowSpan = 1; int nColSpan = 1; string rowspan; if (childElement.TryGetAttribute(WellknownName.RowSpan, out rowspan)) { if (!int.TryParse(rowspan, out nRowSpan)) { nRowSpan = 1; } } string colspan; if (childElement.TryGetAttribute(WellknownName.ColSpan, out colspan)) { if (!int.TryParse(colspan, out nColSpan)) { nColSpan = 1; } } //---------------------------------------------------------- tableCell.SetRowSpanAndColSpan(nRowSpan, nColSpan); return(tableCell); }
public static CssBox CreateTableCell(CssBox parent, HtmlElement childElement, bool fixDisplayType) { CssBox tableCell = null; if (fixDisplayType) { tableCell = new CssBox(childElement.Spec, parent.RootGfx, CssDisplay.TableCell); } else { tableCell = new CssBox(childElement.Spec, parent.RootGfx); } tableCell.SetController(childElement); parent.AppendChild(tableCell); //---------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------- //get rowspan and colspan here int nRowSpan = 1; int nColSpan = 1; string rowspan; if (childElement.TryGetAttribute(WellknownName.RowSpan, out rowspan)) { if (!int.TryParse(rowspan, out nRowSpan)) { nRowSpan = 1; } } string colspan; if (childElement.TryGetAttribute(WellknownName.ColSpan, out colspan)) { if (!int.TryParse(colspan, out nColSpan)) { nColSpan = 1; } } //---------------------------------------------------------- tableCell.SetRowSpanAndColSpan(nRowSpan, nColSpan); return tableCell; }
CssBox CreateImageBox(CssBox parent, HtmlElement childElement) { string imgsrc; ImageBinder imgBinder = null; if (childElement.TryGetAttribute(WellknownName.Src, out imgsrc)) { var clientImageBinder = new ClientImageBinder(imgsrc); imgBinder = clientImageBinder; //clientImageBinder.SetOwner(childElement); } else { var clientImageBinder = new ClientImageBinder(null); imgBinder = clientImageBinder; //clientImageBinder.SetOwner(childElement); } CssBoxImage boxImage = new CssBoxImage(childElement.Spec, parent.RootGfx, imgBinder); boxImage.SetController(childElement); parent.AppendChild(boxImage); return(boxImage); }
CssBox CreateImageBox(CssBox parent, HtmlElement childElement) { string imgsrc; ImageBinder imgBinder = null; if (childElement.TryGetAttribute(WellknownName.Src, out imgsrc)) { var clientImageBinder = new ClientImageBinder(imgsrc); imgBinder = clientImageBinder; clientImageBinder.SetOwner(childElement); } else { var clientImageBinder = new ClientImageBinder(null); imgBinder = clientImageBinder; clientImageBinder.SetOwner(childElement); } CssBoxImage boxImage = new CssBoxImage(childElement.Spec, parent.RootGfx, imgBinder); boxImage.SetController(childElement); parent.AppendChild(boxImage); return boxImage; }
internal CssBox CreateBox(CssBox parentBox, HtmlElement childElement, bool fullmode) { //----------------------------------------- //1. create new box //----------------------------------------- //some box has predefined behaviour CssBox newBox = null; switch (childElement.WellknownElementName) { case WellKnownDomNodeName.br: //special treatment for br newBox = new CssBox(childElement.Spec, parentBox.RootGfx); newBox.SetController(childElement); CssBox.SetAsBrBox(newBox); CssBox.ChangeDisplayType(newBox, CssDisplay.Block); parentBox.AppendChild(newBox); childElement.SetPrincipalBox(newBox); return newBox; case WellKnownDomNodeName.img: //auto append newBox to parentBox newBox = CreateImageBox(parentBox, childElement); childElement.SetPrincipalBox(newBox); return newBox; case WellKnownDomNodeName.hr: newBox = new CssBoxHr(childElement.Spec, parentBox.RootGfx); newBox.SetController(childElement); parentBox.AppendChild(newBox); childElement.SetPrincipalBox(newBox); return newBox; //----------------------------------------------------- //TODO: simplify this ... //table-display elements, fix display type case WellKnownDomNodeName.td: case WellKnownDomNodeName.th: newBox = TableBoxCreator.CreateTableCell(parentBox, childElement, true); break; case WellKnownDomNodeName.col: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, true, CssDisplay.TableColumn); break; case WellKnownDomNodeName.colgroup: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, true, CssDisplay.TableColumnGroup); break; case WellKnownDomNodeName.tr: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableRow); break; case WellKnownDomNodeName.tbody: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableRowGroup); break; case WellKnownDomNodeName.table: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.Table); break; case WellKnownDomNodeName.caption: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableCaption); break; case WellKnownDomNodeName.thead: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableHeaderGroup); break; case WellKnownDomNodeName.tfoot: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableFooterGroup); break; //--------------------------------------------------- case WellKnownDomNodeName.canvas: case WellKnownDomNodeName.input: newBox = this.CreateCustomCssBox(parentBox, childElement, childElement.Spec); if (newBox != null) { childElement.SetPrincipalBox(newBox); return newBox; } goto default; //else goto default *** //--------------------------------------------------- case WellKnownDomNodeName.svg: { //1. create svg container node newBox = Svg.SvgCreator.CreateSvgBox(parentBox, childElement, childElement.Spec); childElement.SetPrincipalBox(newBox); return newBox; } case WellKnownDomNodeName.NotAssign: case WellKnownDomNodeName.Unknown: { //custom tag //check if this is tag is registered as custom element //----------------------------------------------- if (childElement.HasCustomPrincipalBoxGenerator) { var childbox = childElement.GetPrincipalBox(parentBox, this); parentBox.AppendChild(childbox); return childbox; } //----------------------------------------------- LayoutFarm.Composers.CreateCssBoxDelegate foundBoxGen; if (((HtmlDocument)childElement.OwnerDocument).TryGetCustomBoxGenerator(childElement.Name, out foundBoxGen)) { //create custom box newBox = foundBoxGen(childElement, parentBox, childElement.Spec, this); } if (newBox == null) { goto default; } else { childElement.SetPrincipalBox(newBox); return newBox; } } default: { BoxSpec childSpec = childElement.Spec; switch (childSpec.CssDisplay) { //not fixed display type case CssDisplay.TableCell: newBox = TableBoxCreator.CreateTableCell(parentBox, childElement, false); break; case CssDisplay.TableColumn: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, false, CssDisplay.TableColumn); break; case CssDisplay.TableColumnGroup: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, false, CssDisplay.TableColumnGroup); break; case CssDisplay.ListItem: newBox = ListItemBoxCreator.CreateListItemBox(parentBox, childElement); break; default: newBox = new CssBox(childSpec, parentBox.RootGfx); newBox.SetController(childElement); parentBox.AppendChild(newBox); break; } } break; } childElement.SetPrincipalBox(newBox); UpdateChildBoxes(childElement, fullmode); return newBox; }
LayoutFarm.HtmlBoxes.CssBox CreateInputBox(DomElement domE, LayoutFarm.HtmlBoxes.CssBox parentBox, BoxSpec spec, LayoutFarm.RootGraphic rootgfx, HtmlHost host) { var typeAttr = domE.FindAttribute("type"); if (typeAttr != null) { switch (typeAttr.Value) { case "text": { // user can specific width of textbox //var textbox = new LayoutFarm.CustomWidgets.TextBox(100, 17, false); var textbox = new LayoutFarm.CustomWidgets.TextBoxContainer(100, 20, false); var wrapperBox = CreateWrapper( textbox, textbox.GetPrimaryRenderElement(rootgfx), spec, true); //place holder support var placeHolderAttr = domE.FindAttribute("placeholder"); if (placeHolderAttr != null) { textbox.PlaceHolderText = placeHolderAttr.Value; } parentBox.AppendChild(wrapperBox); return(wrapperBox); } case "button": { //use subdom? technique //todo: review the technique here var button = new HtmlWidgets.Button(60, 30); var ihtmlElement = domE as LayoutFarm.WebDom.IHtmlElement; if (ihtmlElement != null) { button.Text = ihtmlElement.innerHTML; } else { button.Text = ""; } button.Text = "testButton"; DomElement buttonDom = button.GetPresentationDomNode((HtmlDocument)domE.OwnerDocument); CssBox buttonCssBox = host.CreateBox2(parentBox, (WebDom.Impl.HtmlElement)buttonDom, true); // CreateCssBox(buttonDom, parentBox, spec, host); //var ui = button.GetPrimaryUIElement(this.myHost); //var wrapperBox = CreateWrapper( // button, // ui.GetPrimaryRenderElement(rootgfx), // spec, true); //parentBox.AppendChild(wrapperBox); //return wrapperBox; parentBox.AppendChild(buttonCssBox); return(buttonCssBox); } case "textbox": { var textbox = new LayoutFarm.CustomWidgets.TextBox(100, 17, false); CssBox wrapperBox = CreateWrapper( textbox, textbox.GetPrimaryRenderElement(rootgfx), spec, true); parentBox.AppendChild(wrapperBox); return(wrapperBox); } case "radio": { //tempfix -> just copy the Button code, //TODO: review here, use proper radio button var box = new LayoutFarm.CustomWidgets.Box(20, 20); CssBox wrapperBox = CreateWrapper( box, box.GetPrimaryRenderElement(rootgfx), spec, true); parentBox.AppendChild(wrapperBox); return(wrapperBox); } } } return(null); }
public static CssBox CreateListItemBox(CssBox parent, HtmlElement childElement) { var spec = childElement.Spec; var newBox = new CssBoxListItem(spec, parent.RootGfx); newBox.SetController(childElement); parent.AppendChild(newBox); if (spec.ListStyleType != CssListStyleType.None) { //create sub item collection var itemBulletBox = new CssBox(spec.GetAnonVersion(), parent.RootGfx); newBox.BulletBox = itemBulletBox; CssBox.UnsafeSetParent(itemBulletBox, newBox); CssBox.ChangeDisplayType(itemBulletBox, CssDisplay.Inline); //--------------------------------------------------------------- //set content of bullet char[] text_content = null; switch (spec.ListStyleType) { case CssListStyleType.Disc: { text_content = discItem; } break; case CssListStyleType.Circle: { text_content = circleItem; } break; case CssListStyleType.Square: { text_content = squareItem; } break; case CssListStyleType.Decimal: { text_content = (GetIndexForList(newBox, childElement).ToString(CultureInfo.InvariantCulture) + ".").ToCharArray(); } break; case CssListStyleType.DecimalLeadingZero: { text_content = (GetIndexForList(newBox, childElement).ToString("00", CultureInfo.InvariantCulture) + ".").ToCharArray(); } break; default: { text_content = (BulletNumberFormatter.ConvertToAlphaNumber(GetIndexForList(newBox, childElement), spec.ListStyleType) + ".").ToCharArray(); } break; } //--------------------------------------------------------------- CssBox.UnsafeSetTextBuffer(itemBulletBox, text_content); List <CssRun> runlist = new List <CssRun>(); bool hasSomeCharacter; splitter.ParseWordContent(text_content, spec, itemBulletBox.IsBlock, runlist, out hasSomeCharacter); RunListHelper.AddRunList(itemBulletBox, spec, runlist, text_content, false); } return(newBox); }
///// <summary> ///// ToString override. ///// </summary> ///// <returns></returns> //public override string ToString() //{ // var tag = HtmlElement != null ? string.Format("<{0}>", HtmlElement.Name) : "anon"; // if (IsBlock) // { // return string.Format("{0}{1} Block {2}, Children:{3}", ParentBox == null ? "Root: " : string.Empty, tag, FontSize, Boxes.Count); // } // else if (this.CssDisplay == CssDisplay.None) // { // return string.Format("{0}{1} None", ParentBox == null ? "Root: " : string.Empty, tag); // } // else // { // if (this.MayHasSomeTextContent) // { // return string.Format("{0}{1} {2}: {3}", ParentBox == null ? "Root: " : string.Empty, tag, // this.CssDisplay.ToCssStringValue(), this.dbugCopyTextContent()); // } // else // { // return string.Format("{0}{1} {2}: {3}", ParentBox == null ? "Root: " : string.Empty, tag, // this.CssDisplay.ToCssStringValue(), ""); // } // } //} #endif //----------------------------------------------------------------- public static CssBox AddNewAnonInline(CssBox parent) { var spec = CssBox.UnsafeGetBoxSpec(parent); var newBox = new CssBox(spec.GetAnonVersion(), parent.rootgfx); parent.AppendChild(newBox); CssBox.ChangeDisplayType(newBox, Css.CssDisplay.Inline); return newBox; }
public static CssBox CreateListItemBox(CssBox parent, HtmlElement childElement) { var spec = childElement.Spec; var newBox = new CssBoxListItem(spec, parent.RootGfx); newBox.SetController(childElement); parent.AppendChild(newBox); if (spec.ListStyleType != CssListStyleType.None) { //create sub item collection var itemBulletBox = new CssBox(spec.GetAnonVersion(), parent.RootGfx); newBox.BulletBox = itemBulletBox; CssBox.UnsafeSetParent(itemBulletBox, newBox); CssBox.ChangeDisplayType(itemBulletBox, CssDisplay.Inline); //--------------------------------------------------------------- //set content of bullet char[] text_content = null; switch (spec.ListStyleType) { case CssListStyleType.Disc: { text_content = discItem; } break; case CssListStyleType.Circle: { text_content = circleItem; } break; case CssListStyleType.Square: { text_content = squareItem; } break; case CssListStyleType.Decimal: { text_content = (GetIndexForList(newBox, childElement).ToString(CultureInfo.InvariantCulture) + ".").ToCharArray(); } break; case CssListStyleType.DecimalLeadingZero: { text_content = (GetIndexForList(newBox, childElement).ToString("00", CultureInfo.InvariantCulture) + ".").ToCharArray(); } break; default: { text_content = (BulletNumberFormatter.ConvertToAlphaNumber(GetIndexForList(newBox, childElement), spec.ListStyleType) + ".").ToCharArray(); } break; } //--------------------------------------------------------------- CssBox.UnsafeSetTextBuffer(itemBulletBox, text_content); List<CssRun> runlist = new List<CssRun>(); bool hasSomeCharacter; splitter.ParseWordContent(text_content, spec, itemBulletBox.IsBlock, runlist, out hasSomeCharacter); RunListHelper.AddRunList(itemBulletBox, spec, runlist, text_content, false); } return newBox; }
/// update some or generate all cssbox /// </summary> /// <param name="parentElement"></param> /// <param name="fullmode">update all nodes (true) or somenode (false)</param> internal void UpdateChildBoxes(HtmlElement parentElement, bool fullmode) { //recursive *** //first just generate into primary pricipal box //layout process will correct it later switch (parentElement.ChildrenCount) { case 0: { } break; case 1: { CssBox hostBox = HtmlElement.InternalGetPrincipalBox(parentElement); //only one child -- easy DomNode child = parentElement.GetChildNode(0); int newBox = 0; switch (child.NodeType) { case HtmlNodeType.TextNode: { HtmlTextNode singleTextNode = (HtmlTextNode)child; RunListHelper.AddRunList(hostBox, parentElement.Spec, singleTextNode); } break; case HtmlNodeType.ShortElement: case HtmlNodeType.OpenElement: { HtmlElement childElement = (HtmlElement)child; var spec = childElement.Spec; if (spec.CssDisplay == CssDisplay.None) { return; } newBox++; //-------------------------------------------------- if (fullmode) { CssBox newbox = CreateBox(hostBox, childElement, fullmode); childElement.SetPrincipalBox(newbox); } else { CssBox existing = HtmlElement.InternalGetPrincipalBox(childElement); if (existing == null) { CssBox box = CreateBox(hostBox, childElement, fullmode); childElement.SetPrincipalBox(box); } else { //just insert hostBox.AppendChild(existing); if (!childElement.SkipPrincipalBoxEvalulation) { existing.Clear(); UpdateChildBoxes(childElement, fullmode); childElement.SkipPrincipalBoxEvalulation = true; } } } } break; } } break; default: { CssBox hostBox = HtmlElement.InternalGetPrincipalBox(parentElement); CssWhiteSpace ws = parentElement.Spec.WhiteSpace; int childCount = parentElement.ChildrenCount; int newBox = 0; for (int i = 0; i < childCount; ++i) { var childNode = parentElement.GetChildNode(i); switch (childNode.NodeType) { case HtmlNodeType.TextNode: { HtmlTextNode textNode = (HtmlTextNode)childNode; switch (ws) { case CssWhiteSpace.Pre: case CssWhiteSpace.PreWrap: { RunListHelper.AddRunList( CssBox.AddNewAnonInline(hostBox), parentElement.Spec, textNode); } break; case CssWhiteSpace.PreLine: { if (newBox == 0 && textNode.IsWhiteSpace) { continue; //skip } RunListHelper.AddRunList( CssBox.AddNewAnonInline(hostBox), parentElement.Spec, textNode); } break; default: { if (textNode.IsWhiteSpace) { continue; //skip } RunListHelper.AddRunList( CssBox.AddNewAnonInline(hostBox), parentElement.Spec, textNode); } break; } newBox++; } break; case HtmlNodeType.ShortElement: case HtmlNodeType.OpenElement: { HtmlElement childElement = (HtmlElement)childNode; var spec = childElement.Spec; if (spec.CssDisplay == CssDisplay.None) { continue; } if (fullmode) { CssBox box = CreateBox(hostBox, childElement, fullmode); } else { CssBox existingCssBox = HtmlElement.InternalGetPrincipalBox(childElement); if (existingCssBox == null) { CssBox box = CreateBox(hostBox, childElement, fullmode); } else { //just insert hostBox.AppendChild(existingCssBox); if (!childElement.SkipPrincipalBoxEvalulation) { existingCssBox.Clear(); UpdateChildBoxes(childElement, fullmode); childElement.SkipPrincipalBoxEvalulation = true; } } } newBox++; } break; default: { } break; } } } break; } //---------------------------------- //summary formatting context //that will be used on layout process //---------------------------------- }
internal CssBox CreateBox(CssBox parentBox, HtmlElement childElement, bool fullmode) { //----------------------------------------- //1. create new box //----------------------------------------- //some box has predefined behaviour CssBox newBox = null; switch (childElement.WellknownElementName) { case WellKnownDomNodeName.br: //special treatment for br newBox = new CssBox(childElement.Spec, parentBox.RootGfx); newBox.SetController(childElement); CssBox.SetAsBrBox(newBox); CssBox.ChangeDisplayType(newBox, CssDisplay.Block); parentBox.AppendChild(newBox); childElement.SetPrincipalBox(newBox); return(newBox); case WellKnownDomNodeName.img: //auto append newBox to parentBox newBox = CreateImageBox(parentBox, childElement); childElement.SetPrincipalBox(newBox); return(newBox); case WellKnownDomNodeName.hr: newBox = new CssBoxHr(childElement.Spec, parentBox.RootGfx); newBox.SetController(childElement); parentBox.AppendChild(newBox); childElement.SetPrincipalBox(newBox); return(newBox); //----------------------------------------------------- //TODO: simplify this ... //table-display elements, fix display type case WellKnownDomNodeName.td: case WellKnownDomNodeName.th: newBox = TableBoxCreator.CreateTableCell(parentBox, childElement, true); break; case WellKnownDomNodeName.col: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, true, CssDisplay.TableColumn); break; case WellKnownDomNodeName.colgroup: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, true, CssDisplay.TableColumnGroup); break; case WellKnownDomNodeName.tr: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableRow); break; case WellKnownDomNodeName.tbody: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableRowGroup); break; case WellKnownDomNodeName.table: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.Table); break; case WellKnownDomNodeName.caption: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableCaption); break; case WellKnownDomNodeName.thead: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableHeaderGroup); break; case WellKnownDomNodeName.tfoot: newBox = TableBoxCreator.CreateOtherPredefinedTableElement(parentBox, childElement, CssDisplay.TableFooterGroup); break; //--------------------------------------------------- case WellKnownDomNodeName.canvas: case WellKnownDomNodeName.input: newBox = this.CreateCustomCssBox(parentBox, childElement, childElement.Spec); if (newBox != null) { childElement.SetPrincipalBox(newBox); return(newBox); } goto default; //else goto default *** //--------------------------------------------------- case WellKnownDomNodeName.svg: { //1. create svg container node newBox = _svgCreator.CreateSvgBox(parentBox, childElement, childElement.Spec); childElement.SetPrincipalBox(newBox); return(newBox); } case WellKnownDomNodeName.NotAssign: case WellKnownDomNodeName.Unknown: { //custom tag //check if this is tag is registered as custom element //----------------------------------------------- if (childElement.HasCustomPrincipalBoxGenerator) { var childbox = childElement.GetPrincipalBox(parentBox, this); parentBox.AppendChild(childbox); return(childbox); } //----------------------------------------------- LayoutFarm.Composers.CreateCssBoxDelegate foundBoxGen; if (((HtmlDocument)childElement.OwnerDocument).TryGetCustomBoxGenerator(childElement.Name, out foundBoxGen)) { //create custom box newBox = foundBoxGen(childElement, parentBox, childElement.Spec, this); } if (newBox == null) { goto default; } else { childElement.SetPrincipalBox(newBox); return(newBox); } } default: { BoxSpec childSpec = childElement.Spec; switch (childSpec.CssDisplay) { //not fixed display type case CssDisplay.TableCell: newBox = TableBoxCreator.CreateTableCell(parentBox, childElement, false); break; case CssDisplay.TableColumn: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, false, CssDisplay.TableColumn); break; case CssDisplay.TableColumnGroup: newBox = TableBoxCreator.CreateTableColumnOrColumnGroup(parentBox, childElement, false, CssDisplay.TableColumnGroup); break; case CssDisplay.ListItem: newBox = ListItemBoxCreator.CreateListItemBox(parentBox, childElement); break; default: newBox = new CssBox(childSpec, parentBox.RootGfx); newBox.SetController(childElement); parentBox.AppendChild(newBox); break; } } break; } childElement.SetPrincipalBox(newBox); UpdateChildBoxes(childElement, fullmode); return(newBox); }