OSDN Git Service

dmg作成バージョンの取得方法の修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / ui / UkagakaConvertDialog.java
1 package charactermanaj.ui;\r
2 \r
3 import java.awt.BorderLayout;\r
4 import java.awt.Color;\r
5 import java.awt.Container;\r
6 import java.awt.GridBagConstraints;\r
7 import java.awt.GridBagLayout;\r
8 import java.awt.Insets;\r
9 import java.awt.TextField;\r
10 import java.awt.Toolkit;\r
11 import java.awt.event.ActionEvent;\r
12 import java.awt.event.ActionListener;\r
13 import java.awt.event.KeyEvent;\r
14 import java.awt.event.WindowAdapter;\r
15 import java.awt.event.WindowEvent;\r
16 import java.awt.image.BufferedImage;\r
17 import java.util.Properties;\r
18 \r
19 import javax.swing.AbstractAction;\r
20 import javax.swing.ActionMap;\r
21 import javax.swing.BorderFactory;\r
22 import javax.swing.Box;\r
23 import javax.swing.BoxLayout;\r
24 import javax.swing.ButtonGroup;\r
25 import javax.swing.InputMap;\r
26 import javax.swing.JButton;\r
27 import javax.swing.JCheckBox;\r
28 import javax.swing.JComponent;\r
29 import javax.swing.JDialog;\r
30 import javax.swing.JFrame;\r
31 import javax.swing.JPanel;\r
32 import javax.swing.JRadioButton;\r
33 import javax.swing.JRootPane;\r
34 import javax.swing.JScrollPane;\r
35 import javax.swing.KeyStroke;\r
36 import javax.swing.event.ChangeEvent;\r
37 import javax.swing.event.ChangeListener;\r
38 \r
39 import charactermanaj.Main;\r
40 import charactermanaj.graphics.io.UkagakaImageConverter;\r
41 import charactermanaj.util.LocalizedResourcePropertyLoader;\r
42 \r
43 /**\r
44  * 伺か用PNG/PNA出力設定ダイアログ\r
45  * @author seraphy\r
46  */\r
47 public class UkagakaConvertDialog extends JDialog {\r
48 \r
49         private static final long serialVersionUID = 4189631881766588004L;\r
50 \r
51         /**\r
52          * リソース\r
53          */\r
54         protected static final String STRINGS_RESOURCE = "languages/ukagakaConvertDialog";\r
55 \r
56         /**\r
57          * キャプション\r
58          */\r
59         private TextField caption = new TextField();\r
60         \r
61         /**\r
62          * キャンセル\r
63          */\r
64         private AbstractAction actCancel;\r
65         \r
66         /**\r
67          * 保存(デフォルトアクション)\r
68          */\r
69         private AbstractAction actSave;\r
70         \r
71 \r
72         /**\r
73          * プレビュー(PNG)\r
74          */\r
75         private SamplePicturePanel opaqueImagePanel = new SamplePicturePanel();\r
76         \r
77         /**\r
78          * プレビュー(PNA)\r
79          */\r
80         private SamplePicturePanel alphaImagePanel = new SamplePicturePanel();\r
81 \r
82         /**\r
83          * 透過色キー表示ボックス\r
84          */\r
85         private ColorBox colorBox = new ColorBox();\r
86         \r
87         /**\r
88          * エクスポート対象の元イメージ.\r
89          */\r
90         private BufferedImage originalImage;\r
91         \r
92         /**\r
93          * 透過色をマニュアルとするか?\r
94          */\r
95         private boolean manualTransparentColorKey;\r
96         \r
97         /**\r
98          * 透過キー自動モード\r
99          */\r
100         private JRadioButton radioAuto;\r
101 \r
102         /**\r
103          * 透過キー手動選択モード\r
104          */\r
105         private JRadioButton radioManual;\r
106         \r
107         /**\r
108          * 上書きモードチェックボックス\r
109          */\r
110         private JCheckBox chkOverwriteOption;\r
111         \r
112         /**\r
113          * 終了コード\r
114          */\r
115         private Object result;\r
116         \r
117         /**\r
118          * 保存ボタンアクションリスナ.<br>\r
119          */\r
120         private ActionListener saveActionListener;\r
121         \r
122         /**\r
123          * 上書きオプションの表示フラグ\r
124          */\r
125         private boolean showOverwriteOption;\r
126         \r
127 \r
128         /**\r
129          * 伺か用PNG/PNA出力設定ダイアログを構築する.\r
130          * @param parent 親フレーム\r
131          */\r
132         public UkagakaConvertDialog(JFrame parent) {\r
133                 this(parent, false);\r
134         }\r
135         \r
136         /**\r
137          * 伺か用PNG/PNA出力設定ダイアログを構築する.\r
138          * @param parent 親フレーム\r
139          * @param overwriteOption 上書きオプションの表示 \r
140          */\r
141         public UkagakaConvertDialog(JFrame parent, boolean overwriteOption) {\r
142                 this(parent, null, overwriteOption);\r
143         }\r
144 \r
145         /**\r
146          * 伺か用PNG/PNA出力設定ダイアログを構築する.\r
147          * @param parent 親フレーム\r
148          * @param saveActionListener 保存ボタンアクション\r
149          * @param overwriteOption 上書きオプションの表示 \r
150          */\r
151         public UkagakaConvertDialog(JFrame parent, ActionListener saveActionListener, boolean overwriteOption) {\r
152                 super(parent, true);\r
153                 this.saveActionListener = saveActionListener;\r
154                 this.showOverwriteOption = overwriteOption;\r
155 \r
156                 addWindowListener(new WindowAdapter() {\r
157                         @Override\r
158                         public void windowClosing(WindowEvent e) {\r
159                                 onClose();\r
160                         }\r
161                         @Override\r
162                         public void windowOpened(WindowEvent e) {\r
163                                 result = null;\r
164                         }\r
165                 });\r
166                 \r
167                 try {\r
168                         initComponent();\r
169 \r
170                 } catch (RuntimeException ex) {\r
171                         dispose();\r
172                         throw ex;\r
173                 }\r
174         }\r
175 \r
176         /**\r
177          * コンポーネントの初期化\r
178          */\r
179         private void initComponent() {\r
180                 \r
181                 Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()\r
182                         .getLocalizedProperties(STRINGS_RESOURCE);\r
183 \r
184                 setTitle(strings.getProperty("title"));\r
185 \r
186                 Toolkit tk = Toolkit.getDefaultToolkit();\r
187 \r
188                 actCancel = new AbstractAction(strings.getProperty("btn.cancel")) {\r
189                         private static final long serialVersionUID = -1L;\r
190                         public void actionPerformed(ActionEvent e) {\r
191                                 onClose();\r
192                         }\r
193                 };\r
194                 actSave = new AbstractAction(strings.getProperty("btn.save")) {\r
195                         private static final long serialVersionUID = -1L;\r
196                         public void actionPerformed(ActionEvent e) {\r
197                                 onSave();\r
198                         }\r
199                 };\r
200                 \r
201                 JButton btnCancel = new JButton(actCancel);\r
202                 JButton btnSave = new JButton(actSave);\r
203 \r
204                 Container contentPane = getContentPane();\r
205                 contentPane.setLayout(new BorderLayout(3, 3));\r
206 \r
207                 contentPane.add(caption, BorderLayout.NORTH);\r
208                 caption.setEditable(false);\r
209                 caption.setVisible(false);\r
210                 \r
211                 JScrollPane opaqueSp = new JScrollPane(opaqueImagePanel);\r
212                 JScrollPane alphaSp = new JScrollPane(alphaImagePanel);\r
213 \r
214                 JPanel previewSpPane = new JPanel();\r
215                 BoxLayout boxlayout = new BoxLayout(previewSpPane, BoxLayout.LINE_AXIS);\r
216                 previewSpPane.setLayout(boxlayout);\r
217                 \r
218                 previewSpPane.add(opaqueSp);\r
219                 previewSpPane.add(Box.createHorizontalStrut(3));\r
220                 previewSpPane.add(alphaSp);\r
221                 \r
222                 previewSpPane.setBorder(BorderFactory.createCompoundBorder(\r
223                                 BorderFactory.createTitledBorder(strings.getProperty("preview")),\r
224                                 BorderFactory.createEmptyBorder(3, 3, 3, 3)\r
225                                 ));\r
226 \r
227                 JPanel centerPane = new JPanel(new BorderLayout());\r
228                 centerPane.add(previewSpPane, BorderLayout.CENTER);\r
229 \r
230                 JPanel transparentColorPanel = new JPanel();\r
231                 GridBagLayout tc_gbl = new GridBagLayout();\r
232                 transparentColorPanel.setLayout(tc_gbl);\r
233                 transparentColorPanel.setBorder(BorderFactory.createCompoundBorder(\r
234                                 BorderFactory.createTitledBorder(strings.getProperty("caption.chooseTransparentColorKey")),\r
235                                 BorderFactory.createEmptyBorder(3, 3, 3, 3)\r
236                                 ));\r
237                 centerPane.add(transparentColorPanel, BorderLayout.SOUTH);\r
238                 \r
239                 \r
240                 GridBagConstraints gbc = new GridBagConstraints();\r
241                 \r
242                 radioAuto = new JRadioButton(strings.getProperty("radio.auto"));\r
243                 radioAuto.addChangeListener(new ChangeListener() {\r
244                         public void stateChanged(ChangeEvent e) {\r
245                                 onChange(!radioAuto.isSelected());\r
246                         }\r
247                 });\r
248                 radioManual = new JRadioButton(strings.getProperty("radio.manual"));\r
249                 radioAuto.addChangeListener(new ChangeListener() {\r
250                         public void stateChanged(ChangeEvent e) {\r
251                                 onChange(!radioAuto.isSelected());\r
252                         }\r
253                 });\r
254                 \r
255                 ButtonGroup btngroup = new ButtonGroup();\r
256                 btngroup.add(radioAuto);\r
257                 btngroup.add(radioManual);\r
258                 \r
259                 radioAuto.setSelected(!manualTransparentColorKey);\r
260                 \r
261                 gbc.gridx = 0;\r
262                 gbc.gridy = 0;\r
263                 gbc.gridheight = 1;\r
264                 gbc.gridwidth = 1;\r
265                 gbc.weightx = 0.;\r
266                 gbc.weighty = 0.;\r
267                 gbc.insets = new Insets(3, 3, 3, 3);\r
268                 gbc.anchor = GridBagConstraints.WEST;\r
269                 gbc.fill = GridBagConstraints.BOTH;\r
270                 transparentColorPanel.add(radioAuto, gbc);\r
271 \r
272                 gbc.gridx = 1;\r
273                 gbc.gridy = 0;\r
274                 transparentColorPanel.add(radioManual, gbc);\r
275 \r
276                 gbc.gridx = 2;\r
277                 gbc.gridy = 0;\r
278                 transparentColorPanel.add(colorBox, gbc);\r
279 \r
280                 \r
281                 contentPane.add(centerPane, BorderLayout.CENTER);\r
282                 \r
283                 \r
284                 JPanel btnPanel = new JPanel();\r
285                 GridBagLayout gbl = new GridBagLayout();\r
286                 btnPanel.setLayout(gbl);\r
287                 \r
288                 gbc.gridx = 0;\r
289                 gbc.gridy = 0;\r
290                 gbc.gridheight = 1;\r
291                 gbc.gridwidth = 1;\r
292                 gbc.weightx = 1.;\r
293                 gbc.weighty = 0.;\r
294                 gbc.insets = new Insets(3, 3, 3, 3);\r
295                 gbc.anchor = GridBagConstraints.WEST;\r
296                 gbc.fill = GridBagConstraints.BOTH;\r
297                 \r
298                 chkOverwriteOption = new JCheckBox(strings.getProperty("chk.overwriteOriginalFile"));\r
299                 \r
300                 if (showOverwriteOption) {\r
301                         btnPanel.add(chkOverwriteOption, gbc);\r
302 \r
303                 } else {\r
304                         btnPanel.add(Box.createHorizontalGlue(), gbc);\r
305                 }\r
306                 \r
307                 gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1;\r
308                 gbc.gridy = 0;\r
309                 gbc.weightx = 0.;\r
310                 btnPanel.add(btnSave, gbc);\r
311                 \r
312                 gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 2;\r
313                 gbc.gridy = 0;\r
314                 btnPanel.add(btnCancel, gbc);\r
315                 \r
316                 btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 45));\r
317                 \r
318                 contentPane.add(btnPanel, BorderLayout.SOUTH);\r
319         \r
320                 JRootPane rootPane = getRootPane();\r
321                 InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);\r
322                 ActionMap am = rootPane.getActionMap();\r
323                 im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeExportWizDialog");\r
324                 im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeExportWizDialog");\r
325                  \r
326                 am.put("closeExportWizDialog", actCancel);\r
327                 \r
328                 rootPane.setDefaultButton(btnSave);\r
329                 \r
330                 rootPane.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));\r
331 \r
332                 setSize(450, 450);\r
333                 setLocationRelativeTo(getParent());\r
334                 \r
335                 // colorBoxの色変更イベントのハンドル\r
336                 colorBox.addActionListener(new ActionListener() {\r
337                         public void actionPerformed(ActionEvent e) {\r
338                                 onChooseTransparentColorKey();\r
339                         }\r
340                 });\r
341         }\r
342         \r
343         /**\r
344          * 出力するイメージを設定する.\r
345          * @param img イメージ(TYPE_INT_ARGBのみ)\r
346          * @param colorKey 透過色に指定するカラーキー(候補)、nullの場合はデフォルト\r
347          */\r
348         public void setExportImage(BufferedImage img, Color colorKey) {\r
349                 if (img == null) {\r
350                         throw new IllegalArgumentException();\r
351                 }\r
352                 if (img.getType() != BufferedImage.TYPE_INT_ARGB) {\r
353                         throw new IllegalArgumentException("TYPE_INT_ARGB以外は指定できません。");\r
354                 }\r
355                 \r
356                 if (colorKey == null) {\r
357                         colorKey = Color.GREEN;\r
358                 }\r
359 \r
360                 this.originalImage = img;\r
361                 colorBox.setColorKey(colorKey);\r
362 \r
363                 rebuildImage();\r
364         }\r
365         \r
366         public BufferedImage getOpaqueImage() {\r
367                 return opaqueImagePanel.getSamplePictrue();\r
368         }\r
369         \r
370         public BufferedImage getAlphaImage() {\r
371                 return alphaImagePanel.getSamplePictrue();\r
372         }\r
373         \r
374         public void setAutoTransparentColor(boolean mode) {\r
375                 if (mode) {\r
376                         radioAuto.setSelected(true);\r
377                         radioManual.setSelected(false);\r
378 \r
379                 } else {\r
380                         radioManual.setSelected(true);\r
381                         radioAuto.setSelected(false);\r
382                 }\r
383         }\r
384         \r
385         public Color getTransparentColorKey() {\r
386                 return colorBox.getColorKey();\r
387         }\r
388         \r
389         public void setTransparentColorKey(Color colorKey) {\r
390                 colorBox.setColorKey(colorKey);\r
391         }\r
392         \r
393         public boolean isAutoTransparentColor() {\r
394                 return radioAuto.isSelected();\r
395         }\r
396         \r
397         public boolean isOverwriteOriginalFile() {\r
398                 return chkOverwriteOption.isSelected();\r
399         }\r
400         \r
401         public void setOverwriteOriginalFile(boolean overwriteOriginalFile) {\r
402                 chkOverwriteOption.setSelected(overwriteOriginalFile);\r
403         }\r
404         \r
405         protected void onClose() {\r
406                 result = null;\r
407                 dispose();\r
408         }\r
409         \r
410         protected void onSave() {\r
411                 if (saveActionListener != null) {\r
412                         ActionEvent e = new ActionEvent(this, 0, "save");\r
413                         saveActionListener.actionPerformed(e);\r
414                 }\r
415         }\r
416         \r
417         public void setSaveActionListener(ActionListener saveActionListener) {\r
418                 this.saveActionListener = saveActionListener;\r
419         }\r
420         \r
421         public ActionListener getSaveActionListener() {\r
422                 return saveActionListener;\r
423         }\r
424         \r
425         public Object getResult() {\r
426                 return result;\r
427         }\r
428         \r
429         public void setResult(Object result) {\r
430                 this.result = result; \r
431         }\r
432         \r
433         public void setCaption(String text) {\r
434                 if (text == null || text.length() == 0) {\r
435                         caption.setText("");\r
436                         caption.setVisible(false);\r
437 \r
438                 } else {\r
439                         caption.setText(text);\r
440                         caption.setVisible(true);\r
441                 }\r
442         }\r
443         \r
444         public String getCaption() {\r
445                 return caption.getText();\r
446         }\r
447         \r
448         /**\r
449          * 透過色のマニュアル選択.<br>\r
450          */\r
451         protected void onChooseTransparentColorKey() {\r
452                 // モードを手動に切り替え\r
453                 setAutoTransparentColor(false);\r
454                 // プレビューを再構築\r
455                 rebuildImage();\r
456         }\r
457 \r
458         /**\r
459          * 伺か用PNGの透過色キーの自動・マニュアルの切り替えイベント.<br>\r
460          * @param modeManual\r
461          */\r
462         protected void onChange(boolean modeManual) {\r
463                 if (manualTransparentColorKey != modeManual) {\r
464                         manualTransparentColorKey = modeManual;\r
465                         rebuildImage();\r
466                 }\r
467         }\r
468         \r
469         /**\r
470          * 伺か用のPNG/PNA画像を生成してプレビューに設定します.<br>\r
471          */\r
472         protected void rebuildImage() {\r
473                 if (originalImage == null) {\r
474                         return;\r
475                 }\r
476                 UkagakaImageConverter conv = UkagakaImageConverter.getInstance();\r
477 \r
478                 BufferedImage pna = conv.createUkagakaPNA(originalImage);\r
479                 \r
480                 Color transparentColorKey = null;\r
481                 if (manualTransparentColorKey) {\r
482                         transparentColorKey = colorBox.getColorKey();\r
483                 } else {\r
484                         transparentColorKey = conv.detectTransparentColorKey(originalImage);\r
485                 }\r
486                 \r
487                 BufferedImage png = conv.createUkagakaPNG(originalImage, transparentColorKey);\r
488                 \r
489                 opaqueImagePanel.setSamplePicture(png);\r
490                 alphaImagePanel.setSamplePicture(pna);\r
491         }\r
492 }\r
493 \r