1 package com.eviware.soapui.support.components;
2
3 import java.awt.Component;
4 import java.awt.Container;
5 import java.awt.Dimension;
6 import java.awt.Graphics;
7 import java.awt.Insets;
8 import java.awt.Point;
9 import java.awt.Rectangle;
10 import java.awt.event.MouseEvent;
11 import java.awt.event.MouseListener;
12
13 import javax.swing.JComponent;
14 import javax.swing.SwingConstants;
15 import javax.swing.SwingUtilities;
16 import javax.swing.border.Border;
17
18 /***
19 * MySwing: Advanced Swing Utilites Copyright (C) 2005 Santhosh Kumar T
20 * <p/>
21 * This library is free software; you can redistribute it and/or modify it under
22 * the terms of the GNU Lesser General Public License as published by the Free
23 * Software Foundation; either version 2.1 of the License, or (at your option)
24 * any later version.
25 * <p/>
26 * This library is distributed in the hope that it will be useful, but WITHOUT
27 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
28 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
29 * details.
30 */
31
32 public class ComponentTitledBorder implements Border, MouseListener, SwingConstants
33 {
34 int offset = 5;
35
36 Component comp;
37 JComponent container;
38 Rectangle rect;
39 Border border;
40
41 public ComponentTitledBorder( Component comp, JComponent container, Border border )
42 {
43 this.comp = comp;
44 this.container = container;
45 this.border = border;
46 container.addMouseListener( this );
47 }
48
49 public boolean isBorderOpaque()
50 {
51 return true;
52 }
53
54 public void paintBorder( Component c, Graphics g, int x, int y, int width, int height )
55 {
56 Insets borderInsets = border.getBorderInsets( c );
57 Insets insets = getBorderInsets( c );
58 int temp = ( insets.top - borderInsets.top ) / 2;
59 border.paintBorder( c, g, x, y + temp, width, height - temp );
60 Dimension size = comp.getPreferredSize();
61 rect = new Rectangle( offset, 0, size.width, size.height );
62 SwingUtilities.paintComponent( g, comp, ( Container )c, rect );
63 }
64
65 public Insets getBorderInsets( Component c )
66 {
67 Dimension size = comp.getPreferredSize();
68 Insets insets = border.getBorderInsets( c );
69 insets.top = Math.max( insets.top, size.height );
70 return insets;
71 }
72
73 private void dispatchEvent( MouseEvent me )
74 {
75 if( rect != null && rect.contains( me.getX(), me.getY() ) )
76 {
77 Point pt = me.getPoint();
78 pt.translate( -offset, 0 );
79 comp.setBounds( rect );
80 comp.dispatchEvent( new MouseEvent( comp, me.getID(), me.getWhen(), me.getModifiers(), pt.x, pt.y, me
81 .getClickCount(), me.isPopupTrigger(), me.getButton() ) );
82 if( !comp.isValid() )
83 container.repaint();
84 }
85 }
86
87 public void mouseClicked( MouseEvent me )
88 {
89 dispatchEvent( me );
90 }
91
92 public void mouseEntered( MouseEvent me )
93 {
94 dispatchEvent( me );
95 }
96
97 public void mouseExited( MouseEvent me )
98 {
99 dispatchEvent( me );
100 }
101
102 public void mousePressed( MouseEvent me )
103 {
104 dispatchEvent( me );
105 }
106
107 public void mouseReleased( MouseEvent me )
108 {
109 dispatchEvent( me );
110 }
111 }