\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
private JCheckBox chkApplyAll;\r
\r
/**\r
+ * リセットアクション\r
+ */\r
+ private Action actReset;\r
+\r
+ \r
+ /**\r
* コンストラクタ\r
* @param parent 親フレーム\r
* @param partsCategory カテゴリ\r
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
}\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
}\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
}\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
final ChangeListener changeEventHandler = new ChangeListener() {\r
public void stateChanged(ChangeEvent e) {\r
fireColorChangeEvent(layer);\r
+ firePropertyChange("colorConvertParameter", null, null);\r
}\r
};\r
\r
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
container.add(colorTunePanel);\r
}\r
\r
+ /**\r
+ * このパネルで変更された色情報の状態をリセットする.<br>\r
+ * 最後に{@link #setColorConvertParameter(ColorConvertParameter)}された値で\r
+ * 設定し直す.<br>\r
+ */\r
public void resetColor() {\r
setColorConvertParameter(paramOrg);\r
}\r
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
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