/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.filechooser.FileFilter;
import ilog.views.IlvRect;
import ilog.views.io.IlvReadFileException;
import ilog.views.maps.IlvDMSCoordinateFormatter;
import ilog.views.maps.beans.editor.IlvCoordinatePanelFactory;
import ilog.views.maps.servlet.IlvManagerTiler;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformationException;
import ilog.views.util.IlvProductUtil;
import ilog.views.util.servlet.tiling.IlvFileTileManager;
/**
* Code sample to show how to use the <code>IlvManagerTiler</code> class to
* generate tiled images of a map for thin client use.
*
* @author eaullas
*
*/
public class TileGenerator extends JFrame {
JTextField mapFilenameField;
JTextField outputDirField;
JTextField diskSizeField;
JCheckBox specifyArea;
IlvManagerTiler managerTiler;
JFileChooser mapFileChooser;
JFileChooser outputDirChooser;
JComboBox<String> formatCombo;
private IlvCoordinatePanelFactory.CoordRectangleInputPanel coordPanel;
/**
* Creates a tile generator
*
* @param outputDir
* default output directory(or null)
* @param map
* default map name (or null)
* @param diskLimit
* disk limit in MB.
* @throws HeadlessException
*/
public TileGenerator(String outputDir, String map, int diskLimit) throws HeadlessException {
super();
initGUI(outputDir, map, diskLimit);
setTitle("Thin client tile generator"); //$NON-NLS-1$
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
}
private void initGUI(String outputDir, String map, int diskLimit) {
JLabel mapFilenameLabel = new JLabel("Map filename"); //$NON-NLS-1$
JLabel outputDirLabel = new JLabel("Output directory"); //$NON-NLS-1$
JLabel diskSizeLabel = new JLabel("Disk size limit"); //$NON-NLS-1$
JLabel MBLabel = new JLabel("MBytes"); //$NON-NLS-1$
mapFilenameField = new JTextField(25);
if (map != null) {
mapFilenameField.setText(map);
}
outputDirField = new JTextField(25);
if (outputDir != null) {
outputDirField.setText(outputDir);
}
diskSizeField = new JTextField(5);
diskSizeField.setText("" + diskLimit); //$NON-NLS-1$
Dimension buttonDimension = new Dimension(25, 20);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridBagLayout());
mainPanel.setBorder(new CompoundBorder(new EmptyBorder(3, 3, 3, 3), new EtchedBorder()));
mainPanel.add(mapFilenameLabel, new GridBagConstraints(0, 0, 2, 1, 0, 0, GridBagConstraints.LINE_START,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
mainPanel.add(mapFilenameField, new GridBagConstraints(2, 0, 2, 1, 0, 0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
JButton filenameChooserButton = new JButton("..."); //$NON-NLS-1$
filenameChooserButton.setPreferredSize(buttonDimension);
filenameChooserButton.setToolTipText("Choose map file"); //$NON-NLS-1$
filenameChooserButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
if (mapFileChooser == null) {
mapFileChooser = new JFileChooser();
mapFileChooser.setMultiSelectionEnabled(false);
FileFilter filter = new FileFilter() {
Override
public boolean accept(File pathname) {
boolean accept = pathname.isDirectory() || pathname.getName().endsWith("ivl") //$NON-NLS-1$
|| pathname.getName().endsWith("IVL"); //$NON-NLS-1$
return accept;
}
Override
public String getDescription() {
return "JViews maps .ivl file"; //$NON-NLS-1$
}
};
mapFileChooser.setFileFilter(filter);
}
int result = mapFileChooser.showDialog(TileGenerator.this, "Open map file"); //$NON-NLS-1$
if (result == JFileChooser.APPROVE_OPTION) {
mapFileChooser.getSelectedFile();
mapFilenameField.setText(mapFileChooser.getSelectedFile().getPath());
}
}
});
mainPanel.add(filenameChooserButton, new GridBagConstraints(4, 0, 1, 1, 0, 0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
mainPanel.add(outputDirLabel, new GridBagConstraints(0, 1, 2, 1, 0, 0, GridBagConstraints.LINE_START,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
mainPanel.add(outputDirField, new GridBagConstraints(2, 1, 2, 1, 0, 0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
JButton outputDirChooserButton = new JButton("..."); //$NON-NLS-1$
outputDirChooserButton.setPreferredSize(buttonDimension);
outputDirChooserButton.setToolTipText("Choose output folder"); //$NON-NLS-1$
outputDirChooserButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
if (outputDirChooser == null) {
outputDirChooser = new JFileChooser();
outputDirChooser.setMultiSelectionEnabled(false);
outputDirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
}
int result = outputDirChooser.showDialog(TileGenerator.this, "Select output folder"); //$NON-NLS-1$
if (result == JFileChooser.APPROVE_OPTION) {
outputDirChooser.getSelectedFile();
outputDirField.setText(outputDirChooser.getSelectedFile().getPath());
}
}
});
mainPanel.add(outputDirChooserButton, new GridBagConstraints(4, 1, 1, 1, 0, 0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
mainPanel.add(diskSizeLabel, new GridBagConstraints(1, 2, 1, 1, 0, 0, GridBagConstraints.LINE_START,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
mainPanel.add(diskSizeField, new GridBagConstraints(2, 2, 1, 1, 0, 0, GridBagConstraints.LINE_START,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
mainPanel.add(MBLabel, new GridBagConstraints(3, 2, 1, 1, 0, 0, GridBagConstraints.LINE_START,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
specifyArea = new JCheckBox("Specify area of interest"); //$NON-NLS-1$
mainPanel.add(specifyArea, new GridBagConstraints(1, 3, 1, 1, 0, 0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
specifyArea.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
coordPanel.setEnabled(specifyArea.isSelected());
}
});
formatCombo = new JComboBox<String>(new String[] { "JPEG", "PNG" }); //$NON-NLS-1$ //$NON-NLS-2$
JLabel formatLabel = new JLabel("Image format"); //$NON-NLS-1$
JPanel panel = new JPanel();
panel.add(formatLabel);
panel.add(formatCombo);
mainPanel.add(panel, new GridBagConstraints(3, 3, 1, 1, 0, 0, GridBagConstraints.LINE_START,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
coordPanel = IlvCoordinatePanelFactory.createCoordRectangleInputPanel(null, new IlvDMSCoordinateFormatter());
coordPanel.setLatLonMax(Math.PI / 2, Math.PI);
coordPanel.setLatLonMin(-Math.PI / 2, -Math.PI);
coordPanel.setEnabled(specifyArea.isSelected());
mainPanel.add(coordPanel, new GridBagConstraints(0, 4, 5, 2, 0, 0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(5, 3, 5, 3), 0, 0));
JButton generateButton = new JButton("Generate tiles"); //$NON-NLS-1$
generateButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
try {
boolean result = generateTiles();
if (result) {
String message = "Tile generation completed."; //$NON-NLS-1$
JOptionPane.showMessageDialog(TileGenerator.this, message, "Completed", //$NON-NLS-1$
JOptionPane.INFORMATION_MESSAGE);
}
} catch (RuntimeException e1) {
String message = "This map does not contain required thin client parameters." + //$NON-NLS-1$
"\nPlease use JViews MapBuilder to set these parameters."; //$NON-NLS-1$
JOptionPane.showMessageDialog(TileGenerator.this, message, "Missing parameters", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
}
}
});
mainPanel.add(generateButton, new GridBagConstraints(0, 6, 5, 1, 0, 0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(15, 3, 5, 3), 0, 0));
getContentPane().add(mainPanel);
}
/**
*
*
*/
private boolean generateTiles() {
String mapFilename = mapFilenameField.getText();
if (mapFilename == null || !(new File(mapFilename).exists())) {
JOptionPane.showMessageDialog(this, "Map file not found. Please check filename", //$NON-NLS-1$
"File not found", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
return false;
}
String outputFolder = outputDirField.getText();
if (outputFolder == null || outputFolder.length() == 0) {
JOptionPane.showMessageDialog(this, "Output folder not set. Please check output folder.", //$NON-NLS-1$
"Output folder not set", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
return false;
}
// check if folder is not empty
File folder = new File(outputFolder);
if (folder.exists() && folder.listFiles().length > 0) {
int result = JOptionPane.showConfirmDialog(this,
"Output folder is not empty. Some files might be overwritten." + //$NON-NLS-1$
" \nDo you want to use this folder anyway ?", //$NON-NLS-1$
"Output folder not empty", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
if (!(result == JOptionPane.YES_OPTION)) {
return false;
}
}
int diskSize = 100;
try {
diskSize = Integer.parseInt(diskSizeField.getText());
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, "Incorrect disk size limit. Please enter a positive integer", //$NON-NLS-1$
"Incorrect value", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
return false;
}
try {
if (managerTiler == null) {
managerTiler = new IlvManagerTiler();
}
if (formatCombo.getSelectedIndex() == 0) {
managerTiler.setImageFormat(IlvFileTileManager.JPEG_FORMAT);
} else {
managerTiler.setImageFormat(IlvFileTileManager.PNG_FORMAT);
}
IlvRect area = null;
if (specifyArea.isSelected()) {
float lonMin = (float) coordPanel.getLonMin();
float lonMax = (float) coordPanel.getLonMax();
float latMin = (float) coordPanel.getLatMin();
float latMax = (float) coordPanel.getLatMax();
area = new IlvRect(lonMin, latMin, lonMax - lonMin, latMax - latMin);
}
try {
managerTiler.createTiles(mapFilename, area, new File(outputFolder), diskSize * 1024 * 1024);
} catch (IlvCoordinateTransformationException e) {
// can not happen since no specified region
}
} catch (IOException e) {
e.printStackTrace();
} catch (IlvReadFileException e) {
e.printStackTrace();
}
return true;
}
/**
* Main method.
*
* @param args
* ignored
*/
public static void main(final String[] args) {
// This sample uses JViews Maps features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Maps Deployment license.
IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Maps_Deployment);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
String rep = null;
String map = null;
int diskLimit = 100;
if (args.length > 0) {
rep = args[0];
}
if (args.length > 1) {
map = args[1];
}
if (args.length > 2) {
try {
diskLimit = Integer.parseInt(args[2]);
} catch (NumberFormatException ex) {
ex.printStackTrace();
}
}
TileGenerator frame = new TileGenerator(rep, map, diskLimit);
frame.setVisible(true);
}
});
}
}