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

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

global use of !Utils.isEmpty/isBlank

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