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}