blob: fdde801f2e31f9f584cc5d3ffe5db0b55d0d1954 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.print.ui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JComponent;
import org.netbeans.spi.print.PrintPage;
import org.netbeans.modules.print.util.Macro;
import org.netbeans.modules.print.util.Config;
import static org.netbeans.modules.print.util.UI.*;
/**
* @author Vladimir Yaroslavskiy
* @version 2005.12.14
*/
final class Paper extends JComponent {
Paper(PrintPage page, String name, Date lastModified) {
myPage = page;
myName = name;
myLastModified = lastModified;
myPaperWidth = Config.getDefault().getPaperWidth();
myPaperHeight = Config.getDefault().getPaperHeight();
myPageX = Config.getDefault().getPageX();
myPageY = Config.getDefault().getPageY();
myPageWidth = Config.getDefault().getPageWidth();
myPageHeight = Config.getDefault().getPageHeight();
myHasBorder = Config.getDefault().hasBorder();
myBorderColor = Config.getDefault().getBorderColor();
myIsPainting = true;
}
void setCoordinate(int number, int row, int column, double scale) {
myNumber = number;
myRow = row;
myColumn = column;
myRowNumber = String.valueOf(row + 1);
myColumnNumber = String.valueOf(column + 1);
setScale(scale);
}
void setCount(int count) {
myCount = String.valueOf(count);
myHeaderY = Config.getDefault().getHeaderY();
myHasHeader = Config.getDefault().hasHeader();
myHeaderLeft = expandTitle(Config.getDefault().getHeaderLeft());
myHeaderCenter = expandTitle(Config.getDefault().getHeaderCenter());
myHeaderRight = expandTitle(Config.getDefault().getHeaderRight());
myHeaderColor = Config.getDefault().getHeaderColor();
myHeaderFont = Config.getDefault().getHeaderFont();
myFooterY = Config.getDefault().getFooterY();
myHasFooter = Config.getDefault().hasFooter();
myFooterLeft = expandTitle(Config.getDefault().getFooterLeft());
myFooterCenter = expandTitle(Config.getDefault().getFooterCenter());
myFooterRight = expandTitle(Config.getDefault().getFooterRight());
myFooterColor = Config.getDefault().getFooterColor();
myFooterFont = Config.getDefault().getFooterFont();
}
int getRow() {
return myRow;
}
int getColumn() {
return myColumn;
}
void setScale(double scale) {
myScale = scale;
if (myIsPainting) {
setPreferredSize(new Dimension((int) Math.floor((myPaperWidth + SHADOW_WIDTH) * myScale), (int) Math.floor((myPaperHeight + SHADOW_WIDTH) * myScale)));
}
else {
setPreferredSize(new Dimension(myPaperWidth, myPaperHeight));
}
}
int getPaperWidth() {
return myPaperWidth + SHADOW_WIDTH;
}
int getPaperHeight() {
return myPaperHeight + SHADOW_WIDTH;
}
@Override
public void print(Graphics g) {
myIsPainting = false;
setScale(1.0);
super.print(g);
myIsPainting = true;
}
@Override
public void paint(Graphics graphics) {
Graphics2D g = Config.getDefault().getGraphics(graphics);
// scaling
if (myIsPainting) {
g.scale(myScale, myScale);
}
// background
g.setColor(Color.white);
g.fillRect(myPageX, myPageY, myPageWidth, myPageHeight);
// page
g.translate(myPageX, myPageY);
myPage.print(g);
g.translate(-myPageX, -myPageY);
// horizontal margin
g.setColor(Color.white);
g.fillRect(0, 0, myPaperWidth, myPageY);
g.fillRect(0, myPageY + myPageHeight, myPaperWidth, myPaperHeight);
// header
if (myHasHeader) {
drawTitle(g, myHeaderLeft, myHeaderCenter, myHeaderRight, myHeaderY, myHeaderColor, myHeaderFont);
}
// footer
if (myHasFooter) {
drawTitle(g, myFooterLeft, myFooterCenter, myFooterRight, myFooterY, myFooterColor, myFooterFont);
}
// vertical margin
g.setColor(Color.white);
g.fillRect(0, 0, myPageX, myPaperHeight);
g.fillRect(myPageX + myPageWidth, 0, myPaperWidth, myPaperHeight);
// shadow
if (myIsPainting) {
g.setColor(Color.gray.darker());
g.fillRect(myPaperWidth, SHADOW_WIDTH, SHADOW_WIDTH + 1, myPaperHeight);
g.fillRect(SHADOW_WIDTH, myPaperHeight, myPaperWidth, SHADOW_WIDTH + 1);
g.setColor(Color.lightGray);
g.fillRect(myPaperWidth, 0, SHADOW_WIDTH + 1, SHADOW_WIDTH + 1);
g.fillRect(0, myPaperHeight, SHADOW_WIDTH + 1, SHADOW_WIDTH + 1);
}
// box
if (myIsPainting) {
g.setColor(Color.black);
g.drawRect(0, 0, myPaperWidth, myPaperHeight);
}
// border
if (myHasBorder) {
g.setColor(myBorderColor);
g.drawRect(myPageX, myPageY, myPageWidth, myPageHeight);
}
// number
if (myIsPainting) {
g.setColor(NUMBER_FONT_COLOR);
g.setFont(NUMBER_FONT_NAME);
g.drawString(Integer.toString(myNumber), NUMBER_X, NUMBER_Y);
}
}
private void drawTitle(Graphics2D g, String left, String center, String right, int y, Color color, Font f) {
g.setColor(color);
drawTitle(g, left, myPageX, y, f);
drawTitle(g, center, myPageX + (myPageWidth - getWidth(center, f)) / 2, y, f);
drawTitle(g, right, myPageX + myPageWidth - getWidth(right, f), y, f);
}
private void drawTitle(Graphics2D g, String text, int x, int y, Font font) {
g.setFont(font);
g.drawString(text, x, y);
}
private String expandTitle(String t) {
Date printed = new Date(System.currentTimeMillis());
t = replace(t, Macro.NAME.getName(), myName);
t = replace(t, Macro.ROW.getName(), myRowNumber);
t = replace(t, Macro.COLUMN.getName(), myColumnNumber);
t = replace(t, Macro.USER.getName(), USER_NAME);
t = replace(t, Macro.COUNT.getName(), myCount);
t = replace(t, Macro.MODIFIED_DATE.getName(), getDate(myLastModified));
t = replace(t, Macro.MODIFIED_TIME.getName(), getTime(myLastModified));
t = replace(t, Macro.PRINTED_DATE.getName(), getDate(printed));
t = replace(t, Macro.PRINTED_TIME.getName(), getTime(printed));
return t;
}
private int getWidth(String text, Font font) {
return (int) Math.ceil(font.getStringBounds(text, Config.FONT_RENDER_CONTEXT).getWidth());
}
private String getDate(Date timestamp) {
return getTimestamp(timestamp, "yyyy.MM.dd"); // NOI18N
}
private String getTime(Date timestamp) {
return getTimestamp(timestamp, "HH:mm:ss"); // NOI18N
}
private String getTimestamp(Date timestamp, String format) {
return new SimpleDateFormat(format).format(timestamp);
}
private int myNumber;
private double myScale;
private PrintPage myPage;
private boolean myIsPainting;
private int myPaperWidth;
private int myPaperHeight;
private int myPageX;
private int myPageY;
private int myPageWidth;
private int myPageHeight;
private int myHeaderY;
private boolean myHasHeader;
private String myHeaderLeft;
private String myHeaderCenter;
private String myHeaderRight;
private Color myHeaderColor;
private Font myHeaderFont;
private int myFooterY;
private boolean myHasFooter;
private String myFooterLeft;
private String myFooterCenter;
private String myFooterRight;
private Color myFooterColor;
private Font myFooterFont;
private boolean myHasBorder;
private Color myBorderColor;
private String myName;
private String myCount;
private String myRowNumber;
private String myColumnNumber;
private Date myLastModified;
private int myRow;
private int myColumn;
private static final int NUMBER_FONT_SIZE = 35;
private static final int SHADOW_WIDTH = 10; // .pt
private static final int NUMBER_X = (int) Math.round(NUMBER_FONT_SIZE * 1.0);
private static final int NUMBER_Y = (int) Math.round(NUMBER_FONT_SIZE * 1.5);
private static final Color NUMBER_FONT_COLOR = new Color(125, 125, 255);
private static final String USER_NAME = System.getProperty("user.name"); // NOI18N
private static final Font NUMBER_FONT_NAME = new Font("Serif", Font.BOLD, NUMBER_FONT_SIZE); // NOI18N
}