/*
* AbstractImageBorder.java
*
* Created on March 27, 2007, 9:19 AM
*
* Copyright 2006-2007 Nigel Hughes
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at http://www.apache.org/
* licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.pushingpixels.lafwidget.contrib.blogofbug.swing.borders;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import org.pushingpixels.lafwidget.contrib.blogofbug.utility.ImageUtilities;
/**
*
* @author nigel
*/
public class AbstractImageBorder {
/**
* Creates a new ImageBofder loading the image from the supplied URL
* @param imageURL The location of the image to use
* @param imageInsets The insets around the edge of the image that allow the cookie-cut-and-stretch of the image
* around the edge of the border
*/
public AbstractImageBorder(URL imageURL, Insets imageInsets){
this.imageInsets = imageInsets;
borderImage = ImageUtilities.loadCompatibleImage(imageURL.toString());
}
/**
* Creates a new ImageBorder using the supplied image and the insets
*
* @param borderImage The image to be used as the border
* @param imageInsets The insets around the edge of the image that allow the cookie-cut-and-stretch of the image
* around the edge of the border
*/
public AbstractImageBorder(BufferedImage borderImage, Insets imageInsets) {
this.borderImage = borderImage;
this.imageInsets = imageInsets;
}
protected BufferedImage borderImage;
protected Insets imageInsets;
/**
* Paints the border around the specified component
*
* @param c The component to paint the border on
* @param g The graphics context
* @param x The x offset
* @param y The y offset
* @param width The width
* @param height The height
*/
public void paintBorder(int compWidth, int compHeight, Graphics g, int x, int y, int width, int height) {
Graphics2D g2 = (Graphics2D) g;
int imageWidth = borderImage.getWidth();
int imageHeight = borderImage.getHeight();
//Top-left corner
drawSlice(g2,0,0,imageInsets.left,imageInsets.top,0,0);
//Top-right corner
drawSlice(g2,imageWidth-imageInsets.right,0,imageInsets.right,imageInsets.bottom,
compWidth-imageInsets.right,0);
//Bottom-left corner
drawSlice(g2,0,imageHeight-imageInsets.bottom,imageInsets.left,imageInsets.bottom,0,compHeight-imageInsets.bottom);
//Bottom-right corner
drawSlice(g2,imageWidth-imageInsets.right,imageHeight-imageInsets.bottom,imageInsets.left,imageInsets.bottom,compWidth-imageInsets.right,compHeight-imageInsets.bottom);
//Draw left side
g2.drawImage(borderImage,0,imageInsets.top,imageInsets.left,compHeight-imageInsets.bottom,
0,imageInsets.top,imageInsets.left,imageHeight-imageInsets.bottom,null);
//Draw right side
g2.drawImage(borderImage,compWidth-imageInsets.right ,imageInsets.top+6,compWidth,compHeight-imageInsets.bottom,
imageWidth-imageInsets.right,imageInsets.top,imageWidth,imageHeight-imageInsets.bottom,null);
//Draw top side
g2.drawImage(borderImage,imageInsets.left ,0,compWidth-imageInsets.left,imageInsets.top,
imageInsets.left,0,imageWidth-imageInsets.right,imageInsets.top,null);
//Draw bottom side
g2.drawImage(borderImage,imageInsets.left ,compHeight-imageInsets.bottom,compWidth-imageInsets.left,compHeight,
imageInsets.left,imageHeight-imageInsets.bottom,imageWidth-imageInsets.right,imageHeight,null);
}
/**
* Sets the insets around the edge of the image to be used to cookie cut the image into a border
*
* @param insets The edges of the image
*/
public void setInsets(Insets insets){
this.imageInsets = insets;
}
public Insets getImageInsets(){
return (Insets) imageInsets.clone();
}
/**
* Paints a stretched version of the center of the image (as the border is drawn
* first, then the component paints itself) so that the component can use it in
* its own paint if the border lends itself to having a centre area over-painted
*
* @param g2 The graphics context
* @param c The component
*/
public void paintCenter(Graphics2D g2, int compWidth,int compHeight){
int imageWidth = borderImage.getWidth();
int imageHeight = borderImage.getHeight();
//draw center
g2.drawImage(borderImage, imageInsets.left,imageInsets.top,compWidth-imageInsets.right,compHeight-imageInsets.bottom,
imageInsets.left,imageInsets.top,imageWidth-imageInsets.right,imageHeight-imageInsets.bottom,null);
}
/**
* Draws a slicde from the specified image onto the graphics area
*
* @param g2 The graphics context to draw into
* @param sliceX The x-cordinate of the slice
* @param sliceY The y-cordinate of the slice
* @param sliceWidth The width of the slice
* @param sliceHeight The height of the slice
* @param destX The target location of the drawn slice
* @param destY The target location of the drawn slice
*/
private void drawSlice(Graphics2D g2,int sliceX, int sliceY, int sliceWidth, int sliceHeight, int destX, int destY){
g2.drawImage(borderImage,destX,destY,destX+sliceWidth,destY+sliceHeight,
sliceX,sliceY,sliceX+sliceWidth,sliceY+sliceHeight,null);
}
}