package com.jroller.santosh.border;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import javax.swing.SwingConstants;
/**
* MySwing: Advanced Swing Utilites
* Copyright (C) 2005 Santhosh Kumar T
* <p/>
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* <p/>
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* @author Santhosh Kumar T
*
* David Reisch Modified this class a little.
*/
public class DefaultResizableBorder implements ResizableBorder
{
private final int dist;
private final boolean isResizable;
int locations[] = {
SwingConstants.NORTH,
SwingConstants.SOUTH,
SwingConstants.WEST,
SwingConstants.EAST,
SwingConstants.NORTH_WEST,
SwingConstants.NORTH_EAST,
SwingConstants.SOUTH_WEST,
SwingConstants.SOUTH_EAST,
0, // move
-1, // no location
};
int cursors[] = {
Cursor.N_RESIZE_CURSOR,
Cursor.S_RESIZE_CURSOR,
Cursor.W_RESIZE_CURSOR,
Cursor.E_RESIZE_CURSOR,
Cursor.NW_RESIZE_CURSOR,
Cursor.NE_RESIZE_CURSOR,
Cursor.SW_RESIZE_CURSOR,
Cursor.SE_RESIZE_CURSOR,
// Cursor.MOVE_CURSOR,
Cursor.DEFAULT_CURSOR,
};
public DefaultResizableBorder(int dist, boolean isResizable){
this.dist = dist;
this.isResizable = isResizable;
}
public Insets getBorderInsets(Component component){
return new Insets(1, 1, 1, 1);
}
public boolean isBorderOpaque(){
return false;
}
public void paintBorder(Component component, Graphics g, int x, int y, int w, int h){
paintOutline(g, x, y, w, h);
if (isResizable)
paintCorners(g, x, y, w, h);
}
protected void paintOutline(Graphics g, int x, int y, int w, int h)
{
g.setColor(Color.red);
g.drawRect(x, y, w-1, h-1);
}
protected void paintCorners(Graphics g, int x, int y, int w, int h)
{
for(int i=0; i<locations.length-2; i++){
Rectangle rect = getRectangle(x, y, w, h, locations[i]);
g.setColor(Color.WHITE);
g.fillRect(rect.x, rect.y, rect.width-1, rect.height-1);
g.setColor(Color.BLACK);
g.drawRect(rect.x, rect.y, rect.width-1, rect.height-1);
}
}
private Rectangle getRectangle(int x, int y, int w, int h, int location){
switch(location){
case SwingConstants.NORTH:
return new Rectangle(x+w/2-dist/2, y, dist, dist);
case SwingConstants.SOUTH:
return new Rectangle(x+w/2-dist/2, y+h-dist, dist, dist);
case SwingConstants.WEST:
return new Rectangle(x, y+h/2-dist/2, dist, dist);
case SwingConstants.EAST:
return new Rectangle(x+w-dist, y+h/2-dist/2, dist, dist);
case SwingConstants.NORTH_WEST:
return new Rectangle(x, y, dist, dist);
case SwingConstants.NORTH_EAST:
return new Rectangle(x+w-dist, y, dist, dist);
case SwingConstants.SOUTH_WEST:
return new Rectangle(x, y+h-dist, dist, dist);
case SwingConstants.SOUTH_EAST:
return new Rectangle(x+w-dist, y+h-dist, dist, dist);
}
return null;
}
public int getResizeCursor(MouseEvent me){
Component comp = me.getComponent();
int w = comp.getWidth();
int h = comp.getHeight();
Rectangle bounds = new Rectangle(0, 0, w, h);
if(!bounds.contains(me.getPoint()))
return Cursor.DEFAULT_CURSOR;
Rectangle actualBounds = new Rectangle(dist, dist, w-2*dist, h-2*dist);
if(actualBounds.contains(me.getPoint()))
return Cursor.MOVE_CURSOR;
if (isResizable)
for(int i=0; i<locations.length-2; i++){
Rectangle rect = getRectangle(0, 0, w, h, locations[i]);
if(rect.contains(me.getPoint()))
return cursors[i];
}
return Cursor.MOVE_CURSOR;
}
}