1 package com.melloware.jukes.gui.view.dialogs;
2
3 import java.awt.BorderLayout;
4 import java.awt.EventQueue;
5 import java.awt.Frame;
6 import java.util.Collection;
7 import java.util.Iterator;
8
9 import javax.swing.DefaultListModel;
10 import javax.swing.JButton;
11 import javax.swing.JComponent;
12 import javax.swing.JList;
13 import javax.swing.JPanel;
14 import javax.swing.JProgressBar;
15 import javax.swing.JScrollPane;
16 import javax.swing.ListSelectionModel;
17
18 import org.apache.commons.logging.Log;
19 import org.apache.commons.logging.LogFactory;
20
21 import com.jgoodies.forms.builder.PanelBuilder;
22 import com.jgoodies.forms.factories.Borders;
23 import com.jgoodies.forms.factories.ButtonBarFactory;
24 import com.jgoodies.forms.layout.CellConstraints;
25 import com.jgoodies.forms.layout.FormLayout;
26 import com.jgoodies.uif.AbstractDialog;
27 import com.jgoodies.uif.action.ActionManager;
28 import com.jgoodies.uif.util.Worker;
29 import com.jgoodies.uifextras.panel.HeaderPanel;
30 import com.jgoodies.validation.Severity;
31 import com.jgoodies.validation.ValidationMessage;
32 import com.melloware.jukes.db.HibernateDao;
33 import com.melloware.jukes.db.orm.Disc;
34 import com.melloware.jukes.file.MusicDirectory;
35 import com.melloware.jukes.gui.tool.Actions;
36 import com.melloware.jukes.gui.tool.Resources;
37 import com.melloware.jukes.gui.view.component.MessageCellRenderer;
38 import com.melloware.jukes.util.JukesValidationMessage;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public final class DiscRemoveDialog
54 extends AbstractDialog {
55
56 private static final Log LOG = LogFactory.getLog(DiscRemoveDialog.class);
57 private DefaultListModel listModel;
58 private JButton buttonApply;
59 private JButton buttonCancel;
60 private JButton buttonClose;
61 private JComponent buttonBar;
62 private JList list;
63 private JPanel panel;
64 private JProgressBar progressBar;
65 private Worker worker;
66
67
68
69
70
71
72 public DiscRemoveDialog(Frame owner) {
73 super(owner);
74 LOG.debug("Disc Cleaner created.");
75 }
76
77
78
79
80 public void doApply() {
81 LOG.debug("Apply pressed.");
82 buttonCancel.setEnabled(true);
83 buttonApply.setEnabled(false);
84 buttonClose.setEnabled(false);
85 LOG.info("[START] Disc Remover");
86
87
88
89
90
91 worker = new Worker() {
92 public Object construct() {
93 return doWork();
94 }
95
96 public void finished() {
97 buttonCancel.setEnabled(false);
98 buttonApply.setEnabled(true);
99 buttonClose.setEnabled(true);
100 threadFinished(get());
101 }
102 };
103 worker.start();
104
105 }
106
107
108
109
110 public void doCancel() {
111 LOG.debug("Cancel Pressed.");
112 if (worker != null) {
113 worker.interrupt();
114 }
115 buttonCancel.setEnabled(false);
116 buttonApply.setEnabled(true);
117 buttonClose.setEnabled(true);
118 }
119
120
121
122
123
124
125 protected JComponent buildContent() {
126 final JPanel content = new JPanel(new BorderLayout());
127 content.add(buildMainPanel(), BorderLayout.CENTER);
128 content.add(buttonBar, BorderLayout.SOUTH);
129 return content;
130 }
131
132
133
134
135
136
137 protected JComponent buildHeader() {
138 return new HeaderPanel(Resources.getString("label.DiscCleaner"),Resources.getString("label.DiscCleanerMessage"),
139 Resources.DISC_REMOVER_ICON);
140 }
141
142
143
144
145
146
147 protected JComponent buildMainPanel() {
148 final JButton[] buttons = new JButton[3];
149 final JButton button = createApplyButton();
150 button.setText(Resources.getString("label.Remove"));
151 buttonCancel = createCancelButton();
152 buttonApply = button;
153 buttonClose = createCloseButton(true);
154 buttonClose.setText(Resources.getString("label.Close"));
155 buttonCancel.setEnabled(false);
156 buttonCancel.setText(Resources.getString("label.Cancel"));
157 buttons[0] = buttonApply;
158 buttons[1] = buttonCancel;
159 buttons[2] = buttonClose;
160 buttonBar = ButtonBarFactory.buildRightAlignedBar(buttons);
161 final FormLayout layout = new FormLayout("fill:pref:grow", "p, p, p, 4px");
162 final PanelBuilder builder = new PanelBuilder(layout);
163 builder.setDefaultDialogBorder();
164 final CellConstraints cc = new CellConstraints();
165 int row = 1;
166 row++;
167 builder.add(buildProgressPanel(), cc.xy(1, row++));
168 builder.add(buildListPanel(), cc.xy(1, 3));
169 panel = builder.getPanel();
170 panel.setBorder(Borders.DIALOG_BORDER);
171 return panel;
172 }
173
174
175
176
177 protected void doCloseWindow() {
178 super.doClose();
179 }
180
181
182
183
184
185
186
187 private JComponent buildListPanel() {
188 listModel = new DefaultListModel();
189
190 list = new JList(listModel);
191 list.setFocusable(false);
192 list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
193 list.setSelectedIndex(0);
194 list.setCellRenderer(new MessageCellRenderer());
195 list.setVisibleRowCount(19);
196 return new JScrollPane(list);
197 }
198
199
200
201
202
203
204 private JComponent buildProgressPanel() {
205 progressBar = new JProgressBar();
206 progressBar.setIndeterminate(false);
207 progressBar.setStringPainted(true);
208 final FormLayout layout = new FormLayout("right:max(14dlu;pref), 4dlu, 550px, 4px",
209 "p, 4px, p");
210 final PanelBuilder builder = new PanelBuilder(layout);
211 final CellConstraints cc = new CellConstraints();
212
213 builder.addLabel(Resources.getString("label.Progress"), cc.xy(1, 1));
214 builder.add(progressBar, cc.xyw(3, 1, 2));
215
216 return builder.getPanel();
217 }
218
219
220
221
222
223 private Object doWork() {
224 Object result = null;
225 try {
226
227 listModel.removeAllElements();
228
229
230
231 final Collection discs = HibernateDao.findAll(Disc.class, Disc.PROPERTYNAME_NAME);
232 if (LOG.isDebugEnabled()) {
233 LOG.debug("Disc Count = " + discs.size());
234 }
235
236
237 progressBar.setMaximum(discs.size());
238 progressBar.setValue(0);
239 progressBar.setIndeterminate(false);
240
241
242
243 int count = 0;
244 for (final Iterator iter = discs.iterator(); iter.hasNext();) {
245 final Disc disc = (Disc)iter.next();
246 count++;
247 final boolean success = MusicDirectory.removeDiscIfNoLongerExists(disc);
248 String message = "";
249 Severity severity = null;
250 if (success) {
251 message = disc.getLocation();
252 severity = Severity.OK;
253 } else {
254 message = "REMOVED " + disc.getLocation();
255 severity = Severity.ERROR;
256 }
257 updateList(message, severity, count);
258 }
259
260 if (Thread.interrupted()) {
261 LOG.debug("Thread interrupted.");
262 throw new InterruptedException();
263 }
264
265 } catch (InterruptedException e) {
266 return result;
267 }
268 return result;
269 }
270
271
272
273
274
275
276 private void threadFinished(Object result) {
277 if (LOG.isDebugEnabled()) {
278 LOG.debug("Thread Finished");
279 LOG.debug(result);
280 }
281
282
283 ActionManager.get(Actions.REFRESH_ID).actionPerformed(null);
284 LOG.info("[STOP] Disc Remover");
285 }
286
287
288
289
290
291
292
293 private void updateList(final String aMessage, final Severity aSeverity, final int aProgress) {
294 final Runnable updateList = new Runnable() {
295 public void run() {
296 progressBar.setValue(aProgress);
297 if (aSeverity == Severity.OK) {
298 return;
299 }
300 final ValidationMessage message = new JukesValidationMessage(aMessage, aSeverity);
301 listModel.addElement(message);
302 final int index = listModel.indexOf(message);
303 list.setSelectedIndex(index);
304 list.ensureIndexIsVisible(index);
305 }
306 };
307 EventQueue.invokeLater(updateList);
308 }
309
310 }