Search in sources :

Example 11 with LineBreakMeasurer

use of java.awt.font.LineBreakMeasurer in project OpenNotebook by jaltekruse.

the class AnswerBoxGUI method drawMathObject.

public void drawMathObject(AnswerBoxObject object, Graphics g, Point pageOrigin, float zoomLevel) {
    ScaledSizeAndPosition sap = getSizeAndPositionWithFontSize(object, pageOrigin, zoomLevel, object.getFontSize());
    // TODO - decide how extra whitespace should be handled, should it always be stored?
    // students may use it to format a multi-line answer
    // although useful whitespace will likely not coming at the very beginning or very end
    // of an answer
    List<? extends MathObjectAttribute> correctAnswers = object.getListWithName(AnswerBoxObject.CORRECT_ANSWERS).getValues();
    if (!object.getStudentAnswer().trim().equals("") || !correctAnswers.isEmpty()) {
        Font f = g.getFont();
        g.setColor(new Color(150, 210, 255));
        g.fillRect(sap.getxOrigin(), sap.getyOrigin(), sap.getWidth(), sap.getHeight());
        String message = object.getStudentAnswer();
        for (MathObjectAttribute mAtt : correctAnswers) {
            message += mAtt.getValue().toString() + ";";
        }
        message = message.substring(0, message.length() - 1);
        if (message.isEmpty()) {
            // cannot have an empty string in AttributedString
            message = " ";
        }
        g.setFont(f.deriveFont(sap.getFontSize()));
        g.setColor(Color.BLACK);
        Graphics2D graphics2D = (Graphics2D) g;
        GraphicsEnvironment.getLocalGraphicsEnvironment();
        AttributedString messageAS = new AttributedString(message);
        messageAS.addAttribute(TextAttribute.FONT, g.getFont());
        AttributedCharacterIterator messageIterator = messageAS.getIterator();
        FontRenderContext messageFRC = graphics2D.getFontRenderContext();
        LineBreakMeasurer messageLBM = new LineBreakMeasurer(messageIterator, messageFRC);
        Insets insets = new Insets(2, 2, 2, 2);
        float wrappingWidth = sap.getWidth() - insets.left - insets.right;
        float x = sap.getxOrigin() + insets.left;
        float y = sap.getyOrigin() + insets.top;
        while (messageLBM.getPosition() < messageIterator.getEndIndex()) {
            TextLayout textLayout = messageLBM.nextLayout(wrappingWidth);
            y += textLayout.getAscent();
            textLayout.draw(graphics2D, x, y);
            y += textLayout.getDescent() + textLayout.getLeading();
            x = sap.getxOrigin() + insets.left;
        }
        g.setFont(f);
    } else {
        g.setColor(new Color(230, 230, 230));
        g.fillRect(sap.getxOrigin(), sap.getyOrigin(), sap.getWidth(), sap.getHeight());
    }
    g.setColor(Color.BLACK);
    g.drawRect(sap.getxOrigin(), sap.getyOrigin(), sap.getWidth(), sap.getHeight());
}
Also used : Insets(java.awt.Insets) Color(java.awt.Color) LineBreakMeasurer(java.awt.font.LineBreakMeasurer) AttributedString(java.text.AttributedString) Font(java.awt.Font) Graphics2D(java.awt.Graphics2D) AttributedCharacterIterator(java.text.AttributedCharacterIterator) TextLayout(java.awt.font.TextLayout) MathObjectAttribute(doc.attributes.MathObjectAttribute) AttributedString(java.text.AttributedString) FontRenderContext(java.awt.font.FontRenderContext)

Example 12 with LineBreakMeasurer

use of java.awt.font.LineBreakMeasurer in project hid-serial by rayshobby.

the class StyledString method getLines.

/**
	 * Get the text layouts for display if the string has changed since last call
	 * to this method regenerate them.
	 * 
	 * @param g2d Graphics2D display context
	 * @return a list of text layouts for rendering
	 */
