/*
* File : ActivityBag.java
* Created : 19-dec-2000 16:09
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details (see the LICENSE file).
*/
package edu.xtec.jclic.bags;
import edu.xtec.jclic.Activity;
import edu.xtec.jclic.Constants;
import edu.xtec.jclic.bags.MediaBag.Listener;
import edu.xtec.jclic.clic3.Clic3;
import edu.xtec.jclic.edit.Editable;
import edu.xtec.jclic.edit.Editor;
import edu.xtec.jclic.fileSystem.FileSystem;
import edu.xtec.jclic.media.EventSounds;
import edu.xtec.jclic.project.JClicProject;
import edu.xtec.util.Domable;
import edu.xtec.util.JDomUtility;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* This class stores the complete collection of activities of a {@link edu.xtec.jclic.project.JClicProject}.
* The collection is managed through a private {@link java.util.ArrayList} of objects
* of type {@link edu.xtec.jclic.bags.ActivityBagElement}.
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.10
*/
public class ActivityBag extends Object implements Editable, Domable, Listener {
/**
* The project that this ActivityBag belongs to
*/
protected JClicProject project;
private List<ActivityBagElement> elements;
/**
* Creates new ActivityBag
* @param project The project this ActivityBag belongs to
*/
public ActivityBag(JClicProject project){
elements=new ArrayList<ActivityBagElement>(20);
this.project=project;
}
/**
* Returns the project this ActiivityBag belongs to
* @return The project related to this ActivityBag.
*/
public JClicProject getProject(){
return project;
}
public int size(){
return elements.size();
}
public ActivityBagElement elementAt(int index) throws ArrayIndexOutOfBoundsException{
return elements.get(index);
//return (ActivityBagElement)elements.elementAt(index);
}
public void insertElementAt(ActivityBagElement el, int index) throws ArrayIndexOutOfBoundsException {
elements.add(index, el);
//elements.insertElementAt(el, index);
}
public void removeElementAt(int index) throws ArrayIndexOutOfBoundsException {
elements.remove(index);
//elements.removeElementAt(index);
}
public void addElement(ActivityBagElement el){
elements.add(el);
//elements.addElement(el);
}
public boolean removeElement(ActivityBagElement el){
return elements.remove(el);
//return elements.removeElement(el);
}
public int getElementIndex(String name){
String s=FileSystem.stdFn(name);
int result=-1, c =0;
Iterator<ActivityBagElement> it=elements.iterator();
while(it.hasNext()){
if(it.next().getName().equals(s)){
result=c;
break;
}
c++;
}
return result;
}
public ActivityBagElement getElementByName(String name){
int i=getElementIndex(name);
return (i>=0 ? elementAt(i) : null);
}
public ActivityBagElement getElement(String name) throws Exception{
ActivityBagElement abe=getElementByName(name);
if(abe==null){
if(Clic3.isClic3Extension(Clic3.getExt(name))){
Clic3.addActivityToBag(project, name);
abe=getElementByName(name);
}
}
return abe;
}
public boolean activityExists(String name){
return getElementByName(name)!=null;
}
/**
* The name of the XML elements of type ActivityBag
*/
public static final String ELEMENT_NAME="activities";
public org.jdom.Element getJDomElement(){
org.jdom.Element e=new org.jdom.Element(ELEMENT_NAME);
for(int i=0; i<size(); i++){
e.addContent(elementAt(i).getData().detach());
}
return e;
}
public void addActivity(Activity act){
if(act!=null)
addJDomElement(act.getJDomElement());
}
public void addJDomElement(org.jdom.Element e){
if(e!=null){
ActivityBagElement abe=getElementByName(e.getAttributeValue(Activity.NAME));
if(abe!=null)
abe.setData(e);
else
addElement(new ActivityBagElement(e));
}
}
public ActivityBagElement[] getElements(){
return elements.toArray(new ActivityBagElement[size()]);
//ActivityBagElement[] result=new ActivityBagElement[size()];
//elements.copyInto(result);
//return result;
}
public void sortByName(){
Collections.sort(elements, new Comparator<ActivityBagElement>(){
public int compare(ActivityBagElement o1, ActivityBagElement o2){
return o1.getName().compareTo(o2.getName());
}
});
}
public void sortByClassAndName(){
final StringBuilder sb1=new StringBuilder(200);
final StringBuilder sb2=new StringBuilder(200);
Collections.sort(elements, new Comparator<ActivityBagElement>(){
public int compare(ActivityBagElement o1, ActivityBagElement o2){
org.jdom.Element e1=o1.getData();
org.jdom.Element e2=o2.getData();
sb1.setLength(0);
sb1.append(e1.getAttributeValue(JDomUtility.CLASS));
sb1.append(e1.getAttributeValue(Activity.NAME));
sb2.setLength(0);
sb2.append(e2.getAttributeValue(JDomUtility.CLASS));
sb2.append(e2.getAttributeValue(Activity.NAME));
return sb1.substring(0).compareTo(sb2.substring(0));
}
});
}
public void setProperties(org.jdom.Element e, Object aux) throws Exception{
JDomUtility.checkName(e, ELEMENT_NAME);
org.jdom.Element child;
List lst=e.getChildren(Activity.ELEMENT_NAME);
//elements.ensureCapacity(lst.size());
Iterator it=lst.iterator();
while(it.hasNext()){
child=(org.jdom.Element)it.next();
// Needed in JDOM B-8:
it.remove();
// Added class cast for JDOM 1.0:
addJDomElement((org.jdom.Element)child.detach());
}
}
public void removeElementByName(String name){
ActivityBagElement abe=getElementByName(name);
if(abe!=null)
removeElement(abe);
}
public Editor getEditor(Editor parent){
return Editor.createEditor(getClass().getName()+"Editor", this, parent);
}
public void listReferencesTo(String name, String type, Map<String, String> map){
for(int i=0; i<size(); i++){
ActivityBagElement abe=elementAt(i);
Map dp=abe.getReferences();
if(dp!=null && dp.containsKey(name) && (type==null || type.equals(dp.get(name))))
map.put(abe.getName(), Constants.ACTIVITY_OBJECT);
}
EventSounds evs=project.settings.eventSounds;
if(evs!=null){
HashMap dp=evs.getReferences();
if(dp!=null && dp.containsKey(name) && (type==null || type.equals(dp.get(name))))
map.put("["+project.getBridge().getMsg("edit_project")+"]", Constants.PROJECT_OBJECT);
}
}
public void listReferences(String type, Map<String, String> map) {
for(int i=0; i<size(); i++){
ActivityBagElement abe=elementAt(i);
if(type==null || type.equals(Constants.ACTIVITY_OBJECT))
map.put(abe.getName(), Constants.ACTIVITY_OBJECT);
Map<String, String> dp=abe.getReferences();
if(dp!=null){
if(type==null)
map.putAll(dp);
else{
Iterator<String> it=dp.keySet().iterator();
while(it.hasNext()){
String key=it.next();
if(type.equals(dp.get(key)))
map.put(key, type);
}
}
}
}
}
}