package edu.colorado.phet.movingman.ladybug
import _root_.edu.colorado.phet.common.phetcommon.view.util.PhetFont
import edu.colorado.phet.common.phetcommon.view.graphics.transforms.ModelViewTransform2D
import edu.colorado.phet.common.phetcommon.view.VerticalLayoutPanel
import edu.colorado.phet.common.piccolophet.nodes.ArrowNode
import edu.colorado.phet.common.piccolophet.PhetPCanvas
import java.awt.event.{MouseEvent, ActionEvent, MouseAdapter, ActionListener}
import java.awt.geom.{Rectangle2D, Point2D, Dimension2D}
import java.awt.{Rectangle, Dimension, Color}
import javax.swing._
import javax.swing.event.MouseInputAdapter
import umd.cs.piccolo.PNode
import umd.cs.piccolo.util.PDimension
import LadybugUtil._
class RemoteControl(model: LadybugModel, setMotionManual: () => Unit) extends VerticalLayoutPanel with ObservableS {
def mode = _mode
val CANVAS_WIDTH = 150
val CANVAS_HEIGHT = 150
val arrowHeadWidth = 30
val arrowHeadHeight = 30
val arrowTailWidth = 20
def resetAll() = {
mode = positionMode
}
abstract class RemoteMode(color: Color, rangeWidth: Double) {
val transform = new ModelViewTransform2D(new Rectangle2D.Double(-rangeWidth / 2, -rangeWidth / 2, rangeWidth, rangeWidth), new Rectangle(CANVAS_WIDTH, CANVAS_HEIGHT), false)
val arrowNode = new ArrowNode(transform.modelToView(new Point2D.Double(0, 0)), transform.modelToView(new Point2D.Double(0, 0)), arrowHeadWidth, arrowHeadHeight, arrowTailWidth, 0.5, true)
arrowNode.setPaint(color)
def setDestination(pt: Point2D) = {
_mode.arrowNode.setTipAndTailLocations(_mode.transform.modelToView(pt), _mode.transform.modelToView(new Point2D.Double(0, 0)))
setLadybugState(pt)
}
def setLadybugState(pt: Point2D) //template method
}
val positionMode = new RemoteMode(LadybugColorSet.position, 20) {
def setLadybugState(pt: Point2D) = {
model.ladybug.setPosition(pt)
model.setUpdateModePosition
}
}
val velocityMode = new RemoteMode(LadybugColorSet.velocity, 33) {
def setLadybugState(pt: Point2D) = {
model.ladybug.setVelocity(pt)
model.setUpdateModeVelocity
}
}
val accelerationMode = new RemoteMode(LadybugColorSet.acceleration, 11) {
def setLadybugState(pt: Point2D) = {
model.ladybug.setAcceleration(pt)
model.setUpdateModeAcceleration
}
}
var _mode: RemoteMode = positionMode;
def mode_=(m: RemoteMode) = {
_mode = m
notifyListeners
}
class RemoteControlCanvas extends PhetPCanvas(new PDimension(CANVAS_WIDTH, CANVAS_HEIGHT)) {
addMouseListener(new MouseInputAdapter() {
override def mousePressed(e: MouseEvent) = {
setMotionManual()
_mode.setDestination(_mode.transform.viewToModel(e.getX, e.getY))
}
override def mouseReleased(e: MouseEvent) = {
setMotionManual()
_mode.setDestination(new Vector2D(0, 0))
}
})
addMouseMotionListener(new MouseInputAdapter() {
override def mouseDragged(e: MouseEvent) = {
setMotionManual()
_mode.setDestination(_mode.transform.viewToModel(e.getX, e.getY))
}
})
}
val label = new JLabel("Remote Control")
label.setFont(new PhetFont(14, true))
add(label)
val canvas = new RemoteControlCanvas
canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT))
add(canvas)
val node = new PNode
canvas.addWorldChild(node)
def updateNode = {
node.removeAllChildren
node.addChild(_mode.arrowNode)
}
updateNode
addListener(() => {
updateNode
})
add(new MyRadioButton("Position", mode = positionMode, mode == positionMode, this))
add(new MyRadioButton("Velocity", mode = velocityMode, mode == velocityMode, this))
add(new MyRadioButton("Acceleration", mode = accelerationMode, mode == accelerationMode, this))
setFillNone
val button = new JButton()
model.addListener((lm: LadybugModel) => updateButton)
def updateButton = {
val value = if (model.isPaused) ("light3.png", "Go") else ("stop-20.png", "Stop")
button.setIcon(new ImageIcon(MovingManResources.loadBufferedImage(value._1)))
button.setText(value._2)
}
updateButton
button.addActionListener(new ActionListener() {
def actionPerformed(e: ActionEvent) = {
if (model.isPaused) {
model.startRecording()
} else {
model.setPaused(!model.isPaused)
}
}
})
add(button)
}