]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/function/AddMapSourceDialog.java
Version 10, May 2010
[GpsPrune.git] / tim / prune / function / AddMapSourceDialog.java
diff --git a/tim/prune/function/AddMapSourceDialog.java b/tim/prune/function/AddMapSourceDialog.java
new file mode 100644 (file)
index 0000000..d7126ea
--- /dev/null
@@ -0,0 +1,309 @@
+package tim.prune.function;
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+
+import tim.prune.I18nManager;
+import tim.prune.gui.map.CloudmadeMapSource;
+import tim.prune.gui.map.MapSource;
+import tim.prune.gui.map.MapSourceLibrary;
+import tim.prune.gui.map.OsmMapSource;
+
+/**
+ * Class to handle the adding of a new map source
+ */
+public class AddMapSourceDialog
+{
+       private SetMapBgFunction _parent = null;
+       private JDialog _addDialog = null;
+       private JRadioButton[] _typeRadios = null;
+       private JPanel _cards = null;
+       // controls for osm panel
+       private JTextField _oNameField = null;
+       private JTextField _baseUrlField = null, _topUrlField = null;
+       private JComboBox _oZoomCombo = null;
+       // controls for cloudmade panel
+       private JTextField _cNameField = null;
+       private JTextField _cStyleField = null;
+       private JComboBox _cZoomCombo = null;
+       private JButton _okButton = null;
+
+
+       /**
+        * Constructor
+        * @param inParent parent dialog
+        */
+       public AddMapSourceDialog(JDialog inParentDialog, SetMapBgFunction inParentFunction)
+       {
+               _parent = inParentFunction;
+               _addDialog = new JDialog(inParentDialog, I18nManager.getText("dialog.addmapsource.title"), true);
+               _addDialog.add(makeDialogComponents());
+               _addDialog.setLocationRelativeTo(inParentDialog);
+               _addDialog.pack();
+       }
+
+
+       /**
+        * Create dialog components
+        * @return Panel containing all gui elements in dialog
+        */
+       private Component makeDialogComponents()
+       {
+               JPanel dialogPanel = new JPanel();
+               dialogPanel.setLayout(new BorderLayout());
+               // Top panel with two radio buttons to select source type
+               JPanel radioPanel = new JPanel();
+               ButtonGroup radioGroup = new ButtonGroup();
+               radioPanel.setLayout(new GridLayout(1, 0));
+               _typeRadios = new JRadioButton[2];
+               _typeRadios[0] = new JRadioButton("Openstreetmap");
+               radioGroup.add(_typeRadios[0]);
+               radioPanel.add(_typeRadios[0]);
+               _typeRadios[1] = new JRadioButton("Cloudmade");
+               radioGroup.add(_typeRadios[1]);
+               radioPanel.add(_typeRadios[1]);
+               _typeRadios[0].setSelected(true);
+               // listener for clicks on type radios
+               ActionListener typeListener = new ActionListener() {
+                       public void actionPerformed(ActionEvent arg0) {
+                               CardLayout cl = (CardLayout) _cards.getLayout();
+                               if (_typeRadios[0].isSelected()) {cl.first(_cards);}
+                               else {cl.last(_cards);}
+                               enableOK();
+                       }
+               };
+               _typeRadios[0].addActionListener(typeListener);
+               _typeRadios[1].addActionListener(typeListener);
+               radioPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+               dialogPanel.add(radioPanel, BorderLayout.NORTH);
+
+               _cards = new JPanel();
+               _cards.setLayout(new CardLayout());
+               // listener
+               KeyAdapter keyListener = new KeyAdapter() {
+                       public void keyReleased(KeyEvent e) {
+                               super.keyReleased(e);
+                               enableOK();
+                       }
+               };
+               // openstreetmap panel
+               JPanel osmPanel = new JPanel();
+               osmPanel.setLayout(new GridLayout(0, 2, 5, 5));
+               osmPanel.setBorder(BorderFactory.createEmptyBorder(6, 2, 4, 2));
+               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.sourcename")));
+               _oNameField = new JTextField(18);
+               _oNameField.addKeyListener(keyListener);
+               osmPanel.add(_oNameField);
+               // Base layer
+               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer1url")));
+               _baseUrlField = new JTextField(18);
+               _baseUrlField.addKeyListener(keyListener);
+               osmPanel.add(_baseUrlField);
+               // Top layer
+               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.layer2url")));
+               _topUrlField = new JTextField(18);
+               _topUrlField.addKeyListener(keyListener);
+               osmPanel.add(_topUrlField);
+               // Max zoom
+               osmPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.maxzoom")));
+               _oZoomCombo = new JComboBox();
+               for (int i=10; i<=20; i++) {
+                       _oZoomCombo.addItem("" + i);
+               }
+               osmPanel.add(_oZoomCombo);
+               _cards.add(osmPanel, "card1");
+               // Panel for cloudmade source
+               JPanel cloudPanel = new JPanel();
+               cloudPanel.setLayout(new GridLayout(0, 2, 5, 5));
+               cloudPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.sourcename")));
+               _cNameField = new JTextField(18);
+               _cNameField.addKeyListener(keyListener);
+               cloudPanel.add(_cNameField);
+               cloudPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.cloudstyle")));
+               _cStyleField = new JTextField(18);
+               _cStyleField.addKeyListener(keyListener);
+               cloudPanel.add(_cStyleField);
+               cloudPanel.add(new JLabel(I18nManager.getText("dialog.addmapsource.maxzoom")));
+               _cZoomCombo = new JComboBox();
+               for (int i=10; i<=20; i++) {
+                       _cZoomCombo.addItem("" + i);
+               }
+               cloudPanel.add(_cZoomCombo);
+               cloudPanel.add(new JLabel(" ")); // force four rows to space text boxes properly
+               _cards.add(cloudPanel, "card2");
+               // cards
+               JPanel holderPanel = new JPanel();
+               holderPanel.setLayout(new BorderLayout());
+               holderPanel.add(_cards, BorderLayout.NORTH);
+               dialogPanel.add(holderPanel, BorderLayout.CENTER);
+
+               // button panel at bottom
+               JPanel buttonPanel = new JPanel();
+               buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
+               _okButton = new JButton(I18nManager.getText("button.ok"));
+               ActionListener okListener = new ActionListener() {
+                       public void actionPerformed(ActionEvent e)
+                       {
+                               finish();
+                       }
+               };
+               _okButton.addActionListener(okListener);
+               buttonPanel.add(_okButton);
+               JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
+               cancelButton.addActionListener(new ActionListener() {
+                       public void actionPerformed(ActionEvent e)
+                       {
+                               _addDialog.dispose();
+                       }
+               });
+               buttonPanel.add(cancelButton);
+               dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
+               return dialogPanel;
+       }
+
+
+       /**
+        * Init and show the dialog
+        */
+       public void showDialog()
+       {
+               _oNameField.setText("");
+               _baseUrlField.setText("");
+               _topUrlField.setText("");
+               _oZoomCombo.setSelectedIndex(8);
+               _cNameField.setText("");
+               _cStyleField.setText("");
+               _cZoomCombo.setSelectedIndex(8);
+               _okButton.setEnabled(false);
+               _addDialog.setVisible(true);
+       }
+
+
+       /**
+        * Check the currently entered details and enable the OK button if it looks OK
+        */
+       private void enableOK()
+       {
+               boolean ok = false;
+               if (_typeRadios[0].isSelected()) {ok = isOsmPanelOk();}
+               if (_typeRadios[1].isSelected()) {ok = isCloudPanelOk();}
+               _okButton.setEnabled(ok);
+       }
+
+       /**
+        * Check the openstreetmap panel if all details are complete
+        * @return true if details look ok
+        */
+       private boolean isOsmPanelOk()
+       {
+               boolean ok = _oNameField.getText().trim().length() > 1;
+               URL baseUrl = null, topUrl = null;
+               try {
+                       // Try to parse base url if given
+                       String baseText = _baseUrlField.getText().trim();
+                       if (baseText.length() > 10) {
+                               baseUrl = new URL(baseText);
+                       }
+                       else if (baseText.length() > 0) {ok = false;}
+                       // Same again for top url if given
+                       String topText = _topUrlField.getText().trim();
+                       if (topText.length() > 10) {
+                               topUrl = new URL(topText);
+                       }
+                       else if (topText.length() > 0) {ok = false;}
+               } catch (MalformedURLException e) {
+                       ok = false;
+               }
+               // looks ok if at least one url given
+               return (ok && (baseUrl != null || topUrl != null));
+       }
+
+       /**
+        * Check the cloudmade panel if all details are complete
+        * @return true if details look ok
+        */
+       private boolean isCloudPanelOk()
+       {
+               boolean ok = _cNameField.getText().trim().length() > 1;
+               int styleNum = 0;
+               try {
+                       styleNum = Integer.parseInt(_cStyleField.getText());
+               }
+               catch (NumberFormatException nfe) {}
+               return (ok && styleNum > 0);
+       }
+
+       /**
+        * Finish by adding the requested source and refreshing the parent
+        */
+       private void finish()
+       {
+               MapSource newSource = null;
+               if (_typeRadios[0].isSelected())
+               {
+                       // Openstreetmap source
+                       String sourceName = getUniqueSourcename(_oNameField.getText());
+                       String url1 = _baseUrlField.getText().trim();
+                       String url2 = _topUrlField.getText().trim();
+                       newSource = new OsmMapSource(sourceName, url1, url2, _oZoomCombo.getSelectedIndex()+10);
+               }
+               else if (_typeRadios[1].isSelected())
+               {
+                       String sourceName = getUniqueSourcename(_cNameField.getText());
+                       newSource = new CloudmadeMapSource(sourceName, _cStyleField.getText(),
+                               _cZoomCombo.getSelectedIndex()+10);
+               }
+               // Add new source if ok
+               if (newSource != null)
+               {
+                       MapSourceLibrary.addSource(newSource);
+                       // inform setmapbg dialog
+                       _parent.updateList();
+                       _addDialog.setVisible(false);
+               }
+       }
+
+       /**
+        * Check the given source name if it exists in library already
+        * @param inName name to check
+        * @return unique name not yet in library
+        */
+       private static String getUniqueSourcename(String inName)
+       {
+               String name = inName;
+               if (name == null) {name = "";}
+               else {name = name.trim();}
+               if (name.equals("")) {
+                       name = I18nManager.getText("dialog.addmapsource.noname");
+               }
+               // Check there isn't already a map source with this name
+               if (MapSourceLibrary.hasSourceName(name))
+               {
+                       int suffix = 1;
+                       while (MapSourceLibrary.hasSourceName(name + suffix)) {
+                               suffix++;
+                       }
+                       name += suffix;
+               }
+               return name;
+       }
+}