package bGUI;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.List;
import script.Script;
import data.BDataModel;
import data.BModelListener;
import data.BPage;
import data.BPageModel;
import data.BShape;
import data.BShapeModel;
/**
*
*/
/**
* @author Matthew Chun-Lum
* @author Chidozie Nwobilor
*
*/
public class BGameCanvas extends BCanvas {
public static final int GAME_WIDTH = 500;
public static final int GAME_HEIGHT = PossessionsAreaModel.DEFAULT_HEIGHT + BPageModel.DEFAULT_HEIGHT;
private PossessionsArea pa;
private Rectangle initialBounds;
private boolean wasOnPage;
private BDataModel data;
public BGameCanvas(BDataModel model) {
super(GAME_WIDTH, GAME_HEIGHT);
setPa(new PossessionsArea());
super.currentPage = null;
initialBounds = null;
wasOnPage = true;
pa.setBounds(new Rectangle(0,BPageModel.DEFAULT_HEIGHT, PossessionsAreaModel.DEFAULT_WIDTH, PossessionsAreaModel.DEFAULT_HEIGHT));
setData(model);
}
public void flipTo(BPage page){
if(page.getModel() == null) return;
if(currentPage != null) currentPage.removeCanvasAsListener(this);
currentPage = page;
selected = null;
currentPage.addListener(this);
Rectangle r = currentPage.getBounds();
pa.setXY(0,r.height);
page.executeScript(Script.ENTER, null, null, this);
}
private boolean IsInPossessionArea(){
List<Point> knobs = selected.getKnobs();
for(Point pt: knobs){
if(pa.getBounds().contains(pt)) return true;
}
return false;
}
private boolean IsOnPage(){
List<Point> knobs = selected.getKnobs();
for(Point pt: knobs){
if(currentPage.getBounds().contains(pt)) return true;
}
return false;
}
// ---------------- Protected ------------- //
@Override
protected void handleMouseDraggedEvent(MouseEvent e) {
if(selected != null) {
// move the selected shape and update the last point
selected.move(getDeltaPoint(e.getPoint()));
setLastPoint(e.getPoint());
if(selected.getMovable()){
if(IsInPossessionArea() && !PointOnPage(e.getPoint())){
if(!pa.contains(selected)){
Rectangle r = pa.addShape(selected);
currentPage.removeShape(selected);
selected.getModel().setX(r.x);
selected.getModel().setY(r.y);
//System.out.println("PA ADD");
}
//System.out.println("PA");
}else if(IsOnPage()){
if(!currentPage.contains(selected)){
currentPage.addShape(selected);
//System.out.println("CP ADD");
pa.removeShape(selected);
}
//System.out.println("Page");
}
}
repaint();
}
}
@Override
protected void handleMousePressedEvent(MouseEvent e) {
Point pt = e.getPoint();
// must update the last point
setLastPoint(pt);
if(PointOnPage(pt))selected = currentPage.getShape(pt);
else if(PointInPossessionArea(pt)){
selected = pa.getShape(pt);
}else{
selected = null;
}
if(selected != null && selected.getHidden()) selected = null; //prevents hidden objects from being moved
if(selected != null && currentPage.contains(selected)){
currentPage.executeScript(Script.CLICK, selected, null, this);
}
if(selected != null){
initialBounds = selected.getBounds();
wasOnPage = currentPage.contains(selected);
}
repaint();
}
private boolean PointInPossessionArea(Point pt) {
return pa.getBounds().contains(pt);
}
private boolean PointOnPage(Point pt) {
return currentPage.getBounds().contains(pt);
}
@Override
protected void handleMouseReleasedEvent(MouseEvent e) {
if(selected != null && !IsInPossessionArea()){
//System.out.println("in pa " + selected);
if(CheckBounds(pa)){
if(!pa.contains(selected)){
Rectangle r = pa.addShape(selected);
currentPage.removeShape(selected);
selected.getModel().setX(r.x);
selected.getModel().setY(r.y);
//System.out.println("PA ADD");
}
//System.out.println("PA");
}
}
if(selected != null){
BShape droppedOn = currentPage.getDroppedOn(e.getPoint(), selected);
if(droppedOn != null && !droppedOn.getHidden()){
if(droppedOn.canRecieve(selected)) currentPage.executeScript(Script.DROP, selected, droppedOn, this);
else{
SnapBack();
}
}
}
repaint();
}
private boolean CheckBounds(BPage page) {
int sY = selected.getKnobs().get(0).y;
int sheight = selected.getBounds().height;
int pY = page.getBounds().y;
return ((pY - sY) <= (sheight / 2));
}
private void SnapBack() {
if(wasOnPage){
selected.setBounds(initialBounds);
}else{
Rectangle r = pa.addShape(selected);
currentPage.removeShape(selected);
selected.getModel().setX(r.x);
selected.getModel().setY(r.y);
}
}
@Override
protected void handleMouseClickedEvent(MouseEvent e) {
}
/**
* @param pa the pa to set
*/
protected void setPa(PossessionsArea pa) {
this.pa = pa;
pa.setDrawKnobs(false);
}
/**
* @return the pa
*/
protected PossessionsArea getPa() {
return pa;
}
/**
* Paints the canvas. If the current page is not null,
* invokes the page's draw method.
* @param g
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(selected != null)currentPage.drawIsDroppable(g, selected);
pa.draw(g, selected);
g.setColor(Color.BLACK);
g.drawLine(0, currentPage.getBounds().height, currentPage.getBounds().width, currentPage.getBounds().height);
}
/**
* @param data the data to set
*/
public void setData(BDataModel data) {
this.data = data;
}
/**
* @return the data
*/
public BDataModel getData() {
return data;
}
}