Ticket #8334: 8334.patch

File 8334.patch, 8.2 KB (added by Don-vip, 12 years ago)
  • core/src/org/openstreetmap/josm/Main.java

     
    44
    55import java.awt.BorderLayout;
    66import java.awt.Component;
     7import java.awt.Font;
    78import java.awt.GridBagConstraints;
    89import java.awt.GridBagLayout;
    910import java.awt.Window;
     
    2021import java.util.ArrayList;
    2122import java.util.Arrays;
    2223import java.util.Collection;
     24import java.util.Enumeration;
    2325import java.util.Iterator;
    2426import java.util.List;
    2527import java.util.Map;
     
    3941import javax.swing.JTextArea;
    4042import javax.swing.KeyStroke;
    4143import javax.swing.UIManager;
     44import javax.swing.plaf.FontUIResource;
    4245
    4346import org.openstreetmap.gui.jmapviewer.FeatureAdapter;
    4447import org.openstreetmap.josm.actions.JosmAction;
     
    515518            menu.redo.setEnabled(redoSize > 0);
    516519        }
    517520    };
     521   
     522    protected static void setUIFont(FontUIResource f) {
     523        Enumeration<?> keys = UIManager.getDefaults().keys();
     524        while (keys.hasMoreElements()) {
     525            Object key = keys.nextElement();
     526            Object value = UIManager.get(key);
     527            if (value != null && value instanceof FontUIResource) {
     528                UIManager.put(key, f);
     529            }
     530        }
     531    }
    518532
    519533    /**
    520534     * Should be called before the main constructor to setup some parameter stuff
     
    537551                System.out.println("Look and Feel not supported: " + laf);
    538552                Main.pref.put("laf", defaultlaf);
    539553            }
     554            String fontName = Main.pref.get("font");
     555            if (fontName != null) {
     556                Font font = Font.decode(fontName);
     557                if (font != null) {
     558                    setUIFont(new FontUIResource(font));
     559                } else {
     560                    System.out.println("Font not found: " + fontName);
     561                }
     562            }
    540563            toolbar = new ToolbarPreferences();
    541564            contentPanePrivate.updateUI();
    542565            panel.updateUI();
  • core/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java

     
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.awt.Component;
     7import java.awt.Font;
    78import java.awt.GridBagLayout;
    89
    910import javax.swing.BorderFactory;
     
    2526import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
    2627import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
    2728import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
     29import org.openstreetmap.josm.gui.widgets.FontChooser;
    2830import org.openstreetmap.josm.gui.widgets.JosmComboBox;
    2931import org.openstreetmap.josm.tools.GBC;
    3032
     
    4042     * ComboBox with all look and feels.
    4143     */
    4244    private JosmComboBox lafCombo;
     45    private FontChooser fontCombo;
    4346    public JPanel panel;
    4447    private JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup"));
    4548    private JCheckBox showID = new JCheckBox(tr("Show object ID in selection lists"));
     
    4952
    5053    public void addGui(PreferenceTabbedPane gui) {
    5154        lafCombo = new JosmComboBox(UIManager.getInstalledLookAndFeels());
     55        fontCombo = new FontChooser();
    5256
    5357        // let's try to load additional LookAndFeels and put them into the list
    5458        try {
     
    7074                break;
    7175            }
    7276        }
     77       
     78        String font = Main.pref.get("font");
     79        if (font != null) {
     80            for (int i = 1; i < fontCombo.getItemCount(); ++i) {
     81                if (((Font)fontCombo.getItemAt(i)).getFontName().equals(font)) {
     82                    fontCombo.setSelectedIndex(i);
     83                    break;
     84                }
     85            }
     86        }
    7387
    7488        final ListCellRenderer oldRenderer = lafCombo.getRenderer();
    7589        lafCombo.setRenderer(new DefaultListCellRenderer(){
     
    113127        panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
    114128        panel.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
    115129
     130        addExpertComponent(new JLabel(tr("Font")), GBC.std().insets(20, 0, 0, 0));
     131        addExpertComponent(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
     132        addExpertComponent(fontCombo, GBC.eol().fill(GBC.HORIZONTAL));
     133
    116134        JScrollPane scrollpane = new JScrollPane(panel);
    117135        scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
    118136        gui.getDisplayPreference().addSubTab(this, tr("Look and Feel"), scrollpane);
    119137    }
     138   
     139    private void addExpertComponent(Component c, GBC constraints) {
     140        ExpertToggleAction.addVisibilitySwitcher(c);
     141        panel.add(c, constraints);
     142    }
    120143
    121144    public boolean ok() {
    122145        boolean mod = false;
     
    125148        Main.pref.put("osm-primitives.localize-name", showLocalizedName.isSelected());
    126149        Main.pref.put("modeless", modeless.isSelected());
    127150        Main.pref.put("dialog.dynamic.buttons", dynamicButtons.isSelected());
     151        mod |= Main.pref.put("font", fontCombo.getSelectedFont() != null ? fontCombo.getSelectedFont().getFontName() : null);
    128152        mod |= Main.pref.put("laf", ((LookAndFeelInfo)lafCombo.getSelectedItem()).getClassName());
    129153        return mod;
    130154    }
  • core/src/org/openstreetmap/josm/gui/widgets/FontChooser.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.widgets;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.Component;
     7import java.awt.Font;
     8import java.awt.GraphicsEnvironment;
     9import java.util.Arrays;
     10import java.util.Comparator;
     11
     12import javax.swing.DefaultListCellRenderer;
     13import javax.swing.JComboBox;
     14import javax.swing.JList;
     15import javax.swing.ListCellRenderer;
     16
     17/**
     18 * A Combobox that displays the available fonts in their own font.
     19 * @since 5664
     20 */
     21public class FontChooser extends JComboBox {
     22
     23    /**
     24     * Constructor
     25     */
     26    public FontChooser() {
     27
     28        final Font[] fonts = GraphicsEnvironment
     29                .getLocalGraphicsEnvironment()
     30                .getAllFonts();
     31
     32        Arrays.sort(fonts, new Comparator<Font>() {
     33            @Override
     34            public int compare(Font f1, Font f2) {
     35                return f1.getName().compareTo(f2.getName());
     36            }
     37        });
     38       
     39        addItem(null);
     40
     41        for (Font font : fonts) {
     42            if (font.canDisplayUpTo(font.getName()) == -1) {
     43                addItem(font);
     44            }
     45        }
     46       
     47        setRenderer(new FontCellRenderer());
     48    }
     49   
     50    private static class FontCellRenderer implements ListCellRenderer {
     51       
     52        protected DefaultListCellRenderer renderer = new DefaultListCellRenderer();
     53       
     54        @Override
     55        public Component getListCellRendererComponent(JList list, Object value,
     56            int index, boolean isSelected, boolean cellHasFocus) {
     57            Font font = (Font) value;
     58            final Component result = renderer.getListCellRendererComponent(list,
     59                    font == null ? tr("Default (Auto determined)") : font.getName(),
     60                            index, isSelected, cellHasFocus);
     61            if (font != null && result != null) {
     62                result.setFont(font.deriveFont(result.getFont().getSize2D()));
     63            }
     64            return result;
     65        }
     66    }
     67   
     68    /**
     69     * Get the selected font, or null if the default font (first choice) has been selected.
     70     * @return The selected font, or null if the default font (first choice) has been selected.
     71     */
     72    public final Font getSelectedFont() {
     73        return (Font) getSelectedItem();
     74    }
     75}