Skip to content

Commit 2f3d01a

Browse files
committed
Refactored TurtlePanel
1 parent 41756e9 commit 2f3d01a

17 files changed

Lines changed: 527 additions & 430 deletions

File tree

src/main/java/org/teachingextensions/WindowUtils/MultiTurtleWindow.java

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
11
package org.teachingextensions.WindowUtils;
22

3-
import java.awt.BasicStroke;
4-
import java.awt.Graphics;
5-
import java.awt.Graphics2D;
6-
import java.awt.Image;
7-
import java.awt.geom.AffineTransform;
8-
import java.awt.geom.Line2D;
9-
import java.util.ArrayList;
10-
import java.util.List;
11-
123
import org.teachingextensions.approvals.lite.util.ObjectUtils;
134
import org.teachingextensions.logo.Turtle;
145
import org.teachingextensions.logo.Turtle.Animals;
156
import org.teachingextensions.logo.utils.ColorUtils.PenColors;
16-
import org.teachingextensions.logo.utils.InterfaceUtils.TkpPanel;
177
import org.teachingextensions.logo.utils.LineAndShapeUtils.LineSegment;
188

9+
import java.awt.*;
10+
import java.awt.geom.AffineTransform;
11+
import java.awt.geom.Line2D;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
1915
/**
2016
* Use this window when you want to put more than one turtle on the same window
2117
*/
2218
public class MultiTurtleWindow extends TurtlePanel
2319
{
24-
private static final long serialVersionUID = 1810849469483511849L;
2520
private List<Turtle> turtles = new ArrayList<Turtle>();
2621
private Image image;
2722
private Animals animal = Animals.Turtle;
@@ -42,20 +37,20 @@ public void addTurtle(Turtle turtle)
4237
{
4338
if (turtle == null) { return; }
4439
this.turtles.add(turtle);
45-
turtle.setFrame(this.getFrame());
40+
turtle.setFrame(this.getWindow().getFrame());
4641
turtle.setPanel(this);
4742
}
48-
@Override
49-
public void paint(Graphics g)
50-
{
51-
// We must call JPanel paint to get the correct behavior on windows...
52-
super.paint(g);
53-
Graphics2D g2d = TkpPanel.configureGraphics2D(g);
54-
super.setBackground(PenColors.Blues.DarkSlateBlue);
55-
paintLines(g2d);
56-
paintTurtle(g2d);
57-
g2d.dispose();
58-
}
43+
// @Override
44+
// public void paint(Graphics g)
45+
// {
46+
// // We must call JPanel paint to get the correct behavior on windows...
47+
// super.getWindow().paint(g);
48+
// Graphics2D g2d = TkpPanel.configureGraphics2D(g);
49+
// super.setBackground(PenColors.Blues.DarkSlateBlue);
50+
// paintLines(g2d);
51+
// paintTurtle(g2d);
52+
// g2d.dispose();
53+
// }
5954
@Override
6055
public synchronized Image getImage()
6156
{
Lines changed: 96 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,117 @@
11
package org.teachingextensions.WindowUtils;
22

3-
import java.awt.BasicStroke;
4-
import java.awt.Cursor;
5-
import java.awt.Graphics;
6-
import java.awt.Graphics2D;
7-
import java.awt.Image;
8-
import java.awt.RenderingHints;
9-
import java.awt.geom.AffineTransform;
10-
import java.awt.geom.Line2D;
3+
import org.teachingextensions.logo.Turtle;
4+
import org.teachingextensions.logo.Turtle.Animals;
5+
import org.teachingextensions.logo.utils.EventUtils.MouseLeftClickListener;
6+
import org.teachingextensions.logo.utils.EventUtils.MouseRightClickListener;
7+
import org.teachingextensions.logo.utils.InterfaceUtils.TurtlePainter;
8+
import org.teachingextensions.logo.utils.InterfaceUtils.TurtleTrailPainter;
9+
import org.teachingextensions.logo.utils.InterfaceUtils.TurtleWindow;
10+
import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable;
11+
12+
import javax.swing.*;
13+
import java.awt.*;
1114
import java.net.URL;
15+
import java.util.ArrayList;
1216

13-
import javax.swing.ImageIcon;
17+
public class TurtlePanel {
18+
private Turtle turtle;
19+
private Image image;
20+
private TurtleWindow window;
21+
private TurtleTrailPainter trailPainter;
22+
private TurtlePainter turtlePainter;
1423

15-
import org.teachingextensions.logo.Turtle;
16-
import org.teachingextensions.logo.Turtle.Animals;
17-
import org.teachingextensions.logo.utils.LineAndShapeUtils.LineSegment;
18-
19-
public class TurtlePanel extends ProgramWindow
20-
{
21-
private static final long serialVersionUID = 3272676059303477850L;
22-
private Turtle turtle;
23-
private Image image;
24-
private Animals animal;
25-
public TurtlePanel()
26-
{
27-
}
28-
public TurtlePanel(String string)
29-
{
30-
super(string);
31-
}
32-
public void setTurtle(Turtle turtle)
33-
{
24+
public TurtlePanel() {
25+
this(null, null);
26+
}
27+
28+
public TurtlePanel(String title) {
29+
this(title, null);
30+
}
31+
32+
public TurtlePanel(String title, Turtle turtle) {
33+
this.window = new TurtleWindow(title);
34+
configureWindow(turtle);
3435
this.turtle = turtle;
3536
}
36-
@Override
37-
public void paint(Graphics g)
38-
{
39-
super.paint(g);
40-
paintLines((Graphics2D) g);
41-
paintTurtle((Graphics2D) g);
42-
}
43-
private void paintLines(Graphics2D g)
44-
{
45-
if (turtle == null) { return; }
46-
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
47-
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
48-
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
49-
g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
50-
for (LineSegment l : turtle.getTrail())
51-
{
52-
if (l != null)
53-
{
54-
g.setColor(l.getColor());
55-
g.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
56-
g.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y));
57-
}
58-
}
37+
38+
public void setTurtle(Turtle turtle) {
39+
clearWindow();
40+
configureWindow(turtle);
41+
this.turtle = turtle;
5942
}
60-
private void paintTurtle(Graphics2D g)
61-
{
62-
if (turtle == null || turtle.isHidden()) { return; }
63-
Image image = getImage();
64-
int xCenter = image.getWidth(null) / 2;
65-
int yCenter = image.getHeight(null) / 2;
66-
int x = turtle.getX() - xCenter;
67-
int y = turtle.getY() - yCenter;
68-
AffineTransform rotate = AffineTransform.getRotateInstance(Math.toRadians(turtle.getHeadingInDegrees()),
69-
xCenter, yCenter);
70-
AffineTransform move = AffineTransform.getTranslateInstance(x, y);
71-
move.concatenate(rotate);
72-
g.drawImage(image, move, null);
73-
}
74-
public synchronized Image getImage()
75-
{
76-
if (image == null)
77-
{
43+
44+
public synchronized Image getImage() {
45+
if (image == null) {
7846
setAnimal(Animals.Turtle);
7947
}
8048
return image;
8149
}
82-
public synchronized Animals getAnimal()
83-
{
84-
if (animal == null)
85-
{
86-
setAnimal(Animals.Turtle);
87-
}
88-
return animal;
89-
}
90-
public synchronized void setAnimal(Animals animal)
91-
{
92-
this.animal = animal;
50+
51+
public synchronized void setAnimal(Animals animal) {
9352
String name = animal + ".png";
9453
URL resource = this.getClass().getResource(name);
95-
if (resource == null)
96-
{
54+
if (resource == null) {
9755
resource = this.getClass().getClassLoader().getResource(name);
9856
}
99-
if (resource == null) { throw new IllegalStateException("Could not find animal: " + name); }
100-
image = new ImageIcon(resource).getImage();
57+
if (resource == null) {
58+
throw new IllegalStateException("Could not find animal: " + name);
59+
}
60+
this.image = new ImageIcon(resource).getImage();
61+
clearWindow();
62+
configureWindow(this.turtle);
10163
}
102-
public void setCursor(int cursor)
103-
{
104-
this.setCursor(Cursor.getPredefinedCursor(cursor));
64+
65+
public void setCursor(int cursor) {
66+
this.window.setCursor(Cursor.getPredefinedCursor(cursor));
10567
}
106-
public void ___()
107-
{
68+
69+
public void ___() {
10870
// blank for the DeepDive
10971
}
72+
73+
protected void clearWindow() {
74+
this.window.remove(this.trailPainter)
75+
.remove(this.turtlePainter);
76+
}
77+
78+
protected void configureWindow(Turtle turtle) {
79+
this.trailPainter = new TurtleTrailPainter(turtle);
80+
this.turtlePainter = new TurtlePainter(turtle, this.getImage());
81+
this.window.add(this.trailPainter)
82+
.add(this.turtlePainter);
83+
}
84+
85+
public TurtleWindow getWindow() {
86+
return window;
87+
}
88+
89+
public void setColor(Color color) {
90+
this.getWindow().setColor(color);
91+
}
92+
93+
public void addButton(JButton leftButton) {
94+
this.getWindow().addButton(leftButton);
95+
}
96+
97+
public void setBackground(Color color) {
98+
this.getWindow().setBackground(color);
99+
}
100+
101+
public void addMouseLeftClickListener(MouseLeftClickListener listener) {
102+
this.getWindow().addMouseLeftClickListener(listener);
103+
}
104+
105+
public void addMouseRightClickListener(MouseRightClickListener listener) {
106+
this.getWindow().addMouseRightClickListener(listener);
107+
}
108+
109+
public void setBackgroundImage(String picture) {
110+
this.getWindow().setBackgroundImage(picture);
111+
}
112+
113+
public ArrayList<Paintable> getAdditional() {
114+
return this.window.additional;
115+
}
110116
}
117+

0 commit comments

Comments
 (0)