/*
* File : Resizer.java
* Created : 08-mai-2003 14:42
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details (see the LICENSE file).
*/
package edu.xtec.util;
import edu.xtec.jclic.Constants;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.*;
import javax.swing.JComponent;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.09
*/
public class Resizer implements MouseListener, MouseMotionListener{
JComponent jc;
Rectangle r;
Cursor defaultCursor;
boolean doGetBounds;
boolean dragging;
boolean dragCursorX, dragCursorY;
ResizerListener rl;
Dimension minSize;
Dimension maxSize;
boolean editable;
boolean enabled;
public static final int MARGIN=5;
/** Creates a new instance of Resizer */
public Resizer(JComponent jc, Rectangle r, boolean editable, ResizerListener rl) {
this.jc=jc;
setRect(r);
this.editable=editable;
if(editable)
defaultCursor=Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
this.rl=rl;
jc.addMouseListener(this);
jc.addMouseMotionListener(this);
minSize=new Dimension(Constants.MIN_CELL_SIZE, Constants.MIN_CELL_SIZE);
maxSize=new Dimension(jc.getPreferredSize());
setEnabled(true);
}
public void setEnabled(boolean enabled){
this.enabled=enabled;
jc.setCursor(defaultCursor);
}
public boolean getEnabled(){
return enabled;
}
public void setMinSize(Dimension d){
minSize=d;
}
public void setMaxSize(Dimension d){
maxSize=d;
}
public void setRect(Rectangle r){
this.r=r;
doGetBounds=(r==null);
if(doGetBounds)
this.r=jc.getBounds();
}
public void mouseClicked(MouseEvent mouseEvent) {
if(enabled && editable && rl!=null && r.contains(mouseEvent.getPoint())){
rl.editObject(r, jc, mouseEvent.getPoint());
}
}
public void mouseDragged(MouseEvent mouseEvent) {
if(enabled && dragging)
resizeByDrag(mouseEvent.getPoint());
}
public void mouseEntered(MouseEvent mouseEvent) {
}
public void mouseExited(MouseEvent mouseEvent) {
}
public void mouseMoved(MouseEvent mouseEvent) {
if(!dragging && enabled){
Point p=mouseEvent.getPoint();
Cursor newCursor=defaultCursor;
if(doGetBounds)
r=jc.getBounds();
dragCursorX=Math.abs(p.x-r.x-r.width)<MARGIN && p.y>=r.y && p.y<(r.y+r.height+MARGIN);
dragCursorY=Math.abs(p.y-r.y-r.height)<MARGIN && p.x>=r.x && p.x<(r.x+r.width+MARGIN);
if(dragCursorX && dragCursorY)
newCursor=Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR);
else if(dragCursorY)
newCursor=Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);
else if(dragCursorX)
newCursor=Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
jc.setCursor(newCursor);
}
else if(dragging)
mouseDragged(mouseEvent);
}
public void mousePressed(MouseEvent mouseEvent) {
if(enabled && (dragCursorX || dragCursorY)){
dragging=true;
resizeByDrag(mouseEvent.getPoint());
}
}
public void mouseReleased(MouseEvent mouseEvent) {
if(enabled && dragging){
resizeByDrag(mouseEvent.getPoint());
dragging=false;
}
}
private void resizeByDrag(Point p){
int w=r.width;
int h=r.height;
if(dragCursorX)
w=Math.min(maxSize.width, Math.max(minSize.width, p.x-r.x));
if(dragCursorY)
h=Math.min(maxSize.height, Math.max(minSize.height, p.y-r.y));
r=new Rectangle(r.x, r.y, w, h);
if(rl!=null)
rl.resizeObjectTo(r, jc);
}
public JComponent getComponent(){
return jc;
}
public interface ResizerListener{
public void resizeObjectTo(Rectangle r, JComponent jc);
public void editObject(Rectangle r, JComponent jc, Point pt);
}
}