/*
* File : ComplexAssociation.java
* Created : 23-apr-2001 9:57
* 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.associations;
import edu.xtec.jclic.*;
import edu.xtec.jclic.automation.ActiveBagContentKit;
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.event.MouseEvent;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.28
*/
public class ComplexAssociation extends SimpleAssociation {
int nonAssignedCells;
/** Creates new ComplexAssociation */
public ComplexAssociation(JClicProject project) {
super(project);
nonAssignedCells=0;
invAss=false;
useIdAss=true;
}
@Override
public void initNew(){
super.initNew();
abc[0]=ActiveBagContent.initNew(3, 2, 'A', true, false, 50, 30);
abc[1]=ActiveBagContent.initNew(3, 2, '1');
//abc[2]=ActiveBagContent.initNew(3, 2, 'a');
}
protected static final String INVERSE="inverse";
@Override
public org.jdom.Element getJDomElement(){
org.jdom.Element e=super.getJDomElement();
if(e!=null)
if(invAss) e.setAttribute(INVERSE, JDomUtility.boolString(invAss));
return e;
}
@Override
public void setProperties(org.jdom.Element e, Object aux) throws Exception{
super.setProperties(e, aux);
invAss=JDomUtility.getBoolAttr(e, INVERSE, invAss);
abc[0].avoidAllIdsNull(abc[1].getNumCells());
}
@Override
public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception{
super.setProperties(c3a);
invAss=c3a.invAss;
abc[0].setIds(c3a.ass);
}
@Override
public int getMinNumActions(){
if(abc[0]==null || abc[1]==null) return 0;
if(invAss) return abc[1].getNumCells();
else return abc[0].getNumCells()-nonAssignedCells;
}
@Override
public Activity.Panel getActivityPanel(PlayStation ps) {
return new Panel(ps);
}
class Panel extends SimpleAssociation.Panel {
boolean [] invAssCheck;
protected Panel(PlayStation ps){
super(ps);
invAssCheck=null;
}
@Override
public void buildVisualComponents() throws Exception{
if(firstRun) super.buildVisualComponents();
clear();
if(abc[0]!=null && abc[1]!=null){
if(acp!=null)
acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, true), ps);
if(invAss){
invAssCheck=new boolean[abc[1].getNumCells()];
for(int i=0; i<invAssCheck.length; i++) invAssCheck[i]=false;
}
for(int i=0; i<2; i++)
bg[i]=ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[i]);
bg[0].setContent(abc[0], abc[2]);
bg[1].setContent(abc[1]);
bg[0].setDefaultIdAss();
nonAssignedCells=0;
for(int i=0; i<bg[0].getNumCells(); i++){
ActiveBox bx=bg[0].getActiveBox(i);
if(bx.idAss==-1){
nonAssignedCells++;
bx.switchToAlt(ps);
}
}
for(int i=0; i<2; i++){
bg[i].setVisible(true);
}
invalidate();
}
}
private boolean checkInvAss(){
int i;
if(invAss==false || invAssCheck==null) return false;
for(i=0; i<invAssCheck.length; i++) if(!invAssCheck[i]) break;
return i==invAssCheck.length;
}
@Override
public void processMouse(MouseEvent e){
ActiveBox bx1, bx2;
java.awt.Point p=e.getPoint();
boolean m=false;
if(playing) switch(e.getID()){
case MouseEvent.MOUSE_PRESSED:
ps.stopMedia(1);
if(bc.active){
boolean clickOnBg0=false;
bc.end();
if((bx1=bg[0].findActiveBox(bc.origin))!=null){
bx2=bg[1].findActiveBox(/*bc.dest*/p);
}
else if((bx2=bg[1].findActiveBox(bc.origin))!=null){
bx1=bg[0].findActiveBox(/*bc.dest*/p);
clickOnBg0=true;
}
if(bx1!=null && bx2!=null && bx1.idAss!=-1 && !bx2.isInactive()){
boolean ok=false;
String src=bx1.getDescription();
String dest=bx2.getDescription();
//ac.incCounterValue(ActivityContainer.ACTIONS_COUNTER);
if(bx1.idAss==bx2.idOrder ||
bx2.getContent().isEquivalent(abc[1].getActiveBoxContent(bx1.idAss), true)){
ok=true;
bx1.setIdAss(-1);
if(abc[2]!=null){
bx1.switchToAlt(ps);
m|=bx1.playMedia(ps);
}
else{
if(clickOnBg0) m|=bx1.playMedia(ps);
else m|=bx2.playMedia(ps);
bx1.clear();
}
if(invAss){
invAssCheck[bx2.idOrder]=true;
bx2.clear();
}
if(useOrder)
currentItem=bg[0].getNextItem(currentItem);
}
int cellsOk=bg[0].countCellsWithIdAss(-1);
ps.reportNewAction(getActivity(), ACTION_MATCH, src, dest, ok, cellsOk-nonAssignedCells);
if(ok && (checkInvAss() || cellsOk==bg[0].getNumCells())) finishActivity(true);
else if(!m) playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR);
}
else if((clickOnBg0 && bg[0].contains(p)) || (!clickOnBg0 && bg[1].contains(p))){
// click on grid, out of cell
String src=(bx1!=null ? bx1.getDescription() : bx2!=null ? bx2.getDescription() : "null");
ps.reportNewAction(getActivity(), ACTION_MATCH, src, "null", false, bg[1].countCellsWithIdAss(-1));
playEvent(EventSounds.ACTION_ERROR);
}
}
else{
//if(((bx1=bg[0].findActiveBox(p))!=null && bx1.idAss!=-1) ||
//(bx1=bg[1].findActiveBox(p))!=null){
if(((bx1=bg[0].findActiveBox(p))!=null && bx1.idAss!=-1 && (!useOrder || bx1.idOrder==currentItem))
||(!useOrder && (bx1=bg[1].findActiveBox(p))!=null)){
if(dragCells)
bc.begin(p, bx1);
else
bc.begin(p);
m|=bx1.playMedia(ps);
if(!m) playEvent(EventSounds.CLICK);
}
}
break;
case MouseEvent.MOUSE_MOVED:
case MouseEvent.MOUSE_DRAGGED:
if(bc.active){
bc.moveTo(p);
}
break;
}
}
}
}