1 package charactermanaj.ui;
\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
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
39 import charactermanaj.Main;
\r
40 import charactermanaj.graphics.io.UkagakaImageConverter;
\r
41 import charactermanaj.util.LocalizedResourcePropertyLoader;
\r
44 * 伺か用PNG/PNA出力設定ダイアログ
\r
47 public class UkagakaConvertDialog extends JDialog {
\r
49 private static final long serialVersionUID = 4189631881766588004L;
\r
54 protected static final String STRINGS_RESOURCE = "languages/ukagakaConvertDialog";
\r
59 private TextField caption = new TextField();
\r
64 private AbstractAction actCancel;
\r
69 private AbstractAction actSave;
\r
75 private SamplePicturePanel opaqueImagePanel = new SamplePicturePanel();
\r
80 private SamplePicturePanel alphaImagePanel = new SamplePicturePanel();
\r
85 private ColorBox colorBox = new ColorBox();
\r
90 private BufferedImage originalImage;
\r
95 private boolean manualTransparentColorKey;
\r
100 private JRadioButton radioAuto;
\r
105 private JRadioButton radioManual;
\r
110 private JCheckBox chkOverwriteOption;
\r
115 private Object result;
\r
118 * 保存ボタンアクションリスナ.<br>
\r
120 private ActionListener saveActionListener;
\r
125 private boolean showOverwriteOption;
\r
129 * 伺か用PNG/PNA出力設定ダイアログを構築する.
\r
130 * @param parent 親フレーム
\r
132 public UkagakaConvertDialog(JFrame parent) {
\r
133 this(parent, false);
\r
137 * 伺か用PNG/PNA出力設定ダイアログを構築する.
\r
138 * @param parent 親フレーム
\r
139 * @param overwriteOption 上書きオプションの表示
\r
141 public UkagakaConvertDialog(JFrame parent, boolean overwriteOption) {
\r
142 this(parent, null, overwriteOption);
\r
146 * 伺か用PNG/PNA出力設定ダイアログを構築する.
\r
147 * @param parent 親フレーム
\r
148 * @param saveActionListener 保存ボタンアクション
\r
149 * @param overwriteOption 上書きオプションの表示
\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
156 addWindowListener(new WindowAdapter() {
\r
158 public void windowClosing(WindowEvent e) {
\r
162 public void windowOpened(WindowEvent e) {
\r
170 } catch (RuntimeException ex) {
\r
179 private void initComponent() {
\r
181 Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
\r
182 .getLocalizedProperties(STRINGS_RESOURCE);
\r
184 setTitle(strings.getProperty("title"));
\r
186 Toolkit tk = Toolkit.getDefaultToolkit();
\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
194 actSave = new AbstractAction(strings.getProperty("btn.save")) {
\r
195 private static final long serialVersionUID = -1L;
\r
196 public void actionPerformed(ActionEvent e) {
\r
201 JButton btnCancel = new JButton(actCancel);
\r
202 JButton btnSave = new JButton(actSave);
\r
204 Container contentPane = getContentPane();
\r
205 contentPane.setLayout(new BorderLayout(3, 3));
\r
207 contentPane.add(caption, BorderLayout.NORTH);
\r
208 caption.setEditable(false);
\r
209 caption.setVisible(false);
\r
211 JScrollPane opaqueSp = new JScrollPane(opaqueImagePanel);
\r
212 JScrollPane alphaSp = new JScrollPane(alphaImagePanel);
\r
214 JPanel previewSpPane = new JPanel();
\r
215 BoxLayout boxlayout = new BoxLayout(previewSpPane, BoxLayout.LINE_AXIS);
\r
216 previewSpPane.setLayout(boxlayout);
\r
218 previewSpPane.add(opaqueSp);
\r
219 previewSpPane.add(Box.createHorizontalStrut(3));
\r
220 previewSpPane.add(alphaSp);
\r
222 previewSpPane.setBorder(BorderFactory.createCompoundBorder(
\r
223 BorderFactory.createTitledBorder(strings.getProperty("preview")),
\r
224 BorderFactory.createEmptyBorder(3, 3, 3, 3)
\r
227 JPanel centerPane = new JPanel(new BorderLayout());
\r
228 centerPane.add(previewSpPane, BorderLayout.CENTER);
\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
237 centerPane.add(transparentColorPanel, BorderLayout.SOUTH);
\r
240 GridBagConstraints gbc = new GridBagConstraints();
\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
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
255 ButtonGroup btngroup = new ButtonGroup();
\r
256 btngroup.add(radioAuto);
\r
257 btngroup.add(radioManual);
\r
259 radioAuto.setSelected(!manualTransparentColorKey);
\r
263 gbc.gridheight = 1;
\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
274 transparentColorPanel.add(radioManual, gbc);
\r
278 transparentColorPanel.add(colorBox, gbc);
\r
281 contentPane.add(centerPane, BorderLayout.CENTER);
\r
284 JPanel btnPanel = new JPanel();
\r
285 GridBagLayout gbl = new GridBagLayout();
\r
286 btnPanel.setLayout(gbl);
\r
290 gbc.gridheight = 1;
\r
294 gbc.insets = new Insets(3, 3, 3, 3);
\r
295 gbc.anchor = GridBagConstraints.WEST;
\r
296 gbc.fill = GridBagConstraints.BOTH;
\r
298 chkOverwriteOption = new JCheckBox(strings.getProperty("chk.overwriteOriginalFile"));
\r
300 if (showOverwriteOption) {
\r
301 btnPanel.add(chkOverwriteOption, gbc);
\r
304 btnPanel.add(Box.createHorizontalGlue(), gbc);
\r
307 gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1;
\r
310 btnPanel.add(btnSave, gbc);
\r
312 gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 2;
\r
314 btnPanel.add(btnCancel, gbc);
\r
316 btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 45));
\r
318 contentPane.add(btnPanel, BorderLayout.SOUTH);
\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
326 am.put("closeExportWizDialog", actCancel);
\r
328 rootPane.setDefaultButton(btnSave);
\r
330 rootPane.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
\r
333 setLocationRelativeTo(getParent());
\r
335 // colorBoxの色変更イベントのハンドル
\r
336 colorBox.addActionListener(new ActionListener() {
\r
337 public void actionPerformed(ActionEvent e) {
\r
338 onChooseTransparentColorKey();
\r
345 * @param img イメージ(TYPE_INT_ARGBのみ)
\r
346 * @param colorKey 透過色に指定するカラーキー(候補)、nullの場合はデフォルト
\r
348 public void setExportImage(BufferedImage img, Color colorKey) {
\r
350 throw new IllegalArgumentException();
\r
352 if (img.getType() != BufferedImage.TYPE_INT_ARGB) {
\r
353 throw new IllegalArgumentException("TYPE_INT_ARGB以外は指定できません。");
\r
356 if (colorKey == null) {
\r
357 colorKey = Color.GREEN;
\r
360 this.originalImage = img;
\r
361 colorBox.setColorKey(colorKey);
\r
366 public BufferedImage getOpaqueImage() {
\r
367 return opaqueImagePanel.getSamplePictrue();
\r
370 public BufferedImage getAlphaImage() {
\r
371 return alphaImagePanel.getSamplePictrue();
\r
374 public void setAutoTransparentColor(boolean mode) {
\r
376 radioAuto.setSelected(true);
\r
377 radioManual.setSelected(false);
\r
380 radioManual.setSelected(true);
\r
381 radioAuto.setSelected(false);
\r
385 public Color getTransparentColorKey() {
\r
386 return colorBox.getColorKey();
\r
389 public void setTransparentColorKey(Color colorKey) {
\r
390 colorBox.setColorKey(colorKey);
\r
393 public boolean isAutoTransparentColor() {
\r
394 return radioAuto.isSelected();
\r
397 public boolean isOverwriteOriginalFile() {
\r
398 return chkOverwriteOption.isSelected();
\r
401 public void setOverwriteOriginalFile(boolean overwriteOriginalFile) {
\r
402 chkOverwriteOption.setSelected(overwriteOriginalFile);
\r
405 protected void onClose() {
\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
417 public void setSaveActionListener(ActionListener saveActionListener) {
\r
418 this.saveActionListener = saveActionListener;
\r
421 public ActionListener getSaveActionListener() {
\r
422 return saveActionListener;
\r
425 public Object getResult() {
\r
429 public void setResult(Object result) {
\r
430 this.result = result;
\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
439 caption.setText(text);
\r
440 caption.setVisible(true);
\r
444 public String getCaption() {
\r
445 return caption.getText();
\r
451 protected void onChooseTransparentColorKey() {
\r
453 setAutoTransparentColor(false);
\r
459 * 伺か用PNGの透過色キーの自動・マニュアルの切り替えイベント.<br>
\r
460 * @param modeManual
\r
462 protected void onChange(boolean modeManual) {
\r
463 if (manualTransparentColorKey != modeManual) {
\r
464 manualTransparentColorKey = modeManual;
\r
470 * 伺か用のPNG/PNA画像を生成してプレビューに設定します.<br>
\r
472 protected void rebuildImage() {
\r
473 if (originalImage == null) {
\r
476 UkagakaImageConverter conv = UkagakaImageConverter.getInstance();
\r
478 BufferedImage pna = conv.createUkagakaPNA(originalImage);
\r
480 Color transparentColorKey = null;
\r
481 if (manualTransparentColorKey) {
\r
482 transparentColorKey = colorBox.getColorKey();
\r
484 transparentColorKey = conv.detectTransparentColorKey(originalImage);
\r
487 BufferedImage png = conv.createUkagakaPNG(originalImage, transparentColorKey);
\r
489 opaqueImagePanel.setSamplePicture(png);
\r
490 alphaImagePanel.setSamplePicture(pna);
\r