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

Last change on this file since 2689 was 2689, checked in by Gubaer, 14 years ago

new: Changeset Cache Manager for querying, downloading, browsing, and managing changesets within JOSM. See also Changeset Manager and Changeset Query Dialog

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