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

Revision 4864, 7.7 KB checked in by Don-vip, 4 months ago (diff)

see #7258 - IllegalStateException when attempting download in Changeset Management Dialog (error message has to be translated after stabilization)

  • Property svn:eol-style set to native
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 predefined queries"));
53
54        tpQueryPanels.setTitleAt(1, tr("From URL"));
55        tpQueryPanels.setToolTipTextAt(1, tr("Query changesets from a server URL"));
56
57        tpQueryPanels.setTitleAt(2, tr("Advanced"));
58        tpQueryPanels.setToolTipTextAt(2, tr("Use a custom changeset query"));
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/ChangesetQueryDialog"))));
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/ChangesetQueryDialog"));
94
95        addWindowListener(new WindowEventHandler());
96    }
97
98
99    public ChangesetQueryDialog(Dialog parent) {
100        super(parent, ModalityType.DOCUMENT_MODAL);
101        build();
102    }
103
104    public ChangesetQueryDialog(Frame parent) {
105        super(parent, ModalityType.DOCUMENT_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            ).applySafe(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            try {
180                switch(tpQueryPanels.getSelectedIndex()) {
181                case 0:
182                    // currently, query specifications can't be invalid in the basic query panel.
183                    // We select from a couple of predefined queries and there is always a query
184                    // selected
185                    break;
186                case 1:
187                    if (getChangesetQuery() == null) {
188                        alertInvalidChangesetQuery();
189                        pnlUrlBasedQueries.startUserInput();
190                        return;
191                    }
192                    break;
193   
194                case 2:
195                    if (getChangesetQuery() == null) {
196                        pnlAdvancedQueries.displayMessageIfInvalid();
197                        return;
198                    }
199                }
200                setCanceled(false);
201                setVisible(false);
202            } catch (IllegalStateException e) {
203                JOptionPane.showMessageDialog(ChangesetQueryDialog.this, e.getMessage(), tr("Error"), JOptionPane.ERROR_MESSAGE);
204            }
205        }
206    }
207
208    class CancelAction extends AbstractAction {
209
210        public CancelAction() {
211            putValue(NAME, tr("Cancel"));
212            putValue(SMALL_ICON, ImageProvider.get("cancel"));
213            putValue(SHORT_DESCRIPTION, tr("Close the dialog and abort querying of changesets"));
214        }
215
216        public void cancel() {
217            setCanceled(true);
218            setVisible(false);
219        }
220
221        public void actionPerformed(ActionEvent arg0) {
222            cancel();
223        }
224    }
225
226    class WindowEventHandler extends WindowAdapter {
227        @Override
228        public void windowClosing(WindowEvent arg0) {
229            new CancelAction().cancel();
230        }
231    }
232}
Note: See TracBrowser for help on using the repository browser.