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); } }