textreportelement.java
来自「优秀的打印控件全源代码,类似水晶表的设计器!」· Java 代码 · 共 877 行 · 第 1/2 页
JAVA
877 行
/* * RectangleReportElement.java * * iReport -- Visual designer for generating JasperReports Documents * Copyright (C) 2002 Giulio Toffoli gt@businesslogic.it * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Giulio Toffoli * Via T.Aspetti, 233 * 35100 Padova ITALY * gt@businesslogic.it * * Created on 28 febbraio 2003, 19.20 */package it.businesslogic.ireport;import it.businesslogic.ireport.gui.*;import it.businesslogic.ireport.util.*;import java.awt.*;import java.awt.image.*;import java.awt.geom.*;import java.awt.font.*;import java.util.*;import java.util.List;import java.text.AttributedCharacterIterator;import java.text.AttributedString;public abstract class TextReportElement extends ReportElement{ static public Rotation ROTATION_NONE; static public Rotation ROTATION_LEFT; static public Rotation ROTATION_RIGHT; static { ROTATION_NONE = new Rotation("None", 0); ROTATION_LEFT = new Rotation("Left", 1); ROTATION_RIGHT = new Rotation("Right", 2); } private String text=""; private String reportFont=""; private String fontName=""; private String PDFFontName=""; private int fontSize=10; private String TTFFont=""; private boolean bold=false; private boolean underline=false; private boolean italic=false; private boolean strikeTrought=false; private String lineSpacing=""; private String align=""; private String verticalAlign=""; private boolean pdfEmbedded=false; private String pdfEncoding=""; private java.awt.Font font=null; private String rotate = "None"; private boolean isStyledText = false; public TextReportElement(int x, int y, int width, int height) { super(x,y,width,height); //see dori.jasper.engine.base.JRBaseFont //setGraphicElementPen("Thin"); this.bgcolor = Color.WHITE; this.fgcolor = Color.BLACK; this.text = "Static text\nsecond line"; this.verticalAlign = "Top"; this.align = "Left"; this.lineSpacing = "Single"; //set font setIReportFont(new IReportFont()); } public void setIReportFont(IReportFont ireportFont){ if(ireportFont == null){ ireportFont = new IReportFont(); } this.fontSize = ireportFont.getFontSize(); this.fontName = ireportFont.getFontName();//"SansSerif"; this.PDFFontName = ireportFont.getPDFFontName();//"Helvetica"; this.pdfEncoding = ireportFont.getPdfEncoding();//"CP1252"; this.pdfEmbedded = ireportFont.isPdfEmbedded();//false; this.font = ireportFont.getJavaAWTFont(); } /** Return a instance of IReportFont. */ public IReportFont getIReportFont(){ IReportFont ireportFont = new IReportFont(); ireportFont.setFontSize(this.fontSize); ireportFont.setFontName(this.fontName); ireportFont.setPDFFontName(this.PDFFontName); ireportFont.setPdfEncoding(this.pdfEncoding); ireportFont.setPdfEmbedded(this.pdfEmbedded); ireportFont.setBold(bold); ireportFont.setItalic(italic); if(font != null){ Map fontAttributes = font.getAttributes(); ireportFont.setUnderline( (fontAttributes.containsKey(TextAttribute.UNDERLINE) && fontAttributes.get(TextAttribute.UNDERLINE).equals(TextAttribute.UNDERLINE_ON)) ); ireportFont.setStrikeTrought( (fontAttributes.containsKey(TextAttribute.STRIKETHROUGH) && fontAttributes.get(TextAttribute.STRIKETHROUGH).equals(TextAttribute.STRIKETHROUGH_ON)) ); } return ireportFont; } public void drawObject(Graphics2D g,double zoom_factor, int x_shift_origin, int y_shift_origin) { //System.out.println(new java.util.Date() + " Print text " + this.getText() + " " + x_shift_origin +" " +y_shift_origin); ArrayList textLayouts; float x, y; TextReportElementLayout textReportElementLayout; AffineTransform transform; position.x -= 10; position.y -= 10; x_shift_origin -= 10; y_shift_origin -= 10; this.zoom_factor = zoom_factor; g.setColor( bgcolor ); if (!getTransparent().equalsIgnoreCase("Transparent")) { g.fillRect(getZoomedDim(position.x)-x_shift_origin, getZoomedDim(position.y)-y_shift_origin, getZoomedDim(width), getZoomedDim(height)); } g.setColor( this.fgcolor ); // Set font to default font.... //Font oldFont = g.getFont(); if (font == null) { int style = 0; if (isBold()) style |= Font.BOLD; if (isItalic()) style |= Font.ITALIC; if (style == 0) style = Font.PLAIN; font = new Font( this.getFontName(), style , getZoomedDim( this.getFontSize() )); } // Code for rotation by gt (taked by jasperreports... int gfx_x = getZoomedDim(position.x)-x_shift_origin; int gfx_y = getZoomedDim(position.y)-y_shift_origin; int gfx_width = getZoomedDim(width); int gfx_height = getZoomedDim(height); Java2DUtil.setClip(g, // 0,0, 3000,3000); gfx_x, gfx_y, gfx_width, gfx_height); double angle = 0; double angle_restore = 0; // Apply the transformation "rotation" // - Do nothing when rotate = "none" transform = null; if(rotate.equals(ROTATION_LEFT.getName())) { transform = new AffineTransform(); transform.rotate(-Math.PI / 2, gfx_x, gfx_y); transform.translate(-gfx_height, -gfx_height); gfx_y = getZoomedDim(position.y)-y_shift_origin + getZoomedDim(height); gfx_width = getZoomedDim(height); gfx_height = getZoomedDim(width); Java2DUtil.setTransform(g, transform); } else if(rotate.equals(ROTATION_RIGHT.getName())) { transform = new AffineTransform(); transform.rotate(Math.PI / 2, gfx_x, gfx_y); transform.translate(0, -gfx_width); gfx_x = getZoomedDim(position.x)-x_shift_origin + getZoomedDim(width); gfx_width = getZoomedDim(height); gfx_height = getZoomedDim(width); Java2DUtil.setTransform(g, transform); } // End code for rotation by gt // We must center the text.. /* Rectangle orgClipBounds = g.getClipBounds(); g.setClip(getZoomedDim(position.x)-x_shift_origin, getZoomedDim(position.y)-y_shift_origin, getZoomedDim(width), getZoomedDim(height)); */ if (this.getText() != null && this.getText().length() > 0) { int zoomedFieldHeight = gfx_height; String allText = Misc.treatNewLineChars(this.getText()); float formatWidth = (float)gfx_width; float verticalOffset = 0f; FontRenderContext fontRenderContext = g.getFontRenderContext(); java.util.Map fontAttributes = font.getAttributes(); fontAttributes.put(TextAttribute.SIZE, new Float(getZoomedDim( this.getFontSize() )) ); fontAttributes.put(TextAttribute.FAMILY, this.getFontName() ); if (this.isBold()) { fontAttributes.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD); } if (this.isItalic()) { fontAttributes.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); } if (this.isUnderline()) { fontAttributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); } if (this.isStrikeTrought()) { fontAttributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); } float lineSpacing = 1f; if (this.getLineSpacing().equals("Single")) lineSpacing = 1f; else if (this.getLineSpacing().equals("1_1_2")) lineSpacing = 1.5f; else if (this.getLineSpacing().equals("Double")) lineSpacing = 2f; AttributedString atext; AttributedCharacterIterator paragraph; int paragraphStart; int paragraphEnd; LineBreakMeasurer lineMeasurer; TextLayout layout = null; String paragr_text = ""; boolean isMaxHeightReached = false; StringTokenizer tkzer = new StringTokenizer(allText, "\n"); float drawPosY = 0; float drawPosX = 0; paragr_text = ""; isMaxHeightReached = false; tkzer = new StringTokenizer(allText, "\n"); textLayouts = new ArrayList(); // Calculate the layouts. (But don't draw yet because we don't know yet // the offset which is needed if we align the text "middle" or "bottom") while(tkzer.hasMoreTokens() && !isMaxHeightReached) { paragr_text = tkzer.nextToken(); atext = new AttributedString(paragr_text, fontAttributes); paragraph = atext.getIterator(); paragraphStart = paragraph.getBeginIndex(); paragraphEnd = paragraph.getEndIndex(); lineMeasurer = new LineBreakMeasurer(paragraph, fontRenderContext); lineMeasurer.setPosition(paragraphStart); layout = null; while (lineMeasurer.getPosition() < paragraphEnd && !isMaxHeightReached) { layout = lineMeasurer.nextLayout(formatWidth); drawPosY += layout.getLeading() + lineSpacing * layout.getAscent(); if (drawPosY + layout.getDescent() <= zoomedFieldHeight+1) { if (this.getAlign().equals("Justify")) { if (layout.isLeftToRight()) { drawPosX = 0; } else { drawPosX = formatWidth - layout.getAdvance(); } if (lineMeasurer.getPosition() < paragraphEnd) { layout = layout.getJustifiedLayout(formatWidth); } } else if (this.getAlign().equals("Right")) { if (layout.isLeftToRight()) { drawPosX = formatWidth - layout.getAdvance(); } else { drawPosX = formatWidth; } } else if (this.getAlign().equals("Center")) { drawPosX = (formatWidth - layout.getAdvance()) / 2; } else //if (this.getAlign().equals("Left")) { if (layout.isLeftToRight()) { drawPosX = 0; } else { drawPosX = formatWidth - layout.getAdvance(); } } x = drawPosX + getZoomedDim(position.x)-x_shift_origin; y = drawPosY + gfx_y; //getZoomedDim(position.y)-y_shift_origin; textReportElementLayout = new TextReportElementLayout(layout, x, y); textLayouts.add(textReportElementLayout); drawPosY += layout.getDescent(); } else { drawPosY -= layout.getLeading() + lineSpacing * layout.getAscent(); isMaxHeightReached = true; } } } // Calculate the offset when aligning the text. float textHeight = drawPosY; if (this.getVerticalAlign().equals("Top")) { verticalOffset = 0f; } else if (this.getVerticalAlign().equals("Middle")) { verticalOffset = ((float)zoomedFieldHeight- textHeight) / 2f; } else if (this.getVerticalAlign().equals("Bottom")) { verticalOffset = (float)zoomedFieldHeight - (float)textHeight; } /* */ // Now draw the text according to the calculated layouts. for(Iterator i=textLayouts.iterator(); i.hasNext();) { textReportElementLayout = (TextReportElementLayout) i.next(); textReportElementLayout.drawWithOffset(g, verticalOffset); } if(transform != null) { // Undo the transformation "rotation" Java2DUtil.resetTransform(g); } /* int txt_width = g.getFontMetrics().stringWidth( this.getText() )/2; int txt_height = g.getFontMetrics().getHeight(); StringTokenizer st = new StringTokenizer(getText(),"\n"); while( st.hasMoreElements()) { String line = st.nextToken(); float formatWidth = (float) this.getWidth(); g.drawString(line, (float)(getZoomedDim(position.x)-x_shift_origin), getZoomedDim(position.y)-y_shift_origin + verticalOffset); //, zoomed_width, getZoomedDim(band.getHeight() verticalOffset += g.getFontMetrics().getHeight(); } */ //g.drawLine(0, getZoomedDim(y)+10-vertical_scroll - txt_height - getZoomedDim(band.getHeight()/2), 700,getZoomedDim(y)+10-vertical_scroll - txt_height - getZoomedDim(band.getHeight()/2)); //g.drawLine(0, getZoomedDim(y)+10-vertical_scroll + txt_height - getZoomedDim(band.getHeight()/2), 700,getZoomedDim(y)+10-vertical_scroll + txt_height - getZoomedDim(band.getHeight()/2));
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?