package app.navigps.gui.detailspanel; import app.navigps.gui.borders.EmptyOvalBorder; import app.navigps.gui.borders.RoundBorder; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.Rectangle; import java.awt.geom.Area; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import java.awt.geom.RoundRectangle2D; import javax.swing.border.Border; /** * * @author Grzegorz (vara) Warywoda */ public class RoundJPanel extends AlphaJPanel{ private float innerCornerW; private float innerCornerH; /** * */ public RoundJPanel(){ this(20,20); } /** * * @param recW * @param recH */ public RoundJPanel(float recW,float recH){ setOpaque(false); setBorder(new EmptyOvalBorder(recW,recH)); setInnerCorners(recW, recH); } public RoundJPanel(LayoutManager lm,float recW,float recH){ this(recW,recH); setLayout(lm); } public RoundJPanel(LayoutManager lm){ this(); setLayout(lm); } /** * * @param g */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); } /** * * @param g */ @Override protected void paintChildren(Graphics g) { Graphics2D g2 = (Graphics2D)g; Rectangle oldClip = g.getClipBounds(); RoundRectangle2D vis = computeVisibleChildrenArea(); Area inner = new Area(oldClip); Area outer = new Area(vis); inner.intersect(outer); //Rectangle2D rec2 = inner.getBounds2D(); //System.out.println("visible rect x: "+rec2.getX()+" y: "+rec2.getY()+" w: "+rec2.getWidth()+" h: "+rec2.getHeight()); GeneralPath gp = new GeneralPath(inner); g2.setClip(gp); super.paintChildren(g2); } /** * * @return */ public RoundRectangle2D.Double computeVisibleChildrenArea(){ Rectangle bounds = getBounds(); Insets ins = super.getInsets(); int canX = ins.left; int canY = ins.top; int canWidth = bounds.width-ins.left-ins.right; int canHeight = bounds.height-ins.top-ins.bottom; float arcx = getInnerCornerW(); float arcy = getInnerCornerH(); if(canX == 0 || canY == 0){ if(arcx == .0f || arcy == .0f){ arcx = getRoundBorder().getRecW(); arcy = getRoundBorder().getRecH(); } } return new RoundRectangle2D.Double(canX, canY, canWidth, canHeight, arcx,arcy); } /** * * @param arcW * @param arcH */ public void setOuterCorners(float arcW,float arcH){ RoundBorder bord = getRoundBorder(); bord.setRecW(arcW); bord.setRecH(arcH); } /** * * @param val */ public void setOuterCorners(Point2D.Float val){ setOuterCorners((float)val.getX(),(float)val.getY()); } /** * * @return */ public Point2D getOuterCorners(){ RoundBorder bord = getRoundBorder(); return new Point2D.Float(bord.getRecW(),bord.getRecH()); } /** * * @param border */ public void setBorder(RoundBorder border) { super.setBorder(border); } /** * * @return */ public RoundBorder getRoundBorder() { return (RoundBorder)super.getBorder(); } public void setInsets(Insets ins){ RoundBorder rb = getRoundBorder(); rb.setBorderInsets(ins); } /** * * @return * @deprecated */ @Deprecated @Override public Border getBorder() { return super.getBorder(); } /** * * @param border * @deprecated */ @Deprecated @Override public void setBorder(Border border) { if(border instanceof RoundBorder) super.setBorder(border); } @Override public Graphics getGraphics() { Graphics g = super.getGraphics(); Point2D p = getOuterCorners(); g.setClip(new RoundRectangle2D.Double(0,0,getWidth(),getHeight(),p.getX(),p.getY())); return g; } /** * @return the innerCornerW */ public float getInnerCornerW() { return innerCornerW; } /** * @param innerCornerW the innerCornerW to set */ public void setInnerCornerW(float innerCornerW) { this.innerCornerW = innerCornerW; } /** * @return the innerCornerH */ public float getInnerCornerH() { return innerCornerH; } /** * @param innerCornerH the innerCornerH to set */ public void setInnerCornerH(float innerCornerH) { this.innerCornerH = innerCornerH; } public void setInnerCorners(float arcW,float arcH){ setInnerCornerW(arcW); setInnerCornerH(arcH); } /** * * @param val */ public void setInnerCorners(Point2D val){ setInnerCorners((float)val.getX(),(float)val.getY()); } public Point2D getInnerCorners(){ return new Point2D.Float(getInnerCornerW(),getInnerCornerH()); } }