source: josm/trunk/src/org/openstreetmap/josm/gui/io/CloseChangesetDialog.java@ 4310

Last change on this file since 4310 was 4310, checked in by stoecker, 13 years ago

fix #6680, fix #6677 - i18n issues

  • Property svn:eol-style set to native
File size: 7.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.io;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Dimension;
8import java.awt.FlowLayout;
9import java.awt.event.ActionEvent;
10import java.awt.event.KeyEvent;
11import java.awt.event.WindowAdapter;
12import java.awt.event.WindowEvent;
13import java.util.ArrayList;
14import java.util.Collection;
15
16import javax.swing.AbstractAction;
17import javax.swing.BorderFactory;
18import javax.swing.DefaultListModel;
19import javax.swing.JComponent;
20import javax.swing.JDialog;
21import javax.swing.JLabel;
22import javax.swing.JList;
23import javax.swing.JOptionPane;
24import javax.swing.JPanel;
25import javax.swing.JScrollPane;
26import javax.swing.KeyStroke;
27import javax.swing.event.ListSelectionEvent;
28import javax.swing.event.ListSelectionListener;
29
30import org.openstreetmap.josm.Main;
31import org.openstreetmap.josm.data.osm.Changeset;
32import org.openstreetmap.josm.gui.SideButton;
33import org.openstreetmap.josm.tools.ImageProvider;
34import org.openstreetmap.josm.tools.WindowGeometry;
35
36/**
37 * This dialog lets the user select changesets from a list of changesets.
38 *
39 */
40public class CloseChangesetDialog extends JDialog {
41
42 /** the list */
43 private JList lstOpenChangesets;
44 /** true if the user canceled the dialog */
45 private boolean canceled;
46 /** the list model */
47 private DefaultListModel model;
48
49 private SideButton btnCloseChangesets;
50
51 protected JPanel buildTopPanel() {
52 JPanel pnl = new JPanel();
53 pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
54 pnl.setLayout(new BorderLayout());
55 pnl.add(new JLabel(tr("<html>Please select the changesets you want to close</html>")), BorderLayout.CENTER);
56 return pnl;
57 }
58
59 protected JPanel buildCenterPanel() {
60 JPanel pnl = new JPanel();
61 pnl.setLayout(new BorderLayout());
62 model = new DefaultListModel();
63 pnl.add(new JScrollPane(lstOpenChangesets = new JList(model)), BorderLayout.CENTER);
64 lstOpenChangesets.setCellRenderer(new ChangesetCellRenderer());
65 return pnl;
66 }
67
68 protected JPanel buildSouthPanel() {
69 JPanel pnl = new JPanel();
70 pnl.setLayout(new FlowLayout(FlowLayout.CENTER));
71
72 // -- close action
73 CloseAction closeAction = new CloseAction();
74 lstOpenChangesets.addListSelectionListener(closeAction);
75 pnl.add(btnCloseChangesets = new SideButton(closeAction));
76 btnCloseChangesets.setFocusable(true);
77 btnCloseChangesets.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "enter");
78 btnCloseChangesets.getActionMap().put("enter",closeAction);
79
80 // -- cancel action
81 SideButton btn;
82 pnl.add(btn = new SideButton(new CancelAction()));
83 btn.setFocusable(true);
84 return pnl;
85 }
86
87 protected void build() {
88 setTitle(tr("Open changesets"));
89 getContentPane().setLayout(new BorderLayout());
90 getContentPane().add(buildTopPanel(), BorderLayout.NORTH);
91 getContentPane().add(buildCenterPanel(), BorderLayout.CENTER);
92 getContentPane().add(buildSouthPanel(), BorderLayout.SOUTH);
93
94 getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0), "escape");
95 getRootPane().getActionMap().put("escape", new CancelAction());
96 addWindowListener(new WindowEventHandler());
97 }
98
99 @Override
100 public void setVisible(boolean visible) {
101 if (visible) {
102 new WindowGeometry(
103 getClass().getName() + ".geometry",
104 WindowGeometry.centerInWindow(Main.parent, new Dimension(300,300))
105 ).applySafe(this);
106 } else {
107 new WindowGeometry(this).remember(getClass().getName() + ".geometry");
108 }
109 super.setVisible(visible);
110 }
111
112 public CloseChangesetDialog() {
113 super(JOptionPane.getFrameForComponent(Main.parent), ModalityType.DOCUMENT_MODAL);
114 build();
115 }
116
117 class CloseAction extends AbstractAction implements ListSelectionListener {
118 public CloseAction() {
119 putValue(NAME, tr("Close changesets"));
120 putValue(SMALL_ICON, ImageProvider.get("closechangeset"));
121 putValue(SHORT_DESCRIPTION, tr("Close the selected open changesets"));
122 refreshEnabledState();
123 }
124
125 public void actionPerformed(ActionEvent e) {
126 setCanceled(false);
127 setVisible(false);
128 }
129
130 protected void refreshEnabledState() {
131 setEnabled(lstOpenChangesets.getSelectedValues() != null && lstOpenChangesets.getSelectedValues().length > 0);
132 }
133
134 public void valueChanged(ListSelectionEvent e) {
135 refreshEnabledState();
136 }
137 }
138
139 class CancelAction extends AbstractAction {
140
141 public CancelAction() {
142 putValue(NAME, tr("Cancel"));
143 putValue(SMALL_ICON, ImageProvider.get("cancel"));
144 putValue(SHORT_DESCRIPTION, tr("Cancel closing of changesets"));
145 }
146
147 public void cancel() {
148 setCanceled(true);
149 setVisible(false);
150 }
151
152 public void actionPerformed(ActionEvent e) {
153 cancel();
154 }
155 }
156
157 class WindowEventHandler extends WindowAdapter {
158
159 @Override
160 public void windowActivated(WindowEvent arg0) {
161 btnCloseChangesets.requestFocusInWindow();
162 }
163
164 @Override
165 public void windowClosing(WindowEvent arg0) {
166 new CancelAction().cancel();
167 }
168
169 }
170
171 /**
172 * Replies true if this dialog was canceled
173 * @return true if this dialog was canceled
174 */
175 public boolean isCanceled() {
176 return canceled;
177 }
178
179 /**
180 * Sets whether this dialog is canceled
181 *
182 * @param canceled true, if this dialog is canceld
183 */
184 protected void setCanceled(boolean canceled) {
185 this.canceled = canceled;
186 }
187
188 /**
189 * Sets the collection of changesets to be displayed
190 *
191 * @param changesets the collection of changesets. Assumes an empty collection if null
192 */
193 public void setChangesets(Collection<Changeset> changesets) {
194 if (changesets == null) {
195 changesets = new ArrayList<Changeset>();
196 }
197 model.removeAllElements();
198 for (Changeset cs: changesets) {
199 model.addElement(cs);
200 }
201 if (!changesets.isEmpty()) {
202 lstOpenChangesets.getSelectionModel().setSelectionInterval(0, changesets.size()-1);
203 }
204 }
205
206 /**
207 * Replies a collection with the changesets the user selected.
208 * Never null, but may be empty.
209 *
210 * @return a collection with the changesets the user selected.
211 */
212 public Collection<Changeset> getSelectedChangesets() {
213 Object [] sel = lstOpenChangesets.getSelectedValues();
214 ArrayList<Changeset> ret = new ArrayList<Changeset>();
215 for (Object o: sel) {
216 ret.add((Changeset)o);
217 }
218 return ret;
219 }
220}
Note: See TracBrowser for help on using the repository browser.