OSDN Git Service

ver0.97リリース
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / ui / ColorDialog.java
index 190414f..3743a3b 100644 (file)
@@ -2,17 +2,23 @@ package charactermanaj.ui;
 \r
 import java.awt.BorderLayout;\r
 import java.awt.Container;\r
+import java.awt.GraphicsEnvironment;\r
 import java.awt.GridBagConstraints;\r
 import java.awt.GridBagLayout;\r
 import java.awt.GridLayout;\r
 import java.awt.Insets;\r
 import java.awt.Point;\r
+import java.awt.Rectangle;\r
 import java.awt.Toolkit;\r
 import java.awt.event.ActionEvent;\r
 import java.awt.event.ActionListener;\r
+import java.awt.event.ComponentAdapter;\r
+import java.awt.event.ComponentEvent;\r
 import java.awt.event.KeyEvent;\r
 import java.awt.event.WindowAdapter;\r
 import java.awt.event.WindowEvent;\r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
 import java.util.Collection;\r
 import java.util.HashMap;\r
 import java.util.LinkedList;\r
@@ -114,6 +120,12 @@ public class ColorDialog extends JDialog {
        private JCheckBox chkApplyAll;\r
        \r
        /**\r
+        * リセットアクション\r
+        */\r
+       private Action actReset;\r
+\r
+       \r
+       /**\r
         * コンストラクタ\r
         * @param parent 親フレーム\r
         * @param partsCategory カテゴリ\r
@@ -152,7 +164,7 @@ public class ColorDialog extends JDialog {
                this.tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);\r
                for (final Layer layer : partsCategory.getLayers()) {\r
                        \r
-                       ColorDialogTabPanel tabContainer = new ColorDialogTabPanel(this, layer, colorGroups);\r
+                       final ColorDialogTabPanel tabContainer = new ColorDialogTabPanel(this, layer, colorGroups);\r
                        final ColorChangeListener innerListener = new ColorChangeListener() {\r
                                private Semaphore semaphore = new Semaphore(1); // イベントが循環発生することを防ぐ\r
                                public void onColorChange(ColorChangeEvent event) {\r
@@ -176,6 +188,19 @@ public class ColorDialog extends JDialog {
                                }\r
                        };\r
                        tabContainer.addColorChangeListener(innerListener);\r
+                       tabContainer.addComponentListener(new ComponentAdapter() {\r
+                               @Override\r
+                               public void componentShown(ComponentEvent e) {\r
+                                       // レイヤータブが切り替えられるたびに、そのレイヤーの状況にあわせてリセットボタンの状態を更新する.\r
+                                       updateResetButton(tabContainer);\r
+                               }\r
+                       });\r
+                       tabContainer.addPropertyChangeListener("colorConvertParameter", new PropertyChangeListener() {\r
+                               public void propertyChange(PropertyChangeEvent evt) {\r
+                                       // レイヤーの情報が変るたびにリセットボタンの状態を更新する\r
+                                       updateResetButton(tabContainer);\r
+                               }\r
+                       });\r
 \r
                        tabbedPane.addTab(layer.getLocalizedName(), tabContainer);\r
                        tabbedPaneIndexMap.put(layer, tabbedPane.getTabCount() - 1);\r
@@ -190,7 +215,7 @@ public class ColorDialog extends JDialog {
                        }\r
                };\r
                // リセットアクション\r
-               Action actReset = new AbstractAction(strings.getProperty("button.reset")) {\r
+               actReset = new AbstractAction(strings.getProperty("button.reset")) {\r
                        private static final long serialVersionUID = 1L;\r
                        public void actionPerformed(ActionEvent e) {\r
                                ColorDialogTabPanel tab = (ColorDialogTabPanel) tabbedPane\r
@@ -276,15 +301,43 @@ public class ColorDialog extends JDialog {
        }\r
        \r
        /**\r
+        * 各レイヤーのカラー情報のタブが開かれた場合、もしくはカラーの設定値が変更されるたびに\r
+        * 呼び出されて、リセットボタンの状態を変更します.<br>\r
+        * 現在のタブが選択しているパネルと異なるパネルからの要求については無視されます.<br>\r
+        * @param panel 色情報が変更された、もしくは開かれた対象パネル\r
+        */\r
+       protected void updateResetButton(ColorDialogTabPanel panel) {\r
+               ColorDialogTabPanel currentPanel = (ColorDialogTabPanel) tabbedPane.getSelectedComponent();\r
+               if (currentPanel != null && currentPanel.equals(panel)) {\r
+                       actReset.setEnabled(panel.isColorConvertParameterModified());\r
+               }\r
+       }\r
+       \r
+       /**\r
         * ダイアログの表示位置を調整する.<br>\r
         * 横位置Xはメインフレームの右側とし、縦位置Yはメインフレームの上位置からのoffset_yを加えた位置とする.<br>\r
         * @param offset_y オフセットY\r
         */\r
        public void adjustLocation(int offset_y) {\r
+               // メインウィンドウよりも左側に位置づけする.\r
+               // 縦位置はメインウィンドウの上端からオフセットを加えたものとする.\r
                Point pt = getParent().getLocation();\r
                Insets insets = getParent().getInsets();\r
                pt.x += getParent().getWidth();\r
                pt.y += (offset_y * insets.top);\r
+\r
+               // メインスクリーンサイズを取得する.\r
+               GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();\r
+               Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ)\r
+               \r
+               // メインスクリーンサイズを超えた場合は、はみ出た分を移動する.\r
+               if ((pt.x + getWidth()) > desktopSize.width) {\r
+                       pt.x -= ((pt.x + getWidth()) - desktopSize.width);\r
+               }\r
+               if ((pt.y + getHeight()) > desktopSize.height) {\r
+                       pt.y -= ((pt.y + getHeight()) - desktopSize.height);\r
+               }\r
+               \r
                setLocation(pt);\r
        }\r
 \r
