package com.jroller.santosh.border;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;
/**
* 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 JResizer extends JPanel
{
public JResizer(){
this(null, null);
}
public JResizer(Component comp){
this(comp, new DefaultResizableBorder(6, true));
}
public JResizer(Component comp, ResizableBorder border){
if (comp != null) {
setLayout(new BorderLayout());
add(comp);
}
setBorder(border);
}
@Override
public void setBorder(Border border){
removeMouseListener(resizeListener);
removeMouseMotionListener(resizeListener);
if(border instanceof ResizableBorder){
getMouseTarget().addMouseListener(resizeListener);
getMouseTarget().addMouseMotionListener(resizeListener);
}
super.setBorder(border);
}
public void didResized(){
if(getParent()!=null){
getParent().repaint();
invalidate();
((JComponent)getParent()).revalidate();
}
}
private Component getMouseTarget()
{
return this;
}
public void setResizeListener(MouseInputListener resizeListener)
{
if (this.resizeListener != null) {
getMouseTarget().removeMouseListener(this.resizeListener);
getMouseTarget().removeMouseMotionListener(this.resizeListener);
}
this.resizeListener = resizeListener;
if (getBorder() instanceof ResizableBorder) {
getMouseTarget().addMouseListener(resizeListener);
getMouseTarget().addMouseMotionListener(resizeListener);
}
}
MouseInputListener resizeListener = new ResizeListener();
public static class ResizeListener extends MouseInputAdapter
{
@Override
public void mouseMoved(MouseEvent me){
JResizer resizer = (JResizer)me.getComponent();
ResizableBorder border = (ResizableBorder)resizer.getBorder();
resizer.setCursor(Cursor.getPredefinedCursor(border.getResizeCursor(me)));
}
@Override
public void mouseExited(MouseEvent mouseEvent){
JResizer resizer = (JResizer)mouseEvent.getComponent();
resizer.setCursor(Cursor.getDefaultCursor());
}
protected int cursor;
protected Point startPos = null;
@Override
public void mousePressed(MouseEvent me){
JResizer resizer = (JResizer)me.getComponent();
if (resizer.getBorder() instanceof ResizableBorder) {
ResizableBorder border = (ResizableBorder)resizer.getBorder();
cursor = border.getResizeCursor(me);
startPos = me.getPoint();
}
}
@Override
public void mouseDragged(MouseEvent me){
JResizer resizer = (JResizer)me.getComponent();
if(startPos!=null){
int dx = me.getX()-startPos.x;
int dy = me.getY()-startPos.y;
switch(cursor){
case Cursor.N_RESIZE_CURSOR:
resizer.setBounds(resizer.getX(), resizer.getY()+dy, resizer.getWidth(), resizer.getHeight()-dy);
resizer.didResized();
break;
case Cursor.S_RESIZE_CURSOR:
resizer.setBounds(resizer.getX(), resizer.getY(), resizer.getWidth(), resizer.getHeight()+dy);
startPos = me.getPoint();
resizer.didResized();
break;
case Cursor.W_RESIZE_CURSOR:
resizer.setBounds(resizer.getX()+dx, resizer.getY(), resizer.getWidth()-dx, resizer.getHeight());
resizer.didResized();
break;
case Cursor.E_RESIZE_CURSOR:
resizer.setBounds(resizer.getX(), resizer.getY(), resizer.getWidth()+dx, resizer.getHeight());
startPos = me.getPoint();
resizer.didResized();
break;
case Cursor.NW_RESIZE_CURSOR:
resizer.setBounds(resizer.getX()+dx, resizer.getY()+dy, resizer.getWidth()-dx, resizer.getHeight()-dy);
resizer.didResized();
break;
case Cursor.NE_RESIZE_CURSOR:
resizer.setBounds(resizer.getX(), resizer.getY()+dy, resizer.getWidth()+dx, resizer.getHeight()-dy);
startPos = new Point(me.getX(), startPos.y);
resizer.didResized();
break;
case Cursor.SW_RESIZE_CURSOR:
resizer.setBounds(resizer.getX()+dx, resizer.getY(), resizer.getWidth()-dx, resizer.getHeight()+dy);
startPos = new Point(startPos.x, me.getY());
resizer.didResized();
break;
case Cursor.SE_RESIZE_CURSOR:
resizer.setBounds(resizer.getX(), resizer.getY(), resizer.getWidth()+dx, resizer.getHeight()+dy);
startPos = me.getPoint();
resizer.didResized();
break;
case Cursor.MOVE_CURSOR:
Rectangle bounds = resizer.getBounds();
bounds.translate(dx, dy);
resizer.setBounds(bounds);
resizer.didResized();
}
// cursor shouldn't change while dragging
resizer.setCursor(Cursor.getPredefinedCursor(cursor));
}
}
@Override
public void mouseReleased(MouseEvent mouseEvent){
startPos = null;
}
}
}