package com.drawbridge.dm; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Point; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashSet; import javax.swing.JComponent; import com.drawbridge.correspondance.Spotlight; import com.drawbridge.dm.DMImageFactory.DMImage; import com.drawbridge.text.TextPanel; import com.drawbridge.utils.AnalyticUtils; import com.drawbridge.utils.HandleBorder; import com.drawbridge.vl.VLPanel; public abstract class DMObject extends JComponent { private static final long serialVersionUID = 1L; protected Color mFill; protected Color mStroke; private Point mPreferredLocation; protected HandleBorder mHandleBorder; private Point mDragLocation = null; private Point mDragStartScreen = null; private String mName; public ManipulationSource mManipulationSource = null; public static final Dimension MINIMUM_OBJECT_SIZE = new Dimension(100, 100); public DMObject(String name) { mName = name; this.addFocusListener(mFocusListener); this.setMinimumSize(DMObject.MINIMUM_OBJECT_SIZE); } @Override public void setName(String newName) { mName = newName; } @Override public String getName() { return mName; } public Point getPreferredLocation() { return mPreferredLocation; } @Override public String toString() { return "DMObject size: (" + this.getX() + "," + this.getY() + ") w:" + this.getWidth() + " h:" + this.getHeight(); } FocusListener mFocusListener = new FocusListener() { @Override public void focusGained(FocusEvent arg0) { if (mHandleBorder != null) mHandleBorder.setVisible(true); } @Override public void focusLost(FocusEvent arg0) { if (mHandleBorder != null) mHandleBorder.setVisible(false); } }; MouseAdapter mouseAdapter = new MouseAdapter() { boolean backgroundSet = false; @Override public void mousePressed(MouseEvent me) { DMObject.this.mManipulationSource = ManipulationSource.SOURCE_HUMAN; if (mHandleBorder != null && mHandleBorder.contains(me.getX(), me.getY())) { mHandleBorder.mousePressed(me.getX(), me.getY()); } else if (contains(me.getX(), me.getY())) { mDragStartScreen = new Point(me.getXOnScreen(), me.getYOnScreen()); mDragLocation = new Point(getLocation().x, getLocation().y); getParent().setComponentZOrder(DMObject.this, 0); requestFocus(); } if (me.getComponent() instanceof DMSimpleObject){ ((DMSimpleObject) me.getComponent()).mHandleBorder.clearSpotlights(); AnalyticUtils.recordDMSimpleClick(); } else if(me.getComponent() instanceof DMImage){ ((DMImage) me.getComponent()).mHandleBorder.clearSpotlights(); AnalyticUtils.recordDMClick(); } } @Override public void mouseReleased(MouseEvent me) { backgroundSet = false; if (mHandleBorder != null && mHandleBorder.contains(me.getX(), me.getY())) mHandleBorder.mouseReleased(me.getX(), me.getY()); if(DMPanel.hasInstance()){ DMPanel.getInstance().getCanvas().setSpotlights(new HashSet<Spotlight>()); DMPanel.getInstance().getCanvas().setDimBackground(false); DMPanel.getInstance().getCanvas().repaint(); } if(DMSimplePanel.hasInstance()){ DMSimplePanel.getInstance().getCanvas().setSpotlights(new HashSet<Spotlight>()); DMSimplePanel.getInstance().getCanvas().setDimBackground(false); DMSimplePanel.getInstance().getCanvas().repaint(); } if (TextPanel.hasInstance()) { TextPanel.getInstance().getDocument().setSpotlights(new HashSet<Spotlight>()); TextPanel.getInstance().getDocument().setDimBackground(false); } if (VLPanel.hasInstance()) { VLPanel.getInstance().mCanvas.setSpotlights(new HashSet<Spotlight>()); VLPanel.getInstance().mCanvas.setDimBackground(false); VLPanel.getInstance().mCanvas.repaint(); } } @Override public void mouseDragged(MouseEvent me) { if (mHandleBorder != null && mHandleBorder.contains(me.getX(), me.getY()) || mHandleBorder.mMouseDown != null) { mHandleBorder.mouseDragged(DMObject.this, me.getX(), me.getY()); if (DMSimplePanel.getInstance().isStoppedAndEmpty()) { DMObject.this.setPreferredSize(DMObject.this.getSize()); } } else if (mDragLocation != null && mDragStartScreen != null) { int newX = me.getXOnScreen() - mDragStartScreen.x; int newY = me.getYOnScreen() - mDragStartScreen.y; newX += mDragLocation.x; newY += mDragLocation.y; setLocation(newX, newY); if (DMSimplePanel.getInstance().isStoppedAndEmpty()) { DMObject.this.setPreferredLocation(new Point(newX, newY), ManipulationSource.SOURCE_HUMAN); } mHandleBorder.paintBorder(DMObject.this, getGraphics(), getX(), getY(), getWidth(), getHeight()); } if (me.getComponent().getParent() instanceof DMCanvas && !backgroundSet) { backgroundSet = true; if(DMPanel.hasInstance()) DMPanel.getInstance().getCanvas().setDimBackground(true); if(DMSimplePanel.hasInstance()) DMSimplePanel.getInstance().getCanvas().setDimBackground(true); if (VLPanel.hasInstance()) { VLPanel.getInstance().mCanvas.setDimBackground(true); VLPanel.getInstance().mCanvas.repaint(); } if (TextPanel.hasInstance()) { TextPanel.getInstance().getDocument().setDimBackground(true); TextPanel.getInstance().getDocument().repaint(); } } } @Override public void mouseMoved(MouseEvent event) { setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); if (mHandleBorder != null && mHandleBorder.contains(event.getX(), event.getY())) { mHandleBorder.mouseMoved(DMObject.this, event.getX(), event.getY()); } } }; public void setPreferredLocation(Point point, ManipulationSource source) { mManipulationSource = source; mPreferredLocation = point; } public void setPreferredSize(Dimension d, ManipulationSource source) { mManipulationSource = source; super.setPreferredSize(d); } public int getHandleThickness() { if (mHandleBorder != null) { return mHandleBorder.getThickness(); } else return 0; } }