package dasherJava.gui;
import java.awt.Graphics;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import dasherJava.DasherJava;
import dasherJava.core.input.InputProvider;
import dasherJava.core.startStop.StartStopAction;
import dasherJava.core.world.RepaintTarget;
import dasherJava.core.world.SquareWorldView;
import dasherJava.core.world.WorldGraphics;
import dasherJava.core.world.WorldGraphics.WorldGraphicsDrawCommand;
import dasherJava.core.world.WorldUpdateThread;
public class WorldPanel extends JPanel implements RepaintTarget, InputProvider {
private final SquareWorldView squareWorldView;
private final WorldGraphics<Graphics> worldGraphics;
private volatile WorldUpdateThread worldUpdateThread;
private volatile int mouseX = 0;
private volatile int mouseY = 0;
private volatile boolean wasResized = true;
private volatile float inputLineX = 0.0f;
private volatile float inputLineY = 0.0f;
public WorldPanel(SquareWorldView squareWorldView, SwingWorldGraphics worldGraphics) {
super(null);
this.squareWorldView=squareWorldView;
this.worldGraphics=worldGraphics;
squareWorldView.setWidth(getWidth());
squareWorldView.setHeight(getHeight());
setBackground(DasherJava.getGUIColors().getBackgroundColor().toAWTColor());
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
//System.out.println("WorldPanel resized");
squareWorldView.setWidth(getWidth());
squareWorldView.setHeight(getHeight());
wasResized=true;
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
requestFocusInWindow();
if (e.getButton()==1 && DasherJava.getSettings().getStartStopOnLeftClick())
worldUpdateThread.setAdditionalStartStopAction(StartStopAction.TOGGLE);
//worldView.move(mouseX, mouseY, 1.0f); //click mode
//doRepaint(mouseX, mouseY);
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton()==3 && !DasherJava.getSettings().getShowStatusBar()) DasherJava.showSettingsDialog();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
mouseX=e.getX();
mouseY=e.getY();
}
@Override
public void mouseDragged(MouseEvent e) {
mouseX=e.getX();
mouseY=e.getY();
}
});
}
public void setWorldUpdateThread(WorldUpdateThread worldUpdateThread) {
this.worldUpdateThread=worldUpdateThread;
}
@Override
public void paint(Graphics g) {
super.paint(g);
worldGraphics.executeLastFinishedFrameCommands(g);
for (WorldGraphicsDrawCommand drawCommand : squareWorldView.getTemporaryUIElements(inputLineX, inputLineY)) {
worldGraphics.executeDrawCommand(drawCommand, g);
}
}
@Override
public boolean wasResized() {
boolean tmp = wasResized;
wasResized=false;
return tmp;
}
@Override
public void doRepaint(float inputX, float inputY) {
inputLineX=inputX;
inputLineY=inputY;
SwingUtilities.invokeLater(() -> repaint());
}
@Override
public float getInputX() {
return InputProvider.mapToInputRange(mouseX, 0.0f, getWidth());
}
@Override
public float getInputY() {
return InputProvider.mapToInputRange(mouseY, 0.0f, getHeight());
}
@Override
public StartStopAction getStartStopAction() {
return StartStopAction.NOTHING; //Starting and stopping is handled using the special "Start/stop on left click"
//feature, so that it works even when another input provider is selected.
}
}