/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.custom.switchon.gui.utils;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
/**
* 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>
*
* <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.</p>
*
* @version $Revision$, $Date$
*/
public class ComponentTitledBorder implements Border, MouseListener, SwingConstants {
//~ Instance fields --------------------------------------------------------
int offset = 5;
Component comp;
JComponent container;
Rectangle rect;
Border border;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ComponentTitledBorder object.
*
* @param comp DOCUMENT ME!
* @param container DOCUMENT ME!
* @param border DOCUMENT ME!
*/
public ComponentTitledBorder(final Component comp, final JComponent container, final Border border) {
this.comp = comp;
this.container = container;
this.border = border;
container.addMouseListener(this);
}
//~ Methods ----------------------------------------------------------------
@Override
public boolean isBorderOpaque() {
return true;
}
@Override
public void paintBorder(final Component c,
final Graphics g,
final int x,
final int y,
final int width,
final int height) {
final Insets borderInsets = border.getBorderInsets(c);
final Insets insets = getBorderInsets(c);
final int temp = (insets.top - borderInsets.top) / 2;
border.paintBorder(c, g, x, y + temp, width, height - temp);
final Dimension size = comp.getPreferredSize();
rect = new Rectangle(offset, 0, size.width, size.height);
SwingUtilities.paintComponent(g, comp, (Container)c, rect);
}
@Override
public Insets getBorderInsets(final Component c) {
final Dimension size = comp.getPreferredSize();
final Insets insets = border.getBorderInsets(c);
insets.top = Math.max(insets.top, size.height);
return insets;
}
/**
* DOCUMENT ME!
*
* @param me DOCUMENT ME!
*/
private void dispatchEvent(final MouseEvent me) {
if ((rect != null) && rect.contains(me.getX(), me.getY())) {
final Point pt = me.getPoint();
pt.translate(-offset, 0);
comp.setBounds(rect);
comp.dispatchEvent(new MouseEvent(
comp,
me.getID(),
me.getWhen(),
me.getModifiers(),
pt.x,
pt.y,
me.getClickCount(),
me.isPopupTrigger(),
me.getButton()));
if (!comp.isValid()) {
container.repaint();
}
}
}
@Override
public void mouseClicked(final MouseEvent me) {
dispatchEvent(me);
}
@Override
public void mouseEntered(final MouseEvent me) {
dispatchEvent(me);
}
@Override
public void mouseExited(final MouseEvent me) {
dispatchEvent(me);
}
@Override
public void mousePressed(final MouseEvent me) {
dispatchEvent(me);
}
@Override
public void mouseReleased(final MouseEvent me) {
dispatchEvent(me);
}
}