package data;
import script.Script;
import sun.audio.*;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import javax.imageio.ImageIO;
/**
* @author Matthew Chun-Lum
*
*/
public class BDataModel {
private Map<String,BShapeModel> shapeModels;
private Map<String,BPageModel> pageModels;
private Map<String,ResourceModel> resources;
private List<String> resourceNames;
private BPageCounter pageCounter;
private BShapeCounter shapeCounter;
private String documentDirectory;
public static Script script;
private boolean isSaved;
// will need to add some array lists for resources
/**
* Default constructor
*/
public BDataModel() {
shapeModels = new HashMap<String,BShapeModel>();
pageModels = new HashMap<String, BPageModel>();
resources = new HashMap<String, ResourceModel>();
resourceNames = new ArrayList<String>();
pageCounter = new BPageCounter();
shapeCounter = new BShapeCounter();
documentDirectory = null;
script = new Script(this);
isSaved = false;
}
public void addShape(BShapeModel model){
if(model.getName()==null) model.setName(shapeCounter.getShapeName());
shapeModels.put(model.getName(), model);
model.setData(this);
}
public void removeShape(BShapeModel model) {
if(model != null)
shapeModels.remove(model.getName());
}
public void addPage(BPageModel model){
if(model.getName()==null) model.setName(pageCounter.getPageName());
pageModels.put(model.getName(), model);
model.setData(this);
}
public void removePage(BPageModel model) {
if(model != null) {
pageModels.remove(model.getName());
for(BShape shape : model.getShapes())
removeShape(shape.getModel());
model = null;
}
}
public void addResource(File object){
ResourceModel rm = new ResourceModel();
rm.setName(object.getName());
rm.setFilePath(object.getAbsolutePath());
String filePath = rm.getFilePath();
if(filePath.endsWith(".jpeg") || filePath.endsWith(".gif")) rm.setDataType("Image");
else if(filePath.endsWith(".au")) rm.setDataType("AudioStream");
if(rm.getDataType().equals("Image")) rm.setImage(loadImage(object.getAbsolutePath()));
else if(rm.getDataType().equals("AudioStream")) rm.setAudioStream(loadAudio(object.getAbsolutePath()));
resources.put(rm.getName(), rm);
}
public void addResource(ResourceModel rm){
resources.put(rm.getName(), rm);
}
public void addResourceName(File object) {
resourceNames.add(object.getName());
}
public void removeResource(String resourceName) {
for(BShapeModel shapeModel : shapeModels.values())
if(shapeModel.getImageName().equals(resourceName))
shapeModel.setImageName("");
resources.remove(resourceName);
resourceNames.remove(resourceName);
}
public boolean resourceIsInUse(String resourceName) {
for(BShapeModel shapeModel : shapeModels.values())
if(shapeModel.getImageName().equals(resourceName))
return true;
return false;
}
public Image getImage(String resourceName){
ResourceModel rm = resources.get(resourceName);
if(rm == null) return null;
return rm.getImage();
}
public AudioStream getAudioStream(String resourceName){
ResourceModel rm = resources.get(resourceName);
if(rm == null) return null;
return rm.getAudioStream();
}
public BShapeModel getShape(String shapeName){
return shapeModels.get(shapeName);
}
public BPageModel getPage(String pageName){
return pageModels.get(pageName);
}
/*
Demonstrates reading in an Image with the ImageIO class.
Image is the superclass of BufferedImage.
Returns null on i/o error.
*/
public Image loadImage(String filename) {
BufferedImage image = null;
try {
image = ImageIO.read(new File(filename));
}
catch (IOException ex) {
ex.printStackTrace();
}
return image;
}
public AudioStream loadAudio(String filename) {
AudioStream as = null;
try {
InputStream in = new FileInputStream(filename);
as = new AudioStream(in);
}
catch (IOException ex) {
ex.printStackTrace();
}
return as;
}
/**
* @return the resources
*/
public Map<String,ResourceModel> getResourcesMap() {
return resources;
}
public List<String> getResourceNames() {
return resourceNames;
}
public void setResourceNames(List<String> resourceNames) {
this.resourceNames = resourceNames;
}
public Map<String, BShapeModel> getShapeModels() {
return shapeModels;
}
public void setShapeModels(Map<String, BShapeModel> shapeModels) {
this.shapeModels = shapeModels;
}
public Map<String, BPageModel> getPageModels() {
return pageModels;
}
public void setPageModels(Map<String, BPageModel> pageModels) {
this.pageModels = pageModels;
}
public String getDocDirectory() {
return documentDirectory;
}
public void setDocDirectory(String docdir) {
documentDirectory = docdir;
}
public boolean hasShape(String shapeName) {
return shapeModels.containsKey(shapeName);
}
public BPageCounter getPageCounter() {
return pageCounter;
}
public void setPageCounter(BPageCounter pageCounter) {
this.pageCounter = pageCounter;
}
public BShapeCounter getShapeCounter() {
return shapeCounter;
}
public void setShapeCounter(BShapeCounter shapeCounter) {
this.shapeCounter = shapeCounter;
}
public void loadResources() {
for(int i = 0; i<resourceNames.size(); i++) {
String filePath = documentDirectory + File.separatorChar + resourceNames.get(i);
File f = new File(filePath);
addResource(f);
}
}
public void playAudio(String key){
ResourceModel r = resources.get(key);
if(r != null && r.getDataType().equals(ResourceModel.AUDIOSTREAM)) {
AudioStream as = r.getAudioStream();
AudioPlayer.player.start(as);
r.setAudioStream(loadAudio(r.getFilePath()));
}
}
public boolean getSaved() {
return isSaved;
}
public void setSaved(boolean state) {
isSaved = state;
}
/**
* clones the datamodel doing a deep copy of the pages and shapes
* @return clone
*/
public BDataModel clone() {
BDataModel clone = new BDataModel();
for(String page: this.pageModels.keySet()){
BPageModel pgclone = pageModels.get(page).clone();
clone.addPage(pgclone);
for(BShape shape: pgclone.getShapes()){
clone.addShape(shape.getModel());
}
pgclone.setData(clone);
}
for(String resource: this.resources.keySet()){
ResourceModel rmclone = resources.get(resource);
clone.addResource(rmclone);
}
clone.setResourceNames(this.resourceNames);
clone.setPageCounter(pageCounter);
clone.setShapeCounter(shapeCounter);
clone.documentDirectory = this.documentDirectory;
return clone;
}
}