OSDN Git Service

mavenによるビルドに変更
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / ui / SamplePicturePanel.java
1 package charactermanaj.ui;\r
2 \r
3 import static java.lang.Math.min;\r
4 \r
5 import java.awt.Color;\r
6 import java.awt.Component;\r
7 import java.awt.Container;\r
8 import java.awt.Dimension;\r
9 import java.awt.Font;\r
10 import java.awt.Graphics;\r
11 import java.awt.Graphics2D;\r
12 import java.awt.Insets;\r
13 import java.awt.Rectangle;\r
14 import java.awt.RenderingHints;\r
15 import java.awt.Shape;\r
16 import java.awt.event.MouseAdapter;\r
17 import java.awt.event.MouseEvent;\r
18 import java.awt.font.FontRenderContext;\r
19 import java.awt.image.BufferedImage;\r
20 import java.util.Properties;\r
21 \r
22 import javax.swing.JPanel;\r
23 import javax.swing.JScrollPane;\r
24 import javax.swing.JViewport;\r
25 \r
26 import charactermanaj.model.AppConfig;\r
27 import charactermanaj.ui.util.ScrollPaneDragScrollSupport;\r
28 import charactermanaj.util.LocalizedResourcePropertyLoader;\r
29 \r
30 /**\r
31  * サンプルピクチャ用パネル.<br>\r
32  * ピクチャの自動縮小と等倍表示切り替えをサポートする.<br>\r
33  * \r
34  * @author seraphy\r
35  */\r
36 public class SamplePicturePanel extends JPanel {\r
37         \r
38         private static final long serialVersionUID = 4026181978500938152L;\r
39 \r
40         protected BufferedImage samplePicture;\r
41         \r
42         protected boolean visiblePicture = true;\r
43         \r
44         protected Color sampleImageBgColor = AppConfig.getInstance().getSampleImageBgColor();\r
45         \r
46         protected String alternateText = "";\r
47         \r
48         protected boolean enableRealsize;\r
49         \r
50         /**\r
51          * マウスドラッグによるスクロールのサポート\r
52          */\r
53         protected ScrollPaneDragScrollSupport scrollSupport;\r
54         \r
55         {\r
56                 setMinimumSize(new Dimension(64, 64));\r
57                 addMouseListener(new MouseAdapter() {\r
58                         @Override\r
59                         public void mouseClicked(MouseEvent e) {\r
60                                 if (e.getClickCount() == 2) {\r
61                                         // 正確に2回\r
62                                         onDblClick();\r
63                                         e.consume();\r
64                                 }\r
65                         }\r
66                 });\r
67         }\r
68         \r
69         @Override\r
70         public void addNotify() {\r
71                 super.addNotify();\r
72                 \r
73                 // 親がJScrollPaneである場合、\r
74                 // マウスのドラッグによるスクロールをサポートするようにマウスリスナをセットアップする.\r
75                 Component parent = getParent();\r
76                 if (parent != null && (parent instanceof JViewport)) {\r
77                         Component gparent = parent.getParent();\r
78                         if (gparent != null && (gparent instanceof JScrollPane)) {\r
79                                 JScrollPane scrollPane = (JScrollPane) gparent;\r
80                                 scrollSupport = new ScrollPaneDragScrollSupport(scrollPane);\r
81                                 scrollSupport.installDraggingListener(this, null);\r
82                         }\r
83                 }\r
84         }\r
85         \r
86         @Override\r
87         public void removeNotify() {\r
88                 if (scrollSupport != null) {\r
89                         scrollSupport.uninstallDraggingListener();\r
90                         scrollSupport = null;\r
91                 }\r
92                 super.removeNotify();\r
93         }\r
94         \r
95         public SamplePicturePanel() {\r
96                 super();\r
97         }\r
98         \r
99         public SamplePicturePanel(BufferedImage samplePicture) {\r
100                 super();\r
101                 this.samplePicture = samplePicture;\r
102                 this.alternateText = "";\r
103                 this.enableRealsize = false;\r
104                 adjustPreferrerdSize(false);\r
105         }\r
106         \r
107         public SamplePicturePanel(BufferedImage samplePicture, String alternateText) {\r
108                 super();\r
109                 if (alternateText == null) {\r
110                         alternateText = "";\r
111                 }\r
112                 this.samplePicture = samplePicture;\r
113                 this.alternateText = alternateText;\r
114                 this.enableRealsize = false;\r
115                 adjustPreferrerdSize(false);\r
116         }\r
117         \r
118         @Override\r
119         protected void paintComponent(Graphics g0) {\r
120                 Graphics2D g = (Graphics2D) g0;\r
121                 super.paintComponent(g);\r
122 \r
123                 if (samplePicture != null && isVisiblePicture()) {\r
124                         Rectangle rct = getBounds();\r
125                         Insets insets = getInsets();\r
126                         int x = insets.left;\r
127                         int y = insets.top;\r
128                         int w = rct.width - insets.left - insets.right;\r
129                         int h = rct.height - insets.top - insets.bottom;\r
130 \r
131                         int imgW = samplePicture.getWidth();\r
132                         int imgH = samplePicture.getHeight();\r
133                         \r
134                         double factor1 = (double) h / (double) imgH; // 縦を納めた場合の、縦の縮小率\r
135                         double factor2 = (double) w / (double) imgW; // 横を納めた場合の、横の縮小率\r
136                         double factor = min(factor1, factor2); // 縦横を納めるのに最低必要な縮小率\r
137                         int scaledW = (int)(imgW * factor);\r
138                         int scaledH = (int)(imgH * factor);\r
139                         int offset_x = (w - scaledW) / 2;\r
140                         int offset_y = (h - scaledH) / 2;\r
141 \r
142                         Object renderingHint;\r
143                         if (factor <= 1.) {\r
144                                 // 等倍未満\r
145                                 renderingHint = RenderingHints.VALUE_INTERPOLATION_BILINEAR;\r
146                         \r
147                         } else if (factor <= 2.) {\r
148                                 // 2倍まで\r
149                                 renderingHint = RenderingHints.VALUE_INTERPOLATION_BICUBIC;\r
150 \r
151                         } else {\r
152                                 // それ以上\r
153                                 renderingHint = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;\r
154                         }\r
155                         g.setRenderingHint(\r
156                                         RenderingHints.KEY_INTERPOLATION,\r
157                                         renderingHint);\r
158                         \r
159                         g.drawImage(samplePicture, x + offset_x, y + offset_y, x\r
160                                         + offset_x + scaledW, y + offset_y + scaledH, 0, 0,\r
161                                         imgW, imgH, sampleImageBgColor, null);\r
162 \r
163                 } else if (alternateText.length() > 0) {\r
164                         Rectangle rct = getBounds();\r
165                         Insets insets = getInsets();\r
166                         int x = insets.left;\r
167                         int y = insets.top;\r
168                         int w = rct.width - insets.left - insets.right;\r
169                         int h = rct.height - insets.top - insets.bottom;\r
170 \r
171                         Font font = g.getFont();\r
172                         FontRenderContext frc = g.getFontRenderContext();\r
173                         int textHeight = (int) font.getMaxCharBounds(frc).getHeight();\r
174                         Shape clipOld = g.getClip();\r
175                         g.setClip(x, y, w, h);\r
176                         g.drawString(alternateText, x, y + textHeight);\r
177                         g.setClip(clipOld);\r
178                 }\r
179         }\r
180         \r
181         public void adjustPreferrerdSize(boolean fullsize) {\r
182                 Dimension minSize = getMinimumSize();\r
183                 Dimension siz = minSize;\r
184 \r
185                 String tooltip = null;\r
186                 if (samplePicture != null) {\r
187                         int div = fullsize ? 1 : 2;\r
188                         Insets insets = getInsets();\r
189                         siz = new Dimension(samplePicture.getWidth() / div + insets.left\r
190                                         + insets.right, samplePicture.getHeight() / div + insets.top\r
191                                         + insets.bottom);\r
192                         Container parent = getParent();\r
193                         if (parent != null && parent instanceof JViewport) {\r
194                                 Properties strings = LocalizedResourcePropertyLoader\r
195                                                 .getCachedInstance().getLocalizedProperties("languages/samplepicturepanel");\r
196                                 if (!fullsize) {\r
197                                         tooltip = strings.getProperty("dblclick.fullsize");\r
198                                 } else {\r
199                                         tooltip = strings.getProperty("dblclick.fit");\r
200                                 }\r
201                         }\r
202                 }\r
203                 setToolTipText(tooltip);\r
204 \r
205                 siz.width = Math.max(minSize.width, siz.width);\r
206                 siz.height = Math.max(minSize.height, siz.height);\r
207 \r
208                 Dimension ord = getPreferredSize();\r
209                 if (ord == null || !ord.equals(siz)) {\r
210                         setPreferredSize(siz);\r
211                         revalidate();\r
212                 }\r
213         }\r
214         \r
215         @Override\r
216         public Dimension getPreferredSize() {\r
217                 Container parent = getParent();\r
218                 if (!enableRealsize && parent != null && parent instanceof JViewport) {\r
219                         JViewport viewport = (JViewport) parent;\r
220                         Dimension siz = viewport.getExtentSize();\r
221                         Insets insets = viewport.getInsets();\r
222                         Dimension preferredSize = new Dimension(siz.width - insets.left\r
223                                         - insets.right, siz.height - insets.top - insets.bottom);\r
224                         return preferredSize;\r
225                 }\r
226                 return super.getPreferredSize();\r
227         }\r
228         \r
229         protected void onDblClick() {\r
230                 Container parent = getParent();\r
231                 if (parent != null && parent instanceof JViewport) {\r
232                         enableRealsize = !enableRealsize;\r
233                         adjustPreferrerdSize(enableRealsize);\r
234                 }\r
235         }\r
236         \r
237         public boolean isVisiblePicture() {\r
238                 return visiblePicture;\r
239         }\r
240         \r
241         public void setVisiblePicture(boolean visiblePicture) {\r
242                 if (this.visiblePicture != visiblePicture) {\r
243                         this.visiblePicture = visiblePicture;\r
244                         repaint();\r
245                 }\r
246         }\r
247         \r
248         public void setSamplePicture(BufferedImage samplePicture) {\r
249                 if (this.samplePicture != samplePicture) {\r
250                         this.samplePicture = samplePicture;\r
251                         enableRealsize = false;\r
252                         adjustPreferrerdSize(false);\r
253                         repaint();\r
254                 }\r
255         }\r
256         \r
257         public BufferedImage getSamplePictrue() {\r
258                 return this.samplePicture;\r
259         }\r
260         \r
261         public Color getSamplePictureBgColor() {\r
262                 return this.sampleImageBgColor;\r
263         }\r
264         \r
265         public void setSamplePictureBgColor(Color color) {\r
266                 if (color == null) {\r
267                         throw new IllegalArgumentException();\r
268                 }\r
269                 if (!sampleImageBgColor.equals(color)) {\r
270                         this.sampleImageBgColor = color;\r
271                         repaint();\r
272                 }\r
273         }\r
274         \r
275         public String getAlternateText() {\r
276                 return alternateText;\r
277         }\r
278         \r
279         public void setAlternateText(String alternateText) {\r
280                 if (alternateText == null) {\r
281                         alternateText = "";\r
282                 }\r
283                 if (!this.alternateText.equals(alternateText)) {\r
284                         this.alternateText = alternateText;\r
285                         repaint();\r
286                 }\r
287         }\r
288 }\r