Exemple #1
0
        public override Status Layout(Area area)
        {
            if (this.marker == MarkerStart)
            {
                AbsolutePositionProps mAbsProps = propMgr.GetAbsolutePositionProps();
                BorderAndPadding      bap       = propMgr.GetBorderAndPadding();
                BackgroundProps       bProps    = propMgr.GetBackgroundProps();
                MarginProps           mProps    = propMgr.GetMarginProps();

                this.marker   = 0;
                this.position = this.properties.GetProperty("position").GetEnum();
                this.top      = this.properties.GetProperty("top").GetLength().MValue();
                this.bottom   = this.properties.GetProperty("bottom").GetLength().MValue();
                this.left     = this.properties.GetProperty("left").GetLength().MValue();
                this.right    = this.properties.GetProperty("right").GetLength().MValue();
                this.width    = this.properties.GetProperty("width").GetLength().MValue();
                this.height   = this.properties.GetProperty("height").GetLength().MValue();
                span          = this.properties.GetSpanKind();
                area.GetMyRefs().InitializeID(this.properties.GetId(), area);
            }

            AreaContainer container = (AreaContainer)area;

            if ((this.width == 0) && (this.height == 0))
            {
                width  = right - left;
                height = bottom - top;
            }

            this.areaContainer =
                new AreaContainer(propMgr.GetFontState(container.getFontInfo()),
                                  container.getXPosition() + left,
                                  container.GetYPosition() - top, width, height,
                                  position);

            areaContainer.setPage(area.getPage());
            areaContainer.setBackground(propMgr.GetBackgroundProps());
            areaContainer.setBorderAndPadding(propMgr.GetBorderAndPadding());
            areaContainer.start();

            areaContainer.setAbsoluteHeight(0);
            areaContainer.setIDReferences(area.getIDReferences());

            int numChildren = this.children.Count;

            for (int i = this.marker; i < numChildren; i++)
            {
                FObj   fo     = (FObj)children[i];
                Status status = fo.Layout(areaContainer);
            }

            areaContainer.end();
            if (position == Position.ABSOLUTE)
            {
                areaContainer.SetHeight(height);
            }
            area.addChild(areaContainer);

            return(new Status(Status.OK));
        }
        public override Status Layout(Area area)
        {
            if (this.marker == MarkerBreakAfter)
            {
                return(new Status(Status.OK));
            }

            if (this.marker == MarkerStart)
            {
                if (!setup)
                {
                    DoSetup(area);
                }
            }
            if (columnWidth > 0)
            {
                this.areaContainer =
                    new AreaContainer(propMgr.GetFontState(area.getFontInfo()),
                                      columnOffset, 0, columnWidth,
                                      area.getContentHeight(), Position.RELATIVE);
                areaContainer.foCreator = this;
                areaContainer.setPage(area.getPage());
                areaContainer.setBorderAndPadding(propMgr.GetBorderAndPadding());
                areaContainer.setBackground(propMgr.GetBackgroundProps());
                areaContainer.SetHeight(area.GetHeight());
                area.addChild(areaContainer);
            }
            return(new Status(Status.OK));
        }
 private void LayoutStaticContent(Flow.Flow flow, Region region,
                                  AreaContainer area)
 {
     if (flow is StaticContent)
     {
         ((StaticContent)flow).Layout(area, region);
     }
     else
     {
         FonetDriver.ActiveDriver.FireFonetError(region.GetName()
                                                 + " only supports static-content flows currently. "
                                                 + "Cannot use flow named '"
                                                 + flow.GetFlowName() + "'");
     }
 }
Exemple #4
0
 public static bool LayoutFootnote(Page p, FootnoteBody fb, Area area)
 {
     try
     {
         BodyAreaContainer bac      = p.getBody();
         AreaContainer     footArea = bac.getFootnoteReferenceArea();
         footArea.setIDReferences(bac.getIDReferences());
         int basePos = footArea.GetCurrentYPosition()
                       - footArea.GetHeight();
         int oldHeight = footArea.GetHeight();
         if (area != null)
         {
             footArea.setMaxHeight(area.getMaxHeight() - area.GetHeight()
                                   + footArea.GetHeight());
         }
         else
         {
             footArea.setMaxHeight(bac.getMaxHeight()
                                   + footArea.GetHeight());
         }
         Status status = fb.Layout(footArea);
         if (status.isIncomplete())
         {
             return(false);
         }
         else
         {
             if (area != null)
             {
                 area.setMaxHeight(area.getMaxHeight()
                                   - footArea.GetHeight() + oldHeight);
             }
             if (bac.getFootnoteState() == 0)
             {
                 Area ar = bac.getMainReferenceArea();
                 DecreaseMaxHeight(ar, footArea.GetHeight() - oldHeight);
                 footArea.setYPosition(basePos + footArea.GetHeight());
             }
         }
     }
     catch (FonetException)
     {
         return(false);
     }
     return(true);
 }
