OSDN Git Service

from subversion repository
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / BalloonBorder.java
1 /*\r
2  * baloon border\r
3  *\r
4  * Copyright(c) 2008 olyutorskii\r
5  * $Id: BalloonBorder.java 953 2009-12-06 16:42:14Z olyutorskii $\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \r
10 import java.awt.BorderLayout;\r
11 import java.awt.Color;\r
12 import java.awt.Component;\r
13 import java.awt.Graphics;\r
14 import java.awt.Graphics2D;\r
15 import java.awt.Insets;\r
16 import java.awt.LayoutManager;\r
17 import java.awt.RenderingHints;\r
18 import javax.swing.JComponent;\r
19 import javax.swing.border.Border;\r
20 \r
21 /**\r
22  * フキダシ風Border。\r
23  */\r
24 public class BalloonBorder implements Border{\r
25 \r
26     private static final int RADIUS = 5;\r
27 \r
28     /**\r
29      * 隙間が透明なフキダシ装飾を任意のコンポーネントに施す。\r
30      * @param inner 装飾対象のコンポーネント\r
31      * @return 装飾されたコンポーネント\r
32      */\r
33     public static JComponent decorateTransparentBorder(JComponent inner){\r
34         JComponent result = new TransparentContainer(inner);\r
35 \r
36         Border border = new BalloonBorder();\r
37         result.setBorder(border);\r
38 \r
39         return result;\r
40     }\r
41 \r
42     /**\r
43      * コンストラクタ。\r
44      */\r
45     public BalloonBorder(){\r
46         super();\r
47         return;\r
48     }\r
49 \r
50     /**\r
51      * {@inheritDoc}\r
52      * @param comp {@inheritDoc}\r
53      * @return {@inheritDoc}\r
54      */\r
55     public Insets getBorderInsets(Component comp){\r
56         Insets insets = new Insets(RADIUS, RADIUS, RADIUS, RADIUS);\r
57         return insets;\r
58     }\r
59 \r
60     /**\r
61      * {@inheritDoc}\r
62      * 必ずfalseを返す(このBorderは透明)。\r
63      * @return {@inheritDoc}\r
64      */\r
65     public boolean isBorderOpaque(){\r
66         return false;\r
67     }\r
68 \r
69     /**\r
70      * {@inheritDoc}\r
71      * @param comp {@inheritDoc}\r
72      * @param g {@inheritDoc}\r
73      * @param x {@inheritDoc}\r
74      * @param y {@inheritDoc}\r
75      * @param width {@inheritDoc}\r
76      * @param height {@inheritDoc}\r
77      */\r
78     public void paintBorder(Component comp,\r
79                               Graphics g,\r
80                               int x, int y,\r
81                               int width, int height ){\r
82         final int diameter = RADIUS * 2;\r
83         final int innerWidth  = width - diameter;\r
84         final int innerHeight = height - diameter;\r
85 \r
86         Graphics2D g2d = (Graphics2D) g;\r
87 \r
88         Color bgColor = comp.getBackground();\r
89         g2d.setColor(bgColor);\r
90 \r
91         Object antiAliaseHint =\r
92                 g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);\r
93         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
94                              RenderingHints.VALUE_ANTIALIAS_ON );\r
95 \r
96         g2d.fillRect(x + RADIUS, y,\r
97                    innerWidth, RADIUS);\r
98         g2d.fillRect(x, y + RADIUS,\r
99                    RADIUS, innerHeight);\r
100         g2d.fillRect(x + RADIUS + innerWidth, y + RADIUS,\r
101                    RADIUS, innerHeight);\r
102         g2d.fillRect(x + RADIUS, y + RADIUS + innerHeight,\r
103                    innerWidth, RADIUS);\r
104 \r
105         int right = 90;  // 90 degree right angle\r
106 \r
107         g2d.fillArc(x + innerWidth, y,\r
108                   diameter, diameter, right * 0, right);\r
109         g2d.fillArc(x, y,\r
110                   diameter, diameter, right * 1, right);\r
111         g2d.fillArc(x, y + innerHeight,\r
112                   diameter, diameter, right * 2, right);\r
113         g2d.fillArc(x + innerWidth, y + innerHeight,\r
114                   diameter, diameter, right * 3, right);\r
115 \r
116         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, antiAliaseHint);\r
117 \r
118         return;\r
119     }\r
120 \r
121     /**\r
122      * 透明コンテナ。\r
123      * 1つの子を持ち、背景色操作を委譲する。\r
124      * つまりこのコンテナにBorderを設定すると子の背景色が反映される。\r
125      */\r
126     @SuppressWarnings("serial")\r
127     private static class TransparentContainer extends JComponent{\r
128 \r
129         private final JComponent inner;\r
130 \r
131         /**\r
132          * コンストラクタ。\r
133          * @param inner 内部コンポーネント\r
134          */\r
135         public TransparentContainer(JComponent inner){\r
136             super();\r
137 \r
138             this.inner = inner;\r
139 \r
140             setOpaque(false);\r
141 \r
142             LayoutManager layout = new BorderLayout();\r
143             setLayout(layout);\r
144             add(this.inner, BorderLayout.CENTER);\r
145 \r
146             return;\r
147         }\r
148 \r
149         /**\r
150          * {@inheritDoc}\r
151          * 子の背景色を返す。\r
152          * @return {@inheritDoc}\r
153          */\r
154         @Override\r
155         public Color getBackground(){\r
156             Color bg = this.inner.getBackground();\r
157             return bg;\r
158         }\r
159 \r
160         /**\r
161          * {@inheritDoc}\r
162          * 背景色指定をフックし、子の背景色を指定する。\r
163          * @param bg {@inheritDoc}\r
164          */\r
165         @Override\r
166         public void setBackground(Color bg){\r
167             this.inner.setBackground(bg);\r
168             return;\r
169         }\r
170     }\r
171 \r
172 }\r