public LinkedList<TextLayoutInfo> getLines(Graphics2D g2d) {
    if (font != g2d.getFont()) {
        setFont(g2d.getFont());
        invalidText = true;
    }
    if (invalidText) {
        styledText = new AttributedString(plainText);
        styledText = insertParagraphMarkers(plainText, styledText);
        applyAttributes();
        invalidText = false;
        invalidLayout = true;
    }
    if (invalidLayout) {
        linesInfo.clear();
        if (plainText.length() > 0) {
            textHeight = 0;
            maxLineLength = 0;
            maxLineHeight = 0;
            nbrLines = 0;
            AttributedCharacterIterator paragraph = styledText.getIterator(null, 0, plainText.length());
            FontRenderContext frc = g2d.getFontRenderContext();
            lineMeasurer = new LineBreakMeasurer(paragraph, frc);
            float yposinpara = 0;
            int charssofar = 0;
            while (lineMeasurer.getPosition() < plainText.length()) {
                TextLayout layout = lineMeasurer.nextLayout(wrapWidth);
                float advance = layout.getVisibleAdvance();
                if (justify) {
                    if (justify && advance > justifyRatio * wrapWidth) {
                        //System.out.println(layout.getVisibleAdvance() + "  " + breakWidth + "  "+ layout.get);
                        // If advance > breakWidth then we have a line break
                        float jw = (advance > wrapWidth) ? advance - wrapWidth : wrapWidth;
                        layout = layout.getJustifiedLayout(jw);
                    }
                }
                // Remember the longest and tallest value for a layout so far.
                float lh = getHeight(layout);
                if (lh > maxLineHeight)
                    maxLineHeight = lh;
                textHeight += lh;
                if (advance <= wrapWidth && advance > maxLineLength)
                    maxLineLength = advance;
                // Store layout and line info
                linesInfo.add(new TextLayoutInfo(nbrLines, layout, charssofar, layout.getCharacterCount(), yposinpara));
                charssofar += layout.getCharacterCount();
                yposinpara += lh;
                nbrLines++;
            }
        }
        invalidLayout = false;
    }
    return linesInfo;
}
Also used : AttributedString(java.text.AttributedString) LineBreakMeasurer(java.awt.font.LineBreakMeasurer) FontRenderContext(java.awt.font.FontRenderContext) AttributedCharacterIterator(java.text.AttributedCharacterIterator) TextLayout(java.awt.font.TextLayout)

Example 13 with LineBreakMeasurer

use of java.awt.font.LineBreakMeasurer in project adempiere by adempiere.

the class WFNode method paintComponent.

//	getPreferredSize
/**
	 * 	Paint Component
	 *	@param g Graphics
	 */
protected void paintComponent(Graphics g) {
    Graphics2D g2D = (Graphics2D) g;
    Rectangle bounds = getBounds();
    m_icon.paintIcon(this, g2D, 0, 0);
    //	Paint Text
    Color color = getForeground();
    g2D.setPaint(color);
    Font font = getFont();
    //
    AttributedString aString = new AttributedString(m_name);
    aString.addAttribute(TextAttribute.FONT, font);
    aString.addAttribute(TextAttribute.FOREGROUND, color);
    AttributedCharacterIterator iter = aString.getIterator();
    //
    LineBreakMeasurer measurer = new LineBreakMeasurer(iter, g2D.getFontRenderContext());
    float width = s_size.width - m_icon.getIconWidth() - 2;
    TextLayout layout = measurer.nextLayout(width);
    float xPos = m_icon.getIconWidth();
    float yPos = layout.getAscent() + 2;
    //
    layout.draw(g2D, xPos, yPos);
    //	2 pt 
    width = s_size.width - 4;
    while (measurer.getPosition() < iter.getEndIndex()) {
        layout = measurer.nextLayout(width);
        yPos += layout.getAscent() + layout.getDescent() + layout.getLeading();
        layout.draw(g2D, 2, yPos);
    }
}
Also used : AttributedString(java.text.AttributedString) Color(java.awt.Color) Rectangle(java.awt.Rectangle) LineBreakMeasurer(java.awt.font.LineBreakMeasurer) Font(java.awt.Font) Graphics2D(java.awt.Graphics2D) AttributedCharacterIterator(java.text.AttributedCharacterIterator) TextLayout(java.awt.font.TextLayout)

