source: josm/trunk/src/org/openstreetmap/josm/gui/bbox/SourceButton.java@ 12955

Last change on this file since 12955 was 12955, checked in by bastiK, 7 years ago

applied #15414 - Redesign of SlippyMapBBoxChooser's SourceButton (patch by ris)

  • Property svn:eol-style set to native
File size: 5.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.bbox;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Dimension;
7import java.awt.event.ActionListener;
8import java.awt.event.ActionEvent;
9import java.util.ArrayList;
10import java.util.Collection;
11import java.util.Collections;
12import java.util.Enumeration;
13import java.util.List;
14
15import javax.swing.AbstractButton;
16import javax.swing.ButtonGroup;
17import javax.swing.ButtonModel;
18import javax.swing.JCheckBoxMenuItem;
19import javax.swing.JPopupMenu;
20import javax.swing.JRadioButtonMenuItem;
21import javax.swing.JToggleButton;
22
23import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
24import org.openstreetmap.josm.gui.widgets.PopupMenuButton;
25import org.openstreetmap.josm.tools.CheckParameterUtil;
26import org.openstreetmap.josm.tools.ImageProvider;
27
28/**
29 * Button that allows to choose the imagery source used for slippy map background.
30 * @since 1390
31 */
32public class SourceButton extends PopupMenuButton {
33 protected class TileSourceButtonModel extends JToggleButton.ToggleButtonModel implements ActionListener {
34 protected final TileSource tileSource;
35
36 public TileSourceButtonModel(TileSource tileSource_) {
37 super();
38 this.tileSource = tileSource_;
39 this.addActionListener(this);
40 }
41
42 @Override
43 public void actionPerformed(ActionEvent e) {
44 if (SourceButton.this.slippyMapBBoxChooser.getTileController().getTileSource() != this.tileSource) { // prevent infinite recursion
45 SourceButton.this.slippyMapBBoxChooser.toggleMapSource(this.tileSource);
46 }
47 }
48 }
49
50 protected final SlippyMapBBoxChooser slippyMapBBoxChooser;
51 protected final ButtonModel showDownloadAreaButtonModel;
52 private List<TileSource> sources;
53 private ButtonGroup sourceButtonGroup;
54
55 /**
56 * Constructs a new {@code SourceButton}.
57 * @param slippyMapBBoxChooser parent slippy map
58 * @param sources list of imagery sources to display
59 */
60 public SourceButton(
61 SlippyMapBBoxChooser slippyMapBBoxChooser_,
62 Collection<TileSource> sources_,
63 ButtonModel showDownloadAreaButtonModel_
64 ) {
65 super(new ImageProvider("dialogs/layerlist").getResource().getImageIcon(new Dimension(16, 16)));
66 this.showDownloadAreaButtonModel = showDownloadAreaButtonModel_;
67 this.slippyMapBBoxChooser = slippyMapBBoxChooser_;
68 this.setPreferredSize(new Dimension(24, 24));
69 this.setSources(sources_);
70 }
71
72 protected void generatePopupMenu() {
73 JPopupMenu pm = new JPopupMenu();
74 this.sourceButtonGroup = new ButtonGroup();
75 for (TileSource ts : this.sources) {
76 JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(ts.getName());
77 TileSourceButtonModel buttonModel = new TileSourceButtonModel(ts);
78 menuItem.setModel(buttonModel);
79 pm.add(menuItem);
80 this.sourceButtonGroup.add(menuItem);
81
82 // attempt to initialize button group matching current state of slippyMapBBoxChooser
83 buttonModel.setSelected(this.slippyMapBBoxChooser.getTileController().getTileSource() == ts);
84 }
85
86 pm.addSeparator();
87
88 JCheckBoxMenuItem showDownloadAreaItem = new JCheckBoxMenuItem(tr("Show downloaded area"));
89 showDownloadAreaItem.setModel(this.showDownloadAreaButtonModel);
90 pm.add(showDownloadAreaItem);
91
92 this.setPopupMenu(pm);
93 }
94
95 private void setSourceDefault() {
96 Enumeration<AbstractButton> elems = this.sourceButtonGroup.getElements();
97 if (elems.hasMoreElements()) {
98 elems.nextElement().setSelected(true);
99 }
100 }
101
102 /**
103 * Set the tile sources.
104 * @param sources The tile sources to display
105 * @since 6364
106 */
107 public final void setSources(Collection<TileSource> sources_) {
108 CheckParameterUtil.ensureParameterNotNull(sources_, "sources_");
109 this.sources = new ArrayList<TileSource>(sources_);
110 this.generatePopupMenu();
111 if (this.sourceButtonGroup.getSelection() == null) {
112 this.setSourceDefault();
113 }
114 }
115
116 /**
117 * Get the tile sources.
118 * @return unmodifiable collection of tile sources
119 */
120 public final Collection<TileSource> getSources() {
121 return Collections.unmodifiableCollection(this.sources);
122 }
123
124 /**
125 * Get the currently-selected tile source.
126 */
127 public final TileSource getCurrentSource() {
128 TileSourceButtonModel buttonModel = (TileSourceButtonModel) this.sourceButtonGroup.getSelection();
129 if (buttonModel != null) {
130 return buttonModel.tileSource;
131 }
132 return null;
133 }
134
135 /**
136 * Changes the current imagery source used for slippy map background.
137 * @param tileSource the new imagery source to use
138 */
139 public void setCurrentMap(TileSource tileSource) {
140 Enumeration<AbstractButton> elems = this.sourceButtonGroup.getElements();
141 while (elems.hasMoreElements()) {
142 AbstractButton b = elems.nextElement();
143 if (((TileSourceButtonModel) b.getModel()).tileSource == tileSource) {
144 b.setSelected(true);
145 return;
146 }
147 }
148 // failed to find the correct one
149 this.setSourceDefault();
150 }
151}
Note: See TracBrowser for help on using the repository browser.