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