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