package me.chenyi.mm.flow; import javax.swing.*; import java.io.File; import java.sql.Connection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import be.pwnt.jflow.Shape; import be.pwnt.jflow.model.FlowModel; import me.chenyi.jython.ScriptEnvironment; import me.chenyi.jython.ScriptTriggerType; import me.chenyi.jython.ScriptUtilities; import me.chenyi.mm.model.*; import me.chenyi.mm.service.ImageType; /** * Class description goes here * * @author $Author:$ * @version $Revision:$ */ public class MovieFlowModel extends AbstractListModel implements FlowModel { private NodeType nodeType; private NodePicture defaultShape; private List<Long> nodeIds = Collections.emptyList(); private Map<Integer, NodePicture> shapeMap = new HashMap();//Index - > NodePicture private EventAdapter ea; public MovieFlowModel() { Connection connection = null; try { ea = new EventAdapter(); defaultShape = new NodePicture(getClass().getResource("/posters/p1.jpg"), null); connection = DatabaseUtil.openConnection(); nodeIds = (List<Long>)ModelUtils.getAllMovieIds(connection); nodeType = ModelUtils.getNodeType(connection, NodeType.TYPE_MOVIE); ModelEventProxy.getInstance().addModelEventListener(ea); } catch(Exception e) { e.printStackTrace(); } finally { DatabaseUtil.closeConnection(connection); } } // @Override // public int getTotalShapeCount() // { // if (nodeIds == null || nodeIds.size() == 0) // return 1; // return nodeIds.size(); // } @Override public Shape getShape(int index) { if(nodeIds.size() == 0) return defaultShape; while(index < 0) index += nodeIds.size(); while(index >= nodeIds.size()) index -= nodeIds.size(); long nodeId = nodeIds.get(index); NodePicture shape = shapeMap.get(index); if(shape != null) return shape; Node node = ModelUtils.getNode(nodeType, nodeId); if(node == null) { shapeMap.put(index, defaultShape); return defaultShape; } File file = NodeUtil.getImageFile(node, ImageType.poster.toString()); System.out.println("file = " + file); if(file == null) { shapeMap.put(index, defaultShape); return defaultShape; } try { if(file.exists()) { shape = new NodePicture(file.toURI().toURL(), node); shapeMap.put(index, shape); return shape; } } catch(Exception e) { e.printStackTrace(); } shapeMap.put(index, defaultShape); return defaultShape; } @Override public int getShapeIndex(Shape shape) { if(shape == null) return -1; for(Map.Entry<Integer, NodePicture> entry : shapeMap.entrySet()) { if(shape.equals(entry.getValue())) return entry.getKey(); } return -1; } @Override public int getSize() { if(nodeIds == null || nodeIds.size() == 0) return 1; return nodeIds.size(); } @Override public Object getElementAt(int index) { return getShape(index); } public void removeAllShapes() { int size = getSize(); nodeIds.clear(); shapeMap.clear(); if(size >= 0) { fireIntervalRemoved(this, 0, size - 1); } } public boolean removeShapeByNodeId(long nodeId) { int index = nodeIds.indexOf(nodeId); boolean rv = nodeIds.remove(nodeId); if(index >= 0) { fireIntervalRemoved(this, index, index); } return rv; } public boolean removeShapeAt(int index) { if(index < 0 || index >= nodeIds.size()) return false; nodeIds.remove(index); if(index >= 0) { fireIntervalRemoved(this, index, index); } return true; } public boolean addNodeId(long nodeId) { nodeIds.add(nodeId); int lastIndex = nodeIds.size() - 1; fireIntervalAdded(this, lastIndex, lastIndex); return true; } public boolean addNodeIdAt(int index, long nodeId) { if(index < 0 || index >= nodeIds.size()) return false; nodeIds.add(index, nodeId); fireIntervalAdded(this, index, index); return true; } public boolean updateAt(int index) { if(index < 0 || index >= nodeIds.size()) return false; shapeMap.remove(index); fireContentsChanged(this, index, index); return true; } public boolean updateNodeId(long nodeId) { int index = nodeIds.indexOf(nodeId); if (index < 0) return false; shapeMap.remove(index); fireContentsChanged(this, index, index); return true; } public boolean updateNodeIdAt(int index, long nodeId) { if(index < 0 || index >= nodeIds.size()) return false; nodeIds.set(index, nodeId); shapeMap.remove(index); fireContentsChanged(this, index, index); return true; } private class EventAdapter implements ModelEventListener { @Override public void objectAdded(ModelObject obj) { System.out.println("MovieFlowModel$EventAdapter.objectAdded"); if (obj == null) return; if (!ModelObjectType.node.equals(obj.getModelObjectType())) return; Node node = (Node)obj; if (node.getNodeType().getName().equals(NodeType.TYPE_MOVIE)) { addNodeId(node.getId()); long oldCurrentMovieId = ScriptEnvironment.getInstance().getCurrentMovieId(); ScriptEnvironment.getInstance().setCurrentMovieId(node.getId()); ScriptUtilities.executeScripts(ScriptTriggerType.OnMovieAdded); ScriptEnvironment.getInstance().setCurrentMovieId(oldCurrentMovieId); } } @Override public void objectRemoved(ModelObject obj) { System.out.println("MovieFlowModel$EventAdapter.objectRemoved"); if (obj == null) return; if (!ModelObjectType.node.equals(obj.getModelObjectType())) return; Node node = (Node)obj; if (node.getNodeType().getName().equals(NodeType.TYPE_MOVIE)) { removeShapeByNodeId(node.getId()); long oldCurrentMovieId = ScriptEnvironment.getInstance().getCurrentMovieId(); ScriptEnvironment.getInstance().setCurrentMovieId(node.getId()); ScriptUtilities.executeScripts(ScriptTriggerType.OnMovieDeleted); ScriptEnvironment.getInstance().setCurrentMovieId(oldCurrentMovieId); } } @Override public void objectUpdated(ModelObject obj) { System.out.println("MovieFlowModel$EventAdapter.objectUpdated"); if (obj == null) return; if (!ModelObjectType.node.equals(obj.getModelObjectType())) return; Node node = (Node)obj; if (node.getNodeType().getName().equals(NodeType.TYPE_MOVIE)) { updateNodeId(node.getId()); long oldCurrentMovieId = ScriptEnvironment.getInstance().getCurrentMovieId(); ScriptEnvironment.getInstance().setCurrentMovieId(node.getId()); ScriptUtilities.executeScripts(ScriptTriggerType.OnMovieUpdated); ScriptEnvironment.getInstance().setCurrentMovieId(oldCurrentMovieId); } } } }