X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2FShowThreeDFunction.java;h=bbe771988fd640ee673a81b28f8d04c16cc95191;hp=8ba0f41af3ba6b627f1d9e1fa61af29ea9a0840f;hb=326f489e36aa7f235bc19409a57bf4955cd50f24;hpb=8c8868ae29b3252f02e094c02307384cf61ba667 diff --git a/tim/prune/function/ShowThreeDFunction.java b/tim/prune/function/ShowThreeDFunction.java index 8ba0f41..bbe7719 100644 --- a/tim/prune/function/ShowThreeDFunction.java +++ b/tim/prune/function/ShowThreeDFunction.java @@ -1,19 +1,45 @@ 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 @@ -42,11 +68,107 @@ public class ShowThreeDFunction extends GenericFunction 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 in config + Config.setConfigInt(Config.KEY_HEIGHT_EXAGGERATION, (int) (_exaggField.getValue() * 100)); + ThreeDWindow window = WindowFactory.getWindow(_parentFrame); + if (window != null) { try { - // Pass the track object and show the window + // 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.show(); } catch (ThreeDException e)