package com.qksnap.www.snap.gui;
import java.awt.AWTException;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Stroke;
import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.event.IIOReadProgressListener;
import javax.imageio.stream.ImageInputStream;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.qksnap.www.snap.gui.events.*;
import com.sun.awt.AWTUtilities;
public class RectGlassPane extends JPanel implements FocusListener {
public Point start = new Point();
public Point down = new Point();
private Rectangle2D rect;
private boolean drawing;
private AreaDragListener ml3;
private Area area = new Area();
private AlphaComposite ta;
private AlphaComposite old;
private SoftReference<BufferedImage> in;
public RectGlassPane() {
setOpaque(false);
ml3 = new AreaDragListener(true);
addMouseListener(ml3);
addMouseMotionListener(ml3);
addFocusListener(this);
addComponentListener(new ComponentAdapter() {
public void componentMoved(ComponentEvent e) {
setLocation(0, 0);
}
});
}
public void setVisible(boolean v) {
// Make sure we grab the focus so that key events don't go astray.
if (v)
requestFocus();
addComponentListener(new ComponentAdapter() {
public void componentMoved(ComponentEvent e) {
setLocation(0, 0);
}
});
super.setVisible(v);
}
// Once we have focus, keep it if we're visible
public void focusLost(FocusEvent fe) {
if (isVisible())
requestFocus();
}
public void focusGained(FocusEvent fe) {
}
public Rectangle2D getRect() {
return rect;
}
public void setRect(Rectangle2D rect) {
this.rect = rect;
}
public void setFinish(Point point) {
this.down = point;
}
public void setStart(Point point) {
this.start = point;
}
public boolean isDrawing() {
return drawing;
}
public void setDrawing(boolean s) {
this.drawing = s;
}
protected void paintComponent(Graphics g) {
super.printComponents(g);
long start = System.currentTimeMillis();
Graphics2D g2 = (Graphics2D) g;
BufferedImage img = getBufferedImage();
g.drawImage(img , 0, 0, null);
// g2.clearRect(0, 0, img.getWidth(), img.getHeight());
area.add(new Area(new Rectangle2D.Float(0, 0, img.getWidth(),
img.getHeight())));
ta = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
0.5f);
old = (AlphaComposite) g2.getComposite();
Font saved = g2.getFont();
g2.setColor(Color.black.darker());
g2.setComposite(ta);
if (getRect() != null && isDrawing()) {
area.subtract(new Area(getRect()));
g2.setColor(Color.GREEN.darker());
g2.setStroke(new BasicStroke(5));
g2.draw(getRect());
g2.setStroke(g2.getStroke()); // reset our stroke
g2.setColor(Color.black.darker());
g2.fill(area);
} else {
g2.setColor(Color.black.darker());
g2.fill(area);
g2.setColor(Color.red.darker());
g2.setComposite(old);
g2.setFont(new Font("Serif", Font.PLAIN, 36));
g2.drawString("Click and drag to make selection!",
(getWidth() / 2) - 150, getHeight() / 2);
}
g2.setFont(saved);
g2.dispose();
area.reset();
ta = null;
old = null;
try {
// Delay depending on how far behind current time we are.
start += (1000 / 45);
Thread.sleep(Math.max(0, start - System.currentTimeMillis()));
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean needUpdate = false;
public BufferedImage getBufferedImage() {
if (in != null && !needUpdate) {
final BufferedImage cachedImg = in.get();
if (cachedImg != null) {
return cachedImg;
}
}
// released by the Garbage Collector
// OR, never loaded
try {
in = new SoftReference<BufferedImage>(ImageIO.read(new ByteArrayInputStream(SplashScreen.getSingleton().getMainFrame().getImg())));
} catch (IOException e) {
e.printStackTrace();
}
return in.get();
}
}