package app.navigps.gui.svgComponents.Thumbnail; import app.navigps.gui.borders.OvalBorder; import app.navigps.gui.detailspanel.RoundJPanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; import org.jdesktop.animation.timing.Animator; import org.jdesktop.animation.timing.Animator.Direction; import org.jdesktop.animation.timing.Animator.RepeatBehavior; import org.jdesktop.animation.timing.TimingTarget; /** * * @author wara */ public class ThumbnailPanel extends RoundJPanel{ private Animator animator; private int animationDuration = 10000; private Thumbnail thumbnail; private PositionerListener mouselistener = new PositionerListener(); /** * * @param tn */ public ThumbnailPanel(Thumbnail tn){ super(10,10); setLayout(new BorderLayout()); setOpaque(false); thumbnail = tn; OvalBorder ob = new OvalBorder(5, 5, 5, 5,10,10); ob.setBorderColor(new Color(0,0,0)); ob.setAlpha(0.8f); setInnerCorners(5,5); setBorder(ob); animator = new Animator(animationDuration, 1, RepeatBehavior.LOOP,new AnimatorBehaviour()); add(thumbnail,BorderLayout.CENTER); installMouseListeners(); } private void installMouseListeners(){ addMouseListener(mouselistener); addMouseMotionListener(mouselistener); } private void uninstallMouseListeners(){ removeMouseListener(mouselistener); removeMouseMotionListener(mouselistener); } /** * * @param g */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if(getAlpha()>0){ Graphics2D g2 = (Graphics2D)g.create(); GradientPaint gp = new GradientPaint(0.0f, (float) (getHeight()>>1),new Color(1,51,90,255), (float)(getWidth()>>1), 80.0f,new Color(43,105,152,255)); g2.setPaint(gp); int recw = (int)getRoundBorder().getRecW(); g2.fillRoundRect(0, 0, getWidth(), getHeight(),recw,recw); g2.dispose(); } } protected void paintPositioner(Graphics2D g2){ } /** * * @param g */ @Override protected void paintBorder(Graphics g) { if(getAlpha()>0) super.paintBorder(g); } /** * * @param g */ @Override protected void paintChildren(Graphics g) { if(getAlpha()>0) super.paintChildren(g); } /** * * @param fraction * @param direct */ protected void initAnimator(float fraction,Direction direct){ System.err.println("Init animator <Thumbnail panel>"); if(fraction == -1){ fraction = getAlpha(); } animator.setStartFraction(fraction); animator.setStartDirection(direct); animator.start(); } /** * * @param disp */ public void displayThumbnail(boolean disp){ if(disp){ if(!thumbnail.isDisplay()) initAnimator(0,Direction.FORWARD); }else{ if(getThumbnail().isDisplay()) initAnimator(-1,Direction.BACKWARD); } } /** * @return the thumbnail */ public Thumbnail getThumbnail() { return thumbnail; } /** * */ protected class AnimatorBehaviour implements TimingTarget{ /** * * @param arg0 */ @Override public void timingEvent(float arg0) { if(setAlpha(arg0)){ //System.out.println("Thumbnail panel alpha "+getAlpha()); } if(thumbnail.setAlpha(arg0)){ SwingUtilities.invokeLater(new Runnable() { @Override public void run() { repaint(); } }); }else{ animator.stop(); } } /** * */ @Override public void begin() { //System.out.println("Thumbnail alpha "+getAlpha()+" upper alpha "+getUpperThresholdAlpha()); getThumbnail().setInteractionEnabled(!thumbnail.isDisplay()); } /** * */ @Override public void end() { //System.out.println("Thumbnail end -> alpha "+getAlpha()+" upper alpha "+getUpperThresholdAlpha()); } /** * */ @Override public void repeat() {} } class PositionerListener extends MouseInputAdapter{ private Point startPoint = new Point(0,0); private boolean drag = false; @Override public void mousePressed(MouseEvent e) { startPoint = e.getPoint(); drag = true; } @Override public void mouseDragged(MouseEvent e) { if(drag){ Point currentPoint = e.getPoint(); Point currLocation = getLocation(); int dx = currentPoint.x - startPoint.x; int dy = currentPoint.y - startPoint.y; //System.out.println("DX: "+dx+" DY: "+dy); currLocation.translate(dx, dy); Rectangle newBopunds = new Rectangle(currLocation.x, currLocation.y, getWidth(), getHeight()); if(checkAccess(newBopunds)){ setLocation(currLocation); } } } @Override public void mouseReleased(MouseEvent e) { drag = false; } private boolean checkAccess(Rectangle rec){ Container parent = getParent(); if(parent != null){ return parent.getBounds().contains(rec); } return false; } } }