source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java@ 11365

Last change on this file since 11365 was 10791, checked in by simon04, 8 years ago

see #13319 - Use InputMapUtils where applicable (VK_ESCAPE)

  • Property svn:eol-style set to native
File size: 6.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Component;
8import java.awt.Container;
9import java.awt.Dimension;
10import java.awt.FlowLayout;
11import java.awt.GridBagLayout;
12import java.awt.Insets;
13import java.awt.event.ActionEvent;
14import java.awt.event.WindowAdapter;
15import java.awt.event.WindowEvent;
16
17import javax.swing.AbstractAction;
18import javax.swing.BorderFactory;
19import javax.swing.JButton;
20import javax.swing.JCheckBox;
21import javax.swing.JDialog;
22import javax.swing.JPanel;
23
24import org.openstreetmap.josm.actions.ExpertToggleAction;
25import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
26import org.openstreetmap.josm.gui.help.HelpUtil;
27import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane.ValidationListener;
28import org.openstreetmap.josm.gui.util.GuiHelper;
29import org.openstreetmap.josm.tools.GBC;
30import org.openstreetmap.josm.tools.ImageProvider;
31import org.openstreetmap.josm.tools.InputMapUtils;
32import org.openstreetmap.josm.tools.WindowGeometry;
33
34public class PreferenceDialog extends JDialog {
35
36 private final PreferenceTabbedPane tpPreferences = new PreferenceTabbedPane();
37 private boolean canceled;
38
39 /**
40 * Constructs a new {@code PreferenceDialog}.
41 * @param parent parent component
42 */
43 public PreferenceDialog(Component parent) {
44 super(GuiHelper.getFrameForComponent(parent), tr("Preferences"), ModalityType.DOCUMENT_MODAL);
45 build();
46 this.setMinimumSize(new Dimension(600, 350));
47 // set the maximum width to the current screen. If the dialog is opened on a
48 // smaller screen than before, this will reset the stored preference.
49 this.setMaximumSize(GuiHelper.getScreenSize());
50 }
51
52 protected JPanel buildActionPanel() {
53 JPanel pnl = new JPanel(new GridBagLayout());
54
55 JCheckBox expert = new JCheckBox(tr("Expert mode"));
56 expert.setSelected(ExpertToggleAction.isExpert());
57 expert.addActionListener(e -> ExpertToggleAction.getInstance().actionPerformed(null));
58
59 JPanel btns = new JPanel(new FlowLayout(FlowLayout.CENTER));
60 btns.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
61 btns.add(new JButton(new OKAction()));
62 btns.add(new JButton(new CancelAction()));
63 btns.add(new JButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Action/Preferences"))));
64 pnl.add(expert, GBC.std().insets(5, 0, 0, 0));
65 pnl.add(btns, GBC.std().fill(GBC.HORIZONTAL));
66 return pnl;
67 }
68
69 protected final void build() {
70 Container c = getContentPane();
71 c.setLayout(new BorderLayout());
72 c.add(tpPreferences, BorderLayout.CENTER);
73 tpPreferences.buildGui();
74 tpPreferences.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
75 c.add(buildActionPanel(), BorderLayout.SOUTH);
76
77 addWindowListener(new WindowEventHandler());
78
79 InputMapUtils.addEscapeAction(getRootPane(), new CancelAction());
80 HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Action/Preferences"));
81 }
82
83 /**
84 * Replies the preferences tabbed pane.
85 * @return The preferences tabbed pane, or null if the dialog is not yet initialized.
86 * @since 5604
87 */
88 public PreferenceTabbedPane getTabbedPane() {
89 return tpPreferences;
90 }
91
92 public boolean isCanceled() {
93 return canceled;
94 }
95
96 protected void setCanceled(boolean canceled) {
97 this.canceled = canceled;
98 }
99
100 @Override
101 public void setVisible(boolean visible) {
102 if (visible) {
103 // Make the pref window at most as large as the parent JOSM window
104 // Have to take window decorations into account or the windows will
105 // be too large
106 Insets i = this.getParent().getInsets();
107 Dimension p = this.getParent().getSize();
108 p = new Dimension(Math.min(p.width-i.left-i.right, 700),
109 Math.min(p.height-i.top-i.bottom, 800));
110 new WindowGeometry(
111 getClass().getName() + ".geometry",
112 WindowGeometry.centerInWindow(
113 getParent(),
114 p
115 )
116 ).applySafe(this);
117 } else if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
118 new WindowGeometry(this).remember(getClass().getName() + ".geometry");
119 }
120 super.setVisible(visible);
121 }
122
123 /**
124 * Select preferences tab by name.
125 * @param name preferences tab name (icon)
126 */
127 public void selectPreferencesTabByName(String name) {
128 tpPreferences.selectTabByName(name);
129 }
130
131 /**
132 * Select preferences tab by class.
133 * @param clazz preferences tab class
134 */
135 public void selectPreferencesTabByClass(Class<? extends TabPreferenceSetting> clazz) {
136 tpPreferences.selectTabByPref(clazz);
137 }
138
139 /**
140 * Select preferences sub-tab by class.
141 * @param clazz preferences sub-tab class
142 */
143 public void selectSubPreferencesTabByClass(Class<? extends SubPreferenceSetting> clazz) {
144 tpPreferences.selectSubTabByPref(clazz);
145 }
146
147 class CancelAction extends AbstractAction {
148 CancelAction() {
149 putValue(NAME, tr("Cancel"));
150 new ImageProvider("cancel").getResource().attachImageIcon(this);
151 putValue(SHORT_DESCRIPTION, tr("Close the preferences dialog and discard preference updates"));
152 }
153
154 public void cancel() {
155 setCanceled(true);
156 setVisible(false);
157 tpPreferences.validationListeners.clear();
158 }
159
160 @Override
161 public void actionPerformed(ActionEvent evt) {
162 cancel();
163 }
164 }
165
166 class OKAction extends AbstractAction {
167 OKAction() {
168 putValue(NAME, tr("OK"));
169 new ImageProvider("ok").getResource().attachImageIcon(this);
170 putValue(SHORT_DESCRIPTION, tr("Save the preferences and close the dialog"));
171 }
172
173 @Override
174 public void actionPerformed(ActionEvent evt) {
175 for (ValidationListener listener: tpPreferences.validationListeners) {
176 if (!listener.validatePreferences())
177 return;
178 }
179
180 tpPreferences.savePreferences();
181 tpPreferences.validationListeners.clear();
182 setCanceled(false);
183 setVisible(false);
184 }
185 }
186
187 class WindowEventHandler extends WindowAdapter {
188 @Override
189 public void windowClosing(WindowEvent arg0) {
190 new CancelAction().cancel();
191 }
192 }
193}
Note: See TracBrowser for help on using the repository browser.