package org.korsakow.domain.command;
import java.awt.Color;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathException;
import javax.xml.xpath.XPathExpressionException;
import org.dsrg.soenea.domain.MapperException;
import org.dsrg.soenea.domain.command.CommandException;
import org.dsrg.soenea.environment.CreationException;
import org.dsrg.soenea.environment.KeyNotFoundException;
import org.dsrg.soenea.uow.UoW;
import org.korsakow.domain.ProjectFactory;
import org.korsakow.domain.SettingsFactory;
import org.korsakow.domain.interchange.mapper.InterchangeInputMapperFactory;
import org.korsakow.domain.interf.IInterface;
import org.korsakow.domain.interf.IKeyword;
import org.korsakow.domain.interf.IMedia;
import org.korsakow.domain.interf.IProject;
import org.korsakow.domain.interf.IRule;
import org.korsakow.domain.interf.ISettings;
import org.korsakow.domain.interf.ISnu;
import org.korsakow.domain.interf.IWidget;
import org.korsakow.ide.DataRegistry;
import org.korsakow.ide.XPathHelper;
import org.korsakow.ide.resources.ResourceType;
import org.korsakow.ide.ui.components.tree.FolderNode;
import org.korsakow.ide.ui.components.tree.ResourceNode;
import org.korsakow.ide.util.DomUtil;
import org.korsakow.ide.util.ResourceManager;
import org.korsakow.ide.util.UIUtil;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
public class NewProjectCommand extends AbstractCommand{
public NewProjectCommand(Helper request, Helper response) {
super(request, response);
}
public void execute()
throws CommandException {
try {
IProject p = newProject();
response.set("project", p);
UoW.getCurrent().commit();
UoW.newCurrent();
} catch (Exception e) {
throw new CommandException(e);
}
}
public static IProject newProject() throws ParserConfigurationException, SAXException, IOException, SQLException, XPathException, MapperException, KeyNotFoundException, CreationException
{
return newProject(null);
}
public static IProject newProject(File parentDir) throws ParserConfigurationException, SAXException, IOException, SQLException, XPathException, MapperException, KeyNotFoundException, CreationException
{
File file = File.createTempFile("korsakow", ".xml", parentDir);
DataRegistry.initialize(DataRegistry.createDefaultDocument(), file);
Document document = DataRegistry.getDocument(); // initialize modifies the doc
final int movieWidth = 1024;
final int movieHeight = 768;
// System.out.println(DataRegistry.debugDump());
ISettings settings = SettingsFactory.createNew();
IInterface defaultInterface = null;
List<IInterface> interfaces = new ArrayList<IInterface>();
interfaces.addAll(loadDefaultInterfaces(document));
defaultInterface = interfaces.get(0);
for (IInterface interf : interfaces) {
UoW.getCurrent().registerNew(interf);
}
IProject project = ProjectFactory.createNew(
"Untitled Project",
new ArrayList<IKeyword>(),
movieWidth, movieHeight,
null, 1.0F, true,
null, 1.0F,
null, Color.black,
null,
false, false,
null,
defaultInterface,
new ArrayList<IRule>(),
new ArrayList<ISnu>(),
interfaces,
new ArrayList<IMedia>(),
settings,
UUID.randomUUID().toString()
);
// flush any changes we've done
DataRegistry.setDocument(document);
return project;
}
private static void centerToStage(IInterface interf, int stageWidth, int stageHeight)
{
// center the interface on the stage
Rectangle bounds = interf.getBounds();
int dx = (stageWidth - bounds.width)/2 - bounds.x;
int dy = (stageHeight - bounds.height)/2 - bounds.y;
for (IWidget widget : interf.getWidgets()) {
widget.setX(widget.getX() + dx);
widget.setY(widget.getY() + dy);
UoW.getCurrent().registerDirty(widget);
}
}
private static Collection<IInterface> loadDefaultInterfaces(Document document) throws SAXException, ParserConfigurationException, IOException, XPathExpressionException
{
org.korsakow.domain.interchange.mapper.input.InterchangeInterfaceInputMapper interfaceInputMapper = InterchangeInputMapperFactory.createInterfaceInputMapper();
List<IInterface> interfs = new ArrayList<IInterface>(); // note, see coment below, this must currently be an ordered collection
// currently this ordering makes 4x3_3Bottom the default interface. we hope to eventaully
// decouple the concept of default interface from internal (and arbitrary) ordering
IInterface _4x3_3Bottom = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/4x3_3Bottom.kif")), "//Interface"));
interfs.add(_4x3_3Bottom);
IInterface _4x3_3Top = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/4x3_3Top.kif")), "//Interface"));
interfs.add(_4x3_3Top);
IInterface _4x3_3Left = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/4x3_3Left.kif")), "//Interface"));
interfs.add(_4x3_3Left);
IInterface _4x3_3Right = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/4x3_3Right.kif")), "//Interface"));
interfs.add(_4x3_3Right);
IInterface _16x9_3Bottom = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/16x9_3Bottom.kif")), "//Interface"));
interfs.add(_16x9_3Bottom);
IInterface _16x9_3Top = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/16x9_3Top.kif")), "//Interface"));
interfs.add(_16x9_3Top);
IInterface _16x9_3Left = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/16x9_3Left.kif")), "//Interface"));
interfs.add(_16x9_3Left);
IInterface _16x9_3Right = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/16x9_3Right.kif")), "//Interface"));
interfs.add(_16x9_3Right);
IInterface galata_4_left = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/galata_4_LEFT.kif")), "//Interface"));
interfs.add(galata_4_left);
IInterface galata_4_middle = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/galata_4_MIDDLE.kif")), "//Interface"));
interfs.add(galata_4_middle);
IInterface galata_4_right = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/galata_4_RIGHT.kif")), "//Interface"));
interfs.add(galata_4_right);
IInterface galata_4_mixed = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/galata_8_MIXED.kif")), "//Interface"));
interfs.add(galata_4_mixed);
IInterface galata_two_big = interfaceInputMapper.input(XPathHelper.xpathAsElement(DomUtil.parseXML(ResourceManager.getResourceStream("interfaces/galata_TWO-BIG.kif")), "//Interface"));
interfs.add(galata_two_big);
FolderNode rootFolder = new FolderNode("/");
FolderNode interfacesFolder = new FolderNode("Interfaces");
rootFolder.add(interfacesFolder);
FolderNode _16x9Folder = new FolderNode("16x9");
interfacesFolder.add(_16x9Folder);
FolderNode _4x3Folder = new FolderNode("4x3");
interfacesFolder.add(_4x3Folder);
FolderNode galataFolder = new FolderNode("Planet Galata");
interfacesFolder.add(galataFolder);
_16x9Folder.add(ResourceNode.create(_16x9_3Bottom));
_16x9Folder.add(ResourceNode.create(_16x9_3Top));
_16x9Folder.add(ResourceNode.create(_16x9_3Left));
_16x9Folder.add(ResourceNode.create(_16x9_3Right));
_4x3Folder.add(ResourceNode.create(_4x3_3Top));
_4x3Folder.add(ResourceNode.create(_4x3_3Left));
_4x3Folder.add(ResourceNode.create(_4x3_3Right));
rootFolder.add(ResourceNode.create(_4x3_3Bottom));
galataFolder.add(ResourceNode.create(galata_4_left));
galataFolder.add(ResourceNode.create(galata_4_middle));
galataFolder.add(ResourceNode.create(galata_4_right));
galataFolder.add(ResourceNode.create(galata_4_mixed));
galataFolder.add(ResourceNode.create(galata_two_big));
document.getDocumentElement().appendChild(UIUtil.resourceTreeToDom(document, rootFolder));
return interfs;
}
}