blob: da3b10e769bb1a54586e41fe40705b505651e8d7 [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.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.print.Paper;
import java.awt.print.PrinterJob;
import java.awt.print.PageFormat;
import java.util.StringTokenizer;
import java.util.prefs.Preferences;
import org.openide.util.NbPreferences;
import static org.netbeans.modules.print.util.UI.*;
/**
* @author Vladimir Yaroslavskiy
* @version 2006.03.21
*/
public final class Config {
private Config() {}
public boolean showPageSetup() {
PrinterJob job = PrinterJob.getPrinterJob();
PageFormat oldFormat = getPageFormat();
PageFormat newFormat = job.pageDialog(oldFormat);
if (oldFormat == newFormat) {
return false;
}
myPageFormat = newFormat;
// save
set(PAGE_ORIENTATION, myPageFormat.getOrientation());
Paper paper = myPageFormat.getPaper();
set(PAPER_WIDTH, paper.getWidth());
set(PAPER_HEIGHT, paper.getHeight());
set(AREA_X, paper.getImageableX());
set(AREA_Y, paper.getImageableY());
set(AREA_WIDTH, paper.getImageableWidth());
set(AREA_HEIGHT, paper.getImageableHeight());
return true;
}
public PageFormat getPageFormat() {
PrinterJob job = PrinterJob.getPrinterJob();
if (myPageFormat == null) {
myPageFormat = job.defaultPage();
// restore
myPageFormat.setOrientation(round(get(PAGE_ORIENTATION, PageFormat.PORTRAIT)));
Paper paper = myPageFormat.getPaper();
if (get(PAPER_WIDTH, null) != null && get(PAPER_HEIGHT, null) != null) {
paper.setSize(get(PAPER_WIDTH, INCH), get(PAPER_HEIGHT, INCH));
}
if (get(AREA_X, null) != null && get(AREA_Y, null) != null && get(AREA_WIDTH, null) != null && get(AREA_HEIGHT, null) != null) {
paper.setImageableArea(get(AREA_X, INCH), get(AREA_Y, INCH), get(AREA_WIDTH, INCH), get(AREA_HEIGHT, INCH));
}
myPageFormat.setPaper(paper);
}
return myPageFormat;
}
// paper
public int getPaperWidth() {
return (int) Math.floor(getPageFormat().getWidth());
}
public int getPaperHeight() {
return (int) Math.floor(getPageFormat().getHeight());
}
// page
public int getPageX() {
return round(getPageFormat().getImageableX());
}
public int getPageY() {
int y = round(getPageFormat().getImageableY());
if (hasHeader()) {
y += getBound(getHeaderFont()).getHeight();
}
return y;
}
public int getPageWidth() {
return (int) Math.floor(getPageFormat().getImageableWidth());
}
public int getPageHeight() {
int height = (int) Math.floor(getPageFormat().getImageableHeight());
if (hasHeader()) {
height -= getBound(getHeaderFont()).getHeight();
}
if (hasFooter()) {
height -= getBound(getFooterFont()).getHeight();
}
return height;
}
// header
public int getHeaderY() {
return getPageY() - round(getBound(getHeaderFont()).getMaxY());
}
public int getFooterY() {
return getPageY() + getPageHeight() + round(getBound(getFooterFont()).getHeight() - getBound(getFooterFont()).getMaxY());
}
public boolean hasBorder() {
return get(BORDER, true);
}
public void setBorder(boolean value) {
set(BORDER, value);
}
public boolean isSelection() {
return get(SELECTION, false);
}
public void setSelection(boolean value) {
set(SELECTION, value);
}
public boolean isAsEditor() {
return get(AS_EDITOR, false);
}
public void setAsEditor(boolean value) {
set(AS_EDITOR, value);
}
public Color getBorderColor() {
return getColor(get(BORDER_COLOR, null), Color.black);
}
public void setBorderColor(Color value) {
set(BORDER_COLOR, getString(value));
}
public boolean hasHeader() {
return get(HEADER, true);
}
public void setHeader(boolean value) {
set(HEADER, value);
}
public String getHeaderLeft() {
return get(HEADER_LEFT, HEADER_LEFT_TEXT);
}
public String getHeaderCenter() {
return get(HEADER_CENTER, HEADER_CENTER_TEXT);
}
public String getHeaderRight() {
return get(HEADER_RIGHT, HEADER_RIGHT_TEXT);
}
public void setHeaderLeft(String value) {
set(HEADER_LEFT, value);
}
public void setHeaderCenter(String value) {
set(HEADER_CENTER, value);
}
public void setHeaderRight(String value) {
set(HEADER_RIGHT, value);
}
public Color getHeaderColor() {
return getColor(get(HEADER_COLOR, null), Color.black);
}
public Font getHeaderFont() {
return getFont(get(HEADER_FONT, null), DEFAULT_TITLE_FONT);
}
public void setHeaderColor(Color value) {
set(HEADER_COLOR, getString(value));
}
public void setHeaderFont(Font value) {
set(HEADER_FONT, getString(value));
}
// footer
public boolean hasFooter() {
return get(FOOTER, true);
}
public void setFooter(boolean value) {
set(FOOTER, value);
}
public String getFooterLeft() {
return get(FOOTER_LEFT, FOOTER_LEFT_TEXT);
}
public String getFooterCenter() {
return get(FOOTER_CENTER, FOOTER_CENTER_TEXT);
}
public String getFooterRight() {
return get(FOOTER_RIGHT, FOOTER_RIGHT_TEXT);
}
public void setFooterLeft(String value) {
set(FOOTER_LEFT, value);
}
public void setFooterCenter(String value) {
set(FOOTER_CENTER, value);
}
public void setFooterRight(String value) {
set(FOOTER_RIGHT, value);
}
public Color getFooterColor() {
return getColor(get(FOOTER_COLOR, null), Color.black);
}
public Font getFooterFont() {
return getFont(get(FOOTER_FONT, null), DEFAULT_TITLE_FONT);
}
public void setFooterColor(Color value) {
set(FOOTER_COLOR, getString(value));
}
public void setFooterFont(Font value) {
set(FOOTER_FONT, getString(value));
}
// text
public void setWrapLines(boolean value) {
set(WRAP_LINES, value);
}
public boolean isWrapLines() {
return get(WRAP_LINES, false);
}
public boolean isLineNumbers() {
return get(LINE_NUMBERS, false);
}
public void setLineNumbers(boolean value) {
set(LINE_NUMBERS, value);
}
public boolean isUseFont() {
return get(USE_FONT, true);
}
public void setUseFont(boolean value) {
set(USE_FONT, value);
}
public boolean isUseColor() {
return get(USE_COLOR, true);
}
public void setUseColor(boolean value) {
set(USE_COLOR, value);
}
public Color getTextColor() {
return getColor(get(TEXT_COLOR, null), Color.black);
}
public void setTextColor(Color value) {
set(TEXT_COLOR, getString(value));
}
public Font getTextFont() {
return getFont(get(TEXT_FONT, null), DEFAULT_TEXT_FONT);
}
public void setTextFont(Font value) {
set(TEXT_FONT, getString(value));
}
public Color getBackgroundColor() {
return getColor(get(BACKGROUND_COLOR, null), DEFAULT_BACGROUND_COLOR);
}
public void setBackgroundColor(Color value) {
set(BACKGROUND_COLOR, getString(value));
}
public double getLineSpacing() {
return get(LINE_SPACING, 1.0);
}
public void setLineSpacing(double value) {
set(LINE_SPACING, value);
}
// zoom
public void setZoom(double value) {
set(ZOOM, value);
}
public double getZoom() {
return get(ZOOM, 1.0);
}
// service
private Preferences getPreferences() {
return NbPreferences.forModule(Config.class);
}
private String get(String name, String defaultValue) {
return getPreferences().get(name, defaultValue);
}
private boolean get(String name, boolean defaultValue) {
return getPreferences().getBoolean(name, defaultValue);
}
private double get(String name, double defaultValue) {
return getPreferences().getDouble(name, defaultValue);
}
private void set(String name, String value) {
getPreferences().put(name, value);
}
private void set(String name, boolean value) {
getPreferences().putBoolean(name, value);
}
private void set(String name, double value) {
getPreferences().putDouble(name, value);
}
private String getString(Color value) {
return value.getRed() + COMMA + value.getGreen() + COMMA + value.getBlue();
}
private String getString(Font value) {
return value.getName() + COMMA + value.getStyle() + COMMA + value.getSize();
}
private Color getColor(String value, Color defaultValue) {
if (value == null) {
return defaultValue;
}
StringTokenizer stk = new StringTokenizer(value, COMMA);
int red = integer(stk);
int green = integer(stk);
int blue = integer(stk);
if (red == -1 || green == -1 || blue == -1) {
return defaultValue;
}
return new Color(red, green, blue);
}
private Font getFont(String value, Font defaultValue) {
if (value == null) {
return defaultValue;
}
StringTokenizer stk = new StringTokenizer(value, COMMA);
String name = getString(stk);
int style = integer(stk);
int size = integer(stk);
if (name == null || style == -1 || size == -1) {
return defaultValue;
}
return new Font(name, style, size);
}
private int integer(StringTokenizer stk) {
if ( !stk.hasMoreTokens()) {
return -1;
}
return getInt(stk.nextToken());
}
private String getString(StringTokenizer stk) {
if ( !stk.hasMoreTokens()) {
return null;
}
return stk.nextToken();
}
private Rectangle2D getBound(Font font) {
return font.getMaxCharBounds(FONT_RENDER_CONTEXT);
}
public static String getPageOfCount(String page, String count) {
return i18n(Config.class, "LBL_Page_of_Count", page, count); // NOI18N
}
private static String getRowColumn(String row, String column) {
return i18n(Config.class, "LBL_Row_Column", row, column); // NOI18N
}
public static Config getDefault() {
return DEFAULT;
}
public Graphics2D getGraphics(Graphics g) {
Graphics2D graphics = (Graphics2D) g;
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
return graphics;
}
private PageFormat myPageFormat;
private static final Config DEFAULT = new Config();
private static final double INCH = 72.0; // .pt
private static final Font DEFAULT_TITLE_FONT = new Font("Serif", Font.PLAIN, 10); //NOI18N
private static final Font DEFAULT_TEXT_FONT = new Font("Monospaced", Font.PLAIN, 10); // NOI18N
private static final Color DEFAULT_BACGROUND_COLOR = new Color(255, 250, 255);
private static final String COMMA = ","; // NOI18N
private static final String EMPTY = ""; // NOI18N
private static final String HEADER_LEFT_TEXT = Macro.NAME.getName();
private static final String HEADER_CENTER_TEXT = EMPTY;
private static final String HEADER_RIGHT_TEXT = EMPTY;
private static final String FOOTER_LEFT_TEXT = getPageOfCount(getRowColumn(Macro.ROW.getName(), Macro.COLUMN.getName()), Macro.COUNT.getName());
private static final String FOOTER_CENTER_TEXT = EMPTY;
private static final String FOOTER_RIGHT_TEXT = Macro.MODIFIED_DATE.getName() + " " + Macro.MODIFIED_TIME.getName(); // NOI18N
private static final String SELECTION = "print.text.selection"; // NOI18N
private static final String AS_EDITOR = "print.text.as.editor"; // NOI18N
private static final String WRAP_LINES = "print.text.wrap.lines"; // NOI18N
private static final String LINE_NUMBERS = "print.text.line.numbers"; // NOI18N
private static final String USE_FONT = "print.text.use.font"; // NOI18N
private static final String USE_COLOR = "print.text.use.color"; // NOI18N
private static final String TEXT_COLOR = "print.text.color"; // NOI18N
private static final String TEXT_FONT = "print.text.font"; // NOI18N
private static final String LINE_SPACING = "print.text.line.spacing"; // NOI18N
private static final String BACKGROUND_COLOR = "print.text.background.color"; // NOI18N
private static final String ZOOM = "print.zoom"; // NOI18N
private static final String BORDER = "print.border"; // NOI18N
private static final String BORDER_COLOR = "print.border.color"; // NOI18N
private static final String HEADER = "print.header"; // NOI18N
private static final String HEADER_LEFT = "print.header.left"; // NOI18N
private static final String HEADER_CENTER = "print.header.center"; // NOI18N
private static final String HEADER_RIGHT = "print.header.right"; // NOI18N
private static final String HEADER_COLOR = "print.header.color"; // NOI18N
private static final String HEADER_FONT = "print.header.font"; // NOI18N
private static final String FOOTER = "print.footer"; // NOI18N
private static final String FOOTER_LEFT = "print.footer.left"; // NOI18N
private static final String FOOTER_CENTER = "print.footer.center"; // NOI18N
private static final String FOOTER_RIGHT = "print.footer.right"; // NOI18N
private static final String FOOTER_COLOR = "print.footer.color"; // NOI18N
private static final String FOOTER_FONT = "print.footer.font"; // NOI18N
private static final String PAGE_ORIENTATION = "print.page.orientation"; // NOI18N
private static final String PAPER_WIDTH = "print.paper.width"; // NOI18N
private static final String PAPER_HEIGHT = "print.paper.height"; // NOI18N
private static final String AREA_X = "print.area.x"; // NOI18N
private static final String AREA_Y = "print.area.y"; // NOI18N
private static final String AREA_WIDTH = "print.area.width"; // NOI18N
private static final String AREA_HEIGHT = "print.area.height"; // NOI18N
public static final FontRenderContext FONT_RENDER_CONTEXT = new FontRenderContext(null, true, true);
}