public void addChildAtStart(Box child) { this.children.Insert(0, child); child.parent = this; }
public LineArea(FontState fontState, int lineHeight, int halfLeading, int allocationWidth, int startIndent, int endIndent, LineArea prevLineArea) : base(fontState) { this.currentFontState = fontState; this.lineHeight = lineHeight; this.nominalFontSize = fontState.FontSize; this.nominalGlyphHeight = fontState.Ascender - fontState.Descender; this.placementOffset = fontState.Ascender; this.contentRectangleWidth = allocationWidth - startIndent - endIndent; this.fontState = fontState; this.allocationHeight = this.nominalGlyphHeight; this.halfLeading = this.lineHeight - this.allocationHeight; this.startIndent = startIndent; this.endIndent = endIndent; if (prevLineArea != null) { IEnumerator e = prevLineArea.pendingAreas.GetEnumerator(); Box b = null; bool eatMoreSpace = true; int eatenWidth = 0; while (eatMoreSpace) { if (e.MoveNext()) { b = (Box)e.Current; if (b is InlineSpace) { InlineSpace isp = (InlineSpace)b; if (isp.isEatable()) { eatenWidth += isp.getSize(); } else { eatMoreSpace = false; } } else { eatMoreSpace = false; } } else { eatMoreSpace = false; b = null; } } while (b != null) { pendingAreas.Add(b); if (e.MoveNext()) { b = (Box)e.Current; } else { b = null; } } pendingWidth = prevLineArea.getPendingWidth() - eatenWidth; } }
public void addChild(Box child) { this.children.Add(child); child.parent = this; }
public int addText(char[] odata, int start, int end, LinkSet ls, TextState textState) { if (start == -1) { return(-1); } bool overrun = false; int wordStart = start; int wordLength = 0; int wordWidth = 0; int whitespaceWidth = getCharWidth(' '); char[] data = new char[odata.Length]; char[] dataCopy = new char[odata.Length]; Array.Copy(odata, data, odata.Length); Array.Copy(odata, dataCopy, odata.Length); bool isText = false; bool isMultiByteChar = false; for (int i = start; i < end; i++) { int charWidth; char c = data[i]; if (!(isSpace(c) || (c == '\n') || (c == '\r') || (c == '\t') || (c == '\u2028'))) { charWidth = getCharWidth(c); isText = true; isMultiByteChar = (c > 127); if (charWidth <= 0 && c != '\u200B' && c != '\uFEFF') { charWidth = whitespaceWidth; } } else { if ((c == '\n') || (c == '\r') || (c == '\t')) { charWidth = whitespaceWidth; } else { charWidth = getCharWidth(c); } isText = false; isMultiByteChar = false; if (prev == WHITESPACE) { if (this.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE) { if (isSpace(c)) { spaceWidth += getCharWidth(c); } else if (c == '\n' || c == '\u2028') { if (spaceWidth > 0) { InlineSpace isp = new InlineSpace(spaceWidth); isp.setUnderlined(textState.getUnderlined()); isp.setOverlined(textState.getOverlined()); isp.setLineThrough(textState.getLineThrough()); addChild(isp); finalWidth += spaceWidth; spaceWidth = 0; } return(i + 1); } else if (c == '\t') { spaceWidth += 8 * whitespaceWidth; } } else if (c == '\u2028') { if (spaceWidth > 0) { InlineSpace isp = new InlineSpace(spaceWidth); isp.setUnderlined(textState.getUnderlined()); isp.setOverlined(textState.getOverlined()); isp.setLineThrough(textState.getLineThrough()); addChild(isp); finalWidth += spaceWidth; spaceWidth = 0; } return(i + 1); } } else if (prev == TEXT || prev == MULTIBYTECHAR) { if (spaceWidth > 0) { InlineSpace isp = new InlineSpace(spaceWidth); if (prevUlState) { isp.setUnderlined(textState.getUnderlined()); } if (prevOlState) { isp.setOverlined(textState.getOverlined()); } if (prevLTState) { isp.setLineThrough(textState.getLineThrough()); } addChild(isp); finalWidth += spaceWidth; spaceWidth = 0; } IEnumerator e = pendingAreas.GetEnumerator(); while (e.MoveNext()) { Box box = (Box)e.Current; if (box is InlineArea) { if (ls != null) { Rectangle lr = new Rectangle(finalWidth, 0, ((InlineArea)box).getContentWidth(), fontState.FontSize); ls.addRect(lr, this, (InlineArea)box); } } addChild(box); } finalWidth += pendingWidth; pendingWidth = 0; pendingAreas = new ArrayList(); if (wordLength > 0) { addSpacedWord(new String(data, wordStart, wordLength), ls, finalWidth, 0, textState, false); finalWidth += wordWidth; wordWidth = 0; } prev = WHITESPACE; embeddedLinkStart = 0; spaceWidth = getCharWidth(c); if (this.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE) { if (c == '\n' || c == '\u2028') { return(i + 1); } else if (c == '\t') { spaceWidth = whitespaceWidth; } } else if (c == '\u2028') { return(i + 1); } } else { if (this.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE) { if (isSpace(c)) { prev = WHITESPACE; spaceWidth = getCharWidth(c); } else if (c == '\n') { InlineSpace isp = new InlineSpace(spaceWidth); addChild(isp); return(i + 1); } else if (c == '\t') { prev = WHITESPACE; spaceWidth = 8 * whitespaceWidth; } } else { wordStart++; } } } if (isText) { int curr = isMultiByteChar ? MULTIBYTECHAR : TEXT; if (prev == WHITESPACE) { wordWidth = charWidth; if ((finalWidth + spaceWidth + wordWidth) > this.getContentWidth()) { if (overrun) { FonetDriver.ActiveDriver.FireFonetWarning( "Area contents overflows area"); } if (this.wrapOption == WrapOption.WRAP) { return(i); } } prev = curr; wordStart = i; wordLength = 1; } else if (prev == TEXT || prev == MULTIBYTECHAR) { if (prev == TEXT && curr == TEXT || !canBreakMidWord()) { wordLength++; wordWidth += charWidth; } else { InlineSpace isp = new InlineSpace(spaceWidth); if (prevUlState) { isp.setUnderlined(textState.getUnderlined()); } if (prevOlState) { isp.setOverlined(textState.getOverlined()); } if (prevLTState) { isp.setLineThrough(textState.getLineThrough()); } addChild(isp); finalWidth += spaceWidth; spaceWidth = 0; IEnumerator e = pendingAreas.GetEnumerator(); while (e.MoveNext()) { Box box = (Box)e.Current; if (box is InlineArea) { if (ls != null) { Rectangle lr = new Rectangle(finalWidth, 0, ((InlineArea)box).getContentWidth(), fontState.FontSize); ls.addRect(lr, this, (InlineArea)box); } } addChild(box); } finalWidth += pendingWidth; pendingWidth = 0; pendingAreas = new ArrayList(); if (wordLength > 0) { addSpacedWord(new String(data, wordStart, wordLength), ls, finalWidth, 0, textState, false); finalWidth += wordWidth; } spaceWidth = 0; wordStart = i; wordLength = 1; wordWidth = charWidth; } prev = curr; } else { prev = curr; wordStart = i; wordLength = 1; wordWidth = charWidth; } if ((finalWidth + spaceWidth + pendingWidth + wordWidth) > this.getContentWidth()) { if (this.wrapOption == WrapOption.WRAP) { if (wordStart == start) { overrun = true; if (finalWidth > 0) { return(wordStart); } } else { return(wordStart); } } } } } if (prev == TEXT || prev == MULTIBYTECHAR) { if (spaceWidth > 0) { InlineSpace pis = new InlineSpace(spaceWidth); pis.setEatable(true); if (prevUlState) { pis.setUnderlined(textState.getUnderlined()); } if (prevOlState) { pis.setOverlined(textState.getOverlined()); } if (prevLTState) { pis.setLineThrough(textState.getLineThrough()); } pendingAreas.Add(pis); pendingWidth += spaceWidth; spaceWidth = 0; } addSpacedWord(new String(data, wordStart, wordLength), ls, finalWidth + pendingWidth, spaceWidth, textState, true); embeddedLinkStart += wordWidth; wordWidth = 0; } if (overrun) { FonetDriver.ActiveDriver.FireFonetWarning( "Area contents overflows area"); } return(-1); }