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

Last change on this file since 8510 was 8510, checked in by Don-vip, 9 years ago

checkstyle: enable relevant whitespace checks and fix them

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