@@ -667,6 +720,7 @@ class ColorDialogTabPanel extends JPanel {
                final ChangeListener changeEventHandler = new ChangeListener() {\r
                        public void stateChanged(ChangeEvent e) {\r
                                fireColorChangeEvent(layer);\r
+                               firePropertyChange("colorConvertParameter", null, null);\r
                        }\r
                };\r
                \r
@@ -688,6 +742,7 @@ class ColorDialogTabPanel extends JPanel {
                cmbColorReplace.addActionListener(new ActionListener() {\r
                        public void actionPerformed(ActionEvent e) {\r
                                fireColorChangeEvent(layer);\r
+                               firePropertyChange("colorConvertParameter", null, null);\r
                        }\r
                });\r
                spinGray = new JSpinner(grayModel);\r
@@ -943,6 +998,11 @@ class ColorDialogTabPanel extends JPanel {
                container.add(colorTunePanel);\r
        }\r
        \r
+       /**\r
+        * このパネルで変更された色情報の状態をリセットする.<br>\r
+        * 最後に{@link #setColorConvertParameter(ColorConvertParameter)}された値で\r
+        * 設定し直す.<br>\r
+        */\r
        public void resetColor() {\r
                setColorConvertParameter(paramOrg);\r
        }\r
@@ -976,10 +1036,14 @@ class ColorDialogTabPanel extends JPanel {
                        spinSaturation.setValue(Double.valueOf(param.getSaturation()));\r
                        spinBrightness.setValue(Double.valueOf(param.getBrightness()));\r
                        spinContrast.setValue(Double.valueOf(param.getContrast()));\r
+\r
                } finally {\r
                        changeEventDisableSemaphore.decrementAndGet();\r
                }\r
+               \r
                chachedParam = param;\r
+               \r
+               firePropertyChange("colorConvertParameter", null, param);\r
        }\r
        \r
        public ColorConvertParameter getColorConvertParameter() {\r
@@ -1009,6 +1073,14 @@ class ColorDialogTabPanel extends JPanel {
                return param;\r
        }\r
        \r
+       /**\r
+        * カラー設定が変更されているか?\r
+        * @return 変更されている場合はtrue、そうでなければfalse\r
+        */\r
+       public boolean isColorConvertParameterModified() {\r
+               return !paramOrg.equals(getColorConvertParameter());\r
+       }\r
+       \r
        public ColorGroup getColorGroup() {\r
                return (ColorGroup) cmbColorGroup.getSelectedItem();\r
        }\r