Exemple #5
0
        public void RenderAreaContainer(AreaContainer area)
        {
            int saveY = this.currentYPosition;
            int saveX = this.currentAreaContainerXPosition;

            if (area.getPosition() == Position.ABSOLUTE)
            {
                // XPosition and YPosition give the content rectangle position
                this.currentYPosition = area.GetYPosition();
                this.currentAreaContainerXPosition = area.getXPosition();
            }
            else if (area.getPosition() == Position.RELATIVE)
            {
                this.currentYPosition -= area.GetYPosition();
                this.currentAreaContainerXPosition += area.getXPosition();
            }
            else if (area.getPosition() == Position.STATIC)
            {
                this.currentYPosition -= area.getPaddingTop()
                                         + area.getBorderTopWidth();
            }

            this.currentXPosition = this.currentAreaContainerXPosition;
            DoFrame(area);

            foreach (Box b in area.getChildren())
            {
                b.render(this);
            }

            // Restore previous origin
            this.currentYPosition = saveY;
            this.currentAreaContainerXPosition = saveX;
            if (area.getPosition() == Position.STATIC)
            {
                this.currentYPosition -= area.GetHeight();
            }
        }
        private void FormatStaticContent(AreaTree areaTree)
        {
            SimplePageMaster simpleMaster = GetCurrentSimplePageMaster();

            if (simpleMaster.getRegion(RegionBefore.REGION_CLASS) != null &&
                (currentPage.getBefore() != null))
            {
                Flow.Flow staticFlow =
                    (Flow.Flow)_flowMap[simpleMaster.getRegion(RegionBefore.REGION_CLASS).getRegionName()];
                if (staticFlow != null)
                {
                    AreaContainer beforeArea = currentPage.getBefore();
                    beforeArea.setIDReferences(areaTree.getIDReferences());
                    LayoutStaticContent(staticFlow,
                                        simpleMaster.getRegion(RegionBefore.REGION_CLASS),
                                        beforeArea);
                }
            }

            if (simpleMaster.getRegion(RegionAfter.REGION_CLASS) != null &&
                (currentPage.getAfter() != null))
            {
                Flow.Flow staticFlow =
                    (Flow.Flow)_flowMap[simpleMaster.getRegion(RegionAfter.REGION_CLASS).getRegionName()];
                if (staticFlow != null)
                {
                    AreaContainer afterArea = currentPage.getAfter();
                    afterArea.setIDReferences(areaTree.getIDReferences());
                    LayoutStaticContent(staticFlow,
                                        simpleMaster.getRegion(RegionAfter.REGION_CLASS),
                                        afterArea);
                }
            }

            if (simpleMaster.getRegion(RegionStart.REGION_CLASS) != null &&
                (currentPage.getStart() != null))
            {
                Flow.Flow staticFlow =
                    (Flow.Flow)_flowMap[simpleMaster.getRegion(RegionStart.REGION_CLASS).getRegionName()];
                if (staticFlow != null)
                {
                    AreaContainer startArea = currentPage.getStart();
                    startArea.setIDReferences(areaTree.getIDReferences());
                    LayoutStaticContent(staticFlow,
                                        simpleMaster.getRegion(RegionStart.REGION_CLASS),
                                        startArea);
                }
            }

            if (simpleMaster.getRegion(RegionEnd.REGION_CLASS) != null &&
                (currentPage.getEnd() != null))
            {
                Flow.Flow staticFlow =
                    (Flow.Flow)_flowMap[simpleMaster.getRegion(RegionEnd.REGION_CLASS).getRegionName()];
                if (staticFlow != null)
                {
                    AreaContainer endArea = currentPage.getEnd();
                    endArea.setIDReferences(areaTree.getIDReferences());
                    LayoutStaticContent(staticFlow,
                                        simpleMaster.getRegion(RegionEnd.REGION_CLASS),
                                        endArea);
                }
            }
        }
