/*
* File : Explore.java
* Created : 27-apr-2001 12:49
* 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.activities.panels;
import edu.xtec.jclic.*;
import edu.xtec.jclic.automation.ActiveBagContentKit;
import edu.xtec.jclic.bags.ActivitySequenceElement;
import edu.xtec.jclic.boxes.*;
import edu.xtec.jclic.media.EventSounds;
import edu.xtec.jclic.project.JClicProject;
import edu.xtec.util.JDomUtility;
import java.awt.*;
import java.awt.event.MouseEvent;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.28
*/
public class Explore extends Activity implements ActiveBagContentKit.Compatible {
/** Creates new Explore */
public Explore(JClicProject project) {
super(project);
boxGridPos=AB;
abc=new ActiveBagContent[2];
//for(int i=0; i<2; i++)
// abc[i]=null;
scramble[0]=false;
bTimeCounter=bScoreCounter=bActionsCounter=false;
includeInReports=false;
reportActions=false;
}
@Override
public void initNew(){
super.initNew();
abc[0]=ActiveBagContent.initNew(3, 2, '1', true, false, 50, 30);
abc[1]=ActiveBagContent.initNew(1, 6, 'A');
}
@Override
public org.jdom.Element getJDomElement(){
org.jdom.Element ex;
if(abc[0]==null || abc[1]==null)
return null;
org.jdom.Element e=super.getJDomElement();
e.addContent(abc[0].getJDomElement().setAttribute(ID, PRIMARY));
e.addContent(abc[1].getJDomElement().setAttribute(ID, SECONDARY));
ex=new org.jdom.Element(SCRAMBLE);{
ex.setAttribute(TIMES, Integer.toString(shuffles));
ex.setAttribute(PRIMARY, JDomUtility.boolString(scramble[0]));
e.addContent(ex);
}
ex=new org.jdom.Element(LAYOUT);
ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]);
e.addContent(ex);
return e;
}
@Override
public void setProperties(org.jdom.Element e, Object aux) throws Exception{
org.jdom.Element child;
super.setProperties(e, aux);
ActiveBagContent bag;
java.util.Iterator itr = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator();
while (itr.hasNext()){
child=((org.jdom.Element)itr.next());
bag=ActiveBagContent.getActiveBagContent(child, project.mediaBag);
String id=JDomUtility.getStringAttr(child, ID, PRIMARY, false);
if(PRIMARY.equals(id))
abc[0]=bag;
else if(SECONDARY.equals(id))
abc[1]=bag;
}
if(abc[0]==null || abc[1]==null)
throw new IllegalArgumentException("Explore activity without content!");
if((child=e.getChild(SCRAMBLE))!=null){
shuffles=JDomUtility.getIntAttr(child, TIMES, shuffles);
scramble[0]=JDomUtility.getBoolAttr(child, PRIMARY, scramble[0]);
}
if((child=e.getChild(LAYOUT))!=null)
boxGridPos=JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos);
}
@Override
public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception{
super.setProperties(c3a);
for(int i=0; i<2; i++){
abc[i]=c3a.createActiveBagContent(i);
abc[i].setBoxBase(c3a.getBoxBase(i));
}
// Clic3 bug
abc[1].border=false;
abc[0].setIds(c3a.ass);
boxGridPos=c3a.graPos;
// Clic3 bug:
//scramble=c3a.bar[0];
scramble[0]=false;
bScoreCounter=bActionsCounter=false;
includeInReports=false;
reportActions=false;
}
@Override
public boolean mustPauseSequence(){
return true;
}
public int getMinNumActions(){
return 0;
}
@Override
public boolean hasRandom(){
return true;
}
public Activity.Panel getActivityPanel(PlayStation ps) {
return new Panel(ps);
}
class Panel extends Activity.Panel {
ActiveBoxBag[] bg=new ActiveBoxBag[2];
protected Panel(PlayStation ps){
super(ps);
for(int i=0; i<2; i++)
bg[i]=null;
}
public void clear(){
for(int i=0; i<2; i++)
if(bg[i]!=null){
bg[i].end();
bg[i]=null;
}
}
@Override
public void buildVisualComponents() throws Exception{
if(firstRun) super.buildVisualComponents();
clear();
if(abc[0]!=null && abc[1]!=null){
// consider the use of assIds
if(acp!=null)
acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, true), ps);
bg[0]=ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]);
// Clic3 behavior!!!
double w=abc[1].w;
if(boxGridPos==AUB || boxGridPos==BUA)
w=abc[0].getTotalWidth();
bg[1]=new ActiveBoxGrid(null, this, margin, margin, w, abc[1].h, new edu.xtec.jclic.shapers.Rectangular(1, 1), abc[1].bb);
bg[0].setContent(abc[0]);
bg[0].setDefaultIdAss();
bg[1].getActiveBox(0).setInactive(false);
bg[0].setVisible(true);
bg[1].setVisible(true);
invalidate();
}
}
@Override
public void initActivity() throws Exception{
super.initActivity();
if(!firstRun) buildVisualComponents();
else firstRun=false;
setAndPlayMsg(MAIN, EventSounds.START);
//ps.setMsg(messages[MAIN]);
if(bg[0]!=null && bg[1]!=null){
if(scramble[0])
shuffle(new ActiveBoxBag[] {bg[0]}, true, true);
//ps.playMsg();
//if(messages[MAIN]==null || messages[MAIN].mediaContent==null)
// playEvent(EventSounds.START);
if(useOrder)
currentItem=bg[0].getNextItem(-1);
playing=true;
}
}
public void render(Graphics2D g2, Rectangle dirtyRegion) {
for(int i=0; i<2; i++)
if(bg[i]!=null)
bg[i].update(g2, dirtyRegion, this);
}
public Dimension setDimension(Dimension preferredMaxSize){
if(bg[0]==null || bg[1]==null || getSize().equals(preferredMaxSize))
return preferredMaxSize;
return BoxBag.layoutDouble(preferredMaxSize, bg[0], bg[1], boxGridPos, margin);
}
@Override
public void processMouse(MouseEvent e){
ActiveBox bx1, bx2;
boolean m=false;
if(playing) switch(e.getID()){
case MouseEvent.MOUSE_PRESSED:
ps.stopMedia(1);
if((bx1=bg[0].findActiveBox(e.getPoint()))!=null){
bx2=bg[1].getActiveBox(0);
if(bx1.idAss!=-1 && (!useOrder || bx1.idOrder==currentItem)){
bx2.setContent(abc[1], bx1.idAss);
if(!bx2.playMedia(ps) && !bx1.playMedia(ps))
playEvent(EventSounds.CLICK);
if(useOrder)
currentItem=bg[0].getNextItem(currentItem);
ps.reportNewAction(getActivity(), ACTION_SELECT, bx1.getDescription(), bx2.getDescription(), true, 0);
// Clic 3.0 behavior:
if(bx1.idAss>=0 && bx1.idAss<abc[1].getNumCells()){
ActivitySequenceElement ase=project.activitySequence.getCurrentAct();
if(ase!=null
&& project.activitySequence.hasNextAct(true)
&& ase.delay>0
&& (project.activitySequence.getNavButtonsFlag() & ActivitySequenceElement.NAV_FWD)==0){
finishActivity(true);
}
}
}
else{
bx2.clear();
bx2.setInactive(false);
}
}
break;
}
}
}
}