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

Last change on this file since 10616 was 10179, checked in by Don-vip, 8 years ago

sonar - squid:AssignmentInSubExpressionCheck - Assignments should not be made from within sub-expressions

  • Property svn:eol-style set to native
File size: 6.9 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.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.gui.util.GuiHelper;
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 * @since 2115
41 */
42public class CloseChangesetDialog extends JDialog {
43
44 /** the list */
45 private JList<Changeset> lstOpenChangesets;
46 /** true if the user canceled the dialog */
47 private boolean canceled;
48 /** the list model */
49 private DefaultListModel<Changeset> model;
50
51 private SideButton btnCloseChangesets;
52
53 protected JPanel buildTopPanel() {
54 JPanel pnl = new JPanel(new BorderLayout());
55 pnl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
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(new BorderLayout());
62 model = new DefaultListModel<>();
63 lstOpenChangesets = new JList<>(model);
64 pnl.add(new JScrollPane(lstOpenChangesets), BorderLayout.CENTER);
65 lstOpenChangesets.setCellRenderer(new ChangesetCellRenderer());
66 return pnl;
67 }
68
69 protected JPanel buildSouthPanel() {
70 JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
71
72 // -- close action
73 CloseAction closeAction = new CloseAction();
74 lstOpenChangesets.addListSelectionListener(closeAction);
75 btnCloseChangesets = new SideButton(closeAction);
76 pnl.add(btnCloseChangesets);
77 InputMapUtils.enableEnter(btnCloseChangesets);
78
79 // -- cancel action
80 SideButton btn = new SideButton(new CancelAction());
81 pnl.add(btn);
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 /**
112 * Constructs a new {@code CloseChangesetDialog}.
113 */
114 public CloseChangesetDialog() {
115 super(GuiHelper.getFrameForComponent(Main.parent), ModalityType.DOCUMENT_MODAL);
116 build();
117 }
118
119 class CloseAction extends AbstractAction implements ListSelectionListener {
120 CloseAction() {
121 putValue(NAME, tr("Close changesets"));
122 putValue(SMALL_ICON, ImageProvider.get("closechangeset"));
123 putValue(SHORT_DESCRIPTION, tr("Close the selected open changesets"));
124 refreshEnabledState();
125 }
126
127 @Override
128 public void actionPerformed(ActionEvent e) {
129 setCanceled(false);
130 setVisible(false);
131 }
132
133 protected void refreshEnabledState() {
134 List<Changeset> list = lstOpenChangesets.getSelectedValuesList();
135 setEnabled(list != null && !list.isEmpty());
136 }
137
138 @Override
139 public void valueChanged(ListSelectionEvent e) {
140 refreshEnabledState();
141 }
142 }
143
144 class CancelAction extends AbstractAction {
145
146 CancelAction() {
147 putValue(NAME, tr("Cancel"));
148 putValue(SMALL_ICON, ImageProvider.get("cancel"));
149 putValue(SHORT_DESCRIPTION, tr("Cancel closing of changesets"));
150 }
151
152 public void cancel() {
153 setCanceled(true);
154 setVisible(false);
155 }
156
157 @Override
158 public void actionPerformed(ActionEvent e) {
159 cancel();
160 }
161 }
162
163 class WindowEventHandler extends WindowAdapter {
164
165 @Override
166 public void windowActivated(WindowEvent arg0) {
167 btnCloseChangesets.requestFocusInWindow();
168 }
169
170 @Override
171 public void windowClosing(WindowEvent arg0) {
172 new CancelAction().cancel();
173 }
174
175 }
176
177 /**
178 * Replies true if this dialog was canceled
179 * @return true if this dialog was canceled
180 */
181 public boolean isCanceled() {
182 return canceled;
183 }
184
185 /**
186 * Sets whether this dialog is canceled
187 *
188 * @param canceled true, if this dialog is canceld
189 */
190 protected void setCanceled(boolean canceled) {
191 this.canceled = canceled;
192 }
193
194 /**
195 * Sets the collection of changesets to be displayed
196 *
197 * @param changesets the collection of changesets. Assumes an empty collection if null
198 */
199 public void setChangesets(Collection<Changeset> changesets) {
200 if (changesets == null) {
201 changesets = new ArrayList<>();
202 }
203 model.removeAllElements();
204 for (Changeset cs: changesets) {
205 model.addElement(cs);
206 }
207 if (!changesets.isEmpty()) {
208 lstOpenChangesets.getSelectionModel().setSelectionInterval(0, changesets.size()-1);
209 }
210 }
211
212 /**
213 * Replies a collection with the changesets the user selected.
214 * Never null, but may be empty.
215 *
216 * @return a collection with the changesets the user selected.
217 */
218 public Collection<Changeset> getSelectedChangesets() {
219 return lstOpenChangesets.getSelectedValuesList();
220 }
221}
Note: See TracBrowser for help on using the repository browser.