Exemple #7
0
        public override Status Layout(Area area)
        {
            if (this.marker == MarkerBreakAfter)
            {
                return(new Status(Status.OK));
            }

            if (this.marker == MarkerStart)
            {
                AccessibilityProps    mAccProps = propMgr.GetAccessibilityProps();
                AuralProps            mAurProps = propMgr.GetAuralProps();
                BorderAndPadding      bap       = propMgr.GetBorderAndPadding();
                BackgroundProps       bProps    = propMgr.GetBackgroundProps();
                MarginProps           mProps    = propMgr.GetMarginProps();
                RelativePositionProps mRelProps = propMgr.GetRelativePositionProps();

                this.breakBefore = this.properties.GetProperty("break-before").GetEnum();
                this.breakAfter  = this.properties.GetProperty("break-after").GetEnum();
                this.spaceBefore =
                    this.properties.GetProperty("space-before.optimum").GetLength().MValue();
                this.spaceAfter =
                    this.properties.GetProperty("space-after.optimum").GetLength().MValue();
                this.ipd =
                    this.properties.GetProperty("inline-progression-dimension").
                    GetLengthRange();
                this.height      = this.properties.GetProperty("height").GetLength().MValue();
                this.bAutoLayout = (this.properties.GetProperty("table-layout").GetEnum() ==
                                    TableLayout.AUTO);

                this.id = this.properties.GetProperty("id").GetString();

                this.omitHeaderAtBreak =
                    this.properties.GetProperty("table-omit-header-at-break").GetEnum()
                    == TableOmitHeaderAtBreak.TRUE;
                this.omitFooterAtBreak =
                    this.properties.GetProperty("table-omit-footer-at-break").GetEnum()
                    == TableOmitFooterAtBreak.TRUE;

                if (area is BlockArea)
                {
                    area.end();
                }
                if (this.areaContainer
                    == null)
                {
                    area.getIDReferences().CreateID(id);
                }

                this.marker = 0;

                if (breakBefore == BreakBefore.PAGE)
                {
                    return(new Status(Status.FORCE_PAGE_BREAK));
                }

                if (breakBefore == BreakBefore.ODD_PAGE)
                {
                    return(new Status(Status.FORCE_PAGE_BREAK_ODD));
                }

                if (breakBefore == BreakBefore.EVEN_PAGE)
                {
                    return(new Status(Status.FORCE_PAGE_BREAK_EVEN));
                }
            }

            if ((spaceBefore != 0) && (this.marker == 0))
            {
                area.addDisplaySpace(spaceBefore);
            }

            if (marker == 0 && areaContainer == null)
            {
                area.getIDReferences().ConfigureID(id, area);
            }

            int spaceLeft = area.spaceLeft();

            this.areaContainer =
                new AreaContainer(propMgr.GetFontState(area.getFontInfo()), 0, 0,
                                  area.getAllocationWidth(), area.spaceLeft(),
                                  Position.STATIC);

            areaContainer.foCreator = this;
            areaContainer.setPage(area.getPage());
            areaContainer.setParent(area);
            areaContainer.setBackground(propMgr.GetBackgroundProps());
            areaContainer.setBorderAndPadding(propMgr.GetBorderAndPadding());
            areaContainer.start();

            areaContainer.setAbsoluteHeight(area.getAbsoluteHeight());
            areaContainer.setIDReferences(area.getIDReferences());

            bool addedHeader = false;
            bool addedFooter = false;
            int  numChildren = this.children.Count;

            if (columns.Count == 0)
            {
                FindColumns(areaContainer);
                if (this.bAutoLayout)
                {
                    FonetDriver.ActiveDriver.FireFonetWarning(
                        "table-layout=auto is not supported, using fixed!");
                }
                this.contentWidth =
                    CalcFixedColumnWidths(areaContainer.getAllocationWidth());
            }
            areaContainer.setAllocationWidth(this.contentWidth);
            layoutColumns(areaContainer);

            for (int i = this.marker; i < numChildren; i++)
            {
                FONode fo = (FONode)children[i];
                if (fo is TableHeader)
                {
                    if (columns.Count == 0)
                    {
                        FonetDriver.ActiveDriver.FireFonetWarning(
                            "Current implementation of tables requires a table-column for each column, indicating column-width");
                        return(new Status(Status.OK));
                    }
                    tableHeader = (TableHeader)fo;
                    tableHeader.SetColumns(columns);
                }
                else if (fo is TableFooter)
                {
                    if (columns.Count == 0)
                    {
                        FonetDriver.ActiveDriver.FireFonetWarning(
                            "Current implementation of tables requires a table-column for each column, indicating column-width");
                        return(new Status(Status.OK));
                    }
                    tableFooter = (TableFooter)fo;
                    tableFooter.SetColumns(columns);
                }
                else if (fo is TableBody)
                {
                    if (columns.Count == 0)
                    {
                        FonetDriver.ActiveDriver.FireFonetWarning(
                            "Current implementation of tables requires a table-column for each column, indicating column-width");
                        return(new Status(Status.OK));
                    }
                    Status status;
                    if (tableHeader != null && !addedHeader)
                    {
                        if ((status =
                                 tableHeader.Layout(areaContainer)).isIncomplete())
                        {
                            tableHeader.ResetMarker();
                            return(new Status(Status.AREA_FULL_NONE));
                        }
                        addedHeader = true;
                        tableHeader.ResetMarker();
                        area.setMaxHeight(area.getMaxHeight() - spaceLeft
                                          + this.areaContainer.getMaxHeight());
                    }
                    if (tableFooter != null && !this.omitFooterAtBreak &&
                        !addedFooter)
                    {
                        if ((status =
                                 tableFooter.Layout(areaContainer)).isIncomplete())
                        {
                            return(new Status(Status.AREA_FULL_NONE));
                        }
                        addedFooter = true;
                        tableFooter.ResetMarker();
                    }
                    fo.SetWidows(widows);
                    fo.SetOrphans(orphans);
                    ((TableBody)fo).SetColumns(columns);

                    if ((status = fo.Layout(areaContainer)).isIncomplete())
                    {
                        this.marker = i;
                        if (bodyCount == 0 &&
                            status.getCode() == Status.AREA_FULL_NONE)
                        {
                            if (tableHeader != null)
                            {
                                tableHeader.RemoveLayout(areaContainer);
                            }
                            if (tableFooter != null)
                            {
                                tableFooter.RemoveLayout(areaContainer);
                            }
                            ResetMarker();
                        }
                        if (areaContainer.getContentHeight() > 0)
                        {
                            area.addChild(areaContainer);
                            area.increaseHeight(areaContainer.GetHeight());
                            if (this.omitHeaderAtBreak)
                            {
                                tableHeader = null;
                            }
                            if (tableFooter != null && !this.omitFooterAtBreak)
                            {
                                ((TableBody)fo).SetYPosition(tableFooter.GetYPosition());
                                tableFooter.SetYPosition(tableFooter.GetYPosition()
                                                         + ((TableBody)fo).GetHeight());
                            }
                            SetupColumnHeights();
                            status = new Status(Status.AREA_FULL_SOME);
                        }
                        return(status);
                    }
                    else
                    {
                        bodyCount++;
                    }
                    area.setMaxHeight(area.getMaxHeight() - spaceLeft
                                      + this.areaContainer.getMaxHeight());
                    if (tableFooter != null && !this.omitFooterAtBreak)
                    {
                        ((TableBody)fo).SetYPosition(tableFooter.GetYPosition());
                        tableFooter.SetYPosition(tableFooter.GetYPosition()
                                                 + ((TableBody)fo).GetHeight());
                    }
                }
            }

            if (tableFooter != null && this.omitFooterAtBreak)
            {
                if (tableFooter.Layout(areaContainer).isIncomplete())
                {
                    FonetDriver.ActiveDriver.FireFonetWarning(
                        "Footer could not fit on page, moving last body row to next page");
                    area.addChild(areaContainer);
                    area.increaseHeight(areaContainer.GetHeight());
                    if (this.omitHeaderAtBreak)
                    {
                        tableHeader = null;
                    }
                    tableFooter.RemoveLayout(areaContainer);
                    tableFooter.ResetMarker();
                    return(new Status(Status.AREA_FULL_SOME));
                }
            }

            if (height != 0)
            {
                areaContainer.SetHeight(height);
            }

            SetupColumnHeights();

            areaContainer.end();
            area.addChild(areaContainer);

            area.increaseHeight(areaContainer.GetHeight());

            if (spaceAfter != 0)
            {
                area.addDisplaySpace(spaceAfter);
            }

            if (area is BlockArea)
            {
                area.start();
            }

            if (breakAfter == BreakAfter.PAGE)
            {
                this.marker = MarkerBreakAfter;
                return(new Status(Status.FORCE_PAGE_BREAK));
            }

            if (breakAfter == BreakAfter.ODD_PAGE)
            {
                this.marker = MarkerBreakAfter;
                return(new Status(Status.FORCE_PAGE_BREAK_ODD));
            }

            if (breakAfter == BreakAfter.EVEN_PAGE)
            {
                this.marker = MarkerBreakAfter;
                return(new Status(Status.FORCE_PAGE_BREAK_EVEN));
            }

            return(new Status(Status.OK));
        }
