/*
* Copyright (c) 2010-2011 by Stefan Laubenberger.
*
* Tyr is free software: you can redistribute it and/or modify
* it under the terms of the General Public License v2.0.
*
* Tyr is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU General Public License for more details:
* <http://www.gnu.org/licenses>
*
* This distribution is available at:
* <http://code.google.com/p/tyr/>
* <http://dev.laubenberger.net/tyr/>
*
* Contact information:
* Stefan Laubenberger
* Bullingerstrasse 53
* CH-8004 Zuerich
*
* <http://www.laubenberger.net>
*
* <laubenberger@gmail.com>
*/
package net.laubenberger.tyr.view.dialog;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import net.laubenberger.bogatyr.helper.HelperImage;
import net.laubenberger.bogatyr.helper.HelperLog;
import net.laubenberger.bogatyr.helper.HelperString;
import net.laubenberger.bogatyr.misc.exception.RuntimeExceptionIsNull;
import net.laubenberger.bogatyr.service.localizer.Localizer;
import net.laubenberger.bogatyr.view.swing.Button;
import net.laubenberger.bogatyr.view.swing.Dialog;
import net.laubenberger.bogatyr.view.swing.Label;
import net.laubenberger.bogatyr.view.swing.Panel;
import net.laubenberger.bogatyr.view.swing.ProgressBar;
import net.laubenberger.bogatyr.view.swing.pane.PaneScroll;
import net.laubenberger.bogatyr.view.swing.worker.Worker;
import net.laubenberger.tyr.helper.HelperResource;
import net.laubenberger.tyr.misc.ScalableIcon;
import net.laubenberger.tyr.misc.Task;
import net.laubenberger.tyr.misc.TaskImpl;
import net.laubenberger.tyr.model.Icon;
import net.laubenberger.tyr.model.TyrData;
import net.laubenberger.tyr.view.ViewTyr;
import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Dialog for the tasks.
*
* @author Stefan Laubenberger
* @version 0.7.5 (20110121)
* @since 0.3.0
*/
public class DialogTask extends Dialog implements Observer {
private static final long serialVersionUID = 4362082035312204543L;
private static final Logger log = LoggerFactory.getLogger(DialogTask.class);
final ViewTyr view;
final Localizer localizer;
final Map<Worker, Task> workers = new ConcurrentHashMap<Worker, Task>();
public DialogTask(final ViewTyr view) {
super(view.getOwner());
if (log.isTraceEnabled()) log.trace(HelperLog.constructor(view));
this.view = view;
localizer = view.getController().getModel().getLocalizer();
view.getController().getData().addObserver(this);
}
{
// setAlwaysOnTop(true);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
public void addWorker(final Worker worker, final String title, final String text, final ScalableIcon icon) {
if (log.isDebugEnabled()) log.debug(HelperLog.methodStart(worker, title, text, icon));
if (null == worker) {
throw new RuntimeExceptionIsNull("worker"); //$NON-NLS-1$
}
workers.put(worker, new TaskImpl(worker, title, text, icon));
createLayout();
setVisible(true);
if (log.isDebugEnabled()) log.debug(HelperLog.methodExit());
}
public void removeWorker(final Worker worker) {
if (log.isDebugEnabled()) log.debug(HelperLog.methodStart(worker));
if (null == worker) {
throw new RuntimeExceptionIsNull("worker"); //$NON-NLS-1$
}
workers.remove(worker);
createLayout();
if (workers.isEmpty()) {
setVisible(false);
}
if (log.isDebugEnabled()) log.debug(HelperLog.methodExit());
}
/*
* Private methods
*/
private void createLayout() {
getContentPane().removeAll();
setTitle(view.getController().getModel().getName() + HelperString.COLON + HelperString.SPACE
+ localizer.getValue(HelperResource.RES_LABEL_TASK));
final JXTaskPaneContainer containerTask = new JXTaskPaneContainer();
for (final Entry<Worker, Task> pair : workers.entrySet()) {
containerTask.add(createTaskPane(pair.getValue()));
}
getContentPane().add(new PaneScroll(containerTask));
pack();
}
private JXTaskPane createTaskPane(final Task task) {
final JPanel panel = new Panel(new BorderLayout());
final JLabel label = new Label(task.getText());
panel.add(label, BorderLayout.NORTH);
final JProgressBar pb = new ProgressBar();
pb.setIndeterminate(true);
panel.add(pb, BorderLayout.CENTER);
final JButton button = new Button(localizer.getValue(HelperResource.RES_LABEL_CANCEL_TASK), view.getController()
.getScaledIcon(Icon.CANCEL), localizer.getTooltip(HelperResource.RES_LABEL_CANCEL_TASK));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
task.getWorker().cancel(true);
}
});
panel.add(button, BorderLayout.EAST);
final JXTaskPane tp = new JXTaskPane();
tp.setFont(new Font("Arial", Font.PLAIN, 12)); //$NON-NLS-1$
tp.setTitle(task.getTitle());
tp.setIcon(new ImageIcon(HelperImage.getScaledImage(task.getIcon().getIcon(), new Dimension(16, 0))));
tp.setFocusable(false);
tp.add(panel);
return tp;
}
/*
* Overridden methods
*/
@Override
public void setVisible(final boolean isVisible) {
if (log.isDebugEnabled()) log.debug(HelperLog.methodStart(isVisible));
if (isVisible) {
view.getController().getData().addObserver(this);
} else {
view.getController().getData().deleteObserver(this);
}
super.setVisible(isVisible);
if (log.isDebugEnabled()) log.debug(HelperLog.methodExit());
}
/*
* Implemented methods
*/
@Override
public void update(final Observable o, final Object arg) {
if (log.isDebugEnabled()) log.debug(HelperLog.methodStart(o, arg));
if (TyrData.MEMBER_FONT_SIZE_OFFSET == arg) {
pack();
} else if (TyrData.MEMBER_LANGUAGE == arg || TyrData.MEMBER_ICON_SIZE == arg) {
createLayout();
} else if (TyrData.MEMBER_LOOK_AND_FEEL == arg) {
SwingUtilities.updateComponentTreeUI(this);
pack();
}
if (log.isDebugEnabled()) log.debug(HelperLog.methodExit());
}
}