OSDN Git Service

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