Exemple #8
0
        public override Status Layout(Area area)
        {
            string destination;

            Fonet.Pdf.LinkKind linkType;

            AccessibilityProps    mAccProps = propMgr.GetAccessibilityProps();
            AuralProps            mAurProps = propMgr.GetAuralProps();
            BorderAndPadding      bap       = propMgr.GetBorderAndPadding();
            BackgroundProps       bProps    = propMgr.GetBackgroundProps();
            MarginInlineProps     mProps    = propMgr.GetMarginInlineProps();
            RelativePositionProps mRelProps = propMgr.GetRelativePositionProps();

            if (!(destination =
                      this.properties.GetProperty("internal-destination").GetString()).Equals(""))
            {
                linkType = Pdf.LinkKind.Internal;
            }
            else if (!(destination =
                           this.properties.GetProperty("external-destination").GetString()).Equals(""))
            {
                linkType = Pdf.LinkKind.External;
            }
            else
            {
                throw new FonetException("internal-destination or external-destination must be specified in basic-link");
            }

            if (this.marker == MarkerStart)
            {
                string   id   = this.properties.GetProperty("id").GetString();
                MyIDRefs refs = (MyIDRefs)area.getIDReferences();

                refs.InitializeID(id, area);
                this.marker = 0;
            }

            LinkSet ls = new LinkSet(destination, area, linkType);

            AreaContainer ac = area.getNearestAncestorAreaContainer();

            while (ac != null && ac.getPosition() != Position.ABSOLUTE)
            {
                ac = ac.getNearestAncestorAreaContainer();
            }
            if (ac == null)
            {
                ac = area.getPage().getBody().getCurrentColumnArea();
            }

            int numChildren = this.children.Count;

            for (int i = this.marker; i < numChildren; i++)
            {
                FONode fo = (FONode)children[i];
                fo.SetLinkSet(ls);

                Status status;
                if ((status = fo.Layout(area)).isIncomplete())
                {
                    this.marker = i;
                    return(status);
                }
            }

            ls.applyAreaContainerOffsets(ac, area);
            area.getPage().addLinkSet(ls);

            return(new Status(Status.OK));
        }