Example 14 with LineBreakMeasurer

use of java.awt.font.LineBreakMeasurer in project adempiere by adempiere.

the class TableElement method printColumn.

//	paint
/**
	 * 	Print non zero width Column
	 * 	@param g2D graphics
	 * 	@param col column index
	 * 	@param origX start X
	 * 	@param origY start Y
	 *  @param leftVline if true print left vertical line (for first column)
	 * 	@param firstRow first row index
	 * 	@param nextPageRow row index of next page
	 *  @param isView true if online view (IDs are links)
	 */
private void printColumn(Graphics2D g2D, int col, final int origX, final int origY, boolean leftVline, final int firstRow, final int nextPageRow, boolean isView) {
    int curX = origX;
    //	start from top
    int curY = origY;
    //
    //	includes 2*Gaps+Line
    float colWidth = ((Float) m_columnWidths.get(col)).floatValue();
    float netWidth = colWidth - (2 * H_GAP) - m_tFormat.getVLineStroke().floatValue();
    if (leftVline)
        netWidth -= m_tFormat.getVLineStroke().floatValue();
    int rowHeight = m_headerHeight;
    float netHeight = rowHeight - (4 * m_tFormat.getLineStroke().floatValue()) + (2 * V_GAP);
    if (DEBUG_PRINT)
        log.finer("#" + col + " - x=" + curX + ", y=" + curY + ", width=" + colWidth + "/" + netWidth + ", HeaderHeight=" + rowHeight + "/" + netHeight);
    String alignment = m_columnJustification[col];
    //	paint header	***************************************************
    if (//	draw left | line
    leftVline) {
        g2D.setPaint(m_tFormat.getVLine_Color());
        g2D.setStroke(m_tFormat.getVLine_Stroke());
        if (//	 -> | (left)
        m_tFormat.isPaintBoundaryLines())
            g2D.drawLine(origX, (int) (origY + m_tFormat.getLineStroke().floatValue()), origX, (int) (origY + rowHeight - (4 * m_tFormat.getLineStroke().floatValue())));
        curX += m_tFormat.getVLineStroke().floatValue();
    }
    //	X - start line
    if (m_tFormat.isPaintHeaderLines()) {
        g2D.setPaint(m_tFormat.getHeaderLine_Color());
        g2D.setStroke(m_tFormat.getHeader_Stroke());
        //	 -> - (top)
        g2D.drawLine(//	 -> - (top)
        origX, //	 -> - (top)
        origY, (int) (origX + colWidth - m_tFormat.getVLineStroke().floatValue()), origY);
    }
    //	thick
    curY += (2 * m_tFormat.getLineStroke().floatValue());
    //	Background
    Color bg = getBackground(HEADER_ROW, col);
    if (!bg.equals(Color.white)) {
        g2D.setPaint(bg);
        g2D.fillRect(curX, (int) (curY - m_tFormat.getLineStroke().floatValue()), (int) (colWidth - m_tFormat.getVLineStroke().floatValue()), (int) (rowHeight - (4 * m_tFormat.getLineStroke().floatValue())));
    }
    int tempCurY = curY;
    //	upper left gap
    curX += H_GAP;
    curY += V_GAP;
    //	Header
    AttributedString aString = null;
    AttributedCharacterIterator iter = null;
    LineBreakMeasurer measurer = null;
    float usedHeight = 0;
    // Calculate column header height - teo_sarca [ 1673429 ]  
    String headerString = m_columnHeader[col].toString();
    if (headerString.length() == 0)
        headerString = " ";
    //if (m_columnHeader[col].toString().length() > 0)
    {
        aString = new AttributedString(headerString);
        aString.addAttribute(TextAttribute.FONT, getFont(HEADER_ROW, col));
        aString.addAttribute(TextAttribute.FOREGROUND, getColor(HEADER_ROW, col));
        //
        boolean fastDraw = LayoutEngine.s_FASTDRAW;
        if (fastDraw && !isView && !Util.is8Bit(headerString))
            fastDraw = false;
        iter = aString.getIterator();
        measurer = new LineBreakMeasurer(iter, g2D.getFontRenderContext());
        while (//	print header
        measurer.getPosition() < iter.getEndIndex()) {
            TextLayout layout = measurer.nextLayout(netWidth + 2);
            if (iter.getEndIndex() != measurer.getPosition())
                fastDraw = false;
            float lineHeight = layout.getAscent() + layout.getDescent() + layout.getLeading();
            if (alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_Block)) {
                layout = layout.getJustifiedLayout(netWidth + 2);
                fastDraw = false;
            }
            curY += layout.getAscent();
            float penX = curX;
            if (alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_Center))
                penX += (netWidth - layout.getAdvance()) / 2;
            else if ((alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_TrailingRight) && layout.isLeftToRight()) || (alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_LeadingLeft) && !layout.isLeftToRight()))
                penX += netWidth - layout.getAdvance();
            //
            if (fastDraw) {
                //	Bug - set Font/Color explicitly 
                g2D.setFont(getFont(HEADER_ROW, col));
                g2D.setColor(getColor(HEADER_ROW, col));
                g2D.drawString(iter, penX, curY);
            } else
                //	-> text
                layout.draw(g2D, penX, curY);
            curY += layout.getDescent() + layout.getLeading();
            usedHeight += layout.getAscent() + layout.getDescent();
            if (//	one line only
            !m_multiLineHeader)
                break;
        }
    }
    curX += netWidth + H_GAP;
    curY = tempCurY + (int) (rowHeight - (4 * m_tFormat.getLineStroke().floatValue()));
    //	Y end line
    g2D.setPaint(m_tFormat.getVLine_Color());
    g2D.setStroke(m_tFormat.getVLine_Stroke());
    if (//	 -> | (right)
    m_tFormat.isPaintVLines())
        g2D.drawLine(curX, (int) (origY + m_tFormat.getLineStroke().floatValue()), curX, (int) (origY + rowHeight - (4 * m_tFormat.getLineStroke().floatValue())));
    curX += m_tFormat.getVLineStroke().floatValue();
    //	X end line
    if (m_tFormat.isPaintHeaderLines()) {
        g2D.setPaint(m_tFormat.getHeaderLine_Color());
        g2D.setStroke(m_tFormat.getHeader_Stroke());
        //	 -> - (button)
        g2D.drawLine(//	 -> - (button)
        origX, //	 -> - (button)
        curY, (int) (origX + colWidth - m_tFormat.getVLineStroke().floatValue()), curY);
    }
    //	thick
    curY += (2 * m_tFormat.getLineStroke().floatValue());
    //	paint Data		***************************************************
    for (int row = firstRow; row < nextPageRow; row++) {
        //	includes 2*Gaps+Line
        rowHeight = ((Float) m_rowHeights.get(row)).intValue();
        netHeight = rowHeight - (2 * V_GAP) - m_tFormat.getLineStroke().floatValue();
        int rowYstart = curY;
        curX = origX;
        if (//	draw left | line
        leftVline) {
            g2D.setPaint(m_tFormat.getVLine_Color());
            g2D.setStroke(m_tFormat.getVLine_Stroke());
            if (m_tFormat.isPaintBoundaryLines())
                //	 -> | (left)
                g2D.drawLine(//	 -> | (left)
                curX, //	 -> | (left)
                rowYstart, curX, (int) (rowYstart + rowHeight - m_tFormat.getLineStroke().floatValue()));
            curX += m_tFormat.getVLineStroke().floatValue();
        }
        //	Background
        bg = getBackground(row, col);
        if (!bg.equals(Color.white)) {
            g2D.setPaint(bg);
            g2D.fillRect(curX, curY, (int) (colWidth - m_tFormat.getVLineStroke().floatValue()), (int) (rowHeight - m_tFormat.getLineStroke().floatValue()));
        }
        //	upper left gap
        curX += H_GAP;
        curY += V_GAP;
        //	actual data
        Object[] printItems = getPrintItems(row, col);
        float penY = curY;
        // suppress repeated values
        boolean suppress = false;
        if (m_colSuppressRepeats[col] && row > 0 && row != firstRow) {
            Object[] lastItems = {};
            lastItems = getPrintItems(row - 1, col);
            if (Arrays.equals(lastItems, printItems))
                suppress = true;
        }
        if (!suppress) {
            for (int index = 0; index < printItems.length; index++) {
                if (printItems[index] == null)
                    ;
                else if (printItems[index] instanceof ImageElement) {
                    Image imageToDraw = ((ImageElement) printItems[index]).getImage();
                    if (// teo_sarca [ 1674706 ] 
                    imageToDraw != null) {
                        // Draw image using the scale factor - teo_sarca, [ 1673548 ] Image is not scaled in a report table cell 
                        double scale = ((ImageElement) printItems[index]).getScaleFactor();
                        if (scale != 1.0) {
                            AffineTransform transform = new AffineTransform();
                            transform.translate(curX, penY);
                            transform.scale(scale, scale);
                            g2D.drawImage(imageToDraw, transform, this);
                        } else {
                            g2D.drawImage(imageToDraw, curX, (int) penY, this);
                        }
                    }
                } else if (printItems[index] instanceof BarcodeElement) {
                    try {
                        Barcode barcode = ((BarcodeElement) printItems[index]).getBarcode();
                        if (barcode != null) {
                            double scale = ((BarcodeElement) printItems[index]).getScaleFactor();
                            if (scale != 1.0) {
                                int w = barcode.getWidth();
                                int h = barcode.getHeight();
                                // draw barcode to buffer
                                BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
                                Graphics2D temp = (Graphics2D) image.getGraphics();
                                barcode.draw(temp, 0, 0);
                                // scale barcode and paint
                                AffineTransform transform = new AffineTransform();
                                transform.translate(curX, penY);
                                transform.scale(scale, scale);
                                g2D.drawImage(image, transform, this);
                            } else {
                                barcode.draw(g2D, curX, (int) penY);
                            }
                        }
                    } catch (OutputException e) {
                    }
                } else if (printItems[index] instanceof Boolean) {
                    //	center
                    int penX = curX + (int) ((netWidth - LayoutEngine.IMAGE_SIZE.width) / 2);
                    if (((Boolean) printItems[index]).booleanValue())
                        g2D.drawImage(LayoutEngine.IMAGE_TRUE, penX, (int) penY, this);
                    else
                        g2D.drawImage(LayoutEngine.IMAGE_FALSE, penX, (int) penY, this);
                    penY += LayoutEngine.IMAGE_SIZE.height;
                } else if (printItems[index] instanceof HTMLRenderer) {
                    HTMLRenderer renderer = (HTMLRenderer) printItems[index];
                    Rectangle allocation = new Rectangle((int) colWidth, (int) netHeight);
                    //	log.finest( "printColumn HTML - " + allocation);
                    g2D.translate(curX, penY);
                    renderer.paint(g2D, allocation);
                    g2D.translate(-curX, -penY);
                    penY += allocation.getHeight();
                } else {
                    String str = printItems[index].toString();
                    if (DEBUG_PRINT)
                        log.fine("row=" + row + ",col=" + col + " - " + str + " 8Bit=" + Util.is8Bit(str));
                    if (str.length() > 0) {
                        usedHeight = 0;
                        String[] lines = Pattern.compile("$", Pattern.MULTILINE).split(str);
                        for (int lineNo = 0; lineNo < lines.length; lineNo++) {
                            aString = new AttributedString(lines[lineNo]);
                            aString.addAttribute(TextAttribute.FONT, getFont(row, col));
                            if (//	ID
                            isView && printItems[index] instanceof NamePair) {
                                aString.addAttribute(TextAttribute.FOREGROUND, LINK_COLOR);
                                aString.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_LOW_ONE_PIXEL, 0, str.length());
                            } else
                                aString.addAttribute(TextAttribute.FOREGROUND, getColor(row, col));
                            //
                            iter = aString.getIterator();
                            boolean fastDraw = LayoutEngine.s_FASTDRAW;
                            if (fastDraw && !isView && !Util.is8Bit(lines[lineNo]))
                                fastDraw = false;
                            measurer = new LineBreakMeasurer(iter, g2D.getFontRenderContext());
                            while (//	print element
                            measurer.getPosition() < iter.getEndIndex()) {
                                TextLayout layout = measurer.nextLayout(netWidth + 2);
                                if (iter.getEndIndex() != measurer.getPosition())
                                    fastDraw = false;
                                float lineHeight = layout.getAscent() + layout.getDescent() + layout.getLeading();
                                if ((m_columnMaxHeight[col] <= 0 || (usedHeight + lineHeight) <= m_columnMaxHeight[col]) && (usedHeight + lineHeight) <= netHeight) {
                                    if (alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_Block) && measurer.getPosition() < iter.getEndIndex()) {
                                        layout = layout.getJustifiedLayout(netWidth + 2);
                                        fastDraw = false;
                                    }
                                    penY += layout.getAscent();
                                    float penX = curX;
                                    if (alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_Center))
                                        penX += (netWidth - layout.getAdvance()) / 2;
                                    else if ((alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_TrailingRight) && layout.isLeftToRight()) || (alignment.equals(MPrintFormatItem.FIELDALIGNMENTTYPE_LeadingLeft) && !layout.isLeftToRight()))
                                        penX += netWidth - layout.getAdvance();
                                    //
                                    if (fastDraw) {
                                        //	Bug - set Font/Color explicitly
                                        g2D.setFont(getFont(row, col));
                                        if (//	ID
                                        isView && printItems[index] instanceof NamePair) {
                                            g2D.setColor(LINK_COLOR);
                                        //	TextAttribute.UNDERLINE
                                        } else
                                            g2D.setColor(getColor(row, col));
                                        g2D.drawString(iter, penX, penY);
                                    } else
                                        //	-> text
                                        layout.draw(g2D, penX, penY);
                                    if (DEBUG_PRINT)
                                        log.fine("row=" + row + ",col=" + col + " - " + str + " - x=" + penX + ",y=" + penY);
                                    penY += layout.getDescent() + layout.getLeading();
                                    usedHeight += lineHeight;
                                    //
                                    if (//	FirstLineOny
                                    m_columnMaxHeight[col] == -1)
                                        break;
                                }
                            }
                        //	print element
                        }
                    //	for all lines
                    }
                //	length > 0
                }
            //	non boolean
            }
        //	for all print items
        }
        // not suppressed
        curY += netHeight + V_GAP;
        curX += netWidth + H_GAP;
        //	Y end line
        g2D.setPaint(m_tFormat.getVLine_Color());
        g2D.setStroke(m_tFormat.getVLine_Stroke());
        if (m_tFormat.isPaintVLines())
            //	 -> | (right)
            g2D.drawLine(//	 -> | (right)
            curX, //	 -> | (right)
            rowYstart, curX, (int) (rowYstart + rowHeight - m_tFormat.getLineStroke().floatValue()));
        curX += m_tFormat.getVLineStroke().floatValue();
        //  X end line
        if (//  last Line
        row == m_data.length - 1) {
            /**
                 * Bug fix - Bottom line was always displayed whether or not header lines was set to be visible
                 * @author ashley
                 */
            if (m_tFormat.isPaintHeaderLines()) {
                g2D.setPaint(m_tFormat.getHeaderLine_Color());
                g2D.setStroke(m_tFormat.getHeader_Stroke());
                //   -> - (last line) 
                g2D.drawLine(//   -> - (last line) 
                origX, //   -> - (last line) 
                curY, (int) (origX + colWidth - m_tFormat.getVLineStroke().floatValue()), curY);
                //  thick
                curY += (2 * m_tFormat.getLineStroke().floatValue());
            } else {
                curY += m_tFormat.getLineStroke().floatValue();
            }
        } else {
            //  next line is a funcion column -> underline this
            boolean nextIsFunction = m_functionRows.contains(new Integer(row + 1));
            if (nextIsFunction && m_functionRows.contains(new Integer(row)))
                //  this is a function line too
                nextIsFunction = false;
            if (nextIsFunction) {
                g2D.setPaint(m_tFormat.getFunctFG_Color());
                g2D.setStroke(m_tFormat.getHLine_Stroke());
                //   -> - (bottom)
                g2D.drawLine(//   -> - (bottom)
                origX, //   -> - (bottom)
                curY, (int) (origX + colWidth - m_tFormat.getVLineStroke().floatValue()), curY);
            } else if (m_tFormat.isPaintHLines()) {
                g2D.setPaint(m_tFormat.getHLine_Color());
                g2D.setStroke(m_tFormat.getHLine_Stroke());
                //   -> - (bottom)
                g2D.drawLine(//   -> - (bottom)
                origX, //   -> - (bottom)
                curY, (int) (origX + colWidth - m_tFormat.getVLineStroke().floatValue()), curY);
            }
            curY += m_tFormat.getLineStroke().floatValue();
        }
    }
