/******************************************************************************
 * Predmet: technologie java
 * Zadanie: zakladne 2D a 3d transformavcie
 * Dodefinovanie zadania: vytvorte program, ktory bude prezentovat zakladne
 * 			  2D a 3D transormacie
 * Autor: Patrik Bona <bona@intrak.sk>
 * Kosice dna 12.12.2001
 * poznamka: dany applet (aplikacia) reprezenruje 2D transformacie
 ******************************************************************************/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.net.URL;

public class Graph extends JApplet implements ActionListener {
	
	// deklaracie potrebnych objektov (tlacitak, toolbar...)
	private AnimPanel animPanel;
	private JRadioButton xButton, yButton;
	private JButton otocButton, zvacsButton, zmensButton, skosButton, spatneSkosenieButton, vlavoButton, vpravoButton, zrkadlenieButton;
	private JToolBar toolBar;
	private JLabel text;
	private ImageIcon img;
	private ButtonGroup group;
	private JPanel panel;
	
	static boolean isApplet = true;
	private boolean rozmer3d = false;
	private boolean osX = true, osY = false;
	
	protected Transform2D transform = new Transform2D(); // trieda obsahujuca transformacie
	
	double[][] matvrch = {{10,10}, // suradnice vrcholov pre 2D
		   {10,50},
		   {50,10},
		   {50,50},};
	
	int[][] matsusednych = {{0,1}, // susedne vrcholy pre 2D
			{0,2},
			{1,3},
			{2,3},
			{0,3},
			{2,1},};

	public void init() {
		setContentPane(vytvorFormu());
	}

	public void start() {
	}
	
	public void stop() {
	}
	
