A9

import java.awt.Color;

import sk.upjs.jpaz2.Pane;

public class Tvar {

        private double x;
        private double y;
        private Color farba;

        public Tvar(double x, double y, Color farba) {
                super();
                this.x = x;
                this.y = y;
                this.farba = farba;
        }

        public double getX() {
                return x;
        }

        public void setX(double x) {
                this.x = x;
        }

        public double getY() {
                return y;
        }

        public void setY(double y) {
                this.y = y;
        }

        public Color getFarba() {
                return farba;
        }

        public void setFarba(Color farba) {
                this.farba = farba;
        }

        public void vykresliSa(Pane plocha) {
                System.err.println("Ja sa neviem vykreslit.");
        }
}
import java.awt.Color;

import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;

public class Kruh extends Tvar {

        private double polomer;

        public Kruh(double x, double y, double r, Color f) {
                super(x, y, f);
                setPolomer(r);
        }

        public double getPolomer() {
                return polomer;
        }

        public void setPolomer(double polomer) {
                polomer = Math.abs(polomer);
                this.polomer = polomer;
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setFillColor(getFarba());
                kreslic.setPosition(getX(), getY());
                kreslic.dot(getPolomer());
                plocha.remove(kreslic);
        }
}
import java.awt.Color;

import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;

public class Obdlznik extends Tvar {

        private double sirka;
        private double vyska;

        public Obdlznik(double x, double y, double s, double v, Color f) {
                super(x, y, f);
                sirka = s;
                vyska = v;
        }

        public double getSirka() {
                return sirka;
        }

        public void setSirka(double sirka) {
                this.sirka = sirka;
        }

        public double getVyska() {
                return vyska;
        }

        public void setVyska(double vyska) {
                this.vyska = vyska;
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setFillColor(getFarba());
                kreslic.setPosition(getX() - sirka / 2, getY() - vyska / 2);
                kreslic.setDirection(90);
                kreslic.openPolygon();
                for (int i = 0; i < 2; i++) {
                        kreslic.step(sirka);
                        kreslic.turn(90);
                        kreslic.step(vyska);
                        kreslic.turn(90);
                }
                kreslic.closePolygon();
                plocha.remove(kreslic);
        }
}
import sk.upjs.jpaz2.Pane;

public class ZoznamTvarov {
        private Tvar[] tvary;

        public ZoznamTvarov() {
                tvary = new Tvar[0];
        }

        public void pridajTvar(Tvar t) {
                Tvar[] nTvary = new Tvar[tvary.length + 1];
                System.arraycopy(tvary, 0, nTvary, 0, tvary.length);
                nTvary[nTvary.length - 1] = t;
                tvary = nTvary;
        }

        public void nakresliVsetky(Pane plocha) {
                for (int i=0; i<tvary.length; i++)
                        tvary[i].vykresliSa(plocha);
        }

        public void posun(double dx, double dy) {
                for (int i=0; i<tvary.length; i++) {
                        tvary[i].setX(tvary[i].getX() + dx);
                        tvary[i].setY(tvary[i].getY() + dy);
                }
        }

        public Tvar bodTvaru(double x, double y) {
                return null;
        }

        public void odstranTvar(Tvar t) {
                // ???
        }
}
import java.awt.Color;
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.WinPane;

public class PlochaTvarov extends WinPane {

        private ZoznamTvarov tvary;

        private double dragX;
        private double dragY;
        private boolean tahanie = false;

        public PlochaTvarov() {
                this.tvary = new ZoznamTvarov();
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        if (detail.isAltDown()) {
                                this.tvary.pridajTvar(new Kruh(x, y, 20, Color.red));
                        } else {
                                this.tvary.pridajTvar(new Obdlznik(x, y, 30, 15, Color.green));
                        }
                }

                if (detail.getButton() == MouseEvent.BUTTON3) {
                        Tvar naOdstranenie = this.tvary.bodTvaru(x, y);
                        if (naOdstranenie != null) {
                                this.tvary.odstranTvar(naOdstranenie);
                        }
                }

