source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java@ 15714

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

fix #18567 - proper help context for Query Changeset Dialog (patch by skyper)

  • Property svn:eol-style set to native
File size: 8.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.changeset.query;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Container;
8import java.awt.Dimension;
9import java.awt.FlowLayout;
10import java.awt.Window;
11import java.awt.event.ActionEvent;
12import java.awt.event.WindowAdapter;
13import java.awt.event.WindowEvent;
14
15import javax.swing.AbstractAction;
16import javax.swing.JButton;
17import javax.swing.JDialog;
18import javax.swing.JOptionPane;
19import javax.swing.JPanel;
20import javax.swing.JTabbedPane;
21
22import org.openstreetmap.josm.gui.HelpAwareOptionPane;
23import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
24import org.openstreetmap.josm.gui.help.HelpUtil;
25import org.openstreetmap.josm.gui.util.WindowGeometry;
26import org.openstreetmap.josm.io.ChangesetQuery;
27import org.openstreetmap.josm.tools.ImageProvider;
28import org.openstreetmap.josm.tools.InputMapUtils;
29import org.openstreetmap.josm.tools.Logging;
30
31/**
32 * This is a modal dialog for entering query criteria to search for changesets.
33 * @since 2689
34 */
35public class ChangesetQueryDialog extends JDialog {
36
37 private JTabbedPane tpQueryPanels;
38 private final BasicChangesetQueryPanel pnlBasicChangesetQueries = new BasicChangesetQueryPanel();
39 private final UrlBasedQueryPanel pnlUrlBasedQueries = new UrlBasedQueryPanel();
40 private final AdvancedChangesetQueryPanel pnlAdvancedQueries = new AdvancedChangesetQueryPanel();
41 private boolean canceled;
42
43 /**
44 * Constructs a new {@code ChangesetQueryDialog}.
45 * @param parent parent window
46 */
47 public ChangesetQueryDialog(Window parent) {
48 super(parent, ModalityType.DOCUMENT_MODAL);
49 build();
50 }
51
52 protected JPanel buildContentPanel() {
53 tpQueryPanels = new JTabbedPane();
54 tpQueryPanels.add(pnlBasicChangesetQueries);
55 tpQueryPanels.add(pnlUrlBasedQueries);
56 tpQueryPanels.add(pnlAdvancedQueries);
57
58 tpQueryPanels.setTitleAt(0, tr("Basic"));
59 tpQueryPanels.setToolTipTextAt(0, tr("Download changesets using predefined queries"));
60
61 tpQueryPanels.setTitleAt(1, tr("From URL"));
62 tpQueryPanels.setToolTipTextAt(1, tr("Query changesets from a server URL"));
63
64 tpQueryPanels.setTitleAt(2, tr("Advanced"));
65 tpQueryPanels.setToolTipTextAt(2, tr("Use a custom changeset query"));
66
67 JPanel pnl = new JPanel(new BorderLayout());
68 pnl.add(tpQueryPanels, BorderLayout.CENTER);
69 return pnl;
70 }
71
72 protected JPanel buildButtonPanel() {
73 JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
74
75 final JButton queryButton = new JButton(new QueryAction());
76 queryButton.setName("queryButton");
77 pnl.add(queryButton);
78 final JButton cancelButton = new JButton(new CancelAction());
79 cancelButton.setName("cancelButton");
80 pnl.add(cancelButton);
81 pnl.add(new JButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/ChangesetQuery"))));
82
83 return pnl;
84 }
85
86 protected final void build() {
87 setTitle(tr("Query changesets"));
88 Container cp = getContentPane();
89 cp.setLayout(new BorderLayout());
90 cp.add(buildContentPanel(), BorderLayout.CENTER);
91 cp.add(buildButtonPanel(), BorderLayout.SOUTH);
92
93 // cancel on ESC
94 InputMapUtils.addEscapeAction(getRootPane(), new CancelAction());
95
96 // context sensitive help
97 HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Dialog/ChangesetQuery"));
98
99 addWindowListener(new WindowEventHandler());
100 }
101
102 /**
103 * Determines if the dialog has been canceled.
104 * @return {@code true} if the dialog has been canceled
105 */
106 public boolean isCanceled() {
107 return canceled;
108 }
109
110 /**
111 * Initializes HMI for user input.
112 */
113 public void initForUserInput() {
114 pnlBasicChangesetQueries.init();
115 }
116
117 protected void setCanceled(boolean canceled) {
118 this.canceled = canceled;
119 }
120
121 /**
122 * Returns the changeset query.
123 * @return the changeset query
124 */
125 public ChangesetQuery getChangesetQuery() {
126 if (isCanceled())
127 return null;
128 switch(tpQueryPanels.getSelectedIndex()) {
129 case 0:
130 return pnlBasicChangesetQueries.buildChangesetQuery();
131 case 1:
132 return pnlUrlBasedQueries.buildChangesetQuery();
133 case 2:
134 return pnlAdvancedQueries.buildChangesetQuery();
135 default:
136 // FIXME: extend with advanced queries
137 return null;
138 }
139 }
140
141 /**
142 * Initializes HMI for user input.
143 */
144 public void startUserInput() {
145 pnlUrlBasedQueries.startUserInput();
146 pnlAdvancedQueries.startUserInput();
147 }
148
149 @Override
150 public void setVisible(boolean visible) {
151 if (visible) {
152 new WindowGeometry(
153 getClass().getName() + ".geometry",
154 WindowGeometry.centerInWindow(
155 getParent(),
156 new Dimension(400, 400)
157 )
158 ).applySafe(this);
159 setCanceled(false);
160 startUserInput();
161 } else if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
162 new WindowGeometry(this).remember(getClass().getName() + ".geometry");
163 pnlAdvancedQueries.rememberSettings();
164 }
165 super.setVisible(visible);
166 }
167
168 class QueryAction extends AbstractAction {
169 QueryAction() {
170 putValue(NAME, tr("Query"));
171 new ImageProvider("dialogs", "search").getResource().attachImageIcon(this);
172 putValue(SHORT_DESCRIPTION, tr("Query and download changesets"));
173 }
174
175 protected void alertInvalidChangesetQuery() {
176 HelpAwareOptionPane.showOptionDialog(
177 ChangesetQueryDialog.this,
178 tr("Please enter a valid changeset query URL first."),
179 tr("Illegal changeset query URL"),
180 JOptionPane.WARNING_MESSAGE,
181 HelpUtil.ht("/Dialog/ChangesetQueryDialog#EnterAValidChangesetQueryUrlFirst")
182 );
183 }
184
185 @Override
186 public void actionPerformed(ActionEvent arg0) {
187 try {
188 switch(tpQueryPanels.getSelectedIndex()) {
189 case 0:
190 // currently, query specifications can't be invalid in the basic query panel.
191 // We select from a couple of predefined queries and there is always a query
192 // selected
193 break;
194 case 1:
195 if (getChangesetQuery() == null) {
196 alertInvalidChangesetQuery();
197 pnlUrlBasedQueries.startUserInput();
198 return;
199 }
200 break;
201 case 2:
202 if (getChangesetQuery() == null) {
203 pnlAdvancedQueries.displayMessageIfInvalid();
204 return;
205 }
206 }
207 setCanceled(false);
208 setVisible(false);
209 } catch (IllegalStateException e) {
210 Logging.error(e);
211 JOptionPane.showMessageDialog(ChangesetQueryDialog.this, e.getMessage(), tr("Error"), JOptionPane.ERROR_MESSAGE);
212 }
213 }
214 }
215
216 class CancelAction extends AbstractAction {
217
218 CancelAction() {
219 putValue(NAME, tr("Cancel"));
220 new ImageProvider("cancel").getResource().attachImageIcon(this);
221 putValue(SHORT_DESCRIPTION, tr("Close the dialog and abort querying of changesets"));
222 }
223
224 public void cancel() {
225 setCanceled(true);
226 setVisible(false);
227 }
228
229 @Override
230 public void actionPerformed(ActionEvent arg0) {
231 cancel();
232 }
233 }
234
235 class WindowEventHandler extends WindowAdapter {
236 @Override
237 public void windowClosing(WindowEvent arg0) {
238 new CancelAction().cancel();
239 }
240 }
241}
Note: See TracBrowser for help on using the repository browser.