Exemple #9
0
        public override Status Layout(Area area)
        {
            if (this.marker == MarkerBreakAfter)
            {
                return(new Status(Status.OK));
            }

            if (this.marker == MarkerStart)
            {
                if (!setup)
                {
                    DoSetup(area);
                }

                if (cellArray == null)
                {
                    InitCellArray();
                    area.getIDReferences().CreateID(id);
                }

                this.marker = 0;
                int breakStatus = propMgr.CheckBreakBefore(area);
                if (breakStatus != Status.OK)
                {
                    return(new Status(breakStatus));
                }
            }

            if (marker == 0)
            {
                area.getIDReferences().ConfigureID(id, area);
            }

            int spaceLeft = area.spaceLeft();

            this.areaContainer =
                new AreaContainer(propMgr.GetFontState(area.getFontInfo()), 0, 0,
                                  area.getContentWidth(), spaceLeft,
                                  Position.RELATIVE);
            areaContainer.foCreator = this;
            areaContainer.setPage(area.getPage());
            areaContainer.setParent(area);

            areaContainer.setBackground(propMgr.GetBackgroundProps());
            areaContainer.start();

            areaContainer.setAbsoluteHeight(area.getAbsoluteHeight());
            areaContainer.setIDReferences(area.getIDReferences());

            largestCellHeight = minHeight;

            bool someCellDidNotLayoutCompletely = false;

            int offset    = 0;
            int iColIndex = 0;

            foreach (TableColumn tcol in columns)
            {
                TableCell cell;
                ++iColIndex;
                int colWidth = tcol.GetColumnWidth();
                if (cellArray.GetCellType(iColIndex) == CellArray.CELLSTART)
                {
                    cell = cellArray.GetCell(iColIndex);
                }
                else
                {
                    if (rowSpanMgr.IsInLastRow(iColIndex))
                    {
                        int h = rowSpanMgr.GetRemainingHeight(iColIndex);
                        if (h > largestCellHeight)
                        {
                            largestCellHeight = h;
                        }
                    }
                    offset += colWidth;
                    continue;
                }
                cell.SetStartOffset(offset);
                offset += colWidth;

                int    rowSpan = cell.GetNumRowsSpanned();
                Status status;
                if ((status = cell.Layout(areaContainer)).isIncomplete())
                {
                    if ((keepTogether.GetKeepType() == KeepValue.KEEP_WITH_ALWAYS) ||
                        (status.getCode() == Status.AREA_FULL_NONE) ||
                        rowSpan > 1)
                    {
                        this.ResetMarker();
                        this.RemoveID(area.getIDReferences());
                        return(new Status(Status.AREA_FULL_NONE));
                    }
                    else if (status.getCode() == Status.AREA_FULL_SOME)
                    {
                        someCellDidNotLayoutCompletely = true;
                    }
                }
                int hi = cell.GetHeight();
                if (rowSpan > 1)
                {
                    rowSpanMgr.AddRowSpan(cell, iColIndex,
                                          cell.GetNumColumnsSpanned(), hi,
                                          rowSpan);
                }
                else if (hi > largestCellHeight)
                {
                    largestCellHeight = hi;
                }
            }

            area.setMaxHeight(area.getMaxHeight() - spaceLeft
                              + this.areaContainer.getMaxHeight());

            for (int iCol = 1; iCol <= columns.Count; iCol++)
            {
                if (cellArray.GetCellType(iCol) == CellArray.CELLSTART &&
                    rowSpanMgr.IsSpanned(iCol) == false)
                {
                    cellArray.GetCell(iCol).SetRowHeight(largestCellHeight);
                }
            }

            rowSpanMgr.FinishRow(largestCellHeight);

            area.addChild(areaContainer);
            areaContainer.SetHeight(largestCellHeight);
            areaAdded = true;
            areaContainer.end();

            area.addDisplaySpace(largestCellHeight
                                 + areaContainer.getPaddingTop()
                                 + areaContainer.getBorderTopWidth()
                                 + areaContainer.getPaddingBottom()
                                 + areaContainer.getBorderBottomWidth());

            if (someCellDidNotLayoutCompletely)
            {
                return(new Status(Status.AREA_FULL_SOME));
            }
            else
            {
                if (rowSpanMgr.HasUnfinishedSpans())
                {
                    return(new Status(Status.KEEP_WITH_NEXT));
                }
                if (breakAfter == BreakAfter.PAGE)
                {
                    this.marker = MarkerBreakAfter;
                    return(new Status(Status.FORCE_PAGE_BREAK));
                }

                if (breakAfter == BreakAfter.ODD_PAGE)
                {
                    this.marker = MarkerBreakAfter;
                    return(new Status(Status.FORCE_PAGE_BREAK_ODD));
                }

                if (breakAfter == BreakAfter.EVEN_PAGE)
                {
                    this.marker = MarkerBreakAfter;
                    return(new Status(Status.FORCE_PAGE_BREAK_EVEN));
                }

                if (breakAfter == BreakAfter.COLUMN)
                {
                    this.marker = MarkerBreakAfter;
                    return(new Status(Status.FORCE_COLUMN_BREAK));
                }
                if (keepWithNext.GetKeepType() != KeepValue.KEEP_WITH_AUTO)
                {
                    return(new Status(Status.KEEP_WITH_NEXT));
                }
                return(new Status(Status.OK));
            }
        }
