package org.korsakow.ide.ui.controller;
import javax.swing.table.TableModel;
import org.dsrg.soenea.domain.MapperException;
import org.korsakow.domain.interf.IInterface;
import org.korsakow.domain.interf.IResource;
import org.korsakow.domain.interf.ISnu;
import org.korsakow.domain.mapper.input.ResourceInputMapper;
import org.korsakow.ide.Application;
import org.korsakow.ide.controller.ApplicationAdapter;
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.ResourceBrowser;
import org.korsakow.ide.util.Command;
public class ResourceExplorerController extends ApplicationAdapter
{
private final ResourceBrowser resourceBrowser;
public ResourceExplorerController(ResourceBrowser resourceExplorer)
{
resourceBrowser = resourceExplorer;
resourceExplorer.addEventListener(new ResourceBrowserController(resourceExplorer));
}
@Override
public void onResourceAdded(IResource resource)
{
Application.getInstance().enqueueCommonTask(new NotifyKeywordsChangedTask());
Application.getInstance().enqueueCommonTask(new ResourceModifiedTask());
}
@Override
public void onResourceDeleted(final IResource resource)
{
Application.getInstance().enqueueCommonTask(new NotifyKeywordsChangedTask());
Application.getInstance().enqueueCommonTask(new ResourceModifiedTask());
}
@Override
public void onResourcesCleared()
{
resourceBrowser.getResourceTreeTable().setTreeTableModel(new DefaultResourceTreeTableModel(new FolderNode("/")));
Application.getInstance().notifyKeywordsChanged();
}
@Override
public void onResourceModified(IResource resource)
{
Application.getInstance().enqueueCommonTask(new NotifyKeywordsChangedTask());
Application.getInstance().enqueueCommonTask(new ResourceModifiedTask());
}
@Override
public void onKeywordsChanged()
{
Application.getInstance().enqueueCommonTask(new KeywordsChangedTask());
}
private class ResourceModifiedTask implements Runnable
{
public void run()
{
TableModel resourceModel = resourceBrowser.getResourceTreeTable().getModel();
for (int row = 0; row < resourceModel.getRowCount(); ++row) {
KNode node = (KNode)resourceBrowser.getResourceTreeTable().getValueAt(row, 0);
if (node instanceof ResourceNode == false)
continue;
ResourceNode resourceNode = (ResourceNode)node;
IResource res;
try {
res = ResourceInputMapper.map( resourceNode.getResourceId() );
} catch (MapperException e) {
Application.getInstance().showUnhandledErrorDialog( e );
continue;
}
if (resourceNode.getResourceId() == null ||
res == null) // not sure if would happen but a NPE may have occurred here 2009-03-27
continue;
resourceNode.setName(res.getName());
switch (resourceNode.getResourceType()) {
case SNU:
ISnu snu = (ISnu) res;
resourceNode.setEndSnu(snu.getEnder());
resourceNode.setStartSnu(snu.getStarter());
resourceNode.setLives(snu.getLives());
resourceNode.setInterfaceName(snu.getInterface().getName());
resourceNode.setFilename(snu.getMainMedia().getFilename());
resourceNode.setPreview(snu.getPreviewMedia() != null);
resourceNode.setBgSound(snu.getBackgroundSound() != null);
break;
case INTERFACE:
IInterface interf = (IInterface)res;
resourceNode.setClickSound(interf.getClickSound() != null);
break;
case SOUND:{
boolean isClickSound = 0!=Command.findResourceByClickSoundId(resourceNode.getResourceId()).size();
resourceNode.setClickSound(isClickSound);
boolean isBackgroundSound = 0!=Command.findResourceByBackgroundSoundId(resourceNode.getResourceId()).size();
resourceNode.setBgSound(isBackgroundSound);
boolean isPreview = 0!=Command.findResourceByPreviewMediaId(resourceNode.getResourceId()).size();
resourceNode.setPreview(isPreview);
}break;
case VIDEO:
case IMAGE:
case TEXT:
boolean isPreview = 0!=Command.findResourceByPreviewMediaId(resourceNode.getResourceId()).size();
resourceNode.setPreview(isPreview);
break;
}
resourceBrowser.getResourceTreeTable().getTreeTableModel().fireChanged(resourceNode);
}
}
}
private class NotifyKeywordsChangedTask implements Runnable
{
public void run()
{
Application.getInstance().notifyKeywordsChanged();
}
}
private class KeywordsChangedTask implements Runnable
{
public void run()
{
// todo: remove me since no longer used
}
}
}