/**
*
*/
package org.korsakow.ide.ui.resources;
import java.util.Collection;
import java.util.HashSet;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import org.apache.log4j.Logger;
import org.dsrg.soenea.domain.command.CommandException;
import org.korsakow.domain.CommandExecutor;
import org.korsakow.domain.command.FindSnuableMediaNotUsedAsSnuMainMediaCommand;
import org.korsakow.domain.command.Response;
import org.korsakow.domain.interf.IMedia;
import org.korsakow.ide.Application;
import org.korsakow.ide.ui.components.tree.FolderNode;
import org.korsakow.ide.ui.components.tree.KNode;
import org.korsakow.ide.ui.components.tree.ResourceNode;
import org.korsakow.ide.ui.resourceexplorer.DefaultResourceTreeTableModel;
import org.korsakow.ide.ui.resourceexplorer.ResourceTreeTable;
import org.korsakow.ide.ui.resourceexplorer.ResourceTreeTableModel;
import org.korsakow.ide.util.UIUtil;
public class UnusedMediaResourceTreeTableModel extends DefaultResourceTreeTableModel
{
private final ResourceTreeTableModel delegate;
private final ResourceTreeTable treeTable;
private boolean includeImages = false;
private boolean includeVideos = true;
public UnusedMediaResourceTreeTableModel(final ResourceTreeTable treeTable, ResourceTreeTableModel delegate, boolean includeImages, boolean includeVideos)
{
// super((FolderNode)copy(delegate.getRoot()));
super(new FolderNode("/"));
update();
if (delegate == null)
throw new NullPointerException();
this.delegate = delegate;
this.treeTable = treeTable;
this.includeImages = includeImages;
this.includeVideos = includeVideos;
// setColumnIdentifiers(Arrays.asList(LanguageBundle.getString("resourcebrowser.columns.name.label")));
delegate.addTreeModelListener(new TreeModelListener() {
public void treeNodesChanged(TreeModelEvent e) {
update();
}
public void treeNodesInserted(TreeModelEvent e) {
update();
}
public void treeNodesRemoved(TreeModelEvent e) {
update();
}
public void treeStructureChanged(TreeModelEvent e) {
update();
}
});
UIUtil.runUITaskLater(new Runnable() {
public void run() {
treeTable.expandAllRecursive();
}
});
}
public void update()
{
Application.getInstance().enqueueCommonTask(new Runnable() {
public void run() {
Collection<Long> unusedMedia = new HashSet<Long>();
try {
Response response = CommandExecutor.executeCommand(FindSnuableMediaNotUsedAsSnuMainMediaCommand.class);
for (IMedia media : (Collection<IMedia>)response.get("media"))
unusedMedia.add(media.getId());
} catch (CommandException e) {
Logger.getLogger(getClass()).error("", e);
}
KNode copy = copy(unusedMedia, delegate.getRoot());
removeEmptyFolders(copy);
setRoot(copy);
treeTable.expandAllRecursive();
}
});
}
private static void removeEmptyFolders(KNode node)
{
// children first is necessary
for (KNode child : node)
removeEmptyFolders(child);
Collection<KNode> toRemove = new HashSet<KNode>();
for (KNode child : node) {
if (child instanceof FolderNode && child.getChildCount() == 0)
toRemove.add(child);
removeEmptyFolders(child);
}
for (KNode child : toRemove)
node.remove(child);
}
private KNode copy(Collection<Long> unusedMedia, KNode node)
{
KNode copy = null;
if (node instanceof FolderNode)
copy = copyFolderNode((FolderNode)node);
if (node instanceof ResourceNode)
copy = copyResourceNode(unusedMedia, (ResourceNode)node);
if (copy != null) {
for (KNode child : node) {
KNode childCopy = null;
childCopy = copy(unusedMedia, child);
if (childCopy != null)
copy.add(childCopy);
}
}
return copy;
}
private ResourceNode copyResourceNode(Collection<Long> unusedMedia, ResourceNode resourceNode)
{
if (!unusedMedia.contains(resourceNode.getResourceId()))
return null;
if (!resourceNode.getResourceType().isMedia())
return null;
switch (resourceNode.getResourceType()) {
case VIDEO: if (!includeVideos) return null; break;
case IMAGE: if (!includeImages) return null; break;
}
return resourceNode.copy();
}
private static FolderNode copyFolderNode(FolderNode folderNode)
{
FolderNode copy = new FolderNode(folderNode.getName());
return copy;
}
public boolean isIncludeImages()
{
return includeImages;
}
public void setIncludeImages(boolean includeImages)
{
this.includeImages = includeImages;
}
public boolean isIncludeVideos()
{
return includeVideos;
}
public void setIncludeVideos(boolean includeVideos)
{
this.includeVideos = includeVideos;
}
}