001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.preferences.imagery; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.Color; 007import java.awt.GridBagLayout; 008import java.awt.event.ActionEvent; 009import java.awt.event.ActionListener; 010 011import javax.swing.JButton; 012import javax.swing.JColorChooser; 013import javax.swing.JLabel; 014import javax.swing.JOptionPane; 015import javax.swing.JPanel; 016import javax.swing.JSlider; 017import javax.swing.JSpinner; 018import javax.swing.SpinnerNumberModel; 019 020import org.openstreetmap.josm.data.imagery.CachedTileLoaderFactory; 021import org.openstreetmap.josm.gui.layer.AbstractCachedTileSourceLayer; 022import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer; 023import org.openstreetmap.josm.gui.layer.ImageryLayer; 024import org.openstreetmap.josm.gui.widgets.JosmComboBox; 025import org.openstreetmap.josm.gui.widgets.JosmTextField; 026import org.openstreetmap.josm.tools.ColorHelper; 027import org.openstreetmap.josm.tools.GBC; 028 029/** 030 * {@code JPanel} giving access to common imagery settings. 031 * @since 5465 032 */ 033public 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<String> sharpen; 039 private final JosmTextField tilecacheDir = new JosmTextField(); 040 private final JSpinner maxElementsOnDisk; 041 private final JSlider tilesZoom = new JSlider(-2, 2, 0); 042 043 044 /** 045 * Constructs a new {@code CommonSettingsPanel}. 046 */ 047 public CommonSettingsPanel() { 048 super(new GridBagLayout()); 049 050 this.maxElementsOnDisk = new JSpinner(new SpinnerNumberModel( 051 AbstractCachedTileSourceLayer.MAX_DISK_CACHE_SIZE.get().intValue(), 0, Integer.MAX_VALUE, 1)); 052 053 054 this.btnFadeColor = new JButton(); 055 056 this.btnFadeColor.addActionListener(new ActionListener() { 057 @Override 058 public void actionPerformed(ActionEvent e) { 059 JColorChooser chooser = new JColorChooser(btnFadeColor.getBackground()); 060 int answer = JOptionPane.showConfirmDialog( 061 CommonSettingsPanel.this, chooser, 062 tr("Choose a color for {0}", tr("imagery fade")), 063 JOptionPane.OK_CANCEL_OPTION, 064 JOptionPane.PLAIN_MESSAGE); 065 if (answer == JOptionPane.OK_OPTION) { 066 Color colFadeColor = chooser.getColor(); 067 btnFadeColor.setBackground(colFadeColor); 068 btnFadeColor.setText(ColorHelper.color2html(colFadeColor)); 069 } 070 } 071 }); 072 073 add(new JLabel(tr("Fade Color: ")), GBC.std()); 074 add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL)); 075 add(this.btnFadeColor, GBC.eol().fill(GBC.HORIZONTAL)); 076 077 add(new JLabel(tr("Fade amount: ")), GBC.std()); 078 add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL)); 079 add(this.fadeAmount, GBC.eol().fill(GBC.HORIZONTAL)); 080 081 this.sharpen = new JosmComboBox<>(new String[] { 082 tr("None"), 083 tr("Soft"), 084 tr("Strong")}); 085 add(new JLabel(tr("Sharpen (requires layer re-add): "))); 086 add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL)); 087 add(this.sharpen, GBC.eol().fill(GBC.HORIZONTAL)); 088 089 add(new JLabel(tr("Tile cache directory: ")), GBC.std()); 090 add(GBC.glue(5, 0), GBC.std()); 091 add(tilecacheDir, GBC.eol().fill(GBC.HORIZONTAL)); 092 093 add(new JLabel(tr("Maximum size of disk cache (per imagery) in MB: ")), GBC.std()); 094 add(GBC.glue(5, 0), GBC.std()); 095 add(this.maxElementsOnDisk, GBC.eol()); 096 097 this.tilesZoom.setPaintLabels(true); 098 this.tilesZoom.setMajorTickSpacing(2); 099 this.tilesZoom.setMinorTickSpacing(1); 100 this.tilesZoom.setPaintTicks(true); 101 add(new JLabel(tr("Tiles zoom offset:"))); 102 add(GBC.glue(5, 0), GBC.std()); 103 add(this.tilesZoom, GBC.eol()); 104 } 105 106 /** 107 * Loads the common settings. 108 */ 109 public void loadSettings() { 110 Color colFadeColor = ImageryLayer.PROP_FADE_COLOR.get(); 111 this.btnFadeColor.setBackground(colFadeColor); 112 this.btnFadeColor.setText(ColorHelper.color2html(colFadeColor)); 113 this.fadeAmount.setValue(ImageryLayer.PROP_FADE_AMOUNT.get()); 114 this.sharpen.setSelectedIndex(Math.max(0, Math.min(2, ImageryLayer.PROP_SHARPEN_LEVEL.get()))); 115 this.tilecacheDir.setText(CachedTileLoaderFactory.PROP_TILECACHE_DIR.get()); 116 this.maxElementsOnDisk.setValue(AbstractCachedTileSourceLayer.MAX_DISK_CACHE_SIZE.get()); 117 this.tilesZoom.setValue(AbstractTileSourceLayer.ZOOM_OFFSET.get()); 118 } 119 120 /** 121 * Saves the common settings. 122 * @return true when restart is required 123 */ 124 public boolean saveSettings() { 125 ImageryLayer.PROP_FADE_AMOUNT.put(this.fadeAmount.getValue()); 126 ImageryLayer.PROP_FADE_COLOR.put(this.btnFadeColor.getBackground()); 127 ImageryLayer.PROP_SHARPEN_LEVEL.put(sharpen.getSelectedIndex()); 128 129 boolean restartRequired = false; 130 if (!AbstractCachedTileSourceLayer.MAX_DISK_CACHE_SIZE.get().equals(this.maxElementsOnDisk.getValue())) { 131 AbstractCachedTileSourceLayer.MAX_DISK_CACHE_SIZE.put((Integer) this.maxElementsOnDisk.getValue()); 132 restartRequired = true; 133 } 134 135 136 if (!CachedTileLoaderFactory.PROP_TILECACHE_DIR.get().equals(this.tilecacheDir.getText())) { 137 restartRequired = true; 138 CachedTileLoaderFactory.PROP_TILECACHE_DIR.put(this.tilecacheDir.getText()); 139 } 140 141 if (!AbstractTileSourceLayer.ZOOM_OFFSET.get().equals(this.tilesZoom.getValue())) { 142 // TODO: make warning about too small MEMORY_CACHE_SIZE? 143 AbstractTileSourceLayer.ZOOM_OFFSET.put(this.tilesZoom.getValue()); 144 restartRequired = true; 145 } 146 return restartRequired; 147 } 148}