                this.clear();
                this.tvary.nakresliVsetky(this);
        }


        @Override
        protected void onMousePressed(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = true;
                        this.dragX = x;
                        this.dragY = y;
                }
        }

        @Override
        protected void onMouseDragged(int x, int y, MouseEvent detail) {
                if (this.tahanie) {
                        tvary.posun(x - this.dragX, y - this.dragY);
                        this.dragX = x;
                        this.dragY = y;
                        this.clear();
                        this.tvary.nakresliVsetky(this);
                }
        }

        @Override
        protected void onMouseReleased(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = false;
                }
        }
}

import java.awt.Color;
import java.io.PrintWriter;

import sk.upjs.jpaz2.Pane;

public class Tvar {

        private double x;
        private double y;
        private Color farba;

        public Tvar(double x, double y, Color farba) {
                super();
                this.x = x;
                this.y = y;
                this.farba = farba;
        }

        public double getX() {
                return x;
        }

        public void setX(double x) {
                this.x = x;
        }

        public double getY() {
                return y;
        }

        public void setY(double y) {
                this.y = y;
        }

        public Color getFarba() {
                return farba;
        }

        public void setFarba(Color farba) {
                this.farba = farba;
        }

        public void posun(double dx, double dy) {
                x = x + dx;
                y = y + dy;
        }

        public void vykresliSa(Pane plocha) {
                System.err.println("Ja sa neviem vykreslit.");
        }

        public boolean jeVnutornyBod(double x, double y) {
                System.err.println("Ja neviem.");
                return false;
        }

        public void zapisDoSuboru(PrintWriter pw) {
                System.err.println("Ja neviem.");
        }
}
import java.awt.Color;
import java.io.PrintWriter;
import java.util.Scanner;

import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;

public class Kruh extends Tvar {

        private double polomer;

        public Kruh(double x, double y, double r, Color f) {
                super(x, y, f);
                setPolomer(r);
        }

        public Kruh(Scanner citac) {
                super(0, 0, Color.red);
                setX(citac.nextDouble());
                setY(citac.nextDouble());
                setPolomer(citac.nextDouble());
        }

        public double getPolomer() {
                return polomer;
        }

        public void setPolomer(double polomer) {
                polomer = Math.abs(polomer);
                this.polomer = polomer;
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setFillColor(getFarba());
                kreslic.setPosition(getX(), getY());
                kreslic.dot(getPolomer());
                plocha.remove(kreslic);
        }

        @Override
        public boolean jeVnutornyBod(double x, double y) {
                double vzdialenost = Math.sqrt((getX() - x) * (getX() - x)
                                + (getY() - y) * (getY() - y));

                return vzdialenost <= polomer;
        }

        @Override
        public void zapisDoSuboru(PrintWriter pw) {
                pw.println("kruh " + getX() + " " + getY() + " " + polomer);
        }
}
import java.awt.Color;
import java.io.PrintWriter;

import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;

public class Obdlznik extends Tvar {

        private double sirka;
        private double vyska;

        public Obdlznik(double x, double y, double s, double v, Color f) {
                super(x, y, f);
                sirka = s;
                vyska = v;
        }

        public double getSirka() {
                return sirka;
        }

        public void setSirka(double sirka) {
                this.sirka = sirka;
        }

        public double getVyska() {
                return vyska;
        }

        public void setVyska(double vyska) {
                this.vyska = vyska;
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setFillColor(getFarba());
                kreslic.setPosition(getX() - sirka / 2, getY() - vyska / 2);
                kreslic.setDirection(90);
                kreslic.penUp();
                kreslic.openPolygon();
                for (int i = 0; i < 2; i++) {
                        kreslic.step(sirka);
                        kreslic.turn(90);
                        kreslic.step(vyska);
                        kreslic.turn(90);
                }
                kreslic.closePolygon();
                plocha.remove(kreslic);
        }

        public boolean jeVnutornyBod(double x, double y) {
                return (Math.abs(x - getX()) < sirka / 2 && Math.abs(y - getY()) < vyska / 2);
        }

        @Override
        public void zapisDoSuboru(PrintWriter pw) {
                pw.println("obdlznik " + getX() + " " + getY() + " " + sirka + " " +  vyska);
        }
}
import java.awt.Color;
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.WinPane;

public class PlochaTvarov extends WinPane {

        private ZoznamTvarov tvary;

        private double dragX;
        private double dragY;
        private boolean tahanie = false;

