/// <summary>
        /// Based on the current numbering creates and returns the appropriate ListItemNumberComponent along with a few other appropriate bits.
        /// </summary>
        /// <param name="item">The list item to build the Number component for</param>
        /// <param name="itemstyle">The full style of this list item</param>
        /// <param name="halign">The alignment as set, can be updated to explict item alignment</param>
        /// <param name="type">The current type of numbering</param>
        /// <param name="itemWidth">If an explicit width has been set then this is returned (otherwise -1)</param>
        /// <param name="text">If this item has explict text (e.g Definiton list) then this is returned, otherwise empty</param>
        /// <returns>The correct PDFListItemLabel for the item</returns>
        private Component BuildAListNumberComponent(ListItem item, Style itemstyle, ref HorizontalAlignment halign,
                                                    out ListNumberingGroupStyle type, out PDFUnit itemWidth, out string text)
        {
            PDFListNumbering numbers = this.Component.Document.ListNumbering;

            type      = numbers.CurrentGroup.Style;
            itemWidth = itemstyle.GetValue(StyleKeys.ListInsetKey, (PDFUnit)(-1));
            text      = itemstyle.GetValue(StyleKeys.ListLabelKey, string.Empty);
            halign    = itemstyle.GetValue(StyleKeys.ListAlignmentKey, halign);

            ListItemLabel label;

            if (type == ListNumberingGroupStyle.Labels)
            {
                PDFListDefinitionItemLabel defn = new PDFListDefinitionItemLabel();
                label = defn;
            }
            else if (type == ListNumberingGroupStyle.Bullet)
            {
                label = new PDFListBulletItemLabel();
            }
            else
            {
                label = new ListItemLabel();
            }

            label.StyleClass = item.StyleClass;



            return(label);
        }
        /// <summary>
        /// Layout the entry item number and returns the height used by the item number.
        /// </summary>
        /// <param name="entry">The entry whose number should be laid out</param>
        /// <returns></returns>
        private PDFUnit LayoutItemNumber(ListNumberEntry entry, Style fullstyle)
        {
            ListItem item = entry.ListItem;


            PDFUnit avail = _itemblock.CurrentRegion.AvailableHeight;

            ListItemLabel literal = (ListItemLabel)entry.NumberComponent;
            Style         applied = literal.GetAppliedStyle();

            if (null != applied)
            {
                this.StyleStack.Push(applied);
                fullstyle = this.StyleStack.GetFullStyle(literal);
            }

            //Get the text of the next number
            if (string.IsNullOrEmpty(entry.NumberText))
            {
                literal.Text = this.Component.Document.ListNumbering.Increment();
            }
            else
            {
                literal.Text = entry.NumberText;
            }

            //Set the list items label reference for future use if required.
            item.ItemLabelComponent = entry.NumberComponent;

            //Actually layout the item in the region
            this.DoLayoutAChild(item.ItemLabelComponent, fullstyle);
            this._itemblock.CurrentRegion.CloseCurrentItem();

            // Calculate the height used and return
            PDFUnit newAvail = _itemblock.CurrentRegion.AvailableHeight;
            PDFUnit used     = avail - newAvail;

            if (null != applied)
            {
                this.StyleStack.Pop();
            }

            return(used);
        }
        static StandardElementMapping()
        {
            foObjs = new Hashtable();

            // Declarations and Pagination and Layout Formatting Objects
            foObjs.Add("root", Root.GetMaker());
            foObjs.Add("declarations", Declarations.GetMaker());
            foObjs.Add("color-profile", ColorProfile.GetMaker());
            foObjs.Add("page-sequence", PageSequence.GetMaker());
            foObjs.Add("layout-master-set", LayoutMasterSet.GetMaker());
            foObjs.Add("page-sequence-master", PageSequenceMaster.GetMaker());
            foObjs.Add("single-page-master-reference", SinglePageMasterReference.GetMaker());
            foObjs.Add("repeatable-page-master-reference", RepeatablePageMasterReference.GetMaker());
            foObjs.Add("repeatable-page-master-alternatives", RepeatablePageMasterAlternatives.GetMaker());
            foObjs.Add("conditional-page-master-reference", ConditionalPageMasterReference.GetMaker());
            foObjs.Add("simple-page-master", SimplePageMaster.GetMaker());
            foObjs.Add("region-body", RegionBody.GetMaker());
            foObjs.Add("region-before", RegionBefore.GetMaker());
            foObjs.Add("region-after", RegionAfter.GetMaker());
            foObjs.Add("region-start", RegionStart.GetMaker());
            foObjs.Add("region-end", RegionEnd.GetMaker());
            foObjs.Add("flow", Flow.Flow.GetMaker());
            foObjs.Add("static-content", StaticContent.GetMaker());
            foObjs.Add("title", Title.GetMaker());

            // Block-level Formatting Objects
            foObjs.Add("block", Block.GetMaker());
            foObjs.Add("block-container", BlockContainer.GetMaker());

            // Inline-level Formatting Objects
            foObjs.Add("bidi-override", BidiOverride.GetMaker());
            foObjs.Add("character", Character.GetMaker());
            foObjs.Add("initial-property-set", InitialPropertySet.GetMaker());
            foObjs.Add("external-graphic", ExternalGraphic.GetMaker());
            foObjs.Add("instream-foreign-object", InstreamForeignObject.GetMaker());
            foObjs.Add("inline", Inline.GetMaker());
            foObjs.Add("inline-container", InlineContainer.GetMaker());
            foObjs.Add("leader", Leader.GetMaker());
            foObjs.Add("page-number", PageNumber.GetMaker());
            foObjs.Add("page-number-citation", PageNumberCitation.GetMaker());

            // Formatting Objects for Tables
            foObjs.Add("table-and-caption", TableAndCaption.GetMaker());
            foObjs.Add("table", Table.GetMaker());
            foObjs.Add("table-column", TableColumn.GetMaker());
            foObjs.Add("table-caption", TableCaption.GetMaker());
            foObjs.Add("table-header", TableHeader.GetMaker());
            foObjs.Add("table-footer", TableFooter.GetMaker());
            foObjs.Add("table-body", TableBody.GetMaker());
            foObjs.Add("table-row", TableRow.GetMaker());
            foObjs.Add("table-cell", TableCell.GetMaker());

            // Formatting Objects for Lists
            foObjs.Add("list-block", ListBlock.GetMaker());
            foObjs.Add("list-item", ListItem.GetMaker());
            foObjs.Add("list-item-body", ListItemBody.GetMaker());
            foObjs.Add("list-item-label", ListItemLabel.GetMaker());

            // Dynamic Effects: Link and Multi Formatting Objects
            foObjs.Add("basic-link", BasicLink.GetMaker());
            foObjs.Add("multi-switch", MultiSwitch.GetMaker());
            foObjs.Add("multi-case", MultiCase.GetMaker());
            foObjs.Add("multi-toggle", MultiToggle.GetMaker());
            foObjs.Add("multi-properties", MultiProperties.GetMaker());
            foObjs.Add("multi-property-set", MultiPropertySet.GetMaker());

            // Out-of-Line Formatting Objects
            foObjs.Add("float", Float.GetMaker());
            foObjs.Add("footnote", Footnote.GetMaker());
            foObjs.Add("footnote-body", FootnoteBody.GetMaker());

            // Other Formatting Objects
            foObjs.Add("wrapper", Wrapper.GetMaker());
            foObjs.Add("marker", Marker.GetMaker());
            foObjs.Add("retrieve-marker", RetrieveMarker.GetMaker());
        }