Changeset 4968 in josm for trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
- Timestamp:
- 2012-02-17T22:27:06+01:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
r4874 r4968 7 7 import java.awt.Font; 8 8 import java.awt.GridBagLayout; 9 import java.awt.ScrollPane;10 9 import java.awt.event.MouseWheelEvent; 11 10 import java.awt.event.MouseWheelListener; 12 11 import java.util.ArrayList; 13 12 import java.util.Collection; 14 import java.util.Iterator;15 13 import java.util.LinkedList; 16 14 import java.util.List; 17 15 18 16 import javax.swing.BorderFactory; 19 import javax.swing.JComponent; 17 import javax.swing.Icon; 18 import javax.swing.ImageIcon; 20 19 import javax.swing.JLabel; 21 20 import javax.swing.JOptionPane; … … 24 23 import javax.swing.JTabbedPane; 25 24 import javax.swing.SwingUtilities; 25 import javax.swing.event.ChangeEvent; 26 import javax.swing.event.ChangeListener; 26 27 27 28 import org.openstreetmap.josm.Main; … … 29 30 import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener; 30 31 import org.openstreetmap.josm.gui.preferences.advanced.AdvancedPreference; 32 import org.openstreetmap.josm.gui.preferences.display.ColorPreference; 33 import org.openstreetmap.josm.gui.preferences.display.DisplayPreference; 34 import org.openstreetmap.josm.gui.preferences.display.DrawingPreference; 35 import org.openstreetmap.josm.gui.preferences.display.LafPreference; 36 import org.openstreetmap.josm.gui.preferences.display.LanguagePreference; 37 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference; 38 import org.openstreetmap.josm.gui.preferences.map.BackupPreference; 39 import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference; 40 import org.openstreetmap.josm.gui.preferences.map.MapPreference; 41 import org.openstreetmap.josm.gui.preferences.map.ProjectionPreference; 42 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference; 43 import org.openstreetmap.josm.gui.preferences.shortcut.ShortcutPreference; 31 44 import org.openstreetmap.josm.plugins.PluginDownloadTask; 32 45 import org.openstreetmap.josm.plugins.PluginHandler; 33 46 import org.openstreetmap.josm.plugins.PluginInformation; 34 47 import org.openstreetmap.josm.tools.BugReportExceptionHandler; 48 import org.openstreetmap.josm.tools.CheckParameterUtil; 35 49 import org.openstreetmap.josm.tools.GBC; 36 import org.openstreetmap.josm.tools.I18n;37 50 import org.openstreetmap.josm.tools.ImageProvider; 38 51 … … 42 55 * @author imi 43 56 */ 44 public class PreferenceTabbedPane extends JTabbedPane implements MouseWheelListener, ExpertModeChangeListener {57 public class PreferenceTabbedPane extends JTabbedPane implements MouseWheelListener, ExpertModeChangeListener, ChangeListener { 45 58 /** 46 59 * Allows PreferenceSettings to do validation of entered values when ok was pressed. … … 55 68 boolean validatePreferences(); 56 69 } 57 58 private static class TabData { 59 public String icon; 60 public JComponent tab; 61 public String toolTip; 62 public boolean isExpert; 70 71 private static interface PreferenceTab { 72 public TabPreferenceSetting getTabPreferenceSetting(); 73 public Component getComponent(); 74 } 75 76 public static class PreferencePanel extends JPanel implements PreferenceTab { 77 private final TabPreferenceSetting preferenceSetting; 78 79 private PreferencePanel(TabPreferenceSetting preferenceSetting) { 80 super(new GridBagLayout()); 81 CheckParameterUtil.ensureParameterNotNull(preferenceSetting); 82 this.preferenceSetting = preferenceSetting; 83 buildPanel(); 84 } 85 86 protected void buildPanel() { 87 setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 88 add(new JLabel(preferenceSetting.getTitle()), GBC.eol().insets(0,5,0,10).anchor(GBC.NORTHWEST)); 89 90 JLabel descLabel = new JLabel("<html>"+preferenceSetting.getDescription()+"</html>"); 91 descLabel.setFont(descLabel.getFont().deriveFont(Font.ITALIC)); 92 add(descLabel, GBC.eol().insets(5,0,5,20).fill(GBC.HORIZONTAL)); 93 } 94 95 @Override 96 public final TabPreferenceSetting getTabPreferenceSetting() { 97 return preferenceSetting; 98 } 99 100 @Override 101 public Component getComponent() { 102 return this; 103 } 104 } 105 106 public static class PreferenceScrollPane extends JScrollPane implements PreferenceTab { 107 private final TabPreferenceSetting preferenceSetting; 108 109 private PreferenceScrollPane(Component view, TabPreferenceSetting preferenceSetting) { 110 super(view); 111 this.preferenceSetting = preferenceSetting; 112 } 113 114 private PreferenceScrollPane(PreferencePanel preferencePanel) { 115 super(preferencePanel.getComponent()); 116 this.preferenceSetting = preferencePanel.getTabPreferenceSetting(); 117 } 118 119 @Override 120 public final TabPreferenceSetting getTabPreferenceSetting() { 121 return preferenceSetting; 122 } 123 124 @Override 125 public Component getComponent() { 126 return this; 127 } 63 128 } 64 129 65 130 // all created tabs 66 private final List< TabData> tabs = new ArrayList<TabData>();131 private final List<PreferenceTab> tabs = new ArrayList<PreferenceTab>(); 67 132 private final static Collection<PreferenceSettingFactory> settingsFactory = new LinkedList<PreferenceSettingFactory>(); 68 133 private final List<PreferenceSetting> settings = new ArrayList<PreferenceSetting>(); 69 70 // some common tabs 71 public final JPanel display = createPreferenceTab("display", tr("Display Settings"), tr("Various settings that influence the visual representation of the whole program.")); 72 public final JPanel connection = createPreferenceTab("connection", I18n.tr("Connection Settings"), I18n.tr("Connection Settings for the OSM server."),false); 73 public final JPanel map = createPreferenceTab("map", I18n.tr("Map Settings"), I18n.tr("Settings for the map projection and data interpretation.")); 74 public final JPanel audio = createPreferenceTab("audio", I18n.tr("Audio Settings"), I18n.tr("Settings for the audio player and audio markers.")); 75 public final JPanel plugins = createPreferenceTab("plugin", tr("Plugins"), tr("Configure available plugins."), false); 76 77 public final javax.swing.JTabbedPane displaycontent = new javax.swing.JTabbedPane(); 78 public final javax.swing.JTabbedPane mapcontent = new javax.swing.JTabbedPane(); 134 135 // distinct list of tabs that have been initialized (we do not initialize tabs until they are displayed to speed up dialog startup) 136 private final List<PreferenceSetting> settingsInitialized = new ArrayList<PreferenceSetting>(); 79 137 80 138 List<ValidationListener> validationListeners = new ArrayList<ValidationListener>(); … … 90 148 91 149 /** 92 * Construct a JPanel for the preference settings. Layout is GridBagLayout 93 * and a centered title label and the description are added. The panel 94 * will be shown inside a {@link ScrollPane} 95 * @param icon The name of the icon. 96 * @param title The title of this preference tab. 97 * @param desc A description in one sentence for this tab. Will be displayed 98 * italic under the title. 150 * Construct a PreferencePanel for the preference settings. Layout is GridBagLayout 151 * and a centered title label and the description are added. 99 152 * @return The created panel ready to add other controls. 100 153 */ 101 public JPanel createPreferenceTab(String icon, String title, String desc) { 102 return createPreferenceTab(icon, title, desc, false); 103 } 104 105 public JPanel createPreferenceTab(String icon, String title, String desc, boolean inScrollPane) { 106 return createPreferenceTab(icon, title, desc, inScrollPane, false); 107 } 108 109 /** 110 * Construct a JPanel for the preference settings. Layout is GridBagLayout 154 public PreferencePanel createPreferenceTab(TabPreferenceSetting caller) { 155 return createPreferenceTab(caller, false); 156 } 157 158 /** 159 * Construct a PreferencePanel for the preference settings. Layout is GridBagLayout 111 160 * and a centered title label and the description are added. 112 * @param icon The name of the icon.113 * @param title The title of this preference tab.114 * @param desc A description in one sentence for this tab. Will be displayed115 * italic under the title.116 161 * @param inScrollPane if <code>true</code> the added tab will show scroll bars 117 162 * if the panel content is larger than the available space 118 163 * @return The created panel ready to add other controls. 119 164 */ 120 public JPanel createPreferenceTab(String icon, String title, String desc, boolean inScrollPane, boolean isExpert) { 121 JPanel p = new JPanel(new GridBagLayout()); 122 p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 123 p.add(new JLabel(title), GBC.eol().insets(0,5,0,10).anchor(GBC.NORTHWEST)); 124 125 JLabel descLabel = new JLabel("<html>"+desc+"</html>"); 126 descLabel.setFont(descLabel.getFont().deriveFont(Font.ITALIC)); 127 p.add(descLabel, GBC.eol().insets(5,0,5,20).fill(GBC.HORIZONTAL)); 128 129 JComponent tab = p; 165 public PreferencePanel createPreferenceTab(TabPreferenceSetting caller, boolean inScrollPane) { 166 CheckParameterUtil.ensureParameterNotNull(caller); 167 PreferencePanel p = new PreferencePanel(caller); 168 169 PreferenceTab tab = p; 130 170 if (inScrollPane) { 131 JScrollPane sp = new JScrollPane(p);171 PreferenceScrollPane sp = new PreferenceScrollPane(p); 132 172 tab = sp; 133 173 } 134 TabData data = new TabData(); 135 data.icon = icon; 136 data.tab = tab; 137 data.isExpert = isExpert; 138 data.toolTip = "<html>"+desc+"</html>"; 139 tabs.add(data); 174 tabs.add(tab); 140 175 return p; 141 176 } 142 177 178 private static interface TabIdentifier { 179 public boolean identify(TabPreferenceSetting tps, Object param); 180 } 181 182 private void selectTabBy(TabIdentifier method, Object param) { 183 for (int i=0; i<getTabCount(); i++) { 184 Component c = getComponentAt(i); 185 if (c instanceof PreferenceTab) { 186 PreferenceTab tab = (PreferenceTab) c; 187 if (method.identify(tab.getTabPreferenceSetting(), param)) { 188 setSelectedIndex(i); 189 return; 190 } 191 } 192 } 193 } 194 143 195 public void selectTabByName(String name) { 144 for (TabData data : tabs) { 145 if (data.icon.equals(name)) { 146 Component c = data.tab; 147 if (c != null) { 148 setSelectedComponent(c); 149 } 150 return; 151 } 152 } 153 } 154 155 protected PluginPreference getPluginPreference() { 156 for (PreferenceSetting setting: settings) { 157 if (setting instanceof PluginPreference) 158 return (PluginPreference) setting; 159 } 160 return null; 196 selectTabBy(new TabIdentifier(){ 197 @Override 198 public boolean identify(TabPreferenceSetting tps, Object name) { 199 return tps.getIconName().equals(name); 200 }}, name); 201 } 202 203 public void selectTabByPref(Class<? extends TabPreferenceSetting> clazz) { 204 selectTabBy(new TabIdentifier(){ 205 @Override 206 public boolean identify(TabPreferenceSetting tps, Object clazz) { 207 return tps.getClass().isAssignableFrom((Class<?>) clazz); 208 }}, clazz); 209 } 210 211 public final DisplayPreference getDisplayPreference() { 212 return getSetting(DisplayPreference.class); 213 } 214 215 public final MapPreference getMapPreference() { 216 return getSetting(MapPreference.class); 217 } 218 219 public final PluginPreference getPluginPreference() { 220 return getSetting(PluginPreference.class); 161 221 } 162 222 … … 248 308 super(JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT); 249 309 super.addMouseWheelListener(this); 310 super.getModel().addChangeListener(this); 250 311 ExpertToggleAction.addExpertModeChangeListener(this); 251 312 } … … 258 319 } 259 320 } 260 261 display.add(displaycontent, GBC.eol().fill(GBC.BOTH)); 262 map.add(mapcontent, GBC.eol().fill(GBC.BOTH)); 321 /* 263 322 for (Iterator<PreferenceSetting> it = settings.iterator(); it.hasNext();) { 264 323 try { 265 PreferenceSetting settings = it.next(); 266 settings.addGui(this); 324 PreferenceSetting ps = it.next(); 325 long start = System.currentTimeMillis(); 326 ps.addGui(this); 327 System.out.println(ps.getClass()+" -> "+(System.currentTimeMillis()-start)); 267 328 } catch (SecurityException e) { 268 329 it.remove(); 269 330 } catch (Throwable e) { 270 / * allow to change most settings even if e.g. a plugin fails */331 // allow to change most settings even if e.g. a plugin fails 271 332 BugReportExceptionHandler.handleException(e); 272 333 } 273 } 334 }*/ 274 335 addGUITabs(false); 275 336 } 276 337 338 private void addGUITabsForSetting(Icon icon, TabPreferenceSetting tps) { 339 for (PreferenceTab tab : tabs) { 340 if (tab.getTabPreferenceSetting().equals(tps)) { 341 insertGUITabsForSetting(icon, tps, getTabCount()); 342 } 343 } 344 } 345 346 private void insertGUITabsForSetting(Icon icon, TabPreferenceSetting tps, int index) { 347 int position = index; 348 for (PreferenceTab tab : tabs) { 349 if (tab.getTabPreferenceSetting().equals(tps)) { 350 insertTab(null, icon, tab.getComponent(), tps.getTooltip(), position++); 351 } 352 } 353 } 354 277 355 private void addGUITabs(boolean clear) { 278 356 boolean expert = ExpertToggleAction.isExpert(); … … 281 359 removeAll(); 282 360 } 283 for (TabData data : tabs) { 284 if (expert || !data.isExpert) { 285 addTab(null, ImageProvider.get("preferences", data.icon), data.tab, data.toolTip); 286 } 287 } 361 // Inspect each tab setting 362 for (PreferenceSetting setting : settings) { 363 if (setting instanceof TabPreferenceSetting) { 364 TabPreferenceSetting tps = (TabPreferenceSetting) setting; 365 if (expert || !tps.isExpert()) { 366 // Get icon 367 ImageIcon icon = ImageProvider.get("preferences", tps.getIconName()); 368 if (settingsInitialized.contains(tps)) { 369 // If it has been initialized, add corresponding tab(s) 370 addGUITabsForSetting(icon, tps); 371 } else { 372 // If it has not been initialized, create an empty tab with only icon and tooltip 373 addTab(null, icon, new PreferencePanel(tps), tps.getTooltip()); 374 } 375 } 376 } 377 } 378 /*for (PreferenceTab tab : tabs) { 379 TabPreferenceSetting s = tab.getTabPreferenceSetting(); 380 if (expert || !s.isExpert()) { 381 addTab(null, ImageProvider.get("preferences", s.getIconName()), tab.getComponent(), "<html>"+s.getTooltip()+"</html>"); 382 } 383 }*/ 288 384 try { 289 setSelectedComponent(sel); 385 if (sel != null) { 386 setSelectedComponent(sel); 387 } 290 388 } catch (IllegalArgumentException e) {} 291 389 } 292 390 293 391 @Override 294 392 public void expertChanged(boolean isExpert) { … … 311 409 static { 312 410 // order is important! 411 settingsFactory.add(new DisplayPreference.Factory()); 313 412 settingsFactory.add(new DrawingPreference.Factory()); 314 413 settingsFactory.add(new ColorPreference.Factory()); … … 316 415 settingsFactory.add(new LanguagePreference.Factory()); 317 416 settingsFactory.add(new ServerAccessPreference.Factory()); 417 settingsFactory.add(new MapPreference.Factory()); 318 418 settingsFactory.add(new ProjectionPreference.Factory()); 319 419 settingsFactory.add(new MapPaintPreference.Factory()); … … 355 455 super.setSelectedIndex(newTab); 356 456 } 457 458 @Override 459 public void stateChanged(ChangeEvent e) { 460 int index = getSelectedIndex(); 461 Component sel = getSelectedComponent(); 462 if (index > -1 && sel instanceof PreferenceTab) { 463 PreferenceTab tab = (PreferenceTab) sel; 464 TabPreferenceSetting preferenceSettings = tab.getTabPreferenceSetting(); 465 //System.out.println(preferenceSettings); 466 if (!settingsInitialized.contains(preferenceSettings)) { 467 try { 468 //System.out.println("adding GUI for "+preferenceSettings); 469 getModel().removeChangeListener(this); 470 preferenceSettings.addGui(this); 471 // Add GUI for sub preferences 472 for (PreferenceSetting setting : settings) { 473 if (setting instanceof SubPreferenceSetting) { 474 SubPreferenceSetting sps = (SubPreferenceSetting) setting; 475 if (sps.getTabPreferenceSetting(this) == preferenceSettings) { 476 //System.out.println("adding GUI for "+sps); 477 sps.addGui(this); 478 } 479 } 480 } 481 Icon icon = getIconAt(index); 482 remove(index); 483 insertGUITabsForSetting(icon, preferenceSettings, index); 484 setSelectedIndex(index); 485 } catch (SecurityException ex) { 486 ex.printStackTrace(); 487 } catch (Throwable ex) { 488 // allow to change most settings even if e.g. a plugin fails 489 BugReportExceptionHandler.handleException(ex); 490 } finally { 491 settingsInitialized.add(preferenceSettings); 492 getModel().addChangeListener(this); 493 } 494 } 495 } 496 } 357 497 }
Note:
See TracChangeset
for help on using the changeset viewer.