        public PlochaTvarov() {
                this.tvary = new ZoznamTvarov();
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        if (detail.isAltDown()) {
                                this.tvary.pridajTvar(new Kruh(x, y, 20, Color.red));
                        } else {
                                this.tvary.pridajTvar(new Obdlznik(x, y, 30, 15, Color.green));
                        }
                }

                if (detail.getButton() == MouseEvent.BUTTON3) {
                        Tvar naOdstranenie = this.tvary.bodTvaru(x, y);
                        if (naOdstranenie != null) {
                                this.tvary.odstranTvar(naOdstranenie);
                        }
                }

                this.clear();
                this.tvary.nakresliVsetky(this);
        }


        @Override
        protected void onMousePressed(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = true;
                        this.dragX = x;
                        this.dragY = y;
                }
        }

        @Override
        protected void onMouseDragged(int x, int y, MouseEvent detail) {
                if (this.tahanie) {
                        tvary.posun(x - this.dragX, y - this.dragY);
                        this.dragX = x;
                        this.dragY = y;
                        this.clear();
                        this.tvary.nakresliVsetky(this);
                }
        }

        @Override
        protected void onMouseReleased(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = false;
                }
        }

        public void uloz(String nazov) {
                tvary.zapisDoSuboru(nazov);
        }
}
import java.awt.Color;
import java.io.File;
import java.io.PrintWriter;
import java.util.Scanner;

import sk.upjs.jpaz2.Pane;

public class ZoznamTvarov {
        private Tvar[] tvary;

        public ZoznamTvarov() {
                tvary = new Tvar[0];
        }

        public void pridajTvar(Tvar t) {
                Tvar[] nTvary = new Tvar[tvary.length + 1];
                System.arraycopy(tvary, 0, nTvary, 0, tvary.length);
                nTvary[nTvary.length - 1] = t;
                tvary = nTvary;
        }

        public void nakresliVsetky(Pane plocha) {
                for (int i = 0; i < tvary.length; i++)
                        tvary[i].vykresliSa(plocha);
        }

        public void posun(double dx, double dy) {
                for (int i = 0; i < tvary.length; i++) {
                        tvary[i].posun(dx, dy);
                }
        }

        public Tvar bodTvaru(double x, double y) {
                for (int i = 0; i < tvary.length; i++) {
                        if (tvary[i].jeVnutornyBod(x, y)) {
                                return tvary[i];
                        }
                }
                return null;
        }

        private int indexTvaru(Tvar t) {
                for (int i = 0; i < tvary.length; i++) {
                        if (tvary[i] == t) {
                                return i;
                        }
                }
                return -1;
        }

        public void odstranTvar(Tvar t) {
                int idx = indexTvaru(t);
                if (idx == -1) {
                        return;
                }

                Tvar[] nTvary = new Tvar[tvary.length - 1];
                System.arraycopy(tvary, 0, nTvary, 0, idx);
                System.arraycopy(tvary, idx + 1, nTvary, idx, tvary.length - idx - 1);
                tvary = nTvary;
        }

        public void zapisDoSuboru(String nazov) {
                PrintWriter pw = null;
                try {
                        pw = new PrintWriter(new File(nazov));
                        for (int i = 0; i < tvary.length; i++) {
                                tvary[i].zapisDoSuboru(pw);
                        }
                } catch (Exception ignore) {

                } finally {
                        if (pw != null)
                                pw.close();
                }
        }

        public void nacitajZoSuboru(String nazov) {
                Scanner citac = null;
                try {
                        citac = new Scanner(new File(nazov));
                        tvary = new Tvar[0];

                        while (citac.hasNextLine()) {
                                String co = citac.next();
                                if (co.equals("kruh")) {
                                        pridajTvar(new Kruh(citac));
                                }
                        }
                } catch (Exception ignore) {

                } finally {
                        if (citac != null)
                                citac.close();
                }
        }
}
import java.awt.Color;

import sk.upjs.jpaz2.ObjectInspector;
import sk.upjs.jpaz2.WinPane;

public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                Tvar t;
                if (Math.random() < 0.5) {
                        t = new Kruh(100, 100, 30, Color.red);
                } else {
                        t = new Obdlznik(100, 100, 30, 15, Color.blue);
                }

                WinPane plocha = new WinPane();
                t.vykresliSa(plocha);

                PlochaTvarov pt = new PlochaTvarov();
                ObjectInspector oi = new ObjectInspector();
                oi.inspect(pt);
        }

}