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