package com.blazemeter.ui;
// * taken from here: http://www.javalobby.org/java/forums/t33048.html
/**
*MySwing:Advanced Swing Utilites
*Copyright(C)2005Santhosh 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
*version2.1of 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.
*/
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class ComponentTitledBorder implements Border, MouseListener, MouseMotionListener, SwingConstants {
private int offset = 5;
private Component comp;
private JComponent container;
private Rectangle rect;
private Border border;
private boolean mouseEntered = false;
public ComponentTitledBorder(Component comp, JComponent container, Border border) {
this.comp = comp;
this.container = container;
this.border = border;
container.addMouseListener(this);
container.addMouseMotionListener(this);
}
@Override
public boolean isBorderOpaque() {
return true;
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
Insets borderInsets = border.getBorderInsets(c);
Insets insets = getBorderInsets(c);
int temp = (insets.top - borderInsets.top) / 2;
border.paintBorder(c, g, x, y + temp, width, height - temp);
Dimension size = comp.getPreferredSize();
rect = new Rectangle(offset, 0, size.width, size.height);
SwingUtilities.paintComponent(g, comp, (Container) c, rect);
}
@Override
public Insets getBorderInsets(Component c) {
Dimension size = comp.getPreferredSize();
Insets insets = border.getBorderInsets(c);
insets.top = Math.max(insets.top, size.height);
return insets;
}
private void dispatchEvent(MouseEvent me) {
if (rect != null && rect.contains(me.getX(), me.getY())) {
dispatchEvent(me, me.getID());
}
}
private void dispatchEvent(MouseEvent me, int id) {
Point pt = me.getPoint();
pt.translate(-offset, 0);
comp.setSize(rect.width, rect.height);
comp.dispatchEvent(new MouseEvent(comp, id, me.getWhen(),
me.getModifiers(), pt.x, pt.y, me.getClickCount(),
me.isPopupTrigger(), me.getButton()));
if (!comp.isValid()) {
container.repaint();
}
}
@Override
public void mouseClicked(MouseEvent me) {
dispatchEvent(me);
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
if (mouseEntered) {
mouseEntered = false;
dispatchEvent(me, MouseEvent.MOUSE_EXITED);
}
}
@Override
public void mousePressed(MouseEvent me) {
dispatchEvent(me);
}
@Override
public void mouseReleased(MouseEvent me) {
dispatchEvent(me);
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent me) {
if (rect == null) {
return;
}
if (!mouseEntered && rect.contains(me.getX(), me.getY())) {
mouseEntered = true;
dispatchEvent(me, MouseEvent.MOUSE_ENTERED);
} else if (mouseEntered) {
if (!rect.contains(me.getX(), me.getY())) {
mouseEntered = false;
dispatchEvent(me, MouseEvent.MOUSE_EXITED);
} else {
dispatchEvent(me, MouseEvent.MOUSE_MOVED);
}
}
}
}