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 }