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

Last change on this file since 6901 was 6316, checked in by Don-vip, 11 years ago

Sonar/FindBugs - Loose coupling

  • 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;
15import java.util.List;
16
17import javax.swing.AbstractAction;
18import javax.swing.BorderFactory;
19import javax.swing.DefaultListModel;
20import javax.swing.JComponent;
21import javax.swing.JDialog;
22import javax.swing.JLabel;
23import javax.swing.JList;
24import javax.swing.JOptionPane;
25import javax.swing.JPanel;
26import javax.swing.JScrollPane;
27import javax.swing.KeyStroke;
28import javax.swing.event.ListSelectionEvent;
29import javax.swing.event.ListSelectionListener;
30
31import org.openstreetmap.josm.Main;
32import org.openstreetmap.josm.data.osm.Changeset;
33import org.openstreetmap.josm.gui.SideButton;
34import org.openstreetmap.josm.tools.ImageProvider;
35import org.openstreetmap.josm.tools.InputMapUtils;
36import org.openstreetmap.josm.tools.WindowGeometry;
37
38/**
39 * This dialog lets the user select changesets from a list of changesets.
40 *
41 */
42public class CloseChangesetDialog extends JDialog {
43
44 /** the list */
45 private JList lstOpenChangesets;
46 /** true if the user canceled the dialog */
47 private boolean canceled;
48 /** the list model */
49 private DefaultListModel model;
50
51 private SideButton btnCloseChangesets;
52
53 protected JPanel buildTopPanel() {
54 JPanel pnl = new JPanel();
55 pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
56 pnl.setLayout(new BorderLayout());
57 pnl.add(new JLabel(tr("<html>Please select the changesets you want to close</html>")), BorderLayout.CENTER);
58 return pnl;
59 }
60
61 protected JPanel buildCenterPanel() {
62 JPanel pnl = new JPanel();
63 pnl.setLayout(new BorderLayout());
64 model = new DefaultListModel();
65 pnl.add(new JScrollPane(lstOpenChangesets = new JList(model)), BorderLayout.CENTER);
66 lstOpenChangesets.setCellRenderer(new ChangesetCellRenderer());
67 return pnl;
68 }
69
70 protected JPanel buildSouthPanel() {
71 JPanel pnl = new JPanel();
72 pnl.setLayout(new FlowLayout(FlowLayout.CENTER));
73
74 // -- close action
75 CloseAction closeAction = new CloseAction();
76 lstOpenChangesets.addListSelectionListener(closeAction);
77 pnl.add(btnCloseChangesets = new SideButton(closeAction));
78 InputMapUtils.enableEnter(btnCloseChangesets);
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 if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
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 @Override
126 public void actionPerformed(ActionEvent e) {
127 setCanceled(false);
128 setVisible(false);
129 }
130
131 protected void refreshEnabledState() {
132 setEnabled(lstOpenChangesets.getSelectedValues() != null && lstOpenChangesets.getSelectedValues().length > 0);
133 }
134
135 @Override
136 public void valueChanged(ListSelectionEvent e) {
137 refreshEnabledState();
138 }
139 }
140
141 class CancelAction extends AbstractAction {
142
143 public CancelAction() {
144 putValue(NAME, tr("Cancel"));
145 putValue(SMALL_ICON, ImageProvider.get("cancel"));
146 putValue(SHORT_DESCRIPTION, tr("Cancel closing of changesets"));
147 }
148
149 public void cancel() {
150 setCanceled(true);
151 setVisible(false);
152 }
153
154 @Override
155 public void actionPerformed(ActionEvent e) {
156 cancel();
157 }
158 }
159
160 class WindowEventHandler extends WindowAdapter {
161
162 @Override
163 public void windowActivated(WindowEvent arg0) {
164 btnCloseChangesets.requestFocusInWindow();
165 }
166
167 @Override
168 public void windowClosing(WindowEvent arg0) {
169 new CancelAction().cancel();
170 }
171
172 }
173
174 /**
175 * Replies true if this dialog was canceled
176 * @return true if this dialog was canceled
177 */
178 public boolean isCanceled() {
179 return canceled;
180 }
181
182 /**
183 * Sets whether this dialog is canceled
184 *
185 * @param canceled true, if this dialog is canceld
186 */
187 protected void setCanceled(boolean canceled) {
188 this.canceled = canceled;
189 }
190
191 /**
192 * Sets the collection of changesets to be displayed
193 *
194 * @param changesets the collection of changesets. Assumes an empty collection if null
195 */
196 public void setChangesets(Collection<Changeset> changesets) {
197 if (changesets == null) {
198 changesets = new ArrayList<Changeset>();
199 }
200 model.removeAllElements();
201 for (Changeset cs: changesets) {
202 model.addElement(cs);
203 }
204 if (!changesets.isEmpty()) {
205 lstOpenChangesets.getSelectionModel().setSelectionInterval(0, changesets.size()-1);
206 }
207 }
208
209 /**
210 * Replies a collection with the changesets the user selected.
211 * Never null, but may be empty.
212 *
213 * @return a collection with the changesets the user selected.
214 */
215 public Collection<Changeset> getSelectedChangesets() {
216 Object [] sel = lstOpenChangesets.getSelectedValues();
217 List<Changeset> ret = new ArrayList<Changeset>(sel.length);
218 for (Object o: sel) {
219 ret.add((Changeset)o);
220 }
221 return ret;
222 }
223}
Note: See TracBrowser for help on using the repository browser.