001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.preferences.imagery;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.awt.Color;
007    import java.awt.GridBagLayout;
008    import java.awt.event.ActionEvent;
009    import java.awt.event.ActionListener;
010    
011    import javax.swing.JButton;
012    import javax.swing.JCheckBox;
013    import javax.swing.JColorChooser;
014    import javax.swing.JLabel;
015    import javax.swing.JOptionPane;
016    import javax.swing.JPanel;
017    import javax.swing.JSlider;
018    import javax.swing.JTextField;
019    import javax.swing.event.ChangeEvent;
020    import javax.swing.event.ChangeListener;
021    
022    import org.openstreetmap.josm.gui.layer.ImageryLayer;
023    import org.openstreetmap.josm.gui.widgets.JosmComboBox;
024    import org.openstreetmap.josm.io.imagery.OffsetServer;
025    import org.openstreetmap.josm.io.imagery.OsmosnimkiOffsetServer;
026    import org.openstreetmap.josm.tools.ColorHelper;
027    import org.openstreetmap.josm.tools.GBC;
028    
029    /**
030     * {@code JPanel} giving access to common imagery settings.
031     * @since 5465
032     */
033    public class CommonSettingsPanel extends JPanel {
034    
035        // Common Settings
036        private final JButton btnFadeColor;
037        private final JSlider fadeAmount = new JSlider(0, 100);
038        private final JosmComboBox sharpen;
039        private final JCheckBox useOffsetServer;
040        private final JTextField offsetServerUrl;
041    
042        /**
043         * Constructs a new {@code CommonSettingsPanel}.
044         */
045        public CommonSettingsPanel() {
046            super(new GridBagLayout());
047            
048            this.btnFadeColor = new JButton();
049    
050            this.btnFadeColor.addActionListener(new ActionListener() {
051                @Override
052                public void actionPerformed(ActionEvent e) {
053                    JColorChooser chooser = new JColorChooser(btnFadeColor.getBackground());
054                    int answer = JOptionPane.showConfirmDialog(
055                            CommonSettingsPanel.this, chooser,
056                            tr("Choose a color for {0}", tr("imagery fade")),
057                            JOptionPane.OK_CANCEL_OPTION,
058                            JOptionPane.PLAIN_MESSAGE);
059                    if (answer == JOptionPane.OK_OPTION) {
060                        Color colFadeColor = chooser.getColor();
061                        btnFadeColor.setBackground(colFadeColor);
062                        btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
063                    }
064                }
065            });
066    
067            add(new JLabel(tr("Fade Color: ")), GBC.std());
068            add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
069            add(this.btnFadeColor, GBC.eol().fill(GBC.HORIZONTAL));
070    
071            add(new JLabel(tr("Fade amount: ")), GBC.std());
072            add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
073            add(this.fadeAmount, GBC.eol().fill(GBC.HORIZONTAL));
074    
075            this.sharpen = new JosmComboBox(new String[] {
076                    tr("None"),
077                    tr("Soft"),
078                    tr("Strong")});
079            add(new JLabel(tr("Sharpen (requires layer re-add): ")));
080            add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
081            add(this.sharpen, GBC.eol().fill(GBC.HORIZONTAL));
082    
083            this.useOffsetServer = new JCheckBox(tr("Use offset server: "));
084            this.offsetServerUrl = new JTextField();
085            this.useOffsetServer.addChangeListener(new ChangeListener() {
086                @Override
087                public void stateChanged(ChangeEvent e) {
088                    offsetServerUrl.setEnabled(useOffsetServer.isSelected());
089                }
090            });
091            offsetServerUrl.setEnabled(useOffsetServer.isSelected());
092            add(this.useOffsetServer, GBC.eol().fill(GBC.HORIZONTAL));
093            add(this.offsetServerUrl, GBC.eol().fill(GBC.HORIZONTAL));
094        }
095        
096        /**
097         * Loads the common settings.
098         */
099        public void loadSettings() {
100            Color colFadeColor = ImageryLayer.PROP_FADE_COLOR.get();
101            this.btnFadeColor.setBackground(colFadeColor);
102            this.btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
103            this.fadeAmount.setValue(ImageryLayer.PROP_FADE_AMOUNT.get());
104            this.sharpen.setSelectedIndex(Math.max(0, Math.min(2, ImageryLayer.PROP_SHARPEN_LEVEL.get())));
105            this.useOffsetServer.setSelected(OffsetServer.PROP_SERVER_ENABLED.get());
106            this.offsetServerUrl.setText(OsmosnimkiOffsetServer.PROP_SERVER_URL.get());
107        }
108        
109        /**
110         * Saves the common settings.
111         * @return true when restart is required
112         */
113        public boolean saveSettings() {
114            OffsetServer.PROP_SERVER_ENABLED.put(useOffsetServer.isSelected());
115            OsmosnimkiOffsetServer.PROP_SERVER_URL.put(offsetServerUrl.getText());
116    
117            ImageryLayer.PROP_FADE_AMOUNT.put(this.fadeAmount.getValue());
118            ImageryLayer.PROP_FADE_COLOR.put(this.btnFadeColor.getBackground());
119            ImageryLayer.PROP_SHARPEN_LEVEL.put(sharpen.getSelectedIndex());
120            return false;
121        }
122    }