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

Last change on this file was 19050, checked in by taylor.smock, 14 hours ago

Revert most var changes from r19048, fix most new compile warnings and checkstyle issues

Also, document why various ErrorProne checks were originally disabled and fix
generic SonarLint issues.

  • 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(600, 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.