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

Last change on this file since 12767 was 12678, checked in by Don-vip, 7 years ago

see #15182 - move WindowGeometry from tools to gui.util

  • Property svn:eol-style set to native
File size: 6.7 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;
14import java.util.List;
15
16import javax.swing.AbstractAction;
17import javax.swing.BorderFactory;
18import javax.swing.DefaultListModel;
19import javax.swing.JDialog;
20import javax.swing.JLabel;
21import javax.swing.JList;
22import javax.swing.JPanel;
23import javax.swing.JScrollPane;
24import javax.swing.event.ListSelectionEvent;
25import javax.swing.event.ListSelectionListener;
26
27import org.openstreetmap.josm.Main;
28import org.openstreetmap.josm.data.osm.Changeset;
29import org.openstreetmap.josm.gui.SideButton;
30import org.openstreetmap.josm.gui.util.GuiHelper;
31import org.openstreetmap.josm.gui.util.WindowGeometry;
32import org.openstreetmap.josm.tools.ImageProvider;
33import org.openstreetmap.josm.tools.InputMapUtils;
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(Main.parent, 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(Main.parent), ModalityType.DOCUMENT_MODAL);
112 build();
113 }
114
115 class CloseAction extends AbstractAction implements ListSelectionListener {
116 CloseAction() {
117 putValue(NAME, tr("Close changesets"));
118 putValue(SMALL_ICON, ImageProvider.get("closechangeset"));
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 List<Changeset> list = lstOpenChangesets.getSelectedValuesList();
131 setEnabled(list != null && !list.isEmpty());
132 }
133
134 @Override
135 public void valueChanged(ListSelectionEvent e) {
136 refreshEnabledState();
137 }
138 }
139
140 class CancelAction extends AbstractAction {
141
142 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<>();
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 return lstOpenChangesets.getSelectedValuesList();
216 }
217}
Note: See TracBrowser for help on using the repository browser.