//$HeadURL$
/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2007 by:
Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/deegree/
lat/lon GmbH
http://www.lat-lon.de
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Andreas Poth
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
E-Mail: poth@lat-lon.de
Prof. Dr. Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: greve@giub.uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.igeo.views.swing.print;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.prefs.Preferences;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.xml.transform.OutputKeys;
import org.deegree.datatypes.QualifiedName;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.framework.util.MapUtils;
import org.deegree.framework.util.StringTools;
import org.deegree.framework.xml.NamespaceContext;
import org.deegree.framework.xml.XMLFragment;
import org.deegree.framework.xml.XMLTools;
import org.deegree.graphics.transformation.GeoTransform;
import org.deegree.igeo.ApplicationContainer;
import org.deegree.igeo.ValueChangedEvent;
import org.deegree.igeo.commands.VectorPrintCommand;
import org.deegree.igeo.commands.VectorPrintCommand.PrintDescriptionBean;
import org.deegree.igeo.commands.model.AddMemoryLayerCommand;
import org.deegree.igeo.dataadapter.MemoryFeatureAdapter;
import org.deegree.igeo.i18n.Messages;
import org.deegree.igeo.io.FileSystemAccess;
import org.deegree.igeo.io.FileSystemAccessFactory;
import org.deegree.igeo.mapmodel.Layer;
import org.deegree.igeo.mapmodel.MapModel;
import org.deegree.igeo.modules.DefaultMapModule;
import org.deegree.igeo.modules.IModule;
import org.deegree.igeo.state.mapstate.MapTool;
import org.deegree.igeo.views.DialogFactory;
import org.deegree.igeo.views.HelpManager;
import org.deegree.igeo.views.swing.ButtonGroup;
import org.deegree.igeo.views.swing.HelpFrame;
import org.deegree.igeo.views.swing.map.LayerComponent;
import org.deegree.igeo.views.swing.util.GenericFileChooser;
import org.deegree.igeo.views.swing.util.GenericFileChooser.FILECHOOSERTYPE;
import org.deegree.igeo.views.swing.util.IGeoFileFilter;
import org.deegree.igeo.views.swing.util.IconRegistry;
import org.deegree.model.feature.Feature;
import org.deegree.model.feature.FeatureCollection;
import org.deegree.model.feature.FeatureProperty;
import org.deegree.model.spatialschema.Envelope;
import org.deegree.model.spatialschema.Geometry;
import org.deegree.model.spatialschema.GeometryFactory;
import org.deegree.model.spatialschema.Point;
import org.deegree.ogcbase.CommonNamespaces;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.lowagie.text.PageSize;
import com.lowagie.text.Rectangle;
/**
*
* Dialog for printing a map as vector pdf document via iText
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
public class VectorPrintDialog extends javax.swing.JDialog implements org.deegree.igeo.ChangeListener {
private static final long serialVersionUID = -3920635540202430586L;
private static final ILogger LOG = LoggerFactory.getLogger( VectorPrintDialog.class );
private JButton btPrint;
private JTextField tfOutputFile;
private JButton btOutputFile;
private JPanel pnOutput;
private JComboBox cbDPI;
private JPanel pnDPI;
private JComboBox cbScale;
private JRadioButton rbVariable;
private JRadioButton rbConst;
private JLabel lbPageSize;
private JComboBox cbPageFormat;
private JLabel lbPageWidth;
private JSpinner tfPageWidth;
private JLabel lbPageUnitW;
private JLabel lbPageHeight;
private JSpinner tfPageHeight;
private JLabel lbPageUnitH;
private JPanel pnFormat;
private JSpinner spMapBottom;
private JSpinner spMapLeft;
private JLabel lbMapBottom;
private JLabel lbMapLeft;
private JLabel lbHeight;
private JLabel lbWidth;
private JLabel lbTop;
private JLabel lbLeft;
private JSpinner spHeight;
private JSpinner spWidth;
private JSpinner spTop;
private JSpinner spLeft;
private JLabel lb4;
private JLabel lb3;
private JLabel lb2;
private JLabel lb1;
private JPanel pnScale;
private JPanel pnMapCoord;
private JPanel pnLayoutPosition;
private JButton btSave;
private JButton btLoad;
private JPanel pnFile;
private PreviewPanel pnPreview;
private JPanel pnPrint;
private JButton btHelp;
private JPanel pnHelp;
private JButton btCancel;
private JPanel pnButtons;
private ButtonGroup bg = new ButtonGroup();
private ApplicationContainer<?> appContainer;
private MapModel mapModel;
private Layer previewLayer;
private PrintSizeListener printSizeListener = new PrintSizeListener();
private MouseListener ml = new PrintMouseListener();
private MouseMotionListener mml = new PrintMouseMotionListener();
private Point pressPoint;
private boolean isActive = false;
/**
*
* @param frame
*/
public VectorPrintDialog( JFrame frame, ApplicationContainer<?> appContainer ) {
super( frame );
this.appContainer = appContainer;
this.mapModel = appContainer.getMapModel( null );
MapTool<Container> mt = getAssignedMapModule().getMapTool();
mt.resetState();
addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( WindowEvent e ) {
disposeListenerAndLayer();
}
@Override
public void windowClosed( WindowEvent e ) {
disposeListenerAndLayer();
}
} );
initGUI();
addPreviewLayer();
toFront();
setAlwaysOnTop( true );
}
private void disposeListenerAndLayer() {
DefaultMapModule<Container> mapModule = getAssignedMapModule();
MapTool<Container> mt = mapModule.getMapTool();
removePreviewLayer();
Container jco = mapModule.getMapContainer();
jco.removeMouseListener( ml );
jco.removeMouseMotionListener( mml );
mt.removeChangeListener( VectorPrintDialog.this );
}
private void initGUI() {
try {
{
GridBagLayout thisLayout = new GridBagLayout();
thisLayout.rowWeights = new double[] { 0.0, 0.0 };
thisLayout.rowHeights = new int[] { 531, 16 };
thisLayout.columnWeights = new double[] { 0.1, 0.1 };
thisLayout.columnWidths = new int[] { 7, 20 };
getContentPane().setLayout( thisLayout );
{
pnButtons = new JPanel();
FlowLayout pnButtonsLayout = new FlowLayout();
pnButtonsLayout.setAlignment( FlowLayout.LEFT );
pnButtons.setLayout( pnButtonsLayout );
getContentPane().add( pnButtons,
new GridBagConstraints( 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets( 0, 0, 0, 0 ), 0,
0 ) );
{
btPrint = new JButton( Messages.getMessage( getLocale(), "$MD11785" ),
IconRegistry.getIcon( "accept.png" ) );
pnButtons.add( btPrint );
btPrint.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent event ) {
if ( tfOutputFile.getText().trim().length() < 3 ) {
DialogFactory.openWarningDialog( appContainer.getViewPlatform(),
VectorPrintDialog.this,
Messages.get( "$MD11817" ),
Messages.get( "$MD11818" ) );
} else {
doPrint();
}
}
} );
}
{
btCancel = new JButton( Messages.getMessage( getLocale(), "$MD11786" ),
IconRegistry.getIcon( "cancel.png" ) );
btCancel.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
VectorPrintDialog.this.dispose();
}
} );
pnButtons.add( btCancel );
}
}
{
pnHelp = new JPanel();
FlowLayout pnHelpLayout = new FlowLayout();
pnHelpLayout.setAlignment( FlowLayout.RIGHT );
pnHelp.setLayout( pnHelpLayout );
getContentPane().add( pnHelp,
new GridBagConstraints( 1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets( 0, 0, 0, 0 ), 0,
0 ) );
{
btHelp = new JButton( Messages.getMessage( getLocale(), "$MD11787" ),
IconRegistry.getIcon( "help.png" ) );
pnHelp.add( btHelp );
btHelp.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
HelpFrame hf = HelpFrame.getInstance( new HelpManager( appContainer ) );
hf.setVisible( true );
hf.gotoModule( "Print" );
}
} );
}
}
{
pnPrint = new JPanel();
GridBagLayout pnPrintLayout = new GridBagLayout();
getContentPane().add( pnPrint,
new GridBagConstraints( 0, 0, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets( 0, 0, 0, 0 ), 0,
0 ) );
pnPrint.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(), "$MD11788" ) ) );
pnPrintLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.1 };
pnPrintLayout.rowHeights = new int[] { 78, 111, 126, 65, 60, 7 };
pnPrintLayout.columnWeights = new double[] { 0.0, 0.0, 0.0, 0.1 };
pnPrintLayout.columnWidths = new int[] { 117, 158, 151, 7 };
pnPrint.setLayout( pnPrintLayout );
{
pnPreview = new PreviewPanel();
pnPreview.setLayout( new BorderLayout() );
pnPrint.add( pnPreview, new GridBagConstraints( 0, 0, 2, 3, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
pnPreview.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$MD11789" ) ) );
{
lbPageSize = new JLabel();
pnPreview.add( lbPageSize, BorderLayout.SOUTH );
lbPageSize.setText( Messages.getMessage( getLocale(), "$MD11790" ) );
}
}
{
pnFile = new JPanel();
FlowLayout pnFileLayout = new FlowLayout();
pnFileLayout.setAlignment( FlowLayout.LEFT );
pnFile.setLayout( pnFileLayout );
pnPrint.add( pnFile, new GridBagConstraints( 0, 5, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets( 0, 0, 0, 0 ),
0, 0 ) );
pnFile.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$MD11791" ) ) );
{
btLoad = new JButton( Messages.getMessage( getLocale(), "$MD11792" ),
IconRegistry.getIcon( "open.gif" ) );
pnFile.add( btLoad );
btLoad.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent event ) {
doLoadSettings();
}
} );
}
{
btSave = new JButton( Messages.getMessage( getLocale(), "$MD11793" ),
IconRegistry.getIcon( "save.gif" ) );
pnFile.add( btSave );
btSave.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent event ) {
doSaveSettings();
}
} );
}
}
{
pnLayoutPosition = new JPanel();
GridBagLayout pnLayoutPositionLayout = new GridBagLayout();
pnLayoutPositionLayout.rowWeights = new double[] { 0.0, 0.1, 0.1, 0.1 };
pnLayoutPositionLayout.rowHeights = new int[] { 39, 7, 7, 7 };
pnLayoutPositionLayout.columnWeights = new double[] { 0.0, 0.0, 0.1 };
pnLayoutPositionLayout.columnWidths = new int[] { 69, 95, 7 };
pnLayoutPosition.setLayout( pnLayoutPositionLayout );
pnPrint.add( pnLayoutPosition, new GridBagConstraints( 2, 0, 2, 2, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
pnLayoutPosition.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$MD11848" ) ) );
{
lb1 = new JLabel( Messages.getMessage( getLocale(), "$MD11794" ) );
pnLayoutPosition.add( lb1, new GridBagConstraints( 2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
lb2 = new JLabel( Messages.getMessage( getLocale(), "$MD11794" ) );
pnLayoutPosition.add( lb2, new GridBagConstraints( 2, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
lb3 = new JLabel( Messages.getMessage( getLocale(), "$MD11794" ) );
pnLayoutPosition.add( lb3, new GridBagConstraints( 2, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
lb4 = new JLabel( Messages.getMessage( getLocale(), "$MD11794" ) );
pnLayoutPosition.add( lb4, new GridBagConstraints( 2, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
spLeft = new JSpinner( new SpinnerNumberModel( 20, 0, 100000, 1 ) );
pnLayoutPosition.add( spLeft, new GridBagConstraints( 1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
spLeft.addChangeListener( printSizeListener );
}
{
spTop = new JSpinner( new SpinnerNumberModel( 20, 0, 100000, 1 ) );
pnLayoutPosition.add( spTop, new GridBagConstraints( 1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
spTop.addChangeListener( printSizeListener );
}
{
spWidth = new JSpinner( new SpinnerNumberModel( 150, 10, 100000, 1 ) );
pnLayoutPosition.add( spWidth, new GridBagConstraints( 1, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
spWidth.addChangeListener( printSizeListener );
}
{
spHeight = new JSpinner( new SpinnerNumberModel( 200, 10, 100000, 1 ) );
pnLayoutPosition.add( spHeight, new GridBagConstraints( 1, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
spHeight.addChangeListener( printSizeListener );
}
{
lbLeft = new JLabel( Messages.getMessage( getLocale(), "$MD11795" ) );
pnLayoutPosition.add( lbLeft, new GridBagConstraints( 0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
lbTop = new JLabel( Messages.getMessage( getLocale(), "$MD11796" ) );
pnLayoutPosition.add( lbTop, new GridBagConstraints( 0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
lbWidth = new JLabel( Messages.getMessage( getLocale(), "$MD11797" ) );
pnLayoutPosition.add( lbWidth, new GridBagConstraints( 0, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
lbHeight = new JLabel( Messages.getMessage( getLocale(), "$MD11798" ) );
pnLayoutPosition.add( lbHeight, new GridBagConstraints( 0, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
}
{
pnMapCoord = new JPanel();
GridBagLayout pnMapCoordLayout = new GridBagLayout();
pnPrint.add( pnMapCoord,
new GridBagConstraints( 2, 2, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets( 0, 0, 0, 0 ), 0, 0 ) );
pnMapCoord.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$MD11799" ) ) );
pnMapCoordLayout.rowWeights = new double[] { 0.1, 0.1 };
pnMapCoordLayout.rowHeights = new int[] { 7, 7 };
pnMapCoordLayout.columnWeights = new double[] { 0.0, 0.1, 0.1 };
pnMapCoordLayout.columnWidths = new int[] { 68, 7, 7 };
pnMapCoord.setLayout( pnMapCoordLayout );
{
lbMapLeft = new JLabel( Messages.getMessage( getLocale(), "$MD11800" ) );
pnMapCoord.add( lbMapLeft, new GridBagConstraints( 0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
lbMapBottom = new JLabel( Messages.getMessage( getLocale(), "$MD11801" ) );
pnMapCoord.add( lbMapBottom, new GridBagConstraints( 0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
{
spMapLeft = new JSpinner( new SpinnerNumberModel( 0, -9E9, 9E9, 0.5 ) );
spMapLeft.setValue( mapModel.getEnvelope().getMin().getX() );
pnMapCoord.add( spMapLeft, new GridBagConstraints( 1, 0, 2, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 0, 0, 9 ), 0, 0 ) );
spMapLeft.addChangeListener( printSizeListener );
}
{
spMapBottom = new JSpinner( new SpinnerNumberModel( 0, -9E9, 9E9, 0.5 ) );
spMapBottom.setValue( mapModel.getEnvelope().getMin().getY() );
pnMapCoord.add( spMapBottom, new GridBagConstraints( 1, 1, 2, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 0, 0, 9 ), 0, 0 ) );
spMapBottom.addChangeListener( printSizeListener );
}
}
{
pnScale = new JPanel();
GridBagLayout pnScaleLayout = new GridBagLayout();
pnPrint.add( pnScale, new GridBagConstraints( 2, 3, 2, 2, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
pnScale.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$MD11802" ) ) );
pnScaleLayout.rowWeights = new double[] { 0.1, 0.1 };
pnScaleLayout.rowHeights = new int[] { 7, 7 };
pnScaleLayout.columnWeights = new double[] { 0.1, 0.1 };
pnScaleLayout.columnWidths = new int[] { 7, 7 };
pnScale.setLayout( pnScaleLayout );
{
rbConst = new JRadioButton( Messages.getMessage( getLocale(), "$MD11803" ) );
pnScale.add( rbConst, new GridBagConstraints( 0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
rbConst.setSelected( true );
bg.add( rbConst );
}
{
rbVariable = new JRadioButton( Messages.getMessage( getLocale(), "$MD11804" ) );
pnScale.add( rbVariable, new GridBagConstraints( 1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
bg.add( rbVariable );
}
{
int[] sc = StringTools.toArrayInt( Messages.getMessage( getLocale(), "$MD11805" ), ",; " );
ListEntry[] le = new ListEntry[sc.length];
for ( int i = 0; i < sc.length; i++ ) {
le[i] = new ListEntry( "1:" + sc[i], sc[i] );
}
cbScale = new JComboBox( new DefaultComboBoxModel( le ) );
cbScale.setSelectedIndex( 6 );
pnScale.add( cbScale, new GridBagConstraints( 0, 1, 2, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 9 ), 0, 0 ) );
cbScale.setEditable( true );
cbScale.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
Object o = cbScale.getSelectedItem();
if ( o instanceof String ) {
try {
// handle use defined scales
ListEntry le = null;
if ( ( (String) o ).indexOf( ":" ) > 0 ) {
String[] t = StringTools.toArray( (String) o, ":", false );
le = new ListEntry( (String) o, Integer.parseInt( t[1].trim() ) );
} else {
le = new ListEntry( "1:" + o, Integer.parseInt( (String) o ) );
}
( (DefaultComboBoxModel) cbScale.getModel() ).addElement( le );
cbScale.setSelectedItem( le );
} catch ( Exception ex ) {
DialogFactory.openWarningDialog( appContainer.getViewPlatform(),
VectorPrintDialog.this,
Messages.get( "$MD11821" ),
Messages.get( "$MD11822" ) );
return;
}
}
updatePreview();
}
} );
}
}
{
pnFormat = new JPanel();
GridBagLayout pnFormatLayout = new GridBagLayout();
pnPrint.add( pnFormat, new GridBagConstraints( 0, 3, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
pnFormat.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$MD11806" ) ) );
pnFormatLayout.rowWeights = new double[] { 0.1 };
pnFormatLayout.rowHeights = new int[] { 7 };
pnFormatLayout.columnWeights = new double[] { 0.1 };
pnFormatLayout.columnWidths = new int[] { 7 };
pnFormat.setLayout( pnFormatLayout );
{
String[] tmp = StringTools.toArray( Messages.getMessage( getLocale(), "$MD11807" ), ",;",
true );
ListEntry[] le = new ListEntry[tmp.length / 2 + 1];
le[0] = new ListEntry( Messages.getMessage( getLocale(), "$MD11829" ), null );
for ( int i = 0; i < tmp.length; i += 2 ) {
le[i / 2 + 1] = new ListEntry( tmp[i], tmp[i + 1] );
}
cbPageFormat = new JComboBox( new DefaultComboBoxModel( le ) );
cbPageFormat.setSelectedIndex( 2 );
pnFormat.add( cbPageFormat, new GridBagConstraints( 0, 0, 3, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 9 ), 0, 0 ) );
// width
lbPageWidth = new JLabel( Messages.getMessage( getLocale(), "$MD11831" ) );
pnFormat.add( lbPageWidth, new GridBagConstraints( 0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 15, 0, 0 ), 0, 0 ) );
tfPageWidth = new JSpinner( new SpinnerNumberModel( inMM( PageSize.A4.getWidth() ), 0,
6080, 1 ) );
pnFormat.add( tfPageWidth, new GridBagConstraints( 1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 5, 0, 0, 0 ), 0, 0 ) );
tfPageWidth.setEnabled( false );
lbPageUnitW = new JLabel( Messages.getMessage( getLocale(), "$MD11832" ) );
pnFormat.add( lbPageUnitW, new GridBagConstraints( 2, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 15 ), 0, 0 ) );
// height
lbPageHeight = new JLabel( Messages.getMessage( getLocale(), "$MD11830" ) );
pnFormat.add( lbPageHeight, new GridBagConstraints( 0, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 15, 0, 0 ), 0, 0 ) );
tfPageHeight = new JSpinner( new SpinnerNumberModel( inMM( PageSize.A4.getHeight() ), 0,
6080, 1 ) );
pnFormat.add( tfPageHeight, new GridBagConstraints( 1, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 5, 0, 0, 0 ), 0, 0 ) );
tfPageHeight.setEnabled( false );
lbPageUnitH = new JLabel( Messages.getMessage( getLocale(), "$MD11832" ) );
pnFormat.add( lbPageUnitH, new GridBagConstraints( 2, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 15 ), 0, 0 ) );
cbPageFormat.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
int width;
int height;
ListEntry le = (ListEntry) ( (JComboBox) e.getSource() ).getSelectedItem();
if ( le.value != null ) {
String value = (String) le.value;
Rectangle rect = PageSize.getRectangle( value );
width = (int) Math.round( rect.getWidth() / 72 * 25.4 );
height = (int) Math.round( rect.getHeight() / 72 * 25.4 );
tfPageWidth.setEnabled( false );
tfPageHeight.setEnabled( false );
} else {
tfPageWidth.setEnabled( true );
tfPageHeight.setEnabled( true );
width = ( (Number) tfPageWidth.getValue() ).intValue();
height = ( (Number) tfPageHeight.getValue() ).intValue();
}
// if page format has been changed max size of printed map must be changed
// for new map size (millimeter) left and top border must be considered to
// ensure that printed map does not overlap paper at the right and at the bottom
width -= ( ( (Number) spLeft.getValue() ).intValue() * 2 );
height -= ( ( (Number) spTop.getValue() ).intValue() * 2 );
spWidth.setValue( width );
spHeight.setValue( height );
// preview of printed area must be updated
updatePreview();
}
} );
}
}
{
pnDPI = new JPanel();
GridBagLayout pnDPILayout = new GridBagLayout();
pnPrint.add( pnDPI, new GridBagConstraints( 0, 4, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets( 0, 0, 0, 0 ),
0, 0 ) );
pnDPI.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(), "$MD11808" ) ) );
pnDPILayout.rowWeights = new double[] { 0.1 };
pnDPILayout.rowHeights = new int[] { 7 };
pnDPILayout.columnWeights = new double[] { 0.1 };
pnDPILayout.columnWidths = new int[] { 7 };
pnDPI.setLayout( pnDPILayout );
{
final DefaultComboBoxModel cbDPIModel = new DefaultComboBoxModel( new Integer[] { 72, 96,
150, 300,
600, 1200,
2400 } );
cbDPI = new JComboBox();
pnDPI.add( cbDPI, new GridBagConstraints( 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 9 ), 0, 0 ) );
cbDPI.setModel( cbDPIModel );
cbDPI.setEditable( true );
cbDPI.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
Object o = cbDPI.getSelectedItem();
if ( o instanceof String ) {
try {
Integer i = Integer.parseInt( o.toString() );
cbDPIModel.addElement( i );
cbDPI.setSelectedItem( i );
} catch ( Exception ex ) {
DialogFactory.openWarningDialog( appContainer.getViewPlatform(),
VectorPrintDialog.this,
Messages.get( "$MD11819" ),
Messages.get( "$MD11820" ) );
}
}
}
} );
}
}
{
pnOutput = new JPanel();
GridBagLayout pnOutputLayout = new GridBagLayout();
pnOutputLayout.rowWeights = new double[] { 0.1 };
pnOutputLayout.rowHeights = new int[] { 7 };
pnOutputLayout.columnWeights = new double[] { 0.1, 0.0, 0.1 };
pnOutputLayout.columnWidths = new int[] { 7, 94, 7 };
pnOutput.setLayout( pnOutputLayout );
pnPrint.add( pnOutput, new GridBagConstraints( 2, 5, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
pnOutput.setBorder( BorderFactory.createTitledBorder( Messages.getMessage( getLocale(),
"$MD11809" ) ) );
{
btOutputFile = new JButton( Messages.get( "$MD11823" ) );
btOutputFile.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
Preferences prefs = Preferences.userNodeForPackage( VectorPrintDialog.class );
File file = GenericFileChooser.showSaveDialog( FILECHOOSERTYPE.externalResource,
appContainer,
VectorPrintDialog.this, prefs,
"print definition",
IGeoFileFilter.PDF );
tfOutputFile.setText( file.getAbsolutePath() );
}
} );
pnOutput.add( btOutputFile, new GridBagConstraints( 2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 9 ), 0, 0 ) );
}
{
tfOutputFile = new JTextField();
pnOutput.add( tfOutputFile, new GridBagConstraints( 0, 0, 2, 1, 0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL,
new Insets( 0, 9, 0, 0 ), 0, 0 ) );
}
}
}
}
pnPreview.setAreaLeft( ( (Number) spLeft.getValue() ).intValue() );
pnPreview.setAreaTop( ( (Number) spTop.getValue() ).intValue() );
pnPreview.setAreaWidth( ( (Number) spWidth.getValue() ).intValue() );
pnPreview.setAreaHeight( ( (Number) spHeight.getValue() ).intValue() );
Rectangle rect;
ListEntry le = (ListEntry) cbPageFormat.getSelectedItem();
if ( le.value != null ) {
rect = PageSize.getRectangle( (String) le.value );
} else {
rect = new Rectangle( inPt( ( (Number) tfPageWidth.getValue() ).intValue() ),
inPt( ( (Number) tfPageHeight.getValue() ).intValue() ) );
}
pnPreview.setPageSize( rect );
this.setBounds( 300, 200, 530, 609 );
} catch ( Exception e ) {
e.printStackTrace();
}
DefaultMapModule<Container> mapModule = getAssignedMapModule();
final Container jco = mapModule.getMapContainer();
jco.addMouseListener( ml );
jco.addMouseMotionListener( mml );
isActive = true;
final MapTool<Container> mapTool = mapModule.getMapTool();
mapTool.addChangeListener( this );
addWindowFocusListener( new WindowFocusListener() {
@Override
public void windowLostFocus( WindowEvent e ) {
}
@Override
public void windowGainedFocus( WindowEvent e ) {
mapTool.resetState();
// it is required to add the listeners again, cause it seems some other module removes all...
jco.addMouseListener( ml );
jco.addMouseMotionListener( mml );
isActive = true;
}
} );
}
private int inPt( int inMM ) {
return (int) Math.round( ( (double) inMM / 25.4 * 72 ) );
}
private int inMM( float inPt ) {
return (int) Math.round( inPt / 72 * 25.4 );
}
private void doPrint() {
PrintDescriptionBean pdb = new PrintDescriptionBean();
pdb.setAreaHeight( ( (Number) spHeight.getValue() ).intValue() );
pdb.setAreaWidth( ( (Number) spWidth.getValue() ).intValue() );
pdb.setAreaLeft( ( (Number) spLeft.getValue() ).intValue() );
pdb.setAreaTop( ( (Number) spTop.getValue() ).intValue() );
pdb.setDpi( (Integer) cbDPI.getSelectedItem() );
pdb.setMapBottom( ( (Number) spMapBottom.getValue() ).doubleValue() );
pdb.setMapLeft( ( (Number) spMapLeft.getValue() ).doubleValue() );
ListEntry le = (ListEntry) cbPageFormat.getSelectedItem();
if ( le.value != null ) {
pdb.setPageFormat( (String) le.value );
} else {
pdb.setPageWidth( inPt( ( (Number) tfPageWidth.getValue() ).intValue() ) );
pdb.setPageHeight( inPt( ( (Number) tfPageHeight.getValue() ).intValue() ) );
}
if ( rbConst.isSelected() ) {
pdb.setScale( (Integer) ( (ListEntry) cbScale.getSelectedItem() ).value );
} else {
pdb.setScale( -1 );
}
pdb.setTargetFile( tfOutputFile.getText() );
VectorPrintCommand cmd = new VectorPrintCommand();
cmd.setApplicationContainer( appContainer );
cmd.setPrintDefinition( pdb );
try {
appContainer.getCommandProcessor().executeSychronously( cmd, false );
} catch ( Exception e ) {
DialogFactory.openErrorDialog( appContainer.getViewPlatform(), this,
Messages.getMessage( getLocale(), "$MD11810" ),
Messages.getMessage( getLocale(), "$MD11811" ), e );
}
DialogFactory.openInformationDialog( appContainer.getViewPlatform(), this,
Messages.getMessage( getLocale(), "$MD11824" ), "INFORMATION" );
}
/**
* <pre>
* <PrintDefinition xmlns="http://www.deegree.org/print">
* <AreaHeight>180</AreaHeight>
* <AreaWidth>270</AreaWidth>
* <AreaLeft>10</AreaLeft>
* <AreaTop>10</AreaTop>
* <DPI>300</DPI>
* <MapLeft>2597678</MapLeft>
* <MapBottom>5697438</MapBottom>
* <PageFormat>
* <Named label="Din A4">A4</Named>
* <!-- or -->
* <Extent>
* <width unit="pt">300.0</width>
* <height unit="pt">500.0</height>
* <Extent>
* </PageFormat>
* <Scale>25000</Scale>
* <TargetFile>e:/temp/test.pdf</TargetFile>
* </PrintDefinition>
* </pre>
*/
private void doSaveSettings() {
Preferences prefs = Preferences.userNodeForPackage( VectorPrintDialog.class );
File file = GenericFileChooser.showSaveDialog( FILECHOOSERTYPE.externalResource, appContainer, this, prefs,
"print definition", IGeoFileFilter.XML );
if ( file == null ) {
// cancel has been pressed
return;
}
XMLFragment xml = new XMLFragment( new QualifiedName( "PrintDefinition",
URI.create( "http://www.deegree.org/print" ) ) );
Document doc = xml.getRootElement().getOwnerDocument();
Element root = xml.getRootElement();
try {
// fill XML document
Element el = doc.createElementNS( "http://www.deegree.org/print", "AreaHeight" );
XMLTools.setNodeValue( el, spHeight.getValue().toString() );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "AreaWidth" );
XMLTools.setNodeValue( el, spWidth.getValue().toString() );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "AreaLeft" );
XMLTools.setNodeValue( el, spLeft.getValue().toString() );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "AreaTop" );
XMLTools.setNodeValue( el, spTop.getValue().toString() );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "DPI" );
XMLTools.setNodeValue( el, cbDPI.getSelectedItem().toString() );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "MapLeft" );
XMLTools.setNodeValue( el, spMapLeft.getValue().toString() );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "MapBottom" );
XMLTools.setNodeValue( el, spMapBottom.getValue().toString() );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "PageFormat" );
Element subEl;
ListEntry le = (ListEntry) cbPageFormat.getSelectedItem();
if ( le.value != null ) {
subEl = doc.createElementNS( "http://www.deegree.org/print", "Named" );
XMLTools.setNodeValue( subEl, le.value.toString() );
subEl.setAttribute( "label", le.title );
} else {
subEl = doc.createElementNS( "http://www.deegree.org/print", "Extent" );
Element w = doc.createElementNS( "http://www.deegree.org/print", "width" );
XMLTools.setNodeValue( w, Integer.toString( ( (Number) tfPageWidth.getValue() ).intValue() ) );
w.setAttribute( "unit", "mm" );
subEl.appendChild( w );
Element h = doc.createElementNS( "http://www.deegree.org/print", "height" );
XMLTools.setNodeValue( h, Integer.toString( ( (Number) tfPageHeight.getValue() ).intValue() ) );
h.setAttribute( "unit", "mm" );
subEl.appendChild( h );
}
el.appendChild( subEl );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "Scale" );
if ( rbConst.isSelected() ) {
XMLTools.setNodeValue( el, ( (ListEntry) cbScale.getSelectedItem() ).value.toString() );
} else {
XMLTools.setNodeValue( el, "-1" );
}
el.setAttribute( "label", ( (ListEntry) cbScale.getSelectedItem() ).title );
root.appendChild( el );
el = doc.createElementNS( "http://www.deegree.org/print", "TargetFile" );
XMLTools.setNodeValue( el, tfOutputFile.getText() );
root.appendChild( el );
// write to file
FileOutputStream fos = new FileOutputStream( file );
Properties props = new Properties();
props.put( OutputKeys.ENCODING, "UTF-8" );
xml.write( fos, props );
fos.close();
} catch ( Exception e ) {
LOG.logError( e );
DialogFactory.openErrorDialog( appContainer.getViewPlatform(), this,
Messages.getMessage( getLocale(), "$MD11812" ),
Messages.getMessage( getLocale(), "$MD11813" ), e );
}
}
/**
* <pre>
* <PrintDefinition xmlns="http://www.deegree.org/print">
* <AreaHeight>180</AreaHeight>
* <AreaWidth>270</AreaWidth>
* <AreaLeft>10</AreaLeft>
* <AreaTop>10</AreaTop>
* <DPI>300</DPI>
* <MapLeft>2597678</MapLeft>
* <MapBottom>5697438</MapBottom>
* <PageFormat>
* <Named label="Din A4">A4</Named>
* <!-- or -->
* <Extent>
* <width unit="pt">300</width>
* <height unit="pt">500</height>
* <Extent>
* </PageFormat>
* <Scale label="1:25000">25000</Scale>
* <TargetFile>e:/temp/test.pdf</TargetFile>
* </PrintDefinition>
* </pre>
*/
private void doLoadSettings() {
Preferences prefs = Preferences.userNodeForPackage( VectorPrintDialog.class );
File file = GenericFileChooser.showOpenDialog( FILECHOOSERTYPE.externalResource, appContainer, this, prefs,
"print definition", IGeoFileFilter.XML );
if ( file == null ) {
// cancel has been pressed
return;
}
FileSystemAccessFactory fsaf = FileSystemAccessFactory.getInstance( appContainer );
try {
FileSystemAccess fsa = fsaf.getFileSystemAccess( FILECHOOSERTYPE.externalResource );
URL url = fsa.getFileURL( file.getAbsolutePath() );
XMLFragment xml = new XMLFragment( url );
NamespaceContext nsc = CommonNamespaces.getNamespaceContext();
nsc.addNamespace( "prnt", URI.create( "http://www.deegree.org/print" ) );
int ah = XMLTools.getRequiredNodeAsInt( xml.getRootElement(), "prnt:AreaHeight", nsc );
int aw = XMLTools.getRequiredNodeAsInt( xml.getRootElement(), "prnt:AreaWidth", nsc );
int al = XMLTools.getRequiredNodeAsInt( xml.getRootElement(), "prnt:AreaLeft", nsc );
int at = XMLTools.getRequiredNodeAsInt( xml.getRootElement(), "prnt:AreaTop", nsc );
int dpi = XMLTools.getRequiredNodeAsInt( xml.getRootElement(), "prnt:DPI", nsc );
double ml = XMLTools.getRequiredNodeAsDouble( xml.getRootElement(), "prnt:MapLeft", nsc );
double mb = XMLTools.getRequiredNodeAsDouble( xml.getRootElement(), "prnt:MapBottom", nsc );
String pageFormatName = XMLTools.getNodeAsString( xml.getRootElement(), "prnt:PageFormat/prnt:Named", nsc,
null );
String pageFormatLabel = XMLTools.getNodeAsString( xml.getRootElement(),
"prnt:PageFormat/prnt:Named/@label", nsc, null );
int pageFormatWidth = XMLTools.getNodeAsInt( xml.getRootElement(),
"prnt:PageFormat/prnt:Extent/prnt:width", nsc, -1 );
int pageFormatHeight = XMLTools.getNodeAsInt( xml.getRootElement(),
"prnt:PageFormat/prnt:Extent/prnt:height", nsc, -1 );
int sc = XMLTools.getNodeAsInt( xml.getRootElement(), "prnt:Scale", nsc, -1 );
String scl = XMLTools.getNodeAsString( xml.getRootElement(), "prnt:Scale/@label", nsc, null );
String tf = XMLTools.getNodeAsString( xml.getRootElement(), "prnt:TargetFilet", nsc, "" );
// set pageFormat first, to avoid that spHeight and spWidth from the imported file are overwritten!
if ( pageFormatName != null ) {
cbPageFormat.setSelectedItem( new ListEntry( pageFormatLabel, pageFormatName ) );
} else if ( pageFormatWidth < 0 ) {
cbPageFormat.setSelectedIndex( 2 );
} else {
cbPageFormat.setSelectedIndex( 0 );
tfPageHeight.setValue( pageFormatHeight );
tfPageHeight.setEnabled( true );
tfPageWidth.setValue( pageFormatWidth );
tfPageWidth.setEnabled( true );
}
spHeight.setValue( ah );
spWidth.setValue( aw );
spLeft.setValue( al );
spTop.setValue( at );
cbDPI.setSelectedItem( new Integer( dpi ) );
spMapLeft.setValue( new Double( ml ) );
spMapBottom.setValue( new Double( mb ) );
if ( sc > -1 ) {
rbConst.setSelected( true );
cbScale.setSelectedItem( new ListEntry( scl, sc ) );
} else {
rbVariable.setSelected( true );
}
tfOutputFile.setText( tf );
} catch ( Exception e ) {
LOG.logError( e );
DialogFactory.openErrorDialog( appContainer.getViewPlatform(), this,
Messages.getMessage( getLocale(), "$MD11814" ),
Messages.getMessage( getLocale(), "$MD11815" ), e );
}
}
private void updatePreview() {
if ( isVisible() ) {
movePreviewRectangle();
Rectangle r;
int pw;
int ph;
ListEntry le = (ListEntry) cbPageFormat.getSelectedItem();
if ( le.value != null ) {
tfPageWidth.setEnabled( false );
tfPageHeight.setEnabled( false );
r = PageSize.getRectangle( (String) le.value );
pw = (int) Math.round( r.getWidth() / 72 * 25.4 );
ph = (int) Math.round( r.getHeight() / 72 * 25.4 );
} else {
tfPageWidth.setEnabled( true );
tfPageHeight.setEnabled( true );
pw = ( (Number) tfPageWidth.getValue() ).intValue();
ph = ( (Number) tfPageHeight.getValue() ).intValue();
r = new Rectangle( inPt( pw ), inPt( ph ) );
}
lbPageSize.setText( Messages.getMessage( getLocale(), "$MD11816", pw, ph ) );
pnPreview.setAreaLeft( ( (Number) spLeft.getValue() ).intValue() );
pnPreview.setAreaTop( ( (Number) spTop.getValue() ).intValue() );
pnPreview.setAreaWidth( ( (Number) spWidth.getValue() ).intValue() );
pnPreview.setAreaHeight( ( (Number) spHeight.getValue() ).intValue() );
pnPreview.setPageSize( r );
pnPreview.repaint();
}
}
private void movePreviewRectangle() {
java.awt.Rectangle rect = getCanvasSize();
Envelope extent = mapModel.getEnvelope();
extent = MapUtils.ensureAspectRatio( extent, (Integer) spWidth.getValue(), (Integer) spHeight.getValue() );
if ( rbConst.isSelected() ) {
// use scale selected by used
double currentScale = MapUtils.calcScale( rect.width, rect.height, extent, extent.getCoordinateSystem(),
0.0254 / (Integer) cbDPI.getSelectedItem() );
extent = MapUtils.scaleEnvelope( extent, currentScale,
(Integer) ( (ListEntry) cbScale.getSelectedItem() ).value );
}
// move rectangle to defined lower left coordinates
double dx = ( (Number) spMapLeft.getValue() ).doubleValue() - extent.getMin().getX();
double dy = ( (Number) spMapBottom.getValue() ).doubleValue() - extent.getMin().getY();
extent.translate( dx, dy );
try {
Geometry geom = GeometryFactory.createSurface( extent, mapModel.getCoordinateSystem() );
MemoryFeatureAdapter adapter = (MemoryFeatureAdapter) previewLayer.getDataAccess().get( 0 );
FeatureCollection fc = adapter.getFeatureCollection();
Feature f = fc.getFeature( 0 );
FeatureProperty prop = f.getProperties()[1];
prop.setValue( geom );
adapter.updateFeature( f );
adapter.commitChanges();
} catch ( Exception e ) {
LOG.logError( e );
}
}
private void addPreviewLayer() {
java.awt.Rectangle rect = getCanvasSize();
Envelope extent = mapModel.getEnvelope();
extent = MapUtils.ensureAspectRatio( extent, (Integer) spWidth.getValue(), (Integer) spHeight.getValue() );
if ( rbConst.isSelected() ) {
// use scale selected by used
double currentScale = MapUtils.calcScale( rect.width, rect.height, extent, extent.getCoordinateSystem(),
0.0254 / (Integer) cbDPI.getSelectedItem() );
extent = MapUtils.scaleEnvelope( extent, currentScale,
(Integer) ( (ListEntry) cbScale.getSelectedItem() ).value );
}
// move rectangle to defined lower left coordinates
double dx = ( (Number) spMapLeft.getValue() ).doubleValue() - extent.getMin().getX();
double dy = ( (Number) spMapBottom.getValue() ).doubleValue() - extent.getMin().getY();
extent.translate( dx, dy );
try {
Geometry geom = GeometryFactory.createSurface( extent, mapModel.getCoordinateSystem() );
List<Geometry> list = new ArrayList<Geometry>();
list.add( geom );
AddMemoryLayerCommand cmd = new AddMemoryLayerCommand();
cmd.setApplicationContainer( appContainer );
cmd.setTitle( "deegree:PrintBorder" );
cmd.setGeometries( list );
cmd.execute();
previewLayer = (Layer) cmd.getResult();
} catch ( Exception e ) {
LOG.logError( e );
}
}
/**
* Fetches and returns the active map module
*
* @return the active map module
*/
@SuppressWarnings("unchecked")
DefaultMapModule<Container> getAssignedMapModule() {
List<?> modules = appContainer.getModules();
MapModel mapModel = appContainer.getMapModel( null );
DefaultMapModule<Container> mapModule = null;
for ( Object module : modules ) {
if ( module instanceof DefaultMapModule<?> ) {
String t = ( (IModule<?>) module ).getInitParameter( "assignedMapModel" );
if ( t != null && mapModel != null && t.equals( mapModel.getIdentifier().getValue() ) ) {
return (DefaultMapModule<Container>) module;
} else {
if ( mapModule == null )
mapModule = (DefaultMapModule<Container>) module;
}
}
}
return mapModule;
}
private int convert( double millimeter ) {
return (int) Math.round( millimeter * (Integer) cbDPI.getSelectedItem() / 25.4 );
}
private java.awt.Rectangle getCanvasSize() {
int w = convert( (Integer) spWidth.getValue() );
int h = convert( (Integer) spHeight.getValue() );
int x = convert( (Integer) spLeft.getValue() );
int y = convert( (Integer) spTop.getValue() );
return new java.awt.Rectangle( x, y, w, h );
}
private void removePreviewLayer() {
if ( previewLayer != null && mapModel.exists( previewLayer.getIdentifier() ) ) {
mapModel.remove( previewLayer );
}
if ( previewLayer != null ) {
previewLayer.destroy();
previewLayer = null;
}
}
@Override
public void valueChanged( ValueChangedEvent event ) {
isActive = false;
}
// /////////////////////////////////////////////////////////////////////////////////////////////////////
// inner classes
// /////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* TODO add class documentation here
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
private class PrintSizeListener implements ChangeListener {
/*
* (non-Javadoc)
*
* @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
*/
public void stateChanged( ChangeEvent arg0 ) {
updatePreview();
}
}
/**
*
* TODO add class documentation here
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
private static class ListEntry {
String title;
Object value;
/**
* @param title
* @param value
*/
public ListEntry( String title, Object value ) {
this.title = title;
this.value = value;
}
@Override
public String toString() {
return title;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ( ( title == null ) ? 0 : title.hashCode() );
result = prime * result + ( ( value == null ) ? 0 : value.hashCode() );
return result;
}
@Override
public boolean equals( Object obj ) {
if ( this == obj )
return true;
if ( obj == null )
return false;
if ( !( obj instanceof ListEntry ) )
return false;
ListEntry other = (ListEntry) obj;
if ( title == null ) {
if ( other.title != null )
return false;
} else if ( !title.equals( other.title ) )
return false;
if ( value == null ) {
if ( other.value != null )
return false;
} else if ( !value.equals( other.value ) )
return false;
return true;
}
}
/**
*
* TODO add class documentation here
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
private class PrintMouseListener extends MouseAdapter {
@Override
public void mousePressed( MouseEvent e ) {
GeoTransform gt = mapModel.getToTargetDeviceTransformation();
double x = gt.getSourceX( e.getX() );
double y = gt.getSourceY( e.getY() );
pressPoint = GeometryFactory.createPoint( x, y, mapModel.getCoordinateSystem() );
LayerComponent.vectorPrintDialogPreviewHack = true;
}
@Override
public void mouseReleased( MouseEvent e ) {
GeoTransform gt = mapModel.getToTargetDeviceTransformation();
double x = gt.getSourceX( e.getX() );
double y = gt.getSourceY( e.getY() );
Point releasePoint = GeometryFactory.createPoint( x, y, mapModel.getCoordinateSystem() );
double dx = releasePoint.getX() - pressPoint.getX();
double dy = releasePoint.getY() - pressPoint.getY();
spMapLeft.setValue( ( (Number) spMapLeft.getValue() ).doubleValue() + dx );
spMapBottom.setValue( ( (Number) spMapBottom.getValue() ).doubleValue() + dy );
LayerComponent.vectorPrintDialogPreviewHack = false;
}
}
private class PrintMouseMotionListener extends MouseMotionAdapter {
@Override
public void mouseDragged( MouseEvent e ) {
if ( isActive ) {
GeoTransform gt = mapModel.getToTargetDeviceTransformation();
double x = gt.getSourceX( e.getX() );
double y = gt.getSourceY( e.getY() );
Point dragPoint = GeometryFactory.createPoint( x, y, mapModel.getCoordinateSystem() );
double dx = dragPoint.getX() - pressPoint.getX();
double dy = dragPoint.getY() - pressPoint.getY();
spMapLeft.setValue( ( (Number) spMapLeft.getValue() ).doubleValue() + dx );
spMapBottom.setValue( ( (Number) spMapBottom.getValue() ).doubleValue() + dy );
pressPoint = dragPoint;
}
}
}
}