001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.preferences.display; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.Component; 007import java.awt.GridBagLayout; 008 009import javax.swing.BorderFactory; 010import javax.swing.Box; 011import javax.swing.DefaultListCellRenderer; 012import javax.swing.JCheckBox; 013import javax.swing.JLabel; 014import javax.swing.JList; 015import javax.swing.JPanel; 016import javax.swing.JScrollPane; 017import javax.swing.ListCellRenderer; 018import javax.swing.UIManager; 019import javax.swing.UIManager.LookAndFeelInfo; 020 021import org.openstreetmap.josm.Main; 022import org.openstreetmap.josm.actions.ExpertToggleAction; 023import org.openstreetmap.josm.gui.preferences.PreferenceSetting; 024import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory; 025import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane; 026import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting; 027import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting; 028import org.openstreetmap.josm.gui.widgets.JosmComboBox; 029import org.openstreetmap.josm.tools.GBC; 030 031public class LafPreference implements SubPreferenceSetting { 032 033 public static class Factory implements PreferenceSettingFactory { 034 @Override 035 public PreferenceSetting createPreferenceSetting() { 036 return new LafPreference(); 037 } 038 } 039 040 /** 041 * ComboBox with all look and feels. 042 */ 043 private JosmComboBox lafCombo; 044 public JPanel panel; 045 private JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup")); 046 private JCheckBox showID = new JCheckBox(tr("Show object ID in selection lists")); 047 private JCheckBox showLocalizedName = new JCheckBox(tr("Show localized name in selection lists")); 048 private JCheckBox modeless = new JCheckBox(tr("Modeless working (Potlatch style)")); 049 private JCheckBox dynamicButtons = new JCheckBox(tr("Dynamic buttons in side menus")); 050 051 @Override 052 public void addGui(PreferenceTabbedPane gui) { 053 lafCombo = new JosmComboBox(UIManager.getInstalledLookAndFeels()); 054 055 // let's try to load additional LookAndFeels and put them into the list 056 try { 057 Class<?> Cquaqua = Class.forName("ch.randelshofer.quaqua.QuaquaLookAndFeel"); 058 Object Oquaqua = Cquaqua.getConstructor((Class[])null).newInstance((Object[])null); 059 // no exception? Then Go! 060 lafCombo.addItem( 061 new UIManager.LookAndFeelInfo(((javax.swing.LookAndFeel)Oquaqua).getName(), "ch.randelshofer.quaqua.QuaquaLookAndFeel") 062 ); 063 } catch (Exception ex) { 064 // just debug, Quaqua may not even be installed... 065 Main.debug(ex.getMessage()); 066 } 067 068 String laf = Main.pref.get("laf", Main.platform.getDefaultStyle()); 069 for (int i = 0; i < lafCombo.getItemCount(); ++i) { 070 if (((LookAndFeelInfo)lafCombo.getItemAt(i)).getClassName().equals(laf)) { 071 lafCombo.setSelectedIndex(i); 072 break; 073 } 074 } 075 076 final ListCellRenderer oldRenderer = lafCombo.getRenderer(); 077 lafCombo.setRenderer(new DefaultListCellRenderer(){ 078 @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 079 return oldRenderer.getListCellRendererComponent(list, ((LookAndFeelInfo)value).getName(), index, isSelected, cellHasFocus); 080 } 081 }); 082 083 panel = new JPanel(new GridBagLayout()); 084 panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 085 086 // Show splash screen on startup 087 showSplashScreen.setToolTipText(tr("Show splash screen at startup")); 088 showSplashScreen.setSelected(Main.pref.getBoolean("draw.splashscreen", true)); 089 panel.add(showSplashScreen, GBC.eop().insets(20, 0, 0, 0)); 090 091 // Show ID in selection 092 showID.setToolTipText(tr("Show object ID in selection lists")); 093 showID.setSelected(Main.pref.getBoolean("osm-primitives.showid", false)); 094 095 // Show localized names 096 showLocalizedName.setToolTipText(tr("Show localized name in selection lists, if available")); 097 showLocalizedName.setSelected(Main.pref.getBoolean("osm-primitives.localize-name", true)); 098 ExpertToggleAction.addVisibilitySwitcher(showLocalizedName); 099 100 modeless.setToolTipText(tr("Do not require to switch modes (potlatch style workflow)")); 101 modeless.setSelected(Main.pref.getBoolean("modeless", false)); 102 ExpertToggleAction.addVisibilitySwitcher(modeless); 103 104 panel.add(showID, GBC.eop().insets(20, 0, 0, 0)); 105 panel.add(showLocalizedName, GBC.eop().insets(20, 0, 0, 0)); 106 panel.add(modeless, GBC.eop().insets(20, 0, 0, 0)); 107 108 dynamicButtons.setToolTipText(tr("Display buttons in right side menus only when mouse is inside the element")); 109 dynamicButtons.setSelected(Main.pref.getBoolean("dialog.dynamic.buttons", true)); 110 panel.add(dynamicButtons, GBC.eop().insets(20, 0, 0, 0)); 111 112 panel.add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0)); 113 114 panel.add(new JLabel(tr("Look and Feel")), GBC.std().insets(20, 0, 0, 0)); 115 panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL)); 116 panel.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL)); 117 118 JScrollPane scrollpane = new JScrollPane(panel); 119 scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 )); 120 gui.getDisplayPreference().addSubTab(this, tr("Look and Feel"), scrollpane); 121 } 122 123 @Override 124 public boolean ok() { 125 boolean mod = false; 126 Main.pref.put("draw.splashscreen", showSplashScreen.isSelected()); 127 Main.pref.put("osm-primitives.showid", showID.isSelected()); 128 Main.pref.put("osm-primitives.localize-name", showLocalizedName.isSelected()); 129 Main.pref.put("modeless", modeless.isSelected()); 130 Main.pref.put("dialog.dynamic.buttons", dynamicButtons.isSelected()); 131 mod |= Main.pref.put("laf", ((LookAndFeelInfo)lafCombo.getSelectedItem()).getClassName()); 132 return mod; 133 } 134 135 @Override 136 public boolean isExpert() { 137 return false; 138 } 139 140 @Override 141 public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) { 142 return gui.getDisplayPreference(); 143 } 144}