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

Last change on this file since 4843 was 4843, checked in by bastiK, 12 years ago

see #7299 - Move features to expert mode

  • Property svn:eol-style set to native
File size: 6.2 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.Main;
30import org.openstreetmap.josm.actions.ExpertToggleAction;
31import org.openstreetmap.josm.gui.SideButton;
32import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
33import org.openstreetmap.josm.gui.help.HelpUtil;
34import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane.ValidationListener;
35import org.openstreetmap.josm.tools.GBC;
36import org.openstreetmap.josm.tools.ImageProvider;
37import org.openstreetmap.josm.tools.WindowGeometry;
38
39public class PreferenceDialog extends JDialog {
40
41 private PreferenceTabbedPane tpPreferences;
42 private boolean canceled;
43
44 protected JPanel buildActionPanel() {
45 JPanel pnl = new JPanel(new GridBagLayout());
46
47 JCheckBox expert = new JCheckBox(tr("Expert mode"));
48 expert.setSelected(ExpertToggleAction.isExpert());
49 expert.addActionListener(new ActionListener() {
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 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 public boolean isCanceled() {
90 return canceled;
91 }
92
93 protected void setCanceled(boolean canceled) {
94 this.canceled = canceled;
95 }
96
97 @Override
98 public void setVisible(boolean visible) {
99 if (visible) {
100 // Make the pref window at most as large as the parent JOSM window
101 // Have to take window decorations into account or the windows will
102 // be too large
103 Insets i = this.getParent().getInsets();
104 Dimension p = this.getParent().getSize();
105 p = new Dimension(Math.min(p.width-i.left-i.right, 700),
106 Math.min(p.height-i.top-i.bottom, 800));
107 new WindowGeometry(
108 getClass().getName() + ".geometry",
109 WindowGeometry.centerInWindow(
110 getParent(),
111 p
112 )
113 ).applySafe(this);
114 } else if (!visible && isShowing()){
115 new WindowGeometry(this).remember(getClass().getName() + ".geometry");
116 }
117 super.setVisible(visible);
118 }
119
120 void selectPreferencesTabByName(String name) {
121 tpPreferences.selectTabByName(name);
122 }
123
124 class CancelAction extends AbstractAction {
125 public CancelAction() {
126 putValue(NAME, tr("Cancel"));
127 putValue(SMALL_ICON, ImageProvider.get("cancel"));
128 putValue(SHORT_DESCRIPTION, tr("Close the preferences dialog and discard preference updates"));
129 }
130
131 public void cancel() {
132 setCanceled(true);
133 setVisible(false);
134 tpPreferences.validationListeners.clear();
135 }
136
137 public void actionPerformed(ActionEvent evt) {
138 cancel();
139 }
140 }
141
142 class OKAction extends AbstractAction {
143 public OKAction() {
144 putValue(NAME, tr("OK"));
145 putValue(SMALL_ICON, ImageProvider.get("ok"));
146 putValue(SHORT_DESCRIPTION, tr("Save the preferences and close the dialog"));
147 }
148
149 public void actionPerformed(ActionEvent evt) {
150 for (ValidationListener listener: tpPreferences.validationListeners) {
151 if (!listener.validatePreferences())
152 return;
153 }
154
155 tpPreferences.savePreferences();
156 tpPreferences.validationListeners.clear();
157 setCanceled(false);
158 setVisible(false);
159 }
160 }
161
162 class WindowEventHandler extends WindowAdapter {
163 @Override
164 public void windowClosing(WindowEvent arg0) {
165 new CancelAction().cancel();
166 }
167 }
168
169 public void selectMapPaintPreferenceTab() {
170 tpPreferences.setSelectedComponent(tpPreferences.map);
171 tpPreferences.mapcontent.setSelectedIndex(1);
172 }
173}
Note: See TracBrowser for help on using the repository browser.