/**
*
*/
package cz.cuni.mff.peckam.java.origamist.gui.viewer.listing;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import cz.cuni.mff.peckam.java.origamist.exceptions.UnsupportedDataFormatException;
import cz.cuni.mff.peckam.java.origamist.files.File;
import cz.cuni.mff.peckam.java.origamist.gui.viewer.OrigamiViewer;
import cz.cuni.mff.peckam.java.origamist.model.Origami;
import cz.cuni.mff.peckam.java.origamist.services.ServiceLocator;
/**
* Listens for the selections of model files and displays them in the main area.
*
* @author Martin Pecka
*/
public class ListingTreeSelectionListener implements TreeSelectionListener
{
@Override
public void valueChanged(final TreeSelectionEvent e)
{
if (!e.isAddedPath()) {
return;
}
final DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
final Object selected = node.getUserObject();
if (selected instanceof File) {
final OrigamiViewer viewer = ServiceLocator.get(OrigamiViewer.class);
if (viewer == null) {
Logger.getLogger("application").log(Level.ERROR,
"Cannot use ListingTreeSelectionListener when not using OrigamiViewer");
} else {
final File file = (File) selected;
final ListingTree tree = (ListingTree) e.getSource();
file.addPropertyChangeListener("isOrigamiLoaded", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt)
{
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
file.fillFromOrigami();
tree.revalidate();
tree.repaint(tree.getRowBounds(tree.getRowForPath(e.getPath())));
}
});
}
});
// load the origami in a separate thread, it may take a long time
new Thread() {
@Override
public void run()
{
try {
final Origami origami = file.getOrigami();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
viewer.setDisplayedOrigami(origami);
}
});
} catch (UnsupportedDataFormatException e1) {
Logger.getLogger("viewer").l7dlog(Level.ERROR, "modelLazyLoadException", e1);
file.setInvalid(true);
// remove the node after 5 seconds
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
Timer timer = new Timer(5000, new AbstractAction() {
/** */
private static final long serialVersionUID = -949655828654998790L;
@Override
public void actionPerformed(ActionEvent e)
{
((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node);
}
});
timer.setRepeats(false);
timer.start();
}
});
} catch (IOException e1) {
Logger.getLogger("viewer").l7dlog(Level.ERROR, "modelLazyLoadException", e1);
}
}
}.start();
}
}
}
}