Exemple #10
0
        public override Status Layout(Area area)
        {
            if (this.marker == MarkerStart)
            {
                AbsolutePositionProps mAbsProps = propMgr.GetAbsolutePositionProps();
                BorderAndPadding      bap       = propMgr.GetBorderAndPadding();
                BackgroundProps       bProps    = propMgr.GetBackgroundProps();
                MarginProps           mProps    = propMgr.GetMarginProps();

                this.marker   = 0;
                this.position = this.properties.GetProperty("position").GetEnum();
                this.top      = this.properties.GetProperty("top").GetLength().MValue();
                this.bottom   = this.properties.GetProperty("bottom").GetLength().MValue();
                this.left     = this.properties.GetProperty("left").GetLength().MValue();
                this.right    = this.properties.GetProperty("right").GetLength().MValue();
                this.width    = this.properties.GetProperty("width").GetLength().MValue();
                this.height   = this.properties.GetProperty("height").GetLength().MValue();
                span          = this.properties.GetProperty("span").GetEnum();

                string id = this.properties.GetProperty("id").GetString();
                area.getIDReferences().InitializeID(id, area);
            }

            AreaContainer container;

            // Apply fix proposed by claytonrumley
            // on http://fonet.codeplex.com/workitem/4647
            if (area is BlockArea)
            {
                container = ((BlockArea)area).getNearestAncestorAreaContainer();
            }
            else
            {
                container = (AreaContainer)area;
            }
            if ((this.width == 0) && (this.height == 0))
            {
                width  = right - left;
                height = bottom - top;
            }

            this.areaContainer =
                new AreaContainer(propMgr.GetFontState(container.getFontInfo()),
                                  container.getXPosition() + left,
                                  container.GetYPosition() - top, width, height,
                                  position);

            areaContainer.setPage(area.getPage());
            areaContainer.setBackground(propMgr.GetBackgroundProps());
            areaContainer.setBorderAndPadding(propMgr.GetBorderAndPadding());
            areaContainer.start();

            areaContainer.setAbsoluteHeight(0);
            areaContainer.setIDReferences(area.getIDReferences());

            int numChildren = this.children.Count;

            for (int i = this.marker; i < numChildren; i++)
            {
                FObj   fo     = (FObj)children[i];
                Status status = fo.Layout(areaContainer);
            }

            areaContainer.end();
            if (position == Position.ABSOLUTE)
            {
                areaContainer.SetHeight(height);
            }
            area.addChild(areaContainer);

            return(new Status(Status.OK));
        }
