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    }