Переглянути джерело

Added Terrain Size Dialog panel

Supermaniac101 10 роки тому
батько
коміт
cf204fda82

+ 16 - 2
src/gui/frames/MainFrame.java

@@ -24,9 +24,12 @@ public class MainFrame extends JFrame{
     private Agenda agenda;
     private JPanel currentPanel;
     
+    private int length;
+    private int width;
+    
     public MainFrame(){
         this.agenda = new Agenda();
-        this.currentPanel = new SimulatorPane(this.agenda);
+        this.currentPanel = new EditPane(this.agenda);
         this.add(this.currentPanel);
 		this.setResizable(true);
 		this.setBounds(100,100,1440,900);
@@ -35,6 +38,9 @@ public class MainFrame extends JFrame{
 		this.setJMenuBar(new MenuBar(this));
 		this.setVisible(true);
 		
+		this.length = 1000;
+		this.width = 1000;
+		
 		this.getContentPane().setBackground( Color.WHITE );
 
         if(System.getProperties().getProperty("os.name").equals("Mac OS X")) {
@@ -63,13 +69,21 @@ public class MainFrame extends JFrame{
                 this.updateView(new AgendaPane(this.agenda));
                 break;
             case SIMULATOR:
-                this.updateView(new SimulatorPane(this.agenda));
+                this.updateView(new SimulatorPane(this.agenda, this.length, this.width));
                 break;
             case TABLE:
                 this.updateView(new Table(this.agenda));
                 break;
         }
     }
+
+    public void setLength(int length){
+    	this.length = length;
+    }
+    
+    public void setWidth(int width){
+    	this.width = width;
+    }
     
     private void updateView(JPanel panel){
         this.currentPanel = panel;

+ 8 - 9
src/gui/menubar/MenuBar.java

@@ -1,19 +1,19 @@
 package gui.menubar;
 
 import gui.frames.MainFrame;
-import gui.main.Main;
-import javafx.stage.*;
+import gui.simulator.SimulatorDialogPane;
 
-import java.awt.*;
-import java.awt.Window;
+import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 
-import javax.swing.*;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.KeyStroke;
 
 import agenda.Agenda;
 import agenda.Io;
@@ -132,8 +132,7 @@ public class MenuBar extends JMenuBar{
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				System.out.println("Simulator View");
-				mainFrame.changeView(MainFrame.Views.SIMULATOR);
-
+				new SimulatorDialogPane(mainFrame);
 			}
 		});
 

+ 132 - 0
src/gui/simulator/SimulatorDialogPane.java

@@ -0,0 +1,132 @@
+package gui.simulator;
+
+import gui.frames.MainFrame;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Label;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+public class SimulatorDialogPane extends JDialog{
+
+	    private JTextField length;
+	    private JTextField width;
+	    private MainFrame mainFrame;
+	    
+	    public SimulatorDialogPane(MainFrame mainFrame){
+	    	this.mainFrame = mainFrame;
+	        this.getContentPane().setBackground( Color.WHITE );
+	        JPanel main = new JPanel();
+	        main.setOpaque(false);
+	        main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
+	        Label label = new Label("Simulator Specification");
+	        label.setBackground(Color.WHITE);
+	        label.setFont(new Font("Arial", Font.PLAIN, 14));
+	        main.add(label);
+	        main.add(this.widthPanel());
+	        main.add(this.lengthPanel());
+	        main.add(this.buttons());
+	        main.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+	        
+	        Toolkit toolkit = Toolkit.getDefaultToolkit();
+	        Dimension screenSize = toolkit.getScreenSize();
+	        int x = (screenSize.width - this.getWidth()) / 2;
+	        int y = (screenSize.height - this.getHeight()) / 2;
+	        this.setLocation(x, y);
+	        
+	        super.add(main);
+	        super.setVisible(true);
+	        super.pack();
+	    } 
+	    
+	    private JPanel lengthPanel(){
+	        JPanel name = new JPanel();
+	        name.setOpaque(false);
+	        name.setLayout(new BoxLayout(name, BoxLayout.X_AXIS));
+	        name.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
+	        Label label = new Label("Length");
+	        label.setBackground(Color.WHITE);
+	        label.setFont(new Font("Arial", Font.PLAIN, 11));
+	        name.add(label);
+	        this.length = new JTextField();
+	        name.add(this.length);
+	        return name;
+	    }
+	    private JPanel widthPanel(){
+	        JPanel name = new JPanel();
+	        name.setOpaque(false);
+	        name.setLayout(new BoxLayout(name, BoxLayout.X_AXIS));
+	        name.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
+	        Label label = new Label("Width");
+	        label.setBackground(Color.WHITE);
+	        label.setFont(new Font("Arial", Font.PLAIN, 11));
+	        name.add(label);
+	        this.width = new JTextField();
+	        name.add(this.width);
+	        return name;
+	    }
+
+	    private JPanel buttons(){
+	        JPanel buttons = new JPanel();
+	        buttons.setOpaque(false);
+	        JButton save = new JButton("Save");
+	        save.addActionListener(new ActionListener() {
+	            @Override
+	            public void actionPerformed(ActionEvent e) {
+	                save();
+	            }
+	        });
+	        buttons.add(save);
+	        
+	        JButton cancel = new JButton("Cancel");
+	        cancel.addActionListener(new ActionListener() {
+	            @Override
+	            public void actionPerformed(ActionEvent e) {
+	                cancel();
+	            }
+	        });
+	        buttons.add(cancel);
+	        return buttons;
+	    }
+	    
+	    private void save(){
+	            if(this.length.getText().equals("") || this.width.getText().equals("")){
+	                JOptionPane.showMessageDialog(null, "Width or height can't be empty!", "Warning", JOptionPane.WARNING_MESSAGE);
+	                return;
+	            }else{
+	            	int length = Integer.parseInt(this.length.getText());
+	            	int width = Integer.parseInt(this.width.getText());
+	            	this.mainFrame.setLength(length);
+	            	this.mainFrame.setWidth(width);
+	            	this.mainFrame.changeView(MainFrame.Views.SIMULATOR);
+	                dispose();
+	            }
+	    }
+
+	    private void cancel(){
+	        dispose();
+	    }
+	    
+	    protected JButton saveButton() {
+	        JButton button = new JButton("Save");
+	        button.addActionListener(new ActionListener() {
+	            @Override
+	            public void actionPerformed(ActionEvent e) {
+	                save();
+	            }
+	        });
+	        return button;
+	    }
+	}
+

+ 3 - 3
src/gui/simulator/SimulatorPane.java

@@ -12,12 +12,12 @@ public class SimulatorPane extends JPanel{
 	
 	private Agenda agenda;
 
-	public SimulatorPane(Agenda agenda){
+	public SimulatorPane(Agenda agenda, int length, int width){
         super.setLayout(new BorderLayout());
 		this.agenda = agenda;
         this.setOpaque(true);
-        this.setBackground(Color.RED);
+        this.setBackground(Color.WHITE);
         this.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
-        this.add(new Terrain(), BorderLayout.CENTER);
+        this.add(new Terrain(length, width), BorderLayout.CENTER);
 	}
 }

+ 69 - 9
src/gui/simulator/Terrain.java

@@ -1,29 +1,56 @@
 package gui.simulator;
 
-import com.sun.istack.internal.NotNull;
 import gui.simulator.facilities.Stage;
 
-import javax.swing.*;
-import java.awt.*;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.TexturePaint;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
 import java.awt.event.MouseWheelEvent;
 import java.awt.geom.AffineTransform;
-import java.awt.geom.Area;
+import java.awt.geom.NoninvertibleTransformException;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
-import java.util.List;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
 import java.util.LinkedList;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
 
 public class Terrain extends JPanel {
 
     private List<Draw> entities;
     private Point2D offset;
     private Draw dragObject, selectedObject;
-
-    public Terrain(){
-        this.setBackground(new Color(100, 255, 255, 255));
+    private BufferedImage background;
+    
+    private int length;
+    private int width;
+    
+    Point2D cameraPoint = new Point2D.Double(1920/2,1080/2);
+	float cameraScale = 1;
+	
+	Point2D lastClickPosition;
+	Point lastMousePosition;
+
+    public Terrain(int length, int width){
+    	this.length = length;
+    	this.width = width;
+    	
+    	try {
+			background = ImageIO.read(new File("res/grass.jpg"));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
         this.dragObject = null;
         this.entities = new LinkedList();
         this.initEntities();
@@ -58,6 +85,7 @@ public class Terrain extends JPanel {
         addMouseMotionListener(new MouseAdapter() {
             @Override
             public void mouseDragged(MouseEvent e) {
+            	Point2D clickPoint = getClickPoint(e.getPoint());
                 if(dragObject != null){
                     if(SwingUtilities.isLeftMouseButton(e)){
                             dragObject.setX(e.getX() - offset.getX());
@@ -66,6 +94,16 @@ public class Terrain extends JPanel {
                         dragObject.setRotation(e.getX() * -1);
                     }
                 }
+                else
+				{
+					cameraPoint = new Point2D.Double(
+							cameraPoint.getX() + (lastMousePosition.getX() - e.getX()),
+							cameraPoint.getY() + (lastMousePosition.getY() - e.getY())
+							);
+					repaint();
+				}
+				lastMousePosition = e.getPoint();
+				lastClickPosition = clickPoint;
                 repaint();
             }
         });
@@ -83,6 +121,7 @@ public class Terrain extends JPanel {
                 repaint();
             }
         });
+        
     }
 
     private void initEntities(){
@@ -94,6 +133,10 @@ public class Terrain extends JPanel {
     public void paint(Graphics g) {
         super.paint(g);
         Graphics2D g2 = (Graphics2D) g;
+        
+        TexturePaint p = new TexturePaint(background, new Rectangle2D.Double(0, 0, 500, 500));
+		g2.setPaint(p);
+		g2.fill(new Rectangle2D.Double(0,0,width,length));
 
         for(Draw drawObject: entities){
             drawObject.draw(g2);
@@ -141,4 +184,21 @@ public class Terrain extends JPanel {
         Rectangle2D.Double s2 = new Rectangle2D.Double(d2.getX() - d2.getDistanceToOtherObjects(), d2.getY() - d2.getDistanceToOtherObjects(), d2.getWidth() * d2.getScale() + (2*d2.getDistanceToOtherObjects()) , d2.getHeight() * d2.getScale() + (2*d2.getDistanceToOtherObjects()));
         return s1.intersects(s2);
     }
+    
+    private Point2D getClickPoint(Point point) {
+		try {
+			return getCamera().inverseTransform(point, null);
+		} catch (NoninvertibleTransformException e1) {
+			e1.printStackTrace();
+		}
+		return null;
+	}
+    
+    private AffineTransform getCamera() {
+		AffineTransform tx = new AffineTransform();
+		tx.translate(-cameraPoint.getX() + getWidth()/2, -cameraPoint.getY() + getHeight()/2);
+		tx.scale(cameraScale, cameraScale);
+		
+		return tx;
+	}
 }