1 package charactermanaj.ui;
\r
3 import static java.lang.Math.min;
\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
22 import javax.swing.JPanel;
\r
23 import javax.swing.JScrollPane;
\r
24 import javax.swing.JViewport;
\r
26 import charactermanaj.model.AppConfig;
\r
27 import charactermanaj.ui.util.ScrollPaneDragScrollSupport;
\r
28 import charactermanaj.util.LocalizedResourcePropertyLoader;
\r
32 * ピクチャの自動縮小と等倍表示切り替えをサポートする.<br>
\r
36 public class SamplePicturePanel extends JPanel {
\r
38 private static final long serialVersionUID = 4026181978500938152L;
\r
40 protected BufferedImage samplePicture;
\r
42 protected boolean visiblePicture = true;
\r
44 protected Color sampleImageBgColor = AppConfig.getInstance().getSampleImageBgColor();
\r
46 protected String alternateText = "";
\r
48 protected boolean enableRealsize;
\r
51 * マウスドラッグによるスクロールのサポート
\r
53 protected ScrollPaneDragScrollSupport scrollSupport;
\r
56 setMinimumSize(new Dimension(64, 64));
\r
57 addMouseListener(new MouseAdapter() {
\r
59 public void mouseClicked(MouseEvent e) {
\r
60 if (e.getClickCount() == 2) {
\r
70 public void addNotify() {
\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
87 public void removeNotify() {
\r
88 if (scrollSupport != null) {
\r
89 scrollSupport.uninstallDraggingListener();
\r
90 scrollSupport = null;
\r
92 super.removeNotify();
\r
95 public SamplePicturePanel() {
\r
99 public SamplePicturePanel(BufferedImage samplePicture) {
\r
101 this.samplePicture = samplePicture;
\r
102 this.alternateText = "";
\r
103 this.enableRealsize = false;
\r
104 adjustPreferrerdSize(false);
\r
107 public SamplePicturePanel(BufferedImage samplePicture, String alternateText) {
\r
109 if (alternateText == null) {
\r
110 alternateText = "";
\r
112 this.samplePicture = samplePicture;
\r
113 this.alternateText = alternateText;
\r
114 this.enableRealsize = false;
\r
115 adjustPreferrerdSize(false);
\r
119 protected void paintComponent(Graphics g0) {
\r
120 Graphics2D g = (Graphics2D) g0;
\r
121 super.paintComponent(g);
\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
131 int imgW = samplePicture.getWidth();
\r
132 int imgH = samplePicture.getHeight();
\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
142 Object renderingHint;
\r
143 if (factor <= 1.) {
\r
145 renderingHint = RenderingHints.VALUE_INTERPOLATION_BILINEAR;
\r
147 } else if (factor <= 2.) {
\r
149 renderingHint = RenderingHints.VALUE_INTERPOLATION_BICUBIC;
\r
153 renderingHint = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
\r
155 g.setRenderingHint(
\r
156 RenderingHints.KEY_INTERPOLATION,
\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
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
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
181 public void adjustPreferrerdSize(boolean fullsize) {
\r
182 Dimension minSize = getMinimumSize();
\r
183 Dimension siz = minSize;
\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
192 Container parent = getParent();
\r
193 if (parent != null && parent instanceof JViewport) {
\r
194 Properties strings = LocalizedResourcePropertyLoader
\r
195 .getCachedInstance().getLocalizedProperties("languages/samplepicturepanel");
\r
197 tooltip = strings.getProperty("dblclick.fullsize");
\r
199 tooltip = strings.getProperty("dblclick.fit");
\r
203 setToolTipText(tooltip);
\r
205 siz.width = Math.max(minSize.width, siz.width);
\r
206 siz.height = Math.max(minSize.height, siz.height);
\r
208 Dimension ord = getPreferredSize();
\r
209 if (ord == null || !ord.equals(siz)) {
\r
210 setPreferredSize(siz);
\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
226 return super.getPreferredSize();
\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
237 public boolean isVisiblePicture() {
\r
238 return visiblePicture;
\r
241 public void setVisiblePicture(boolean visiblePicture) {
\r
242 if (this.visiblePicture != visiblePicture) {
\r
243 this.visiblePicture = visiblePicture;
\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
257 public BufferedImage getSamplePictrue() {
\r
258 return this.samplePicture;
\r
261 public Color getSamplePictureBgColor() {
\r
262 return this.sampleImageBgColor;
\r
265 public void setSamplePictureBgColor(Color color) {
\r
266 if (color == null) {
\r
267 throw new IllegalArgumentException();
\r
269 if (!sampleImageBgColor.equals(color)) {
\r
270 this.sampleImageBgColor = color;
\r
275 public String getAlternateText() {
\r
276 return alternateText;
\r
279 public void setAlternateText(String alternateText) {
\r
280 if (alternateText == null) {
\r
281 alternateText = "";
\r
283 if (!this.alternateText.equals(alternateText)) {
\r
284 this.alternateText = alternateText;
\r