package org.teachingextensions.WindowUtils;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import org.teachingextensions.approvals.lite.util.FrameCloser;
import org.teachingextensions.approvals.lite.util.WindowUtils;
import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter;
import org.teachingextensions.logo.utils.ColorUtils.PenColors;
import org.teachingextensions.logo.utils.EventUtils.LeftClickMouseAdapter;
import org.teachingextensions.logo.utils.EventUtils.MouseLeftClickListener;
import org.teachingextensions.logo.utils.EventUtils.MouseRightClickListener;
import org.teachingextensions.logo.utils.EventUtils.RightClickMouseAdapter;
import org.teachingextensions.logo.utils.InterfaceUtils.CanvasPanel;
import org.teachingextensions.logo.utils.InterfaceUtils.TurtleFrame;
import org.teachingextensions.logo.utils.LineAndShapeUtils.ImageBackground;
import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable;
import org.teachingextensions.virtualproctor.VirtualProctorWeb;
/**
* <img src="http://ftpmirror.your.org/pub/wikimedia/images/wikibooks/de/2/2c/JPanel_Add_JButton_PAGE_END.JPG" style="text-align: left" alt="A window image" height="50" width="75" > Program Window
* allows you to change the color of the background and more...
*/
public class ProgramWindow
{
private final LazyCanvas canvas = new LazyCanvas();
private JFrame frame;
public ProgramWindow(String title)
{
this();
this.frame = new JFrame(title);
this.canvas.addTo(this.frame);
ProgramWindow.createStandardFrame(getFrame());
}
public ProgramWindow()
{
this.canvas.setPreferredSize(new Dimension(627, 442));
setColor(PenColors.Whites.White);
}
public static void createStandardFrame(JFrame frame)
{
WindowUtils.testFrame(frame, new VirtualProctorWeb(), new FrameCloser());
}
/**
* Adds a button instance to a window
* <p><b>Example:</b> {@code programWindow.addButton(myButton)}</p>
*
* @param button
* A button instance
*/
public void addButton(JButton button)
{
this.canvas.add(button);
}
public void setColor(Color backgroundColor)
{
this.canvas.setBackground(backgroundColor);
}
public ProgramWindow clearWindow()
{
this.canvas.clear();
return this;
}
/**
* Adds a right mouse click listener instance to a window
* <p><b>Example:</b> {@code programWindow.addMouseRightClickListener(myRightClickListener)}</p>
*
* @param listener
* A listener instance
*/
public void addMouseRightClickListener(MouseRightClickListener listener)
{
this.canvas.addMouseListener(new RightClickMouseAdapter(listener));
}
/**
* Adds a left mouse click listener instance to a window
* <p><b>Example:</b> {@code programWindow.addMouseLeftClickListener(myLeftClickListener)}</p>
*
* @param listener
* A listener instance
*/
public void addMouseLeftClickListener(MouseLeftClickListener listener)
{
this.canvas.addMouseListener(new LeftClickMouseAdapter(listener));
}
/**
* Adds a background image to a window
* <p><b>Example:</b> {@code programWindow.setBackgroundImage("http://www.coolpicture.com/sunshine.jpg")}</p>
*
* @param url
* A URL path to an image
*/
public void setBackgroundImage(String url)
{
add(new ImageBackground(url));
}
public JFrame getFrame()
{
return frame;
}
public void setWindowVisible(boolean b)
{
this.frame.setVisible(b);
this.canvas.getValue().setVisible(b);
}
@Deprecated
public ProgramWindow add(Paintable painter)
{
this.canvas.getValue().add(painter);
return this;
}
@Deprecated
public ProgramWindow remove(Paintable painter)
{
this.canvas.getValue().remove(painter);
return this;
}
public final BufferedImage getWindowImage()
{
return ComponentApprovalWriter.drawComponent(this.canvas.getValue());
}
public ProgramWindow addTo(TurtleFrame frame)
{
frame.addContent(this.canvas.getValue());
return this;
}
public ProgramWindow repaint()
{
this.canvas.getValue().repaint();
return this;
}
public ProgramWindow setVisible(boolean visible)
{
this.canvas.getValue().setVisible(visible);
return this;
}
public ProgramWindow setCursor(int cursor)
{
this.setCursor(Cursor.getPredefinedCursor(cursor));
return this;
}
public ProgramWindow setCursor(Cursor predefinedCursor)
{
this.canvas.getValue().setCursor(predefinedCursor);
return this;
}
public ProgramWindow setBackground(Color color)
{
this.canvas.setBackground(color);
return this;
}
public CanvasPanel getCanvas()
{
return this.canvas.getValue();
}
private class LazyCanvas
{
private CanvasPanel panel;
public LazyCanvas addTo(JFrame frame)
{
frame.getContentPane().add(this.getValue());
return this;
}
public CanvasPanel getValue()
{
if (this.panel == null)
{
this.panel = new CanvasPanel();
}
return panel;
}
public LazyCanvas setPreferredSize(Dimension dimension)
{
this.getValue().setPreferredSize(dimension);
return this;
}
public LazyCanvas add(JButton button)
{
this.getValue().add(button);
return this;
}
public LazyCanvas setBackground(Color color)
{
this.getValue().setBackground(color);
return this;
}
public LazyCanvas clear()
{
this.getValue().clear();
return this;
}
public LazyCanvas addMouseListener(MouseListener adapter)
{
this.getValue().addMouseListener(adapter);
return this;
}
@SuppressWarnings("unused")
public LazyCanvas setImageBackground(ImageBackground imageBackground)
{
this.getValue().setBackground(imageBackground);
return this;
}
}
}