/*******************************************************************************
* Breakout Cave Survey Visualizer
*
* Copyright (C) 2014 James Edwards
*
* jedwards8 at fastmail dot fm
*
* 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.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*******************************************************************************/
package org.andork.awt.layout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ResizeKnobHandler extends MouseAdapter {
Component target;
Side side;
MouseEvent pressEvent;
Rectangle pressBounds;
public ResizeKnobHandler(Component target, Side side) {
super();
this.target = target;
this.side = side;
}
@Override
public void mouseDragged(MouseEvent e) {
if (pressEvent == null) {
return;
}
Dimension newSize = pressBounds.getSize();
Axis axis = side.axis();
axis.setSize(newSize, axis.size(newSize) +
(axis.get(e.getLocationOnScreen()) - axis.get(pressEvent.getLocationOnScreen())) /
side.direction());
Dimension minSize = target.getMinimumSize();
Dimension maxSize = target.getMaximumSize();
newSize.width = Math.max(minSize.width, Math.min(maxSize.width, newSize.width));
newSize.height = Math.max(minSize.height, Math.min(maxSize.height, newSize.height));
target.setPreferredSize(newSize);
onResize(target);
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
pressEvent = e;
pressBounds = target.getBounds();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
pressEvent = null;
}
}
protected void onResize(Component target) {
if (target.getParent() != null) {
if (target.getParent().getLayout() instanceof DelegatingLayoutManager) {
((DelegatingLayoutManager) target.getParent().getLayout()).onLayoutChanged(target.getParent());
} else {
target.getParent().invalidate();
target.getParent().validate();
}
}
}
}