package com.drawbridge.dm;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import com.drawbridge.Activity;
import com.drawbridge.dm.DMImageFactory.DMImage;
import com.drawbridge.jsengine.ast.DBParser;
import com.drawbridge.utils.ASTModification;
import com.drawbridge.utils.HandleBorder;
import com.drawbridge.utils.JSUtils;
import com.drawbridge.utils.Utils;
public class DMSimpleObject extends DMObject
{
private static final long serialVersionUID = -8572020779678839596L;
private DMImage mCounterpart;
private JTextField mNameField;
// Simple object, intended to show the basic underlying representation of the DMImage objects
public DMSimpleObject(DMImage image){
super(image.getName());
setPreferredLocation(image.getPreferredLocation(), ManipulationSource.SOURCE_EXECUTION);
setMinimumSize(DMObject.MINIMUM_OBJECT_SIZE);
mCounterpart = image;
mCounterpart.addComponentListener(mObjectSynchronizer);
addComponentListener(mObjectSynchronizer);
mHandleBorder = new HandleBorder(true);
setBorder(mHandleBorder);
addMouseListener(mouseAdapter);
addMouseMotionListener(mouseAdapter);
mCounterpart.addFocusListener(mFocusAdapter);
addFocusListener(mFocusAdapter);
this.setLayout(new BorderLayout());
mNameField = new JTextField(image.getName());
mNameField.setHorizontalAlignment(JTextField.CENTER);
mNameField.setBorder(BorderFactory.createLineBorder(Color.black));
this.add(mNameField);
mNameField.setDragEnabled(false);
mNameField.setEditable(false);
Utils.adaptTextFieldInputForVariableNames(mNameField, '_');
mNameField.addMouseListener(mTextMouseAdapter);
mNameField.addMouseMotionListener(mTextMouseAdapter);
mNameField.addFocusListener(new FocusListener(){
@Override
public void focusGained(FocusEvent arg0)
{
Utils.out.println(this.getClass(),"This \t\tx:" + getX() + ", y:" + getY() + ", width:" + getWidth() + ", height:" + getHeight());
Utils.out.println(this.getClass(),"CounterPart \t\tx:" + mCounterpart.getX() + ", y:" + mCounterpart.getY() + ", width:" + mCounterpart.getWidth() + ", height:" + mCounterpart.getHeight());
Utils.out.println(this.getClass(),"Handle thickness:" + mHandleBorder.getThickness());
}
@Override
public void focusLost(FocusEvent arg0)
{
mNameField.setEditable(false);
mNameField.setDragEnabled(false);
}
});
mNameField.getDocument().addDocumentListener(mDocumentListener);
}
DocumentListener mDocumentListener = new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent de)
{
}
@Override
public void insertUpdate(DocumentEvent de)
{
DMSimpleObject.this.mCounterpart.setName(mNameField.getText());
DMPanel.getInstance().mModel.updateDMModelListeners();
Activity.getInstance().printFocusOwner();
}
@Override
public void removeUpdate(DocumentEvent de)
{
DMSimpleObject.this.mCounterpart.setName(mNameField.getText());
DMPanel.getInstance().mModel.updateDMModelListeners();
Activity.getInstance().printFocusOwner();
}
};
MouseAdapter mTextMouseAdapter = new MouseAdapter(){
@Override
public void mousePressed(MouseEvent me){
MouseEvent newMouseEvent = SwingUtilities.convertMouseEvent(me.getComponent(), me, DMSimpleObject.this);
DMSimpleObject.this.dispatchEvent(newMouseEvent);
}
@Override
public void mouseDragged(MouseEvent me){
MouseEvent newMouseEvent = SwingUtilities.convertMouseEvent(me.getComponent(), me, DMSimpleObject.this);
DMSimpleObject.this.dispatchEvent(newMouseEvent);
}
@Override
public void mouseReleased(MouseEvent me){
MouseEvent newMouseEvent = SwingUtilities.convertMouseEvent(me.getComponent(), me, DMSimpleObject.this);
DMSimpleObject.this.dispatchEvent(newMouseEvent);
}
};
@Override
public String getName(){
return mCounterpart.getName();
}
FocusAdapter mFocusAdapter = new FocusAdapter(){
@Override
public void focusGained(FocusEvent e){
mCounterpart.mHandleBorder.setVisible(true);
mHandleBorder.setVisible(true);
mCounterpart.repaint();
repaint();
}
@Override
public void focusLost(FocusEvent e){
mCounterpart.mHandleBorder.setVisible(false);
mHandleBorder.setVisible(false);
mCounterpart.repaint();
repaint();
}
};
ComponentAdapter mObjectSynchronizer = new ComponentAdapter(){
@Override
public void componentMoved(ComponentEvent ce)
{
if(ce.getComponent() instanceof DMImage){
DMImage image = (DMImage) ce.getComponent();
// Find out what has changed
if((image.getX() - DMSimpleObject.this.getHandleThickness() + image.getHandleThickness()) != DMSimpleObject.this.getX()){
DMSimpleObject.this.mHandleBorder.mXSpotlight = true;
}
if((image.getY() - DMSimpleObject.this.getHandleThickness() + image.getHandleThickness()) != (DMSimpleObject.this.getY())){
DMSimpleObject.this.mHandleBorder.mYSpotlight = true;
}
DMSimpleObject.this.setLocation(new Point(image.getX() - DMSimpleObject.this.getHandleThickness() + image.getHandleThickness(),
image.getY() - DMSimpleObject.this.getHandleThickness() + image.getHandleThickness()));
}
else if(ce.getComponent() instanceof DMSimpleObject){
DMSimpleObject obj = (DMSimpleObject) ce.getComponent();
// Find out what has changed
if((obj.getX() + DMSimpleObject.this.getHandleThickness() - obj.mCounterpart.getHandleThickness()) != (obj.getX() + 50)){
Utils.out.println("First X:" + (obj.getX() + DMSimpleObject.this.getHandleThickness() - obj.mCounterpart.getHandleThickness()) + ", second: " + (obj.getX() + 50));
DMSimpleObject.this.mHandleBorder.mXSpotlight = true;
}
if((obj.getY() + DMSimpleObject.this.getHandleThickness() - obj.mCounterpart.getHandleThickness()) != obj.getY() + 50){
Utils.out.println("First Y:" + (obj.getY() + DMSimpleObject.this.getHandleThickness() - obj.mCounterpart.getHandleThickness()) + ", second: " + (obj.getY() + 50));
DMSimpleObject.this.mHandleBorder.mYSpotlight = true;
}
obj.mCounterpart.setLocation(new Point(obj.getX() + DMSimpleObject.this.getHandleThickness() - obj.mCounterpart.getHandleThickness(),
obj.getY() + DMSimpleObject.this.getHandleThickness() - obj.mCounterpart.getHandleThickness()));
}
// If the animation isn't running, just modify the AST and notify
if(DMSimplePanel.getInstance().isStoppedAndEmpty()){
DMImage image;
if(ce.getComponent() instanceof DMImage)
image = (DMImage) ce.getComponent();
else
image = (DMImage) ((DMSimpleObject) ce.getComponent()).mCounterpart;
ManipulationSource ms = image.mManipulationSource;
if(ms != null && (ms == ManipulationSource.SOURCE_EXECUTION && DMSimpleObject.this.mManipulationSource == ManipulationSource.SOURCE_EXECUTION)){
//don't do anything
}
else{
Utils.err.println("Location attempting to use ModifyImageParams " + ms.name());
//Make sure parser is up to date
if(DBParser.getInstance().containsEvaluator(image.getEvaluatorNode(ASTModification.ASTModificationType.MOD_LOCATION))){
ASTModification.modifyImageParams(image, ASTModification.ASTModificationType.MOD_LOCATION);
}
else{
Utils.err.println("EXECUTING STATIC IMAGE CODE");
JSUtils.executeStaticImageCode(DMPanel.getInstance().mModel.getModelObjects(), false);
}
}
}
}
@Override
public void componentResized(ComponentEvent ce)
{
//Removed a check for playing. Not sure it was vital, but just in case.
if(ce.getComponent() instanceof DMImage){
DMImage image = (DMImage) ce.getComponent();
// Find out what has changed
if((image.getSize().width + (DMSimpleObject.this.getHandleThickness() * 2) - (image.getHandleThickness() * 2)) != DMSimpleObject.this.getWidth()){
DMSimpleObject.this.mHandleBorder.mWidthSpotlight = true;
}
if((image.getSize().height + (DMSimpleObject.this.getHandleThickness() * 2) - (image.getHandleThickness() * 2)) != (DMSimpleObject.this.getHeight())){
DMSimpleObject.this.mHandleBorder.mHeightSpotlight = true;
}
DMSimpleObject.this.setSize(new Dimension(image.getSize().width + (DMSimpleObject.this.getHandleThickness() * 2) - (image.getHandleThickness() * 2),
image.getSize().height + (DMSimpleObject.this.getHandleThickness() * 2) - (image.getHandleThickness() * 2)));
}
else if(ce.getComponent() instanceof DMSimpleObject){
DMSimpleObject obj = (DMSimpleObject) ce.getComponent();
// Find out what has changed
if((obj.getSize().width - (DMSimpleObject.this.getHandleThickness() * 2) + (obj.mCounterpart.getHandleThickness() * 2)) != (obj.mCounterpart.getWidth())){
DMSimpleObject.this.mHandleBorder.mWidthSpotlight = true;
}
if((obj.getY() + DMSimpleObject.this.getHandleThickness() - obj.mCounterpart.getHandleThickness()) != obj.mCounterpart.getHeight()){
DMSimpleObject.this.mHandleBorder.mHeightSpotlight = true;
}
obj.mCounterpart.setSize(new Dimension(obj.getSize().width - (DMSimpleObject.this.getHandleThickness() * 2) + (obj.mCounterpart.getHandleThickness() * 2),
obj.getSize().height - (DMSimpleObject.this.getHandleThickness() * 2) + (obj.mCounterpart.getHandleThickness() * 2)));
}
ce.getComponent().validate();
// If the animation isn't running, just modify the AST and notify
if(DMSimplePanel.getInstance().isStoppedAndEmpty()){
DMImage image;
if(ce.getComponent() instanceof DMImage)
image = (DMImage) ce.getComponent();
else
image = (DMImage) ((DMSimpleObject) ce.getComponent()).mCounterpart;
ManipulationSource ms = image.mManipulationSource;
if(ms != null && (ms == ManipulationSource.SOURCE_EXECUTION && DMSimpleObject.this.mManipulationSource == ManipulationSource.SOURCE_EXECUTION)){
//don't do anything
}
else{
if(DBParser.getInstance().containsEvaluator(image.getEvaluatorNode(ASTModification.ASTModificationType.MOD_SIZE))){
ASTModification.modifyImageParams(image, ASTModification.ASTModificationType.MOD_SIZE);
}
else{
JSUtils.executeStaticImageCode(DMPanel.getInstance().mModel.getModelObjects(), false);
}
}
}
}
};
public DMImage getCounterpart(){
return mCounterpart;
}
@Override
public void setPreferredLocation(Point point, ManipulationSource s)
{
if(point != null){
super.setPreferredLocation(point, s);
if(mCounterpart != null)
mCounterpart.setPreferredLocation(point, s);
}
}
@Override
public void setPreferredSize(Dimension size)
{
super.setPreferredSize(size);
mCounterpart.setPreferredSize(size);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
}
}