	private Container vytvorFormu() { // vytvorime vzhlad appletu (aplikacie)
 
		// definicie tlacitok
		img = new ImageIcon(getURL("pics/sipkavlavo.png"));
                vlavoButton = new JButton(img);
                vlavoButton.setToolTipText("zmensi polohu vzhladom na vybranu os");
                vlavoButton.setActionCommand("POSUNMINUS");
                vlavoButton.addActionListener(this);
                
		img = new ImageIcon(getURL("pics/sipkavpravo.png"));
                vpravoButton = new JButton(img);
		vpravoButton.setToolTipText("zvacsi polohu vzhladom na vybranu os");
		vpravoButton.setActionCommand("POSUNPLUS");
		vpravoButton.addActionListener(this);
				
		img = new ImageIcon(getURL("pics/otocenie.png"));
		otocButton = new JButton(img);
		otocButton.setToolTipText("otoc objekt vzhladom na pociatok suradnicovej sustavy (uhol = 10 st.)");
		otocButton.setActionCommand("OTOC");
		otocButton.addActionListener(this);
		
		img = new ImageIcon(getURL("pics/zvacs.png"));
		zvacsButton = new JButton(img);
		zvacsButton.setToolTipText("zvacsi objekt (M=1.1)");
		zvacsButton.setActionCommand("ZVACS");
		zvacsButton.addActionListener(this);
		
		img = new ImageIcon(getURL("pics/zmensi.png"));
		zmensButton = new JButton(img);
                zmensButton.setToolTipText("zmensi objekt (M=0.9)");
                zmensButton.setActionCommand("ZMENS");
                zmensButton.addActionListener(this);
						
		img = new ImageIcon(getURL("pics/skosenie.png"));
		skosButton = new JButton(img);
		skosButton.setToolTipText("skos objekt vzhladom na vybranu os (S=1)");
		skosButton.setActionCommand("SKOS");
		skosButton.addActionListener(this);

		img = new ImageIcon(getURL("pics/spatneskosenie.png"));
		spatneSkosenieButton  = new JButton(img);
		spatneSkosenieButton.setToolTipText("skos objekt vzhladom na vybranu os (S=-1)");
		spatneSkosenieButton.setActionCommand("SKOSSPATNE");
		spatneSkosenieButton.addActionListener(this);

		img = new ImageIcon(getURL("pics/zrkadlenie.png"));
		zrkadlenieButton = new JButton(img);
		zrkadlenieButton.setToolTipText("odzrkadli objekt vzhladom na vybranu os");
		zrkadlenieButton.setActionCommand("ZRKADLENIE");
		zrkadlenieButton.addActionListener(this);
		
		text = new JLabel(" Vyber si os: ");
		
		xButton = new JRadioButton("x");
		xButton.setSelected(true);
		xButton.setToolTipText("vyber os x");
		xButton.setActionCommand("OSX");
		xButton.addActionListener(this);
		
		yButton = new JRadioButton("y");
		yButton.setToolTipText("vyber os y");
		yButton.setActionCommand("OSY");
		yButton.addActionListener(this);

		// zoskupenie radio buttonov
		group = new ButtonGroup();
		group.add(xButton);
		group.add(yButton);

		// toolbar s tlacitkami
		toolBar = new JToolBar();
                toolBar.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder(" 2D tools "), BorderFactory.createEmptyBorder(5,5,5,5)));
                toolBar.add(vlavoButton);
		toolBar.add(vpravoButton);
		toolBar.add(otocButton);
                toolBar.add(zvacsButton);
                toolBar.add(zmensButton);
                toolBar.add(skosButton);
		toolBar.add(spatneSkosenieButton);
		toolBar.add(zrkadlenieButton);
		toolBar.add(text);
		toolBar.add(xButton);
		toolBar.add(yButton);

		// panel kam sa vykresluje
		animPanel = new AnimPanel();
		animPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder(" 2D draw panel "), BorderFactory.createEmptyBorder(5,5,5,5)));

		// celkovy panel kam secko nahadzeme
		panel = new JPanel(new BorderLayout());
		panel.add(toolBar,BorderLayout.NORTH);
		panel.add(animPanel,BorderLayout.CENTER);
		return panel;
	}	

	// tu pocuvame udalosti (pre stlacanie tlacitok)
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("OTOC")) {
			transform.otoc(10,matvrch);
		}
		if(e.getActionCommand().equals("ZVACS")) {
			transform.zmenMierku(1.1,matvrch);
		}
		if(e.getActionCommand().equals("ZMENS")) {
			transform.zmenMierku(0.9,matvrch);
		}
		if(e.getActionCommand().equals("SKOS")) {
			int pom = osX ? 0 : 1;
			transform.skos(1, pom, matvrch);
		}
		if(e.getActionCommand().equals("SKOSSPATNE")) {
			int pom = osX ? 0 : 1;
			transform.skos(-1, pom, matvrch);
		}
		if(e.getActionCommand().equals("OSX")) {
			xButton.setSelected(true);
			osX = true;
			osY = false;
		}
		if(e.getActionCommand().equals("OSY")) {
			yButton.setSelected(true);
			osY = true;
			osX = false;
		}
		if(e.getActionCommand().equals("POSUNMINUS")) {
			int pom = osX ? 0 : 1;
			transform.posun(-10, pom, matvrch);
		}
		if(e.getActionCommand().equals("POSUNPLUS")) {
			int pom = osX ? 0 : 1;
			transform.posun(10, pom, matvrch);
		}
		if(e.getActionCommand().equals("ZRKADLENIE")) {
			int pom = osY ? 0 : 1;
			transform.odraz(pom, matvrch);
		}
		animPanel.repaint();
	}
	
	// na AnimPanel sa vykresluje dany objekt ...
	private class AnimPanel extends JPanel {
		public void paintComponent(Graphics g) {
			super.paintComponent(g);

			int width = size().width, height = size().height;
			// vymaz plochu
			g.clearRect(0,0,width,height);

			// nakresli suradnicovy system
			g.drawLine(width/2, 20, width/2, height-10);
			g.drawLine(10, height/2, width -10, height/2);
			g.drawString("X", width - 15, height/2 - 5);
			g.drawString("Y", width/2 + 5, 30);
			// vykresli objekt
			for(int i=0;i<matsusednych.length;i++) {
				g.drawLine(width/2 + (int)matvrch[matsusednych[i][0]][0], height/2 - (int)matvrch[matsusednych[i][0]][1], width/2 + (int)matvrch[matsusednych[i][1]][0], height/2 - (int)matvrch[matsusednych[i][1]][1]);
	                }
		}
	}


	// tato metoda je kvoli stahovaniu obrazkov v pripade appletu
	protected URL getURL(String filename) {
	        URL url = null;
                if(isApplet){
	                URL codeBase = getCodeBase();
	                try {
	                        url = new URL(codeBase, filename);
	                } catch (java.net.MalformedURLException e) {
	                System.out.println("Couldn't create image: badly specified URL");
	        	        return null;
		        }
	          }
	            else{
		            url=getClass().getResource(filename);
		    }
	       return url;
	}
	
	
	
	// pre aplikaciu tu mame main() :-))
	public static void main (String args[]) {
		JFrame f=new JFrame("Java");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Graph app=new Graph();
	        isApplet=false;
		f.getContentPane().add(app);
		app.init();
        	f.setSize(500,380);
	        f.show();
	}
}