/*
* NaviToolBarUI.java
*
* Created on 2009-04-16, 00:13:17
*/
package app.navigps.gui.ToolBar.UI;
import app.navigps.gui.borders.OvalBorder;
import app.navigps.utils.GraphicsUtilities;
import app.navigps.utils.MetalUtils;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Transparency;
import java.awt.Window;
import java.awt.event.MouseEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.GeneralPath;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JRootPane;
import javax.swing.JToolBar;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.event.MouseInputListener;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import javax.swing.plaf.basic.BasicToolBarUI.DockingListener;
import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.TimingTargetAdapter;
import org.jdesktop.animation.timing.interpolation.PropertySetter;
/**
*
* @author Grzegorz (wara) Warywoda
*/
public class NaviToolBarUI extends BasicToolBarUI{
Image intermediateImage;
static boolean AA = true;
private boolean paintedText = true;
private String text = "NaviGPS";
private BufferedImage bi = null;
private ConvolveOp blurOp;
@Override
public void installUI(JComponent c) {
super.installUI(c);
//setRolloverBorders(false);
float[] matrix = {
0.111f, 0.111f, 0.111f,
0.111f, 0.111f, 0.111f,
0.111f, 0.111f, 0.111f,
};
blurOp = new ConvolveOp(new Kernel(3, 3, matrix));
}
@Override
public void paint(Graphics g, JComponent c) {
super.paint(g, c);
//g2d.setColor(Color.RED);
//g2d.fillRect(0,0,c.getWidth(), c.getHeight());
}
@Override
protected void floatAt(Point position, Point origin) {
super.floatAt(position, origin);
System.out.println("floatAt pos: "+position+" origin: "+origin);
}
@Override
protected void dragTo(Point position, Point origin) {
super.dragTo(position, origin);
System.out.println("dragTo pos: "+position+" origin: "+origin);
}
@Override
public void update(Graphics g, JComponent c) {
if (g == null) {
throw new NullPointerException("graphics must be non-null");
}
Border bord = c.getBorder();
if(bord instanceof OvalBorder){
OvalBorder ovb= (OvalBorder)bord;
RoundRectangle2D clip = new RoundRectangle2D.Double(0,0,
c.getWidth(),c.getHeight(), ovb.getRecW(), ovb.getRecH());
Area newClip = new Area(g.getClip());
Area visbClip = new Area(clip);
newClip.intersect(visbClip);
GeneralPath gpClip = new GeneralPath(newClip);
g.setClip(gpClip);
}
if (c.isOpaque() && (c.getBackground() instanceof UIResource) &&
((JToolBar)c).getOrientation() ==
JToolBar.HORIZONTAL && UIManager.get(
"MenuBar.gradient") != null) {
JRootPane rp = SwingUtilities.getRootPane(c);
JMenuBar mb = null;
if(rp != null)
mb = rp.getJMenuBar();
if (mb != null && mb.isOpaque() &&
(mb.getBackground() instanceof UIResource)) {
Point point = new Point(0, 0);
point = SwingUtilities.convertPoint(c, point, rp);
int x = point.x;
int y = point.y;
point.x = point.y = 0;
point = SwingUtilities.convertPoint(mb, point, rp);
if (point.x == x && y == point.y + mb.getHeight() &&
mb.getWidth() == c.getWidth() &&
MetalUtils.drawGradient(c, g, "MenuBar.gradient",
0, -mb.getHeight(), c.getWidth(), c.getHeight() +
mb.getHeight(), true)) {
paint(g, c);
return;
}
}
if (MetalUtils.drawGradient(c, g, "MenuBar.gradient",
0, 0, c.getWidth(), c.getHeight(), true)) {
paint(g, c);
return;
}
}
super.update(g, c);
}
protected void paintText(Graphics2D g2d,JComponent c){
if(!text.equals("")){
Dimension compSize = c.getSize();
//check size for painting text
int childsWidth = 0;
Component [] childs = c.getComponents();
for (Component child : childs) {
childsWidth +=child.getWidth();
}
int textGap = compSize.width - childsWidth;
System.out.println("Text gap "+textGap);
if(textGap >50){
//positioning text in center textGap area
//int xPos = childsWidth+(gapForText - textWidth)>>1;
//int yPos = (compSize.height-textHight)>>1;
createIamge(g2d, new Rectangle(0,0, textGap, 50));
}
}
}
private void createIamge(Graphics2D g2d,Rectangle paintArea){
if (intermediateImage == null) {
// First, measure the size of the text
FontRenderContext frc = new FontRenderContext(null,AA, false);
Font f = new Font("Times",Font.BOLD,22);
TextLayout layout = new TextLayout(text, f, frc);
float sw = (float) layout.getBounds().getWidth();
AffineTransform transform = new AffineTransform();
//transform.setToTranslation(paintArea.width/2-sw/2, paintArea.height/4);
Shape shape = layout.getOutline(transform);
Rectangle rect = shape.getBounds();
System.out.println("Rect text "+rect);
//Rectangle2D rect = layout.getBounds();
int imageW = (int)(rect.getWidth() - rect.getX() + .5);
int imageH = (int)(rect.getHeight() - rect.getY() + .5);
// We must also account for text "descent" in determining where to draw string in image
int descent = (int)(layout.getDescent() + .5f);
// Now, create the intermediate image
GraphicsConfiguration gc =
SwingUtilities.getWindowAncestor(toolBar).getGraphicsConfiguration();
if (!AA) {
// non-Anti-Aliased text; only need transparent-background image
intermediateImage = gc.createCompatibleImage(imageW, imageH,
Transparency.BITMASK);
} else {
// anti-aliased text needs translucent image
intermediateImage = gc.createCompatibleImage(imageW, imageH,
Transparency.TRANSLUCENT);
}
// And render the transparent background and the text into the image
Graphics2D gImg = (Graphics2D)intermediateImage.getGraphics();
gImg.setComposite(AlphaComposite.Src);
gImg.setColor(new Color(0, 0, 0, 0));
gImg.fillRect(0, 0, imageW, imageH);
if (AA) {
// Set up Anti-Aliasing for text rendering
gImg.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}
gImg.draw(shape);
gImg.dispose();
}
g2d.drawImage(intermediateImage, 0, 0, null);
}
/**
* @return the paintText
*/
public boolean isPaintedText() {
return paintedText;
}
/**
* @param paintText the paintText to set
*/
public void setPaintedText(boolean paintText) {
this.paintedText = paintText;
}
@Override
protected MouseInputListener createDockingListener(){
return new NaviDockingListener(toolBar);
}
protected void setDragOffset(Point p) {
if (!GraphicsEnvironment.isHeadless()) {
if (dragWindow == null) {
dragWindow = createDragWindow(toolBar);
}
dragWindow.setOffset(p);
}
}
@Override
public boolean canDock(Component c, Point p) {
boolean val =super.canDock(c, p);
System.out.println("can dock "+val);
return val;
}
@Override
public void setFloating(boolean b, Point p) {
if (toolBar.isFloatable()) {
if (b){
if (dragWindow != null){
Point destLoc = toolBar.getLocationOnScreen();
Animator animator =
PropertySetter.createAnimator(500, dragWindow, "location", destLoc);
animator.addTarget(new TimingTargetAdapter(){
@Override
public void end() {
dragWindow.setVisible(false);
}
});
animator.start();
}
}else {
if (dragWindow != null){
dragWindow.setVisible(false);
}
System.out.println("point "+p);
Container dockingSource = toolBar.getParent();
if ( propertyListener != null )
UIManager.removePropertyChangeListener( propertyListener );
Component target = dockingSource.getComponentAt(p);
if(target != null){
Rectangle rec = target.getBounds();
p.translate(rec.width/2, 0);
if(!rec.contains(p)){
return;
}
}
int zLocation = dockingSource.getComponentZOrder(target);
dockingSource.add(toolBar,zLocation);
dockingSource.invalidate();
Container dockingSourceParent = dockingSource.getParent();
if (dockingSourceParent != null)
dockingSourceParent.validate();
dockingSource.repaint();
}
}
}
@Override
protected JFrame createFloatingFrame(JToolBar toolbar) {
return (JFrame)null;
}
@Override
protected RootPaneContainer createFloatingWindow(JToolBar toolbar) {
return super.createFloatingWindow(toolbar);
}
@Override
protected void paintDragWindow(Graphics g) {
if(bi == null){
bi = GraphicsUtilities.
createCompatibleTranslucentImage(toolBar.getWidth(),toolBar.getHeight());
Graphics gbi = bi.createGraphics();
toolBar.paint(gbi);
gbi.dispose();
}
Graphics2D g2 = (Graphics2D)g;
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));
g2.drawImage(blurOp.filter(bi, null), 0, 0, null);
System.err.println("Paint dragWindow");
}
@Override
protected DragWindow createDragWindow(JToolBar toolbar) {
return super.createDragWindow(toolbar);
}
protected class NaviDockingListener extends DockingListener {
private boolean pressedInBumps = false;
public NaviDockingListener(JToolBar t) {
super(t);
}
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
if (!toolBar.isEnabled()) {
return;
}
pressedInBumps = false;
Rectangle bumpRect = new Rectangle();
if (toolBar.getOrientation() == JToolBar.HORIZONTAL) {
int x = MetalUtils.isLeftToRight(toolBar) ? 0 : toolBar.getSize().width-14;
bumpRect.setBounds(x, 0, 14, toolBar.getSize().height);
} else { // vertical
bumpRect.setBounds(0, 0, toolBar.getSize().width, 14);
}
if (bumpRect.contains(e.getPoint())) {
pressedInBumps = true;
Point dragOffset = e.getPoint();
if (!MetalUtils.isLeftToRight(toolBar)) {
dragOffset.x -=
(toolBar.getSize().width-toolBar.getPreferredSize().width);
}
setDragOffset(dragOffset);
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (pressedInBumps) {
super.mouseDragged(e);
}
}
}
}