// for all rows
}
Also used : LineBreakMeasurer(java.awt.font.LineBreakMeasurer) Rectangle(java.awt.Rectangle) AttributedString(java.text.AttributedString) Image(java.awt.Image) BufferedImage(java.awt.image.BufferedImage) BufferedImage(java.awt.image.BufferedImage) AttributedString(java.text.AttributedString) OutputException(net.sourceforge.barbecue.output.OutputException) Color(java.awt.Color) NamePair(org.compiere.util.NamePair) ValueNamePair(org.compiere.util.ValueNamePair) KeyNamePair(org.compiere.util.KeyNamePair) Point(java.awt.Point) AttributedCharacterIterator(java.text.AttributedCharacterIterator) TextLayout(java.awt.font.TextLayout) Graphics2D(java.awt.Graphics2D) Barcode(net.sourceforge.barbecue.Barcode) AffineTransform(java.awt.geom.AffineTransform)

Example 15 with LineBreakMeasurer

use of java.awt.font.LineBreakMeasurer in project adempiere by adempiere.

the class StringElement method calculateSize.

//	translate
/**************************************************************************
	 * 	Layout and Calculate Size.
	 * 	Set p_width & p_height
	 * 	@return Size
	 */
protected boolean calculateSize() {
    if (p_sizeCalculated)
        return true;
    //
    FontRenderContext frc = new FontRenderContext(null, true, true);
    TextLayout layout = null;
    p_height = 0f;
    p_width = 0f;
    //	No Limit
    if (p_maxWidth == 0f && p_maxHeight == 0f) {
        for (int i = 0; i < m_string_paper.length; i++) {
            AttributedCharacterIterator iter = m_string_paper[i].getIterator();
            if (iter.getBeginIndex() == iter.getEndIndex())
                continue;
            //	Check for Tab (just first)
            int tabPos = -1;
            for (char c = iter.first(); c != CharacterIterator.DONE && tabPos == -1; c = iter.next()) {
                if (c == '\t')
                    tabPos = iter.getIndex();
            }
            if (tabPos == -1) {
                layout = new TextLayout(iter, frc);
                p_height += layout.getAscent() + layout.getDescent() + layout.getLeading();
                if (p_width < layout.getAdvance())
                    p_width = layout.getAdvance();
            } else //	with tab
            {
                LineBreakMeasurer measurer = new LineBreakMeasurer(iter, frc);
                layout = measurer.nextLayout(9999, tabPos, false);
                p_height += layout.getAscent() + layout.getDescent() + layout.getLeading();
                float width = getTabPos(0, layout.getAdvance());
                layout = measurer.nextLayout(9999, iter.getEndIndex(), true);
                width += layout.getAdvance();
                if (p_width < width)
                    p_width = width;
            }
        }
        //	Add CheckBox Size
        if (m_check != null) {
            p_width += LayoutEngine.IMAGE_SIZE.width;
            if (p_height < LayoutEngine.IMAGE_SIZE.height)
                p_height = LayoutEngine.IMAGE_SIZE.height;
        }
    } else //	Size Limits
    {
        p_width = p_maxWidth;
        for (int i = 0; i < m_string_paper.length; i++) {
            AttributedCharacterIterator iter = m_string_paper[i].getIterator();
            if (iter.getBeginIndex() == iter.getEndIndex())
                continue;
            LineBreakMeasurer measurer = new LineBreakMeasurer(iter, frc);
            //	System.out.println("StringLength=" + m_originalString.length() + " MaxWidth=" + p_maxWidth + " MaxHeight=" + p_maxHeight);
            while (measurer.getPosition() < iter.getEndIndex()) {
                //	no need to expand tab space for limited space
                layout = measurer.nextLayout(p_maxWidth);
                float lineHeight = layout.getAscent() + layout.getDescent() + layout.getLeading();
                //	System.out.println("  LineWidth=" + layout.getAdvance() + "  LineHeight=" + lineHeight);
                if (//	one line only
                p_maxHeight == -1f && i == 0)
                    p_maxHeight = lineHeight;
                if (p_maxHeight == 0f || (p_height + lineHeight) <= p_maxHeight)
                    p_height += lineHeight;
            }
        }
        //	Add CheckBox Size
        if (m_check != null) {
            //	p_width += LayoutEngine.IMAGE_SIZE.width;
            if (p_height < LayoutEngine.IMAGE_SIZE.height)
                p_height = LayoutEngine.IMAGE_SIZE.height;
        }
    //	System.out.println("  Width=" + p_width + "  Height=" + p_height);
    }
    //	Enlarge Size when aligned and max size is given
    if (p_FieldAlignmentType != null) {
        boolean changed = false;
        if (p_height < p_maxHeight) {
            p_height = p_maxHeight;
            changed = true;
        }
        if (p_width < p_maxWidth) {
            p_width = p_maxWidth;
            changed = true;
        }
    //	if (changed)
    //		System.out.println("StringElement.calculate size - Width="
    //			+ p_width + "(" + p_maxWidth + ") - Height=" + p_height + "(" + p_maxHeight + ")");
    }
    return true;
}
Also used : LineBreakMeasurer(java.awt.font.LineBreakMeasurer) FontRenderContext(java.awt.font.FontRenderContext) Point(java.awt.Point) Paint(java.awt.Paint) TextLayout(java.awt.font.TextLayout) AttributedCharacterIterator(java.text.AttributedCharacterIterator)

Aggregations

LineBreakMeasurer (java.awt.font.LineBreakMeasurer)17 TextLayout (java.awt.font.TextLayout)16 AttributedString (java.text.AttributedString)16 AttributedCharacterIterator (java.text.AttributedCharacterIterator)15 FontRenderContext (java.awt.font.FontRenderContext)7 Font (java.awt.Font)6 Point (java.awt.Point)6 Graphics2D (java.awt.Graphics2D)5 Paint (java.awt.Paint)5 Color (java.awt.Color)3 Rectangle (java.awt.Rectangle)3 ArrayList (java.util.ArrayList)3 Dimension (java.awt.Dimension)2 Insets (java.awt.Insets)2 KeyNamePair (org.compiere.util.KeyNamePair)2 NamePair (org.compiere.util.NamePair)2 ValueNamePair (org.compiere.util.ValueNamePair)2 BooleanAttribute (doc.attributes.BooleanAttribute)1 MathObjectAttribute (doc.attributes.MathObjectAttribute)1 Image (java.awt.Image)1