Ignore:
Timestamp:
2010-01-06T20:34:54+01:00 (14 years ago)
Author:
Gubaer
Message:

Partial commit due to #4137. Comment to follow in another commit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java

    r2641 r2745  
    1 // License: GPL. Copyright 2007 by Immanuel Scholz and others
     1// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.preferences;
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.awt.Font;
    7 import java.awt.GridBagLayout;
    8 import java.awt.ScrollPane;
    9 import java.awt.event.MouseWheelEvent;
    10 import java.awt.event.MouseWheelListener;
    11 import java.util.ArrayList;
    12 import java.util.Collection;
    13 import java.util.Iterator;
    14 import java.util.LinkedList;
    15 import java.util.List;
    16 import java.util.logging.Logger;
     6import java.awt.BorderLayout;
     7import java.awt.Component;
     8import java.awt.Container;
     9import java.awt.Dimension;
     10import java.awt.FlowLayout;
     11import java.awt.event.ActionEvent;
     12import java.awt.event.KeyEvent;
     13import java.awt.event.WindowAdapter;
     14import java.awt.event.WindowEvent;
    1715
     16import javax.swing.AbstractAction;
    1817import javax.swing.BorderFactory;
    1918import javax.swing.JComponent;
    20 import javax.swing.JLabel;
     19import javax.swing.JDialog;
    2120import javax.swing.JOptionPane;
    2221import javax.swing.JPanel;
    23 import javax.swing.JScrollPane;
    24 import javax.swing.JTabbedPane;
     22import javax.swing.KeyStroke;
    2523
    26 import org.openstreetmap.josm.Main;
    27 import org.openstreetmap.josm.plugins.PluginHandler;
    28 import org.openstreetmap.josm.tools.BugReportExceptionHandler;
    29 import org.openstreetmap.josm.tools.GBC;
    30 import org.openstreetmap.josm.tools.I18n;
     24import org.openstreetmap.josm.gui.SideButton;
     25import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
     26import org.openstreetmap.josm.gui.help.HelpUtil;
    3127import org.openstreetmap.josm.tools.ImageProvider;
     28import org.openstreetmap.josm.tools.WindowGeometry;
    3229
    33 /**
    34  * The preference settings.
    35  *
    36  * @author imi
    37  */
    38 public class PreferenceDialog extends JTabbedPane implements MouseWheelListener {
    39     static private final Logger logger = Logger.getLogger(PreferenceDialog.class.getName());
     30public class PreferenceDialog extends JDialog {
    4031
    41     private final static Collection<PreferenceSettingFactory> settingsFactory = new LinkedList<PreferenceSettingFactory>();
    42     private final List<PreferenceSetting> settings = new ArrayList<PreferenceSetting>();
     32    private PreferenceTabbedPane tpPreferences;
     33    private boolean canceled;
    4334
    44     // some common tabs
    45     public final JPanel display = createPreferenceTab("display", tr("Display Settings"), tr("Various settings that influence the visual representation of the whole program."));
    46     public final JPanel connection = createPreferenceTab("connection", I18n.tr("Connection Settings"), I18n.tr("Connection Settings for the OSM server."),false);
    47     public final JPanel map = createPreferenceTab("map", I18n.tr("Map Settings"), I18n.tr("Settings for the map projection and data interpretation."));
    48     public final JPanel audio = createPreferenceTab("audio", I18n.tr("Audio Settings"), I18n.tr("Settings for the audio player and audio markers."));
    49 
    50     public final javax.swing.JTabbedPane displaycontent = new javax.swing.JTabbedPane();
    51     public final javax.swing.JTabbedPane mapcontent = new javax.swing.JTabbedPane();
    52 
    53     /**
    54      * Construct a JPanel for the preference settings. Layout is GridBagLayout
    55      * and a centered title label and the description are added. The panel
    56      * will be shown inside a {@link ScrollPane}
    57      * @param icon The name of the icon.
    58      * @param title The title of this preference tab.
    59      * @param desc A description in one sentence for this tab. Will be displayed
    60      *      italic under the title.
    61      * @return The created panel ready to add other controls.
    62      */
    63     public JPanel createPreferenceTab(String icon, String title, String desc) {
    64         return createPreferenceTab(icon, title, desc, false);
     35    protected JPanel buildActionPanel() {
     36        JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
     37        pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
     38        pnl.add(new SideButton(new OKAction()));
     39        pnl.add(new SideButton(new CancelAction()));
     40        pnl.add(new SideButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Action/Preferences"))));
     41        return pnl;
    6542    }
    6643
    67     /**
    68      * Construct a JPanel for the preference settings. Layout is GridBagLayout
    69      * and a centered title label and the description are added.
    70      * @param icon The name of the icon.
    71      * @param title The title of this preference tab.
    72      * @param desc A description in one sentence for this tab. Will be displayed
    73      *      italic under the title.
    74      * @param inScrollPane if <code>true</code> the added tab will show scroll bars
    75      *        if the panel content is larger than the available space
    76      * @return The created panel ready to add other controls.
    77      */
    78     public JPanel createPreferenceTab(String icon, String title, String desc, boolean inScrollPane) {
    79         JPanel p = new JPanel(new GridBagLayout());
    80         p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    81         p.add(new JLabel(title), GBC.eol().anchor(GBC.CENTER).insets(0,5,0,10));
     44    protected void build() {
     45        Container c = getContentPane();
     46        c.setLayout(new BorderLayout());
     47        c.add(tpPreferences = new PreferenceTabbedPane(), BorderLayout.CENTER);
     48        tpPreferences.buildGui();
     49        tpPreferences.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
     50        c.add(buildActionPanel(), BorderLayout.SOUTH);
    8251
    83         JLabel descLabel = new JLabel("<html>"+desc+"</html>");
    84         descLabel.setFont(descLabel.getFont().deriveFont(Font.ITALIC));
    85         p.add(descLabel, GBC.eol().insets(5,0,5,20).fill(GBC.HORIZONTAL));
     52        addWindowListener(new WindowEventHandler());
    8653
    87         JComponent tab = p;
    88         if (inScrollPane) {
    89             JScrollPane sp = new JScrollPane(p);
    90             tab = sp;
    91         }
    92         addTab(null, ImageProvider.get("preferences", icon), tab);
    93         setToolTipTextAt(getTabCount()-1, "<html>"+desc+"</html>");
    94         return p;
     54        getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel");
     55        getRootPane().getActionMap().put("cancel", new CancelAction());
     56        HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Action/Preferences"));
    9557    }
    9658
    97     public void ok() {
    98         boolean requiresRestart = false;
    99         for (PreferenceSetting setting : settings)
    100         {
    101             if(setting.ok()) {
    102                 requiresRestart = true;
    103             }
    104         }
    105         if (requiresRestart) {
    106             JOptionPane.showMessageDialog(
    107                     Main.parent,
    108                     tr("You have to restart JOSM for some settings to take effect."),
    109                     tr("Warning"),
    110                     JOptionPane.WARNING_MESSAGE
    111             );
    112         }
    113         Main.parent.repaint();
     59    public PreferenceDialog(Component parent) {
     60        super(JOptionPane.getFrameForComponent(parent), tr("Preferences"), true /* modal */);
     61        build();
    11462    }
    11563
    116     /**
    117      * If the dialog is closed with Ok, the preferences will be stored to the preferences-
    118      * file, otherwise no change of the file happens.
    119      */
    120     public PreferenceDialog() {
    121         super(JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT);
     64    public boolean isCanceled() {
     65        return canceled;
     66    }
    12267
    123         super.addMouseWheelListener(this);
     68    protected void setCanceled(boolean canceled) {
     69        this.canceled = canceled;
     70    }
    12471
    125         for (PreferenceSettingFactory factory:settingsFactory) {
    126             // logger.info("creating settings: " + factory);
    127             PreferenceSetting setting = factory.createPreferenceSetting();
    128             if (setting != null) {
    129                 settings.add(factory.createPreferenceSetting());
    130             }
     72    @Override
     73    public void setVisible(boolean visible) {
     74        if (visible) {
     75            new WindowGeometry(
     76                    getClass().getName() + ".geometry",
     77                    WindowGeometry.centerInWindow(
     78                            getParent(),
     79                            new Dimension(600,800)
     80                    )
     81            ).apply(this);
     82        } else if (!visible && isShowing()){
     83            new WindowGeometry(this).remember(getClass().getName() + ".geometry");
     84        }
     85        super.setVisible(visible);
     86    }
     87
     88    class CancelAction extends AbstractAction {
     89        public CancelAction() {
     90            putValue(NAME, tr("Cancel"));
     91            putValue(SMALL_ICON, ImageProvider.get("cancel"));
     92            putValue(SHORT_DESCRIPTION, tr("Close the prefereces dialog and discard preference updates"));
    13193        }
    13294
    133         display.add(displaycontent, GBC.eol().fill(GBC.BOTH));
    134         map.add(mapcontent, GBC.eol().fill(GBC.BOTH));
    135         for (Iterator<PreferenceSetting> it = settings.iterator(); it.hasNext();) {
    136             try {
    137                 PreferenceSetting settings = it.next();
    138                 //logger.info("adding gui: " + settings);
    139                 settings.addGui(this);
    140             } catch (SecurityException e) {
    141                 it.remove();
    142             } catch (Throwable e) {
    143                 /* allow to change most settings even if e.g. a plugin fails */
    144                 BugReportExceptionHandler.handleException(e);
    145             }
     95        public void cancel() {
     96            setCanceled(true);
     97            setVisible(false);
     98        }
     99
     100        public void actionPerformed(ActionEvent evt) {
     101            cancel();
    146102        }
    147103    }
    148104
    149     public List<PreferenceSetting> getSettings() {
    150         return settings;
     105    class OKAction extends AbstractAction {
     106        public OKAction() {
     107            putValue(NAME, tr("OK"));
     108            putValue(SMALL_ICON, ImageProvider.get("ok"));
     109            putValue(SHORT_DESCRIPTION, tr("Save the preferences and close the dialog"));
     110        }
     111
     112        public void actionPerformed(ActionEvent evt) {
     113            tpPreferences.savePreferences();
     114            setCanceled(false);
     115            setVisible(false);
     116        }
    151117    }
    152118
    153     @SuppressWarnings("unchecked")
    154     public <T>  T getSetting(Class<? extends T> clazz) {
    155         for (PreferenceSetting setting:settings) {
    156             if (clazz.isAssignableFrom(setting.getClass()))
    157                 return (T)setting;
     119    class WindowEventHandler extends WindowAdapter {
     120        @Override
     121        public void windowClosing(WindowEvent arg0) {
     122            new CancelAction().cancel();
    158123        }
    159         return null;
    160     }
    161 
    162     static {
    163         // order is important!
    164         settingsFactory.add(new DrawingPreference.Factory());
    165         settingsFactory.add(new ColorPreference.Factory());
    166         settingsFactory.add(new LafPreference.Factory());
    167         settingsFactory.add(new LanguagePreference.Factory());
    168         settingsFactory.add(new ServerAccessPreference.Factory());
    169         settingsFactory.add(new FilePreferences.Factory());
    170         settingsFactory.add(new ProxyPreferences.Factory());
    171         settingsFactory.add(new ProjectionPreference.Factory());
    172         settingsFactory.add(new MapPaintPreference.Factory());
    173         settingsFactory.add(new TaggingPresetPreference.Factory());
    174         settingsFactory.add(new PluginPreference.Factory());
    175         settingsFactory.add(Main.toolbar);
    176         settingsFactory.add(new AudioPreference.Factory());
    177         settingsFactory.add(new ShortcutPreference.Factory());
    178 
    179         PluginHandler.getPreferenceSetting(settingsFactory);
    180 
    181         // always the last: advanced tab
    182         settingsFactory.add(new AdvancedPreference.Factory());
    183     }
    184 
    185     /**
    186      * This mouse wheel listener reacts when a scroll is carried out over the
    187      * tab strip and scrolls one tab/down or up, selecting it immediately.
    188      */
    189     public void mouseWheelMoved(MouseWheelEvent wev) {
    190         // Ensure the cursor is over the tab strip
    191         if(super.indexAtLocation(wev.getPoint().x, wev.getPoint().y) < 0)
    192             return;
    193 
    194         // Get currently selected tab
    195         int newTab = super.getSelectedIndex() + wev.getWheelRotation();
    196 
    197         // Ensure the new tab index is sound
    198         newTab = newTab < 0 ? 0 : newTab;
    199         newTab = newTab >= super.getTabCount() ? super.getTabCount() - 1 : newTab;
    200 
    201         // select new tab
    202         super.setSelectedIndex(newTab);
    203124    }
    204125}
Note: See TracChangeset for help on using the changeset viewer.