/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is created by Dimitry Polivaev in 2008.
*
* 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, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.features.print;
import java.awt.Component;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.Locale;
import org.freeplane.core.extension.IExtension;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.util.Compat;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.mode.Controller;
import org.freeplane.view.swing.map.MapView;
/**
* @author Dimitry Polivaev
*/
public class PrintController implements IExtension {
public static PrintController getController() {
Controller controller = Controller.getCurrentController();
return (PrintController) controller.getExtension(PrintController.class);
}
public static void install() {
Controller controller = Controller.getCurrentController();
controller.addExtension(PrintController.class, new PrintController());
}
// // final private Controller controller;
final private PageAction pageAction;
private PageFormat pageFormat = null;
final private PrintAction printAction;
final private PrintDirectAction printDirectAction;
private PrinterJob printerJob = null;
private boolean printingAllowed;
final private PrintPreviewAction printPreviewAction;
public PrintController() {
super();
Controller controller = Controller.getCurrentController();
// this.controller = controller;
printAction = new PrintAction(this, true);
printDirectAction = new PrintDirectAction(this);
printPreviewAction = new PrintPreviewAction(this);
pageAction = new PageAction(this);
controller.addAction(printAction);
controller.addAction(printDirectAction);
controller.addAction(printPreviewAction);
controller.addAction(pageAction);
printingAllowed = true;
}
boolean acquirePrinterJobAndPageFormat(boolean showDlg) {
if (printerJob == null || showDlg && Compat.isWindowsOS()) {
try {
printerJob = PrinterJob.getPrinterJob();
}
catch (final SecurityException ex) {
printAction.setEnabled(false);
printDirectAction.setEnabled(false);
printPreviewAction.setEnabled(false);
pageAction.setEnabled(false);
printingAllowed = false;
return false;
}
}
return true;
}
PageFormat getPageFormat() {
if (pageFormat == null) {
pageFormat = printerJob.defaultPage();
String pageSettings = ResourceController.getResourceController().getProperty("pageSettings", null);
if(pageSettings == null){
return pageFormat;
}
ParsePosition pos = new ParsePosition(0);
NumberFormat parser = DecimalFormat.getInstance(Locale.US);
Number pageFormatX = parser.parse(pageSettings, pos);
if(pos.getErrorIndex() != -1 || pageFormatX == null)
return pageFormat;
pos.setIndex(pos.getIndex()+1);
Number pageFormatY = parser.parse(pageSettings, pos);
if(pos.getErrorIndex() != -1|| pageFormatY == null)
return pageFormat;
pos.setIndex(pos.getIndex()+1);
Number pageFormatWidth = parser.parse(pageSettings, pos);
if(pos.getErrorIndex() != -1 || pageFormatWidth == null)
return pageFormat;
pos.setIndex(pos.getIndex()+1);
Number pageFormatHeight = parser.parse(pageSettings, pos);
if(pos.getErrorIndex() != -1 || pageFormatHeight == null)
return pageFormat;
pos.setIndex(pos.getIndex()+1);
Number pageFormatOrientation = parser.parse(pageSettings, pos);
if(pos.getErrorIndex() != -1 || pageFormatOrientation == null)
return pageFormat;
Paper paper = (Paper) pageFormat.getPaper().clone();
paper.setImageableArea(pageFormatX.doubleValue(), pageFormatY.doubleValue(), pageFormatWidth.doubleValue(), pageFormatHeight.doubleValue());
pageFormat.setOrientation(pageFormatOrientation.intValue());
pageFormat.setPaper(paper);
}
return pageFormat;
}
private PrinterJob getPrinterJob() {
return printerJob;
}
public boolean isEnabled() {
return printingAllowed;
}
public void pageDialog() {
this.pageFormat = getPrinterJob().pageDialog(getPageFormat());
Paper paper = pageFormat.getPaper();
StringBuilder sb = new StringBuilder();
NumberFormat format = DecimalFormat.getInstance(Locale.US);
double pageFormatX = paper.getImageableX(); sb.append(format.format(pageFormatX));sb.append(' ');
double pageFormatY = paper.getImageableY(); sb.append(format.format(pageFormatY));sb.append(' ');
double pageFormatWidth = paper.getImageableWidth(); sb.append(format.format(pageFormatWidth));sb.append(' ');
double pageFormatHeight = paper.getImageableHeight(); sb.append(format.format(pageFormatHeight));sb.append(' ');
int pageFormatOrientation = pageFormat.getOrientation(); sb.append(format.format(pageFormatOrientation));
ResourceController.getResourceController().setProperty("pageSettings", sb.toString());
}
public boolean printDialog() {
return getPrinterJob().printDialog();
}
public void print(Printable mapView, boolean showDlg) throws PrinterException {
if (!acquirePrinterJobAndPageFormat(showDlg)) {
return;
}
getPrinterJob().setPrintable(mapView, getPageFormat());
if(! showDlg || printDialog()){
if(mapView instanceof MapView)
((MapView)mapView).preparePrinting();
try{
final PrinterJob printerJob = getPrinterJob();
if (mapView instanceof Component){
final String name = ((Component)mapView).getName();
if(name != null)
printerJob.setJobName(name);
}
printerJob.print();
}
catch(PrinterException ex){
LogUtils.warn(ex);
}
finally{
if(mapView instanceof MapView)
((MapView)mapView).endPrinting();
}
}
}
}