/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed 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.pentaho.di.ui.core;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.pentaho.di.ui.core.dialog.EnterPrintDialog;
/**
* This class handles printing for Kettle.
*
* @author Matt
* @since 28-03-2004
*
*/
public class PrintSpool {
private PrinterData printerdata;
private Printer printer;
private PaletteData palette;
public PrintSpool() {
printerdata = Printer.getDefaultPrinterData();
if ( printerdata != null ) {
// Fail silently instead of crashing.
printer = new Printer( printerdata );
}
}
public PrinterData getPrinterData() {
return printerdata;
}
// Ask which printer to use...
public Printer getPrinter( Shell sh ) {
PrintDialog pd = new PrintDialog( sh );
printerdata = pd.open();
if ( printerdata != null ) {
if ( printer != null ) {
printer.dispose();
}
printer = new Printer( printerdata );
}
return printer;
}
public void dispose() {
if ( printer != null ) {
printer.dispose();
}
}
public int getDepth() {
return printer.getDepth();
}
public PaletteData getPaletteData() {
switch ( getDepth() ) {
case 1:
palette = new PaletteData( new RGB[] { new RGB( 0, 0, 0 ), new RGB( 255, 255, 255 ) } );
break;
default:
palette = new PaletteData( 0, 0, 0 );
palette.isDirect = true;
break;
}
return palette;
}
public void printImage( Shell sh, Image img ) {
if ( printerdata != null ) {
Rectangle imgbounds = img.getBounds();
Point max = new Point( imgbounds.width, imgbounds.height );
// What's the printers DPI?
Point dpi_printer = printer.getDPI();
// What's the screens DPI?
Point dpi_screen = Display.getCurrent().getDPI();
// Resize on printer: calculate factor:
double factorx = (double) dpi_printer.x / (double) dpi_screen.x;
double factory = (double) dpi_printer.y / (double) dpi_screen.y;
// Get size of 1 page?
Rectangle page = printer.getBounds();
double margin_left = 0.40; // 0,40 inch about 1cm
double margin_right = 0.40;
double margin_top = 0.40;
double margin_bottom = 0.40;
EnterPrintDialog epd =
new EnterPrintDialog(
sh, 1, 1, 100, factorx, factory, page, margin_left, margin_right, margin_top, margin_bottom, img );
if ( epd.open() == SWT.OK ) {
double page_left = epd.leftMargin * dpi_printer.x;
double page_right = epd.rightMargin * dpi_printer.x;
double page_top = epd.topMargin * dpi_printer.y;
double page_bottom = epd.bottomMargin * dpi_printer.y;
double page_sizex = page.width - page_left - page_right;
double page_sizey = page.height - page_top - page_bottom;
double size_on_paperx = max.x * factorx;
double size_on_papery = max.y * factory;
double actual_sizex = size_on_paperx * epd.scale / 100;
double actual_sizey = size_on_papery * epd.scale / 100;
// Create new print job.
printer.startJob( "Kettle : Spoon print job" );
// How much of the image do we print on each page: all or just a page worth of pixels?
for ( int c = 0; c < epd.nrcols; c++ ) {
double left_to_printx = actual_sizex - page_sizex * c;
double printx =
( left_to_printx > page_sizex ) ? page_sizex : ( left_to_printx >= 0 ? left_to_printx : 0 );
for ( int r = 0; r < epd.nrrows; r++ ) {
double left_to_printy = actual_sizey - page_sizey * r;
double printy =
( left_to_printy > page_sizey ) ? page_sizey : ( left_to_printy >= 0 ? left_to_printy : 0 );
int startx = (int) ( actual_sizex - left_to_printx );
int starty = (int) ( actual_sizey - left_to_printy );
int fromx = (int) ( startx / ( factorx * epd.scale / 100 ) );
int fromy = (int) ( starty / ( factory * epd.scale / 100 ) );
int imx = (int) ( max.x * printx / actual_sizex ) - 1;
int imy = (int) ( max.y * printy / actual_sizey ) - 1;
printer.startPage();
GC gc_printer = new GC( printer );
gc_printer.drawImage(
img, fromx, fromy, imx, imy, (int) page_left, (int) page_top, (int) printx, (int) printy );
// ShowImageDialog sid = new ShowImageDialog(sh, props, img);
// sid.open();
System.out.println( "img dept = " + img.getImageData().depth );
System.out.println( "prn dept = " + printer.getDepth() );
System.out.println( "img size = ("
+ img.getBounds().x + "," + img.getBounds().y + ") : (" + img.getBounds().width + ","
+ img.getBounds().height + ")" );
System.out.println( "fromx="
+ fromx + ", fromy=" + fromy + ", imx=" + imx + ", imy=" + imy + ", page_left=" + (int) page_left
+ ", page_top=" + (int) page_top + ", printx=" + (int) printx + ", printy=" + (int) printy );
printer.endPage();
gc_printer.dispose();
}
}
printer.endJob();
printer.dispose();
}
img.dispose();
}
}
}