DasherJava / src / dasherJava / gui / WorldPanel.java
WorldPanel.java
Raw
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.
	}
}