package org.deegree.igeo.views.swing.print;
import static org.deegree.framework.util.MapUtils.DEFAULT_PIXEL_SIZE;
import static org.deegree.graphics.MapFactory.createMapView;
import static org.deegree.igeo.views.LayerPane.createThemes;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterGraphics;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.List;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.framework.utils.MapTools;
import org.deegree.graphics.MapView;
import org.deegree.graphics.Theme;
import org.deegree.igeo.mapmodel.Layer;
import org.deegree.igeo.mapmodel.LayerGroup;
import org.deegree.igeo.mapmodel.MapModel;
import org.deegree.igeo.mapmodel.MapModelVisitor;
import org.deegree.model.spatialschema.Envelope;
/**
*
* TODO add class documentation here
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
public class PrintableMap implements Printable {
private static final ILogger LOG = LoggerFactory.getLogger( PrintableMap.class );
private MapModel mapModel;
private int iResMul = 4; // 1 = 72 dpi; 4 = 288 dpi
/**
*
* @param mapModel
*/
PrintableMap( MapModel mapModel ) {
this.mapModel = mapModel;
}
public int print( Graphics g, PageFormat pf, int iPage )
throws PrinterException {
if ( 0 != iPage ) {
return NO_SUCH_PAGE;
}
final List<Theme> themes = new ArrayList<Theme>();
// calculate size of printable area
int iWdth = (int) Math.round( pf.getImageableWidth() * iResMul ) - 3;
int iHght = (int) Math.round( pf.getImageableHeight() * iResMul ) - 3;
// store current map size
int tWdth = mapModel.getTargetDevice().getPixelWidth();
int tHght = mapModel.getTargetDevice().getPixelHeight();
Envelope tEnv = mapModel.getEnvelope();
// set map size to size of printable area
mapModel.getTargetDevice().setPixelWidth( iWdth );
mapModel.getTargetDevice().setPixelHeight( iHght );
MapTools.adjustMapModelExtent( iWdth, iHght, mapModel );
try {
mapModel.walkLayerTree( new MapModelVisitor() {
public void visit( Layer layer )
throws Exception {
double mis = layer.getMinScaleDenominator();
double mxs = layer.getMaxScaleDenominator();
if ( layer.isVisible() && mis <= mapModel.getScaleDenominator()
&& mxs >= mapModel.getScaleDenominator() ) {
List<Theme> layerThemes = createThemes( layer.getCurrentStyle(), layer.getDataAccess(),
mapModel.getCoordinateSystem() );
themes.addAll( layerThemes );
}
}
public void visit( LayerGroup layerGroup )
throws Exception {
// not using grouping nodes
}
} );
List<Theme> tmp = new ArrayList<Theme>();
for ( int i = themes.size() - 1; i >= 0; i-- ) {
tmp.add( themes.get( i ) );
}
MapView mv = createMapView( "iGeoDesktop", mapModel.getEnvelope(), mapModel.getCoordinateSystem(),
tmp.toArray( new Theme[tmp.size()] ), DEFAULT_PIXEL_SIZE );
Graphics2D g2 = (Graphics2D) g;
g2.translate( pf.getImageableX(), pf.getImageableY() );
g2.scale( 1.0 / iResMul, 1.0 / iResMul );
g2.setClip( 0, 0, iWdth, iHght );
mv.paint( g2 );
} catch ( Exception e ) {
LOG.logError( e );
throw new PrinterException( e.getMessage() );
} finally {
// reset mapsize
mapModel.getTargetDevice().setPixelWidth( tWdth );
mapModel.getTargetDevice().setPixelHeight( tHght );
mapModel.setEnvelope( tEnv );
}
return PAGE_EXISTS;
}
/**
* @param g
* @param pf
* @param iPage
* @throws PrinterException
*/
public int print_( Graphics g, PageFormat pf, int iPage )
throws PrinterException {
final int FONTSIZE = 12;
final double PNT_MM = 25.4 / 72.;
if ( 0 != iPage )
return NO_SUCH_PAGE;
try {
int iPosX = 1;
int iPosY = 1;
int iAddY = FONTSIZE * 3 / 2 * iResMul;
int iWdth = (int) Math.round( pf.getImageableWidth() * iResMul ) - 3;
int iHght = (int) Math.round( pf.getImageableHeight() * iResMul ) - 3;
int iCrcl = Math.min( iWdth, iHght ) - 4 * iResMul;
Graphics2D g2 = (Graphics2D) g;
PrinterJob prjob = ( (PrinterGraphics) g2 ).getPrinterJob();
g2.translate( pf.getImageableX(), pf.getImageableY() );
g2.scale( 1.0 / iResMul, 1.0 / iResMul );
g2.setFont( new Font( "SansSerif", Font.PLAIN, FONTSIZE * iResMul ) );
g2.setColor( Color.black );
g2.drawRect( iPosX, iPosY, iWdth, iHght );
g2.drawLine( iPosX, iHght / 2 + iWdth / 50, iPosX + iWdth, iHght / 2 - iWdth / 50 );
g2.drawLine( iPosX, iHght / 2 - iWdth / 50, iPosX + iWdth, iHght / 2 + iWdth / 50 );
g2.drawOval( iPosX + 2 * iResMul, iHght - iCrcl - 2 * iResMul, iCrcl, iCrcl );
iPosX += iAddY;
iPosY += iAddY / 2;
g2.drawString( "PrinterJob-UserName: " + prjob.getUserName(), iPosX, iPosY += iAddY );
g2.drawString( "Betriebssystem: " + System.getProperty( "os.name" ) + " "
+ System.getProperty( "os.version" ), iPosX, iPosY += iAddY );
g2.drawString( "Java-Version: JDK " + System.getProperty( "java.version" ), iPosX, iPosY += iAddY );
g2.drawString( "Width/Height: " + dbldgt( pf.getWidth() ) + " / " + dbldgt( pf.getHeight() ) + " points = "
+ dbldgt( pf.getWidth() * PNT_MM ) + " / " + dbldgt( pf.getHeight() * PNT_MM ) + " mm",
iPosX, iPosY += iAddY );
g2.drawString( "Imageable Width/Height: " + dbldgt( pf.getImageableWidth() ) + " / "
+ dbldgt( pf.getImageableHeight() ) + " points = "
+ dbldgt( pf.getImageableWidth() * PNT_MM ) + " / "
+ dbldgt( pf.getImageableHeight() * PNT_MM ) + " mm", iPosX, iPosY += iAddY );
g2.drawString( "Imageable X/Y: " + dbldgt( pf.getImageableX() ) + " / " + dbldgt( pf.getImageableY() )
+ " points = " + dbldgt( pf.getImageableX() * PNT_MM ) + " / "
+ dbldgt( pf.getImageableY() * PNT_MM ) + " mm", iPosX, iPosY += iAddY );
g2.drawString( "versuchte Druckauflösung: " + 72 * iResMul + " dpi", iPosX, iPosY += iAddY );
} catch ( Exception ex ) {
throw new PrinterException( ex.getMessage() );
}
return PAGE_EXISTS;
}
private static double dbldgt( double d ) {
return Math.round( d * 10. ) / 10.; // show one digit after point
}
}