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

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

see #8902 - Small performance enhancements / coding style (patch by shinigami):

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