Exemple #11
0
        public override Status Layout(Area area)
        {
            int originalAbsoluteHeight = area.getAbsoluteHeight();

            if (this.marker == MarkerBreakAfter)
            {
                return(new Status(Status.OK));
            }

            if (this.marker == MarkerStart)
            {
                area.getIDReferences().CreateID(id);

                this.marker = 0;
                this.bDone  = false;
            }

            if (marker == 0)
            {
                area.getIDReferences().ConfigureID(id, area);
            }

            int spaceLeft = area.spaceLeft() - m_borderSeparation;

            this.cellArea =
                new AreaContainer(propMgr.GetFontState(area.getFontInfo()),
                                  startOffset + startAdjust, beforeOffset,
                                  width - widthAdjust, spaceLeft,
                                  Position.RELATIVE);

            cellArea.foCreator = this;
            cellArea.setPage(area.getPage());
            cellArea.setParent(area);
            cellArea.setBorderAndPadding(
                (BorderAndPadding)propMgr.GetBorderAndPadding().Clone());
            cellArea.setBackground(propMgr.GetBackgroundProps());
            cellArea.start();

            cellArea.setAbsoluteHeight(area.getAbsoluteHeight());
            cellArea.setIDReferences(area.getIDReferences());
            cellArea.setTableCellXOffset(startOffset + startAdjust);

            int numChildren = this.children.Count;

            for (int i = this.marker; bDone == false && i < numChildren; i++)
            {
                FObj fo = (FObj)children[i];
                fo.SetIsInTableCell();
                fo.ForceWidth(width);

                this.marker = i;

                Status status;
                if ((status = fo.Layout(cellArea)).isIncomplete())
                {
                    if ((i == 0) && (status.getCode() == Status.AREA_FULL_NONE))
                    {
                        return(new Status(Status.AREA_FULL_NONE));
                    }
                    else
                    {
                        area.addChild(cellArea);
                        return(new Status(Status.AREA_FULL_SOME));
                    }
                }

                area.setMaxHeight(area.getMaxHeight() - spaceLeft
                                  + this.cellArea.getMaxHeight());
            }
            this.bDone = true;
            cellArea.end();
            area.addChild(cellArea);

            if (minCellHeight > cellArea.getContentHeight())
            {
                cellArea.SetHeight(minCellHeight);
            }

            height = cellArea.GetHeight();
            top    = cellArea.GetCurrentYPosition();

            return(new Status(Status.OK));
        }
