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

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

sonar - squid:AssignmentInSubExpressionCheck - Assignments should not be made from within sub-expressions

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