package javax.swing;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.util.HashMap;
import Scheduler.MakeSchedule;
import Scheduler.MakeSchedule.ClassPanel;
public class ZoomPanel extends JPanel {
private static final long serialVersionUID = 1L;
protected double zoom;
private JPanel item;
private AffineTransform scale;
private AffineTransform forward;
protected CustomZoomListener zoomListen;
public ZoomPanel(double initialZoom, JPanel item) {
super(new FlowLayout());
zoom = initialZoom;
this.item = item;
add(item);
zoomListen = new CustomZoomListener();
addMouseListener(zoomListen);
}
@Override
public void paint(Graphics g) {
super.paintComponent(g); // clears background
Graphics2D g2 = (Graphics2D) g;
AffineTransform backup = g2.getTransform();
scale = new AffineTransform();
scale.setToIdentity();
scale.scale(zoom, zoom);
forward = new AffineTransform();
forward.concatenate(scale);
forward.translate(getLayout().preferredLayoutSize(this).getWidth()*(1-zoom)/2, 0);
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.transform(forward);
super.paint(g);
g2.setTransform(backup);
}
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
@SuppressWarnings("cast")
@Override
public Dimension getPreferredSize() {
Dimension unzoomed
= getLayout().preferredLayoutSize(this);
Dimension zoomed
= new Dimension((int)(unzoomed.width*zoom + (unzoomed.width * 0.15 *(1-zoom))),//*2),
(int)(unzoomed.height*zoom));
return zoomed;
}
public void setZoom(double newZoom)
throws PropertyVetoException {
if (newZoom <= 0.0) {
throw new PropertyVetoException
("Zoom must be positive-valued",
new PropertyChangeEvent(this,
"zoom",
new Double(zoom),
new Double(newZoom)));
}
double oldZoom = zoom;
if (newZoom != oldZoom) {
zoom = newZoom;
revalidate();
repaint();
}
}
public double getZoom() {
return zoom;
}
public class CustomZoomListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
MouseEvent temp = findSubComponent(arg0);
if(temp != null)
{
arg0 = temp;
maybeShowPopup(arg0);
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
MouseEvent temp = findSubComponent(arg0);
if(temp != null)
{
arg0 = temp;
maybeShowPopup(arg0);
}
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
((ClassPanel)e.getComponent()).showContextMenu(e.getX(), e.getY());
}
}
}
public AffineTransform getForwardTx(){
AffineTransform first = new AffineTransform(scale);
AffineTransform second = new AffineTransform(forward);
first.preConcatenate(second);
return first;
}
public MouseEvent findSubComponent(MouseEvent e){
Point click = e.getPoint();
AffineTransform first = getForwardTx();
try {
AffineTransform inverse = first.createInverse();
Point newClick = (Point) inverse.transform(click, new Point());
if(newClick.equals(click)){
return e;
}
/*
Component c;
if(e.getSource() instanceof MakeSchedule.ClassPanel){
c = (Component)e.getSource();
}
else{
c= SwingUtilities.getDeepestComponentAt(item, newClick.x, newClick.y).getParent().getParent();
}
Shape convertedShape = first.createTransformedShape(c.getBounds());
if(convertedShape.contains(click)){
Point panelPoint = SwingUtilities.convertPoint(this, click, c);
MouseEvent newMouse = new MouseEvent(c, e.getID(), e.getWhen(), e.getModifiers(), panelPoint.x, panelPoint.y,
e.getClickCount(), e.isPopupTrigger(), e.getButton());
if(c instanceof MakeSchedule.ClassPanel){
return newMouse;
}
}
else if(c.getBounds().equals(convertedShape.getBounds())){
if(c instanceof MakeSchedule.ClassPanel){
return e;
}
}*/
return null;
} catch (Throwable t) {
return null;
}
}
public CustomZoomListener getZoomListen() {
return zoomListen;
}
public void setZoomListen(CustomZoomListener zoomListen) {
this.zoomListen = zoomListen;
}
}