Exemple #12
0
        public override Status Layout(Area area)
        {
            if (this.marker == MarkerBreakAfter)
            {
                return(new Status(Status.OK));
            }

            if (this.marker == MarkerStart)
            {
                AccessibilityProps    mAccProps = propMgr.GetAccessibilityProps();
                AuralProps            mAurProps = propMgr.GetAuralProps();
                BorderAndPadding      bap       = propMgr.GetBorderAndPadding();
                BackgroundProps       bProps    = propMgr.GetBackgroundProps();
                RelativePositionProps mRelProps = propMgr.GetRelativePositionProps();

                this.spaceBefore = this.properties.GetProperty("space-before.optimum").GetLength().MValue();
                this.spaceAfter  = this.properties.GetProperty("space-after.optimum").GetLength().MValue();
                this.id          = this.properties.GetProperty("id").GetString();

                try
                {
                    area.getIDReferences().CreateID(id);
                }
                catch (FonetException e)
                {
                    throw e;
                }

                if (area is BlockArea)
                {
                    area.end();
                }

                if (rowSpanMgr == null)
                {
                    rowSpanMgr = new RowSpanMgr(columns.Count);
                }

                this.marker = 0;
            }

            if ((spaceBefore != 0) && (this.marker == 0))
            {
                area.increaseHeight(spaceBefore);
            }

            if (marker == 0)
            {
                MyIDRefs refs = (MyIDRefs)area.getIDReferences();
                refs.ConfigureID(id, area);
            }

            int spaceLeft = area.spaceLeft();

            this.areaContainer =
                new AreaContainer(propMgr.GetFontState(area.getFontInfo()), 0,
                                  area.getContentHeight(),
                                  area.getContentWidth(),
                                  area.spaceLeft(), Position.RELATIVE);
            areaContainer.foCreator = this;
            areaContainer.setPage(area.getPage());
            areaContainer.setParent(area);
            areaContainer.setBackground(propMgr.GetBackgroundProps());
            areaContainer.setBorderAndPadding(propMgr.GetBorderAndPadding());
            areaContainer.start();

            areaContainer.setAbsoluteHeight(area.getAbsoluteHeight());
            areaContainer.setIDReferences(area.getIDReferences());

            Hashtable keepWith     = new Hashtable();
            int       numChildren  = this.children.Count;
            TableRow  lastRow      = null;
            bool      endKeepGroup = true;

            for (int i = this.marker; i < numChildren; i++)
            {
                Object child = children[i];
                if (child is Marker)
                {
                    ((Marker)child).Layout(area);
                    continue;
                }
                if (!(child is TableRow))
                {
                    throw new FonetException("Currently only Table Rows are supported in table body, header and footer");
                }
                TableRow row = (TableRow)child;

                row.SetRowSpanMgr(rowSpanMgr);
                row.SetColumns(columns);
                row.DoSetup(areaContainer);
                if ((row.GetKeepWithPrevious().GetKeepType() != KeepValue.KEEP_WITH_AUTO ||
                     row.GetKeepWithNext().GetKeepType() != KeepValue.KEEP_WITH_AUTO ||
                     row.GetKeepTogether().GetKeepType() != KeepValue.KEEP_WITH_AUTO) &&
                    lastRow != null && !keepWith.Contains(lastRow))
                {
                    keepWith.Add(lastRow, null);
                }
                else
                {
                    if (endKeepGroup && keepWith.Count > 0)
                    {
                        keepWith = new Hashtable();
                    }
                    if (endKeepGroup && i > this.marker)
                    {
                        rowSpanMgr.SetIgnoreKeeps(false);
                    }
                }

                bool bRowStartsArea = (i == this.marker);
                if (bRowStartsArea == false && keepWith.Count > 0)
                {
                    if (children.IndexOf(keepWith[0]) == this.marker)
                    {
                        bRowStartsArea = true;
                    }
                }
                row.setIgnoreKeepTogether(bRowStartsArea && startsAC(area));
                Status status = row.Layout(areaContainer);
                if (status.isIncomplete())
                {
                    if (status.isPageBreak())
                    {
                        this.marker = i;
                        area.addChild(areaContainer);

                        area.increaseHeight(areaContainer.GetHeight());
                        if (i == numChildren - 1)
                        {
                            this.marker = MarkerBreakAfter;
                            if (spaceAfter != 0)
                            {
                                area.increaseHeight(spaceAfter);
                            }
                        }
                        return(status);
                    }
                    if ((keepWith.Count > 0) &&
                        (!rowSpanMgr.IgnoreKeeps()))
                    {
                        row.RemoveLayout(areaContainer);
                        foreach (TableRow tr in keepWith.Keys)
                        {
                            tr.RemoveLayout(areaContainer);
                            i--;
                        }
                        if (i == 0)
                        {
                            ResetMarker();

                            rowSpanMgr.SetIgnoreKeeps(true);

                            return(new Status(Status.AREA_FULL_NONE));
                        }
                    }
                    this.marker = i;
                    if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE))
                    {
                        status = new Status(Status.AREA_FULL_SOME);
                    }
                    if (!((i == 0) && (areaContainer.getContentHeight() <= 0)))
                    {
                        area.addChild(areaContainer);

                        area.increaseHeight(areaContainer.GetHeight());
                    }

                    rowSpanMgr.SetIgnoreKeeps(true);

                    return(status);
                }
                else if (status.getCode() == Status.KEEP_WITH_NEXT ||
                         rowSpanMgr.HasUnfinishedSpans())
                {
                    keepWith.Add(row, null);
                    endKeepGroup = false;
                }
                else
                {
                    endKeepGroup = true;
                }
                lastRow = row;
                area.setMaxHeight(area.getMaxHeight() - spaceLeft
                                  + this.areaContainer.getMaxHeight());
                spaceLeft = area.spaceLeft();
            }
            area.addChild(areaContainer);
            areaContainer.end();

            area.increaseHeight(areaContainer.GetHeight());

            if (spaceAfter != 0)
            {
                area.increaseHeight(spaceAfter);
                area.setMaxHeight(area.getMaxHeight() - spaceAfter);
            }

            if (area is BlockArea)
            {
                area.start();
            }

            return(new Status(Status.OK));
        }