X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2FShowThreeDFunction.java;fp=src%2Ftim%2Fprune%2Ffunction%2FShowThreeDFunction.java;h=c2e285b3fc2839cecbfc38debacb880817631dce;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/ShowThreeDFunction.java b/src/tim/prune/function/ShowThreeDFunction.java new file mode 100644 index 0000000..c2e285b --- /dev/null +++ b/src/tim/prune/function/ShowThreeDFunction.java @@ -0,0 +1,185 @@ +package tim.prune.function; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import tim.prune.App; +import tim.prune.GenericFunction; +import tim.prune.I18nManager; +import tim.prune.config.Config; +import tim.prune.gui.BaseImageDefinitionPanel; +import tim.prune.gui.DecimalNumberField; +import tim.prune.gui.TerrainDefinitionPanel; +import tim.prune.threedee.TerrainDefinition; +import tim.prune.threedee.ThreeDException; +import tim.prune.threedee.ThreeDWindow; +import tim.prune.threedee.WindowFactory; +import tim.prune.tips.TipManager; + +/** + * Class to show the 3d window + */ +public class ShowThreeDFunction extends GenericFunction +{ + /** Dialog for input parameters */ + private JDialog _dialog = null; + /** Field for altitude exaggeration value */ + private DecimalNumberField _exaggField = null; + /** Component for defining the base image */ + private BaseImageDefinitionPanel _baseImagePanel = null; + /** Component for defining the terrain */ + private TerrainDefinitionPanel _terrainPanel = null; + + /** + * Constructor + * @param inApp app object + */ + public ShowThreeDFunction(App inApp) + { + super(inApp); + } + + /** + * Get the name key + */ + public String getNameKey() { + return "function.show3d"; + } + + /** + * Begin the function + */ + public void begin() + { + ThreeDWindow window = WindowFactory.getWindow(_parentFrame); + if (window == null) + { + JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.function.nojava3d"), + I18nManager.getText("error.function.notavailable.title"), JOptionPane.WARNING_MESSAGE); + } + else + { + // See if the track has any altitudes at all - if not, show a tip to use SRTM + if (!_app.getTrackInfo().getTrack().hasAltitudeData()) { + _app.showTip(TipManager.Tip_UseSrtmFor3d); + } + // Show a dialog to get the parameters + if (_dialog == null) + { + _dialog = new JDialog(_app.getFrame(), I18nManager.getText(getNameKey()), true); + _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + _dialog.getContentPane().add(makeDialogComponents()); + _dialog.pack(); + } + final int exaggFactor = Config.getConfigInt(Config.KEY_HEIGHT_EXAGGERATION); + if (exaggFactor > 0) { + _exaggField.setValue(exaggFactor / 100.0); + } + _baseImagePanel.updateBaseImageDetails(); + _dialog.setLocationRelativeTo(_app.getFrame()); + _dialog.setVisible(true); + } + } + + /** + * Make the dialog components to select the options + * @return JPanel holding the gui elements + */ + private JPanel makeDialogComponents() + { + JPanel mainPanel = new JPanel(); + mainPanel.setLayout(new BorderLayout(4, 4)); + + JPanel innerPanel = new JPanel(); + innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.Y_AXIS)); + // Panel for altitude exaggeration + JPanel exaggPanel = new JPanel(); + exaggPanel.setLayout(new FlowLayout()); + exaggPanel.add(new JLabel(I18nManager.getText("dialog.3d.altitudefactor") + ": ")); + _exaggField = new DecimalNumberField(); // don't allow negative numbers + _exaggField.setText("5.0"); + exaggPanel.add(_exaggField); + innerPanel.add(exaggPanel); + innerPanel.add(Box.createVerticalStrut(4)); + + // Panel for terrain + _terrainPanel = new TerrainDefinitionPanel(); + innerPanel.add(_terrainPanel); + mainPanel.add(innerPanel, BorderLayout.NORTH); + innerPanel.add(Box.createVerticalStrut(4)); + + // Panel for base image (null because we don't need callback) + _baseImagePanel = new BaseImageDefinitionPanel(null, _dialog, _app.getTrackInfo().getTrack()); + innerPanel.add(_baseImagePanel); + + // OK, Cancel buttons + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); + JButton okButton = new JButton(I18nManager.getText("button.ok")); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + _dialog.dispose(); + new Thread(new Runnable() { + public void run() { + finish(); // needs to be in separate thread + } + }).start(); + } + }); + buttonPanel.add(okButton); + JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + _dialog.dispose(); + } + }); + buttonPanel.add(cancelButton); + mainPanel.add(buttonPanel, BorderLayout.SOUTH); + + return mainPanel; + } + + /** + * All parameters have been selected in the input dialog, now we can go to the 3d window + */ + private void finish() + { + // Store exaggeration factor and grid size in config + Config.setConfigInt(Config.KEY_HEIGHT_EXAGGERATION, (int) (_exaggField.getValue() * 100)); + int terrainGridSize = _terrainPanel.getGridSize(); + if (terrainGridSize < 20) {terrainGridSize = 20;} + Config.setConfigInt(Config.KEY_TERRAIN_GRID_SIZE, terrainGridSize); + + ThreeDWindow window = WindowFactory.getWindow(_parentFrame); + if (window != null) + { + try + { + // Pass the parameters to use and show the window + window.setTrack(_app.getTrackInfo().getTrack()); + window.setAltitudeFactor(_exaggField.getValue()); + // Also pass the base image parameters from input dialog + window.setBaseImageParameters(_baseImagePanel.getImageDefinition()); + window.setTerrainParameters(new TerrainDefinition(_terrainPanel.getUseTerrain(), _terrainPanel.getGridSize())); + window.setDataStatus(_app.getCurrentDataStatus()); + window.show(); + } + catch (ThreeDException e) + { + _app.showErrorMessageNoLookup(getNameKey(), I18nManager.getText("error.3d") + ": " + e.getMessage()); + } + } + } +}