|
What this is
Other links
The source code/* * 09/27/2001 - 16:37:37 * * PrintSyntax.java - Prints colors and styles * Copyright (C) 2001 Slava Pestov * * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.jext.print; import java.util.*; import java.awt.*; import java.awt.print.*; import javax.swing.text.*; import org.jext.*; import org.gjt.sp.jedit.syntax.*; public class PrintSyntax { private Segment seg = new Segment(); public void print(JextFrame parent, JextTextArea textArea) { PrintJob job = parent.getToolkit().getPrintJob(parent, "Jext:" + textArea.getName(), null); if (job == null) return; int topMargin; int leftMargin; int bottomMargin; int rightMargin; int ppi = job.getPageResolution(); topMargin = (int) (0.5 * ppi); leftMargin = (int) (0.5 * ppi); bottomMargin = (int) (0.5 * ppi); rightMargin = (int) (0.5 * ppi); boolean printHeader = Jext.getBooleanProperty("print.header"); boolean printFooter = Jext.getBooleanProperty("print.footer"); boolean printLineNumbers = Jext.getBooleanProperty("print.lineNumbers"); String header = textArea.getName(); String footer = new java.util.Date().toString(); int lineCount = textArea.getDocument().getDefaultRootElement().getElementCount(); TabExpander expander = null; Graphics gfx = null; String fontFamily = Jext.getProperty("print.font"); int fontSize; try { fontSize = Integer.parseInt(Jext.getProperty("print.fontSize")); } catch (NumberFormatException nf) { fontSize = 10; } int fontStyle = Font.PLAIN; SyntaxStyle[] styles = textArea.getPainter().getStyles();//GUIUtilities.loadStyles(fontFamily, fontSize); Font font = new Font(fontFamily, fontStyle, fontSize); FontMetrics fm = null; Dimension pageDimension = job.getPageDimension(); int pageWidth = pageDimension.width; int pageHeight = pageDimension.height; int y = 0; int tabSize = 0; int lineHeight = 0; int page = 0; int lineNumberDigits = (int) Math.ceil(Math.log(lineCount) / Math.log(10)); int lineNumberWidth = 0; for (int i = 0; i < lineCount; i++) { if (gfx == null) { page++; gfx = job.getGraphics(); gfx.setFont(font); fm = gfx.getFontMetrics(); if (printLineNumbers) lineNumberWidth = fm.charWidth('0') * lineNumberDigits; else lineNumberWidth = 0; lineHeight = fm.getHeight(); tabSize = textArea.getTabSize() * fm.charWidth(' '); expander = new PrintTabExpander(leftMargin + lineNumberWidth, tabSize); y = topMargin + lineHeight - fm.getDescent() - fm.getLeading(); if (printHeader) { gfx.setColor(Color.lightGray); gfx.fillRect(leftMargin, topMargin, pageWidth - leftMargin - rightMargin, lineHeight); gfx.setColor(Color.black); gfx.drawString(header, leftMargin, y); y += lineHeight; } } y += lineHeight; gfx.setColor(Color.black); gfx.setFont(font); int x = leftMargin; if (printLineNumbers) { String lineNumber = String.valueOf(i + 1); gfx.drawString(lineNumber, (leftMargin + lineNumberWidth) - fm.stringWidth(lineNumber), y); x += lineNumberWidth + fm.charWidth('0'); } paintSyntaxLine(textArea, gfx, expander, textArea.getTokenMarker(), styles, fm, i, font, Color.black, x, y); int bottomOfPage = pageHeight - bottomMargin - lineHeight; if (printFooter) bottomOfPage -= lineHeight * 2; if (y >= bottomOfPage || i == lineCount - 1) { if (printFooter) { y = pageHeight - bottomMargin; gfx.setColor(Color.lightGray); gfx.setFont(font); gfx.fillRect(leftMargin, y - lineHeight, pageWidth - leftMargin - rightMargin, lineHeight); gfx.setColor(Color.black); y -= (lineHeight - fm.getAscent()); gfx.drawString(footer, leftMargin, y); String pageStr = Jext.getProperty("print.page.footer", new Integer[] { new Integer(page) }); int width = fm.stringWidth(pageStr); gfx.drawString(pageStr, pageWidth - rightMargin - width, y); } gfx.dispose(); gfx = null; } } job.end(); } protected int paintSyntaxLine(JextTextArea textArea, Graphics gfx, TabExpander expander, TokenMarker tokenMarker, SyntaxStyle[] styles, FontMetrics fm, int line, Font defaultFont, Color defaultColor, int x, int y) { gfx.setFont(defaultFont); gfx.setColor(defaultColor); //y += fm.getHeight(); textArea.getLineText(line, seg); x = SyntaxUtilities.paintSyntaxLine(seg, tokenMarker.markTokens(seg, line), styles, expander, gfx, x, y); return x; } static class PrintTabExpander implements TabExpander { private int leftMargin; private int tabSize; public PrintTabExpander(int leftMargin, int tabSize) { this.leftMargin = leftMargin; this.tabSize = tabSize; } public float nextTabStop(float x, int tabOffset) { int ntabs = ((int) x - leftMargin) / tabSize; return (ntabs + 1) * tabSize + leftMargin; } } } // End of PrintSyntax.java |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.