source: josm/trunk/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java@ 4932

Last change on this file since 4932 was 4739, checked in by jttt, 12 years ago
  • fix #7202 Downloading Data window harder to read since r4718
  • update display correctly when progress monitor is moved to background/foreground
  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.GridBagConstraints;
8import java.awt.GridBagLayout;
9import java.awt.event.ActionListener;
10import java.awt.event.ComponentEvent;
11import java.awt.event.ComponentListener;
12
13import javax.swing.BorderFactory;
14import javax.swing.BoundedRangeModel;
15import javax.swing.JButton;
16import javax.swing.JDialog;
17import javax.swing.JLabel;
18import javax.swing.JOptionPane;
19import javax.swing.JPanel;
20import javax.swing.JProgressBar;
21import javax.swing.JScrollPane;
22import javax.swing.JTextArea;
23import javax.swing.UIManager;
24
25import org.openstreetmap.josm.Main;
26import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor.ProgressMonitorDialog;
27import org.openstreetmap.josm.tools.GBC;
28import org.openstreetmap.josm.tools.ImageProvider;
29
30public class PleaseWaitDialog extends JDialog implements ProgressMonitorDialog {
31
32 private final JProgressBar progressBar = new JProgressBar();
33
34 public final JLabel currentAction = new JLabel("");
35 private final JLabel customText = new JLabel("");
36 public final BoundedRangeModel progress = progressBar.getModel();
37 private JButton btnCancel;
38 private JButton btnInBackground;
39 /** the text area and the scroll pane for the log */
40 private JTextArea taLog = new JTextArea(5,50);
41 private JScrollPane spLog;
42
43 private void initDialog() {
44 setLayout(new GridBagLayout());
45 JPanel pane = new JPanel(new GridBagLayout());
46 pane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
47 pane.add(currentAction, GBC.eol().fill(GBC.HORIZONTAL));
48 pane.add(customText, GBC.eol().fill(GBC.HORIZONTAL));
49 pane.add(progressBar, GBC.eop().fill(GBC.HORIZONTAL));
50 JPanel buttons = new JPanel();
51 buttons.setLayout(new GridBagLayout());
52 btnCancel = new JButton(tr("Cancel"));
53 btnCancel.setIcon(ImageProvider.get("cancel"));
54 btnCancel.setToolTipText(tr("Click to cancel the current operation"));
55 buttons.add(btnCancel);
56 btnInBackground = new JButton(tr("In background"));
57 btnInBackground.setToolTipText(tr("Click to run job in background"));
58 buttons.add(btnInBackground, GBC.std().fill(GBC.VERTICAL).insets(5, 0, 0, 0));
59 pane.add(buttons, GBC.eol().anchor(GBC.CENTER));
60 GridBagConstraints gc = GBC.eol().fill(GBC.BOTH);
61 gc.weighty = 1.0;
62 gc.weightx = 1.0;
63 pane.add(spLog = new JScrollPane(taLog), gc);
64 spLog.setVisible(false);
65 setContentPane(pane);
66 setCustomText("");
67 setLocationRelativeTo(getParent());
68 addComponentListener(new ComponentListener() {
69 public void componentHidden(ComponentEvent e) {}
70 public void componentMoved(ComponentEvent e) {}
71 public void componentShown(ComponentEvent e) {}
72 public void componentResized(ComponentEvent ev) {
73 int w = getWidth();
74 if(w > 200) {
75 Main.pref.putInteger("progressdialog.size",w);
76 }
77 }
78 });
79 }
80
81 public PleaseWaitDialog(Component parent) {
82 super(JOptionPane.getFrameForComponent(parent), ModalityType.DOCUMENT_MODAL);
83 initDialog();
84 }
85
86 public void setIndeterminate(boolean newValue) {
87 UIManager.put("ProgressBar.cycleTime", UIManager.getInt("ProgressBar.repaintInterval") * 100);
88 progressBar.setIndeterminate(newValue);
89 }
90
91 protected void adjustLayout() {
92 invalidate();
93 pack();
94 setSize(Main.pref.getInteger("progressdialog.size", 600), getSize().height);
95 }
96
97 /**
98 * Sets a custom text line below currentAction. Can be used to display additional information
99 * @param text
100 */
101 public void setCustomText(String text) {
102 if(text == null || text.trim().length() == 0) {
103 customText.setVisible(false);
104 adjustLayout();
105 return;
106 }
107 customText.setText(text);
108 if (!customText.isVisible()) {
109 customText.setVisible(true);
110 adjustLayout();
111 }
112 }
113
114 public void setCurrentAction(String text) {
115 currentAction.setText(text);
116 }
117
118 /**
119 * Appends a log message to the progress dialog. If the log area isn't visible yet
120 * it becomes visible. The height of the progress dialog is slightly increased too.
121 *
122 * @param message the message to append to the log. Ignore if null or white space only.
123 */
124 public void appendLogMessage(String message) {
125 if (message == null || message.trim().length() ==0 )
126 return;
127 if (!spLog.isVisible()) {
128 spLog.setVisible(true);
129 taLog.setVisible(true);
130 adjustLayout();
131 }
132 taLog.append(message);
133 taLog.append("\n");
134 spLog.getVerticalScrollBar().setValue(spLog.getVerticalScrollBar().getMaximum());
135 }
136
137 /**
138 * Sets whether the cancel button is enabled or not
139 *
140 * @param enabled true, if the cancel button is enabled; false otherwise
141 */
142 public void setCancelEnabled(boolean enabled) {
143 btnCancel.setEnabled(enabled);
144 }
145
146 public void setInBackgroundPossible(boolean value) {
147 btnInBackground.setVisible(value);
148 }
149
150 /**
151 * Installs a callback for the cancel button. If callback is null, all action listeners
152 * are removed from the cancel button.
153 *
154 * @param callback the cancel callback
155 */
156 public void setCancelCallback(ActionListener callback) {
157 if (callback == null) {
158 ActionListener[] listeners = btnCancel.getActionListeners();
159 for (ActionListener l: listeners) {
160 btnCancel.removeActionListener(l);
161 }
162 } else {
163 btnCancel.addActionListener(callback);
164 }
165 }
166
167 /**
168 * Installs a callback for the "In background" button. If callback is null, all action listeners
169 * are removed from the cancel button.
170 *
171 * @param callback the cancel callback
172 */
173 public void setInBackgroundCallback(ActionListener callback) {
174 if (callback == null) {
175 ActionListener[] listeners = btnInBackground.getActionListeners();
176 for (ActionListener l: listeners) {
177 btnInBackground.removeActionListener(l);
178 }
179 } else {
180 btnInBackground.addActionListener(callback);
181 }
182 }
183
184 @Override
185 public void updateProgress(int progress) {
186 this.progress.setValue(progress);
187 }
188
189}
Note: See TracBrowser for help on using the repository browser.