6552812: Add HSL tab to JColorChooser
Reviewed-by: peterz, avu
This commit is contained in:
parent
3916f38bd4
commit
e91ae90285
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=Sample Text Sample Text
|
||||
ColorChooser.swatchesNameText=Swatches
|
||||
ColorChooser.swatchesMnemonic=83
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=0
|
||||
ColorChooser.swatchesRecentText=Recent:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=Red
|
||||
ColorChooser.rgbRedMnemonic=68
|
||||
ColorChooser.rgbGreenText=Green
|
||||
ColorChooser.rgbGreenMnemonic=78
|
||||
ColorChooser.rgbBlueText=Blue
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=90
|
||||
ColorChooser.sampleText=Beispieltext Beispieltext
|
||||
ColorChooser.swatchesNameText=Muster
|
||||
ColorChooser.swatchesMnemonic=77
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=0
|
||||
ColorChooser.swatchesRecentText=Aktuell:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=Rot
|
||||
ColorChooser.rgbRedMnemonic=82
|
||||
ColorChooser.rgbGreenText=Gr\u00fcn
|
||||
ColorChooser.rgbGreenMnemonic=78
|
||||
ColorChooser.rgbBlueText=Blau
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=Texto de ejemplo Texto de ejemplo
|
||||
ColorChooser.swatchesNameText=Muestras
|
||||
ColorChooser.swatchesMnemonic=77
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=0
|
||||
ColorChooser.swatchesRecentText=Reciente:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=V
|
||||
ColorChooser.hsbBlueText=A
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=Rojo
|
||||
ColorChooser.rgbRedMnemonic=74
|
||||
ColorChooser.rgbGreenText=Verde
|
||||
ColorChooser.rgbGreenMnemonic=86
|
||||
ColorChooser.rgbBlueText=Azul
|
||||
ColorChooser.rgbBlueMnemonic=76
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=Echantillon de texte Echantillon de texte
|
||||
ColorChooser.swatchesNameText=Echantillons
|
||||
ColorChooser.swatchesMnemonic=69
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=0
|
||||
ColorChooser.swatchesRecentText=Dernier :
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=V
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RVB
|
||||
ColorChooser.rgbMnemonic=86
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=Rouge
|
||||
ColorChooser.rgbRedMnemonic=71
|
||||
ColorChooser.rgbGreenText=Vert
|
||||
ColorChooser.rgbGreenMnemonic=84
|
||||
ColorChooser.rgbBlueText=Bleu
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=Testo di prova Testo di prova
|
||||
ColorChooser.swatchesNameText=Colori campione
|
||||
ColorChooser.swatchesMnemonic=67
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=0
|
||||
ColorChooser.swatchesRecentText=Recenti:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=Rosso
|
||||
ColorChooser.rgbRedMnemonic=79
|
||||
ColorChooser.rgbGreenText=Verde
|
||||
ColorChooser.rgbGreenMnemonic=69
|
||||
ColorChooser.rgbBlueText=Blu
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=\u30b5\u30f3\u30d7\u30eb\u30c6\u30ad\u30b9\u30c8 \u30b5\u30f3\u30d7\u30eb\u30c6\u30ad\u30b9\u30c8
|
||||
ColorChooser.swatchesNameText=\u30b5\u30f3\u30d7\u30eb(S)
|
||||
ColorChooser.swatchesMnemonic=83
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=5
|
||||
ColorChooser.swatchesRecentText=\u6700\u65b0:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=\u8d64(D)
|
||||
ColorChooser.rgbRedMnemonic=68
|
||||
ColorChooser.rgbGreenText=\u7dd1(N)
|
||||
ColorChooser.rgbGreenMnemonic=78
|
||||
ColorChooser.rgbBlueText=\u9752(B)
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=\uc0d8\ud50c \ud14d\uc2a4\ud2b8 \uc0d8\ud50c \ud14d\uc2a4\ud2b8
|
||||
ColorChooser.swatchesNameText=\uacac\ubcf8(S)
|
||||
ColorChooser.swatchesMnemonic=83
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=3
|
||||
ColorChooser.swatchesRecentText=\ucd5c\uadfc \ubaa9\ub85d:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=\ube68\uac04\uc0c9(D)
|
||||
ColorChooser.rgbRedMnemonic=68
|
||||
ColorChooser.rgbGreenText=\ub179\uc0c9(N)
|
||||
ColorChooser.rgbGreenMnemonic=78
|
||||
ColorChooser.rgbBlueText=\ud30c\ub780\uc0c9(B)
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=84
|
||||
ColorChooser.sampleText=Exempeltext Exempeltext
|
||||
ColorChooser.swatchesNameText=Prov
|
||||
ColorChooser.swatchesMnemonic=80
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=0
|
||||
ColorChooser.swatchesRecentText=Tidigare:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=R\u00f6d
|
||||
ColorChooser.rgbRedMnemonic=82
|
||||
ColorChooser.rgbGreenText=Gr\u00f6n
|
||||
ColorChooser.rgbGreenMnemonic=71
|
||||
ColorChooser.rgbBlueText=Bl\u00e5
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=\u6837\u54c1\u6587\u672c \u6837\u54c1\u6587\u672c
|
||||
ColorChooser.swatchesNameText=\u6837\u54c1(S)
|
||||
ColorChooser.swatchesMnemonic=83
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=3
|
||||
ColorChooser.swatchesRecentText=\u6700\u8fd1:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=\u7ea2
|
||||
ColorChooser.rgbRedMnemonic=68
|
||||
ColorChooser.rgbGreenText=\u7eff
|
||||
ColorChooser.rgbGreenMnemonic=78
|
||||
ColorChooser.rgbBlueText=\u84dd
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -101,30 +101,41 @@ ColorChooser.resetMnemonic=82
|
||||
ColorChooser.sampleText=\u7bc4\u4f8b\u6587\u5b57 \u7bc4\u4f8b\u6587\u5b57
|
||||
ColorChooser.swatchesNameText=\u8abf\u8272\u677f(S)
|
||||
ColorChooser.swatchesMnemonic=83
|
||||
ColorChooser.swatchesDisplayedMnemonicIndex=4
|
||||
ColorChooser.swatchesRecentText=\u6700\u65b0\u9078\u64c7:
|
||||
ColorChooser.hsbNameText=HSB
|
||||
# Each of the ColorChooser types can define a mnemonic, as a KeyEvent.VK_XXX
|
||||
# constant, and an index into the text to render the mnemonic as. The
|
||||
# mnemonic is xxxMnemonic and the index of the character to underline is
|
||||
# xxxDisplayedMnemonicIndex.
|
||||
ColorChooser.hsbMnemonic=72
|
||||
ColorChooser.hsbDisplayedMnemonicIndex=0
|
||||
ColorChooser.hsbHueText=H
|
||||
ColorChooser.hsbSaturationText=S
|
||||
ColorChooser.hsbBrightnessText=B
|
||||
ColorChooser.hsbRedText=R
|
||||
ColorChooser.hsbGreenText=G
|
||||
ColorChooser.hsbBlueText=B
|
||||
ColorChooser.hsvNameText=HSV
|
||||
ColorChooser.hsvMnemonic=72
|
||||
ColorChooser.hsvHueText=Hue
|
||||
ColorChooser.hsvSaturationText=Saturation
|
||||
ColorChooser.hsvValueText=Value
|
||||
ColorChooser.hsvTransparencyText=Transparency
|
||||
ColorChooser.hslNameText=HSL
|
||||
ColorChooser.hslMnemonic=76
|
||||
ColorChooser.hslHueText=Hue
|
||||
ColorChooser.hslSaturationText=Saturation
|
||||
ColorChooser.hslLightnessText=Lightness
|
||||
ColorChooser.hslTransparencyText=Transparency
|
||||
ColorChooser.rgbNameText=RGB
|
||||
ColorChooser.rgbMnemonic=71
|
||||
ColorChooser.rgbDisplayedMnemonicIndex=1
|
||||
ColorChooser.rgbRedText=\u7d05\u8272(D)
|
||||
ColorChooser.rgbRedMnemonic=68
|
||||
ColorChooser.rgbGreenText=\u7da0\u8272(N)
|
||||
ColorChooser.rgbGreenMnemonic=78
|
||||
ColorChooser.rgbBlueText=\u85cd\u8272(B)
|
||||
ColorChooser.rgbBlueMnemonic=66
|
||||
ColorChooser.rgbAlphaText=Alpha
|
||||
ColorChooser.rgbHexCodeText=Color Code
|
||||
ColorChooser.rgbHexCodeMnemonic=67
|
||||
ColorChooser.cmykNameText=CMYK
|
||||
ColorChooser.cmykMnemonic=77
|
||||
ColorChooser.cmykCyanText=Cyan
|
||||
ColorChooser.cmykMagentaText=Magenta
|
||||
ColorChooser.cmykYellowText=Yellow
|
||||
ColorChooser.cmykBlackText=Black
|
||||
ColorChooser.cmykAlphaText=Alpha
|
||||
|
||||
############ OPTION PANE STRINGS #############
|
||||
# Mnemonic keys correspond to KeyEvent.VK_XXX constant
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,9 +25,7 @@
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
|
||||
import javax.swing.JComponent;
|
||||
|
||||
/**
|
||||
* A class designed to produce preconfigured "accessory" objects to
|
||||
@ -49,16 +47,17 @@ public class ColorChooserComponentFactory {
|
||||
|
||||
private ColorChooserComponentFactory() { } // can't instantiate
|
||||
|
||||
|
||||
public static AbstractColorChooserPanel[] getDefaultChooserPanels() {
|
||||
AbstractColorChooserPanel[] choosers = { new DefaultSwatchChooserPanel(),
|
||||
new DefaultHSBChooserPanel(),
|
||||
new DefaultRGBChooserPanel() };
|
||||
return choosers;
|
||||
return new AbstractColorChooserPanel[] {
|
||||
new DefaultSwatchChooserPanel(),
|
||||
new ColorChooserPanel(new ColorModelHSV()),
|
||||
new ColorChooserPanel(new ColorModelHSL()),
|
||||
new ColorChooserPanel(new ColorModel()),
|
||||
new ColorChooserPanel(new ColorModelCMYK()),
|
||||
};
|
||||
}
|
||||
|
||||
public static JComponent getPreviewPanel() {
|
||||
return new DefaultPreviewPanel();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,182 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFormattedTextField;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
final class ColorChooserPanel extends AbstractColorChooserPanel implements PropertyChangeListener {
|
||||
|
||||
private static final int MASK = 0xFF000000;
|
||||
private final ColorModel model;
|
||||
private final ColorPanel panel;
|
||||
private final DiagramComponent slider;
|
||||
private final DiagramComponent diagram;
|
||||
private final JFormattedTextField text;
|
||||
private final JLabel label;
|
||||
|
||||
ColorChooserPanel(ColorModel model) {
|
||||
this.model = model;
|
||||
this.panel = new ColorPanel(this.model);
|
||||
this.slider = new DiagramComponent(this.panel, false);
|
||||
this.diagram = new DiagramComponent(this.panel, true);
|
||||
this.text = new JFormattedTextField();
|
||||
this.label = new JLabel(null, null, SwingConstants.RIGHT);
|
||||
ValueFormatter.init(6, true, this.text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateChooser() {
|
||||
Color color = getColorFromModel();
|
||||
this.panel.setColor(color);
|
||||
this.text.setValue(Integer.valueOf(color.getRGB()));
|
||||
this.slider.repaint();
|
||||
this.diagram.repaint();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildChooser() {
|
||||
if (0 == getComponentCount()) {
|
||||
setLayout(new GridBagLayout());
|
||||
|
||||
GridBagConstraints gbc = new GridBagConstraints();
|
||||
|
||||
gbc.gridx = 3;
|
||||
gbc.gridwidth = 2;
|
||||
gbc.weighty = 1.0;
|
||||
gbc.anchor = GridBagConstraints.NORTH;
|
||||
gbc.fill = GridBagConstraints.HORIZONTAL;
|
||||
gbc.insets.top = 10;
|
||||
gbc.insets.right = 10;
|
||||
add(this.panel, gbc);
|
||||
|
||||
gbc.gridwidth = 1;
|
||||
gbc.weightx = 1.0;
|
||||
gbc.weighty = 0.0;
|
||||
gbc.anchor = GridBagConstraints.CENTER;
|
||||
gbc.insets.right = 5;
|
||||
gbc.insets.bottom = 10;
|
||||
add(this.label, gbc);
|
||||
|
||||
gbc.gridx = 4;
|
||||
gbc.weightx = 0.0;
|
||||
gbc.insets.right = 10;
|
||||
add(this.text, gbc);
|
||||
|
||||
gbc.gridx = 2;
|
||||
gbc.gridheight = 2;
|
||||
gbc.anchor = GridBagConstraints.NORTH;
|
||||
gbc.ipadx = this.text.getPreferredSize().height;
|
||||
gbc.ipady = getPreferredSize().height;
|
||||
add(this.slider, gbc);
|
||||
|
||||
gbc.gridx = 1;
|
||||
gbc.insets.left = 10;
|
||||
gbc.ipadx = gbc.ipady;
|
||||
add(this.diagram, gbc);
|
||||
|
||||
this.label.setLabelFor(this.text);
|
||||
this.text.addPropertyChangeListener("value", this); // NON-NLS: the property name
|
||||
this.slider.setBorder(this.text.getBorder());
|
||||
this.diagram.setBorder(this.text.getBorder());
|
||||
|
||||
setInheritsPopupMenu(this, true); // CR:4966112
|
||||
}
|
||||
String label = this.model.getText(this, "HexCode"); // NON-NLS: suffix
|
||||
boolean visible = label != null;
|
||||
this.text.setVisible(visible);
|
||||
this.label.setVisible(visible);
|
||||
if (visible) {
|
||||
this.label.setText(label);
|
||||
int mnemonic = this.model.getInteger(this, "HexCodeMnemonic"); // NON-NLS: suffix
|
||||
if (mnemonic > 0) {
|
||||
this.label.setDisplayedMnemonic(mnemonic);
|
||||
mnemonic = this.model.getInteger(this, "HexCodeMnemonicIndex"); // NON-NLS: suffix
|
||||
if (mnemonic >= 0) {
|
||||
this.label.setDisplayedMnemonicIndex(mnemonic);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.panel.buildPanel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return this.model.getText(this, "Name"); // NON-NLS: suffix
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMnemonic() {
|
||||
return this.model.getInteger(this, "Mnemonic"); // NON-NLS: suffix
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDisplayedMnemonicIndex() {
|
||||
return this.model.getInteger(this, "DisplayedMnemonicIndex"); // NON-NLS: suffix
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon getSmallDisplayIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon getLargeDisplayIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void propertyChange(PropertyChangeEvent event) {
|
||||
Object object = event.getNewValue();
|
||||
if (object instanceof Integer) {
|
||||
int value = MASK & getColorFromModel().getRGB() | (Integer) object;
|
||||
getColorSelectionModel().setSelectedColor(new Color(value, true));
|
||||
}
|
||||
this.text.selectAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows to show context popup for all components recursively.
|
||||
*
|
||||
* @param component the root component of the tree
|
||||
* @param value whether or not the popup menu is inherited
|
||||
*/
|
||||
private static void setInheritsPopupMenu(JComponent component, boolean value) {
|
||||
component.setInheritsPopupMenu(value);
|
||||
for (Object object : component.getComponents()) {
|
||||
if (object instanceof JComponent) {
|
||||
setInheritsPopupMenu((JComponent) object, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
102
jdk/src/share/classes/javax/swing/colorchooser/ColorModel.java
Normal file
102
jdk/src/share/classes/javax/swing/colorchooser/ColorModel.java
Normal file
@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import java.awt.Component;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
class ColorModel {
|
||||
|
||||
private final String prefix;
|
||||
private final String[] labels;
|
||||
|
||||
ColorModel(String name, String... labels) {
|
||||
this.prefix = "ColorChooser." + name; // NON-NLS: default prefix
|
||||
this.labels = labels;
|
||||
}
|
||||
|
||||
ColorModel() {
|
||||
this("rgb", "Red", "Green", "Blue", "Alpha"); // NON-NLS: components
|
||||
}
|
||||
|
||||
void setColor(int color, float[] model) {
|
||||
model[0] = normalize(color >> 16);
|
||||
model[1] = normalize(color >> 8);
|
||||
model[2] = normalize(color);
|
||||
model[3] = normalize(color >> 24);
|
||||
}
|
||||
|
||||
int getColor(float[] model) {
|
||||
return to8bit(model[2]) | (to8bit(model[1]) << 8) | (to8bit(model[0]) << 16) | (to8bit(model[3]) << 24);
|
||||
}
|
||||
|
||||
int getCount() {
|
||||
return this.labels.length;
|
||||
}
|
||||
|
||||
int getMinimum(int index) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int getMaximum(int index) {
|
||||
return 255;
|
||||
}
|
||||
|
||||
float getDefault(int index) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
final String getLabel(Component component, int index) {
|
||||
return getText(component, this.labels[index]);
|
||||
}
|
||||
|
||||
private static float normalize(int value) {
|
||||
return (float) (value & 0xFF) / 255.0f;
|
||||
}
|
||||
|
||||
private static int to8bit(float value) {
|
||||
return (int) (255.0f * value);
|
||||
}
|
||||
|
||||
final String getText(Component component, String suffix) {
|
||||
return UIManager.getString(this.prefix + suffix + "Text", component.getLocale()); // NON-NLS: default postfix
|
||||
}
|
||||
|
||||
final int getInteger(Component component, String suffix) {
|
||||
Object value = UIManager.get(this.prefix + suffix, component.getLocale());
|
||||
if (value instanceof Integer) {
|
||||
return (Integer) value;
|
||||
}
|
||||
if (value instanceof String) {
|
||||
try {
|
||||
return Integer.parseInt((String) value);
|
||||
}
|
||||
catch (NumberFormatException exception) {
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
final class ColorModelCMYK extends ColorModel {
|
||||
|
||||
ColorModelCMYK() {
|
||||
super("cmyk", "Cyan", "Magenta", "Yellow", "Black", "Alpha"); // NON-NLS: components
|
||||
}
|
||||
|
||||
@Override
|
||||
void setColor(int color, float[] space) {
|
||||
super.setColor(color, space);
|
||||
space[4] = space[3];
|
||||
RGBtoCMYK(space, space);
|
||||
}
|
||||
|
||||
@Override
|
||||
int getColor(float[] space) {
|
||||
CMYKtoRGB(space, space);
|
||||
space[3] = space[4];
|
||||
return super.getColor(space);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts CMYK components of a color to a set of RGB components.
|
||||
*
|
||||
* @param cmyk a float array with length equal to
|
||||
* the number of CMYK components
|
||||
* @param rgb a float array with length of at least 3
|
||||
* that contains RGB components of a color
|
||||
* @return a float array that contains RGB components
|
||||
*/
|
||||
private static float[] CMYKtoRGB(float[] cmyk, float[] rgb) {
|
||||
if (rgb == null) {
|
||||
rgb = new float[3];
|
||||
}
|
||||
rgb[0] = 1.0f + cmyk[0] * cmyk[3] - cmyk[3] - cmyk[0];
|
||||
rgb[1] = 1.0f + cmyk[1] * cmyk[3] - cmyk[3] - cmyk[1];
|
||||
rgb[2] = 1.0f + cmyk[2] * cmyk[3] - cmyk[3] - cmyk[2];
|
||||
return rgb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts RGB components of a color to a set of CMYK components.
|
||||
*
|
||||
* @param rgb a float array with length of at least 3
|
||||
* that contains RGB components of a color
|
||||
* @param cmyk a float array with length equal to
|
||||
* the number of CMYK components
|
||||
* @return a float array that contains CMYK components
|
||||
*/
|
||||
private static float[] RGBtoCMYK(float[] rgb, float[] cmyk) {
|
||||
if (cmyk == null) {
|
||||
cmyk = new float[4];
|
||||
}
|
||||
float max = ColorModelHSL.max(rgb[0], rgb[1], rgb[2]);
|
||||
if (max > 0.0f) {
|
||||
cmyk[0] = 1.0f - rgb[0] / max;
|
||||
cmyk[1] = 1.0f - rgb[1] / max;
|
||||
cmyk[2] = 1.0f - rgb[2] / max;
|
||||
}
|
||||
else {
|
||||
cmyk[0] = 0.0f;
|
||||
cmyk[1] = 0.0f;
|
||||
cmyk[2] = 0.0f;
|
||||
}
|
||||
cmyk[3] = 1.0f - max;
|
||||
return cmyk;
|
||||
}
|
||||
}
|
@ -0,0 +1,188 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
final class ColorModelHSL extends ColorModel {
|
||||
|
||||
ColorModelHSL() {
|
||||
super("hsl", "Hue", "Saturation", "Lightness", "Transparency"); // NON-NLS: components
|
||||
}
|
||||
|
||||
@Override
|
||||
void setColor(int color, float[] space) {
|
||||
super.setColor(color, space);
|
||||
RGBtoHSL(space, space);
|
||||
space[3] = 1.0f - space[3];
|
||||
}
|
||||
|
||||
@Override
|
||||
int getColor(float[] space) {
|
||||
space[3] = 1.0f - space[3];
|
||||
HSLtoRGB(space, space);
|
||||
return super.getColor(space);
|
||||
}
|
||||
|
||||
@Override
|
||||
int getMaximum(int index) {
|
||||
return (index == 0) ? 360 : 100;
|
||||
}
|
||||
|
||||
@Override
|
||||
float getDefault(int index) {
|
||||
return (index == 0) ? -1.0f : (index == 2) ? 0.5f : 1.0f;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts HSL components of a color to a set of RGB components.
|
||||
*
|
||||
* @param hsl a float array with length equal to
|
||||
* the number of HSL components
|
||||
* @param rgb a float array with length of at least 3
|
||||
* that contains RGB components of a color
|
||||
* @return a float array that contains RGB components
|
||||
*/
|
||||
private static float[] HSLtoRGB(float[] hsl, float[] rgb) {
|
||||
if (rgb == null) {
|
||||
rgb = new float[3];
|
||||
}
|
||||
float hue = hsl[0];
|
||||
float saturation = hsl[1];
|
||||
float lightness = hsl[2];
|
||||
|
||||
if (saturation > 0.0f) {
|
||||
hue = (hue < 1.0f) ? hue * 6.0f : 0.0f;
|
||||
float q = lightness + saturation * ((lightness > 0.5f) ? 1.0f - lightness : lightness);
|
||||
float p = 2.0f * lightness - q;
|
||||
rgb[0]= normalize(q, p, (hue < 4.0f) ? (hue + 2.0f) : (hue - 4.0f));
|
||||
rgb[1]= normalize(q, p, hue);
|
||||
rgb[2]= normalize(q, p, (hue < 2.0f) ? (hue + 4.0f) : (hue - 2.0f));
|
||||
}
|
||||
else {
|
||||
rgb[0] = lightness;
|
||||
rgb[1] = lightness;
|
||||
rgb[2] = lightness;
|
||||
}
|
||||
return rgb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts RGB components of a color to a set of HSL components.
|
||||
*
|
||||
* @param rgb a float array with length of at least 3
|
||||
* that contains RGB components of a color
|
||||
* @param hsl a float array with length equal to
|
||||
* the number of HSL components
|
||||
* @return a float array that contains HSL components
|
||||
*/
|
||||
private static float[] RGBtoHSL(float[] rgb, float[] hsl) {
|
||||
if (hsl == null) {
|
||||
hsl = new float[3];
|
||||
}
|
||||
float max = max(rgb[0], rgb[1], rgb[2]);
|
||||
float min = min(rgb[0], rgb[1], rgb[2]);
|
||||
|
||||
float summa = max + min;
|
||||
float saturation = max - min;
|
||||
if (saturation > 0.0f) {
|
||||
saturation /= (summa > 1.0f)
|
||||
? 2.0f - summa
|
||||
: summa;
|
||||
}
|
||||
hsl[0] = getHue(rgb[0], rgb[1], rgb[2], max, min);
|
||||
hsl[1] = saturation;
|
||||
hsl[2] = summa / 2.0f;
|
||||
return hsl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three color components.
|
||||
*
|
||||
* @param red the red component of the color
|
||||
* @param green the green component of the color
|
||||
* @param blue the blue component of the color
|
||||
* @return the smaller of {@code red}, {@code green} and {@code blue}
|
||||
*/
|
||||
static float min(float red, float green, float blue) {
|
||||
float min = (red < green) ? red : green;
|
||||
return (min < blue) ? min : blue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the larger of three color components.
|
||||
*
|
||||
* @param red the red component of the color
|
||||
* @param green the green component of the color
|
||||
* @param blue the blue component of the color
|
||||
* @return the larger of {@code red}, {@code green} and {@code blue}
|
||||
*/
|
||||
static float max(float red, float green, float blue) {
|
||||
float max = (red > green) ? red : green;
|
||||
return (max > blue) ? max : blue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the hue component for HSL and HSV color spaces.
|
||||
*
|
||||
* @param red the red component of the color
|
||||
* @param green the green component of the color
|
||||
* @param blue the blue component of the color
|
||||
* @param max the larger of {@code red}, {@code green} and {@code blue}
|
||||
* @param min the smaller of {@code red}, {@code green} and {@code blue}
|
||||
* @return the hue component
|
||||
*/
|
||||
static float getHue(float red, float green, float blue, float max, float min) {
|
||||
float hue = max - min;
|
||||
if (hue > 0.0f) {
|
||||
if (max == red) {
|
||||
hue = (green - blue) / hue;
|
||||
if (hue < 0.0f) {
|
||||
hue += 6.0f;
|
||||
}
|
||||
}
|
||||
else if (max == green) {
|
||||
hue = 2.0f + (blue - red) / hue;
|
||||
}
|
||||
else /*max == blue*/ {
|
||||
hue = 4.0f + (red - green) / hue;
|
||||
}
|
||||
hue /= 6.0f;
|
||||
}
|
||||
return hue;
|
||||
}
|
||||
|
||||
private static float normalize(float q, float p, float color) {
|
||||
if (color < 1.0f) {
|
||||
return p + (q - p) * color;
|
||||
}
|
||||
if (color < 3.0f) {
|
||||
return q;
|
||||
}
|
||||
if (color < 4.0f) {
|
||||
return p + (q - p) * (4.0f - color);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
}
|
@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
final class ColorModelHSV extends ColorModel {
|
||||
|
||||
ColorModelHSV() {
|
||||
super("hsv", "Hue", "Saturation", "Value", "Transparency"); // NON-NLS: components
|
||||
}
|
||||
|
||||
@Override
|
||||
void setColor(int color, float[] space) {
|
||||
super.setColor(color, space);
|
||||
RGBtoHSV(space, space);
|
||||
space[3] = 1.0f - space[3];
|
||||
}
|
||||
|
||||
@Override
|
||||
int getColor(float[] space) {
|
||||
space[3] = 1.0f - space[3];
|
||||
HSVtoRGB(space, space);
|
||||
return super.getColor(space);
|
||||
}
|
||||
|
||||
@Override
|
||||
int getMaximum(int index) {
|
||||
return (index == 0) ? 360 : 100;
|
||||
}
|
||||
|
||||
@Override
|
||||
float getDefault(int index) {
|
||||
return (index == 0) ? -1.0f : 1.0f;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts HSV components of a color to a set of RGB components.
|
||||
*
|
||||
* @param hsv a float array with length equal to
|
||||
* the number of HSV components
|
||||
* @param rgb a float array with length of at least 3
|
||||
* that contains RGB components of a color
|
||||
* @return a float array that contains RGB components
|
||||
*/
|
||||
private static float[] HSVtoRGB(float[] hsv, float[] rgb) {
|
||||
if (rgb == null) {
|
||||
rgb = new float[3];
|
||||
}
|
||||
float hue = hsv[0];
|
||||
float saturation = hsv[1];
|
||||
float value = hsv[2];
|
||||
|
||||
rgb[0] = value;
|
||||
rgb[1] = value;
|
||||
rgb[2] = value;
|
||||
|
||||
if (saturation > 0.0f) {
|
||||
hue = (hue < 1.0f) ? hue * 6.0f : 0.0f;
|
||||
int integer = (int) hue;
|
||||
float f = hue - (float) integer;
|
||||
switch (integer) {
|
||||
case 0:
|
||||
rgb[1] *= 1.0f - saturation * (1.0f - f);
|
||||
rgb[2] *= 1.0f - saturation;
|
||||
break;
|
||||
case 1:
|
||||
rgb[0] *= 1.0f - saturation * f;
|
||||
rgb[2] *= 1.0f - saturation;
|
||||
break;
|
||||
case 2:
|
||||
rgb[0] *= 1.0f - saturation;
|
||||
rgb[2] *= 1.0f - saturation * (1.0f - f);
|
||||
break;
|
||||
case 3:
|
||||
rgb[0] *= 1.0f - saturation;
|
||||
rgb[1] *= 1.0f - saturation * f;
|
||||
break;
|
||||
case 4:
|
||||
rgb[0] *= 1.0f - saturation * (1.0f - f);
|
||||
rgb[1] *= 1.0f - saturation;
|
||||
break;
|
||||
case 5:
|
||||
rgb[1] *= 1.0f - saturation;
|
||||
rgb[2] *= 1.0f - saturation * f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return rgb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts RGB components of a color to a set of HSV components.
|
||||
*
|
||||
* @param rgb a float array with length of at least 3
|
||||
* that contains RGB components of a color
|
||||
* @param hsv a float array with length equal to
|
||||
* the number of HSV components
|
||||
* @return a float array that contains HSV components
|
||||
*/
|
||||
private static float[] RGBtoHSV(float[] rgb, float[] hsv) {
|
||||
if (hsv == null) {
|
||||
hsv = new float[3];
|
||||
}
|
||||
float max = ColorModelHSL.max(rgb[0], rgb[1], rgb[2]);
|
||||
float min = ColorModelHSL.min(rgb[0], rgb[1], rgb[2]);
|
||||
|
||||
float saturation = max - min;
|
||||
if (saturation > 0.0f) {
|
||||
saturation /= max;
|
||||
}
|
||||
hsv[0] = ColorModelHSL.getHue(rgb[0], rgb[1], rgb[2], max, min);
|
||||
hsv[1] = saturation;
|
||||
hsv[2] = max;
|
||||
return hsv;
|
||||
}
|
||||
}
|
210
jdk/src/share/classes/javax/swing/colorchooser/ColorPanel.java
Normal file
210
jdk/src/share/classes/javax/swing/colorchooser/ColorPanel.java
Normal file
@ -0,0 +1,210 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.ContainerOrderFocusTraversalPolicy;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
final class ColorPanel extends JPanel implements ActionListener {
|
||||
|
||||
private final SlidingSpinner[] spinners = new SlidingSpinner[5];
|
||||
private final float[] values = new float[this.spinners.length];
|
||||
|
||||
private final ColorModel model;
|
||||
private Color color;
|
||||
private int x = 1;
|
||||
private int y = 2;
|
||||
private int z;
|
||||
|
||||
ColorPanel(ColorModel model) {
|
||||
super(new GridBagLayout());
|
||||
|
||||
GridBagConstraints gbc = new GridBagConstraints();
|
||||
gbc.fill = GridBagConstraints.HORIZONTAL;
|
||||
|
||||
gbc.gridx = 1;
|
||||
ButtonGroup group = new ButtonGroup();
|
||||
EmptyBorder border = null;
|
||||
for (int i = 0; i < this.spinners.length; i++) {
|
||||
if (i < 3) {
|
||||
JRadioButton button = new JRadioButton();
|
||||
if (i == 0) {
|
||||
Insets insets = button.getInsets();
|
||||
insets.left = button.getPreferredSize().width;
|
||||
border = new EmptyBorder(insets);
|
||||
button.setSelected(true);
|
||||
gbc.insets.top = 5;
|
||||
}
|
||||
add(button, gbc);
|
||||
group.add(button);
|
||||
button.setActionCommand(Integer.toString(i));
|
||||
button.addActionListener(this);
|
||||
this.spinners[i] = new SlidingSpinner(this, button);
|
||||
}
|
||||
else {
|
||||
JLabel label = new JLabel();
|
||||
add(label, gbc);
|
||||
label.setBorder(border);
|
||||
label.setFocusable(false);
|
||||
this.spinners[i] = new SlidingSpinner(this, label);
|
||||
}
|
||||
}
|
||||
gbc.gridx = 2;
|
||||
gbc.weightx = 1.0;
|
||||
gbc.insets.top = 0;
|
||||
gbc.insets.left = 5;
|
||||
for (SlidingSpinner spinner : this.spinners) {
|
||||
add(spinner.getSlider(), gbc);
|
||||
gbc.insets.top = 5;
|
||||
}
|
||||
gbc.gridx = 3;
|
||||
gbc.weightx = 0.0;
|
||||
gbc.insets.top = 0;
|
||||
for (SlidingSpinner spinner : this.spinners) {
|
||||
add(spinner.getSpinner(), gbc);
|
||||
gbc.insets.top = 5;
|
||||
}
|
||||
setFocusTraversalPolicy(new ContainerOrderFocusTraversalPolicy());
|
||||
setFocusTraversalPolicyProvider(true);
|
||||
setFocusable(false);
|
||||
|
||||
this.model = model;
|
||||
}
|
||||
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
try {
|
||||
this.z = Integer.parseInt(event.getActionCommand());
|
||||
this.y = (this.z != 2) ? 2 : 1;
|
||||
this.x = (this.z != 0) ? 0 : 1;
|
||||
getParent().repaint();
|
||||
}
|
||||
catch (NumberFormatException exception) {
|
||||
}
|
||||
}
|
||||
|
||||
void buildPanel() {
|
||||
int count = this.model.getCount();
|
||||
this.spinners[4].setVisible(count > 4);
|
||||
for (int i = 0; i < count; i++) {
|
||||
Object object = this.spinners[i].getLabel();
|
||||
if (object instanceof JRadioButton) {
|
||||
JRadioButton button = (JRadioButton) object;
|
||||
button.setText(this.model.getLabel(this, i));
|
||||
}
|
||||
else if (object instanceof JLabel) {
|
||||
JLabel label = (JLabel) object;
|
||||
label.setText(this.model.getLabel(this, i));
|
||||
}
|
||||
this.spinners[i].setRange(this.model.getMinimum(i), this.model.getMaximum(i));
|
||||
this.spinners[i].setValue(this.values[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void colorChanged() {
|
||||
this.color = new Color(getColor(0), true);
|
||||
Object parent = getParent();
|
||||
if (parent instanceof ColorChooserPanel) {
|
||||
ColorChooserPanel chooser = (ColorChooserPanel) parent;
|
||||
chooser.getColorSelectionModel().setSelectedColor(this.color);
|
||||
chooser.repaint();
|
||||
}
|
||||
}
|
||||
|
||||
float getValueX() {
|
||||
return this.spinners[this.x].getValue();
|
||||
}
|
||||
|
||||
float getValueY() {
|
||||
return 1.0f - this.spinners[this.y].getValue();
|
||||
}
|
||||
|
||||
float getValueZ() {
|
||||
return 1.0f - this.spinners[this.z].getValue();
|
||||
}
|
||||
|
||||
void setValue(float z) {
|
||||
this.spinners[this.z].setValue(1.0f - z);
|
||||
colorChanged();
|
||||
}
|
||||
|
||||
void setValue(float x, float y) {
|
||||
this.spinners[this.x].setValue(x);
|
||||
this.spinners[this.y].setValue(1.0f - y);
|
||||
colorChanged();
|
||||
}
|
||||
|
||||
int getColor(float z) {
|
||||
setDefaultValue(this.x);
|
||||
setDefaultValue(this.y);
|
||||
this.values[this.z] = 1.0f - z;
|
||||
return getColor(3);
|
||||
}
|
||||
|
||||
int getColor(float x, float y) {
|
||||
this.values[this.x] = x;
|
||||
this.values[this.y] = 1.0f - y;
|
||||
setValue(this.z);
|
||||
return getColor(3);
|
||||
}
|
||||
|
||||
void setColor(Color color) {
|
||||
if (!color.equals(this.color)) {
|
||||
this.color = color;
|
||||
this.model.setColor(color.getRGB(), this.values);
|
||||
for (int i = 0; i < this.model.getCount(); i++) {
|
||||
this.spinners[i].setValue(this.values[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int getColor(int index) {
|
||||
while (index < this.model.getCount()) {
|
||||
setValue(index++);
|
||||
}
|
||||
return this.model.getColor(this.values);
|
||||
}
|
||||
|
||||
private void setValue(int index) {
|
||||
this.values[index] = this.spinners[index].getValue();
|
||||
}
|
||||
|
||||
private void setDefaultValue(int index) {
|
||||
float value = this.model.getDefault(index);
|
||||
this.values[index] = (value < 0.0f)
|
||||
? this.spinners[index].getValue()
|
||||
: value;
|
||||
}
|
||||
}
|
@ -1,801 +0,0 @@
|
||||
/*
|
||||
* Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.event.*;
|
||||
import javax.swing.border.*;
|
||||
import java.awt.image.*;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Implements the default HSB Color chooser
|
||||
*
|
||||
* @author Tom Santos
|
||||
* @author Steve Wilson
|
||||
* @author Mark Davidson
|
||||
* @author Shannon Hickey
|
||||
*/
|
||||
class DefaultHSBChooserPanel extends AbstractColorChooserPanel implements ChangeListener, HierarchyListener {
|
||||
|
||||
private transient HSBImage palette;
|
||||
private transient HSBImage sliderPalette;
|
||||
|
||||
private transient Image paletteImage;
|
||||
private transient Image sliderPaletteImage;
|
||||
|
||||
private JSlider slider;
|
||||
private JSpinner hField;
|
||||
private JSpinner sField;
|
||||
private JSpinner bField;
|
||||
|
||||
private JTextField redField;
|
||||
private JTextField greenField;
|
||||
private JTextField blueField;
|
||||
|
||||
private boolean isAdjusting = false; // Flag which indicates that values are set internally
|
||||
private Point paletteSelection = new Point();
|
||||
private JLabel paletteLabel;
|
||||
private JLabel sliderPaletteLabel;
|
||||
|
||||
private JRadioButton hRadio;
|
||||
private JRadioButton sRadio;
|
||||
private JRadioButton bRadio;
|
||||
|
||||
private static final int PALETTE_DIMENSION = 200;
|
||||
private static final int MAX_HUE_VALUE = 359;
|
||||
private static final int MAX_SATURATION_VALUE = 100;
|
||||
private static final int MAX_BRIGHTNESS_VALUE = 100;
|
||||
|
||||
private int currentMode = HUE_MODE;
|
||||
|
||||
private static final int HUE_MODE = 0;
|
||||
private static final int SATURATION_MODE = 1;
|
||||
private static final int BRIGHTNESS_MODE = 2;
|
||||
|
||||
public DefaultHSBChooserPanel() {
|
||||
}
|
||||
|
||||
private void addPaletteListeners() {
|
||||
paletteLabel.addMouseListener(new MouseAdapter() {
|
||||
public void mousePressed(MouseEvent e ) {
|
||||
float[] hsb = new float[3];
|
||||
palette.getHSBForLocation( e.getX(), e.getY(), hsb );
|
||||
updateHSB( hsb[0], hsb[1], hsb[2] );
|
||||
}
|
||||
});
|
||||
|
||||
paletteLabel.addMouseMotionListener(new MouseMotionAdapter() {
|
||||
public void mouseDragged( MouseEvent e ){
|
||||
int labelWidth = paletteLabel.getWidth();
|
||||
|
||||
int labelHeight = paletteLabel.getHeight();
|
||||
int x = e.getX();
|
||||
int y = e.getY();
|
||||
|
||||
if ( x >= labelWidth ) {
|
||||
x = labelWidth - 1;
|
||||
}
|
||||
|
||||
if ( y >= labelHeight ) {
|
||||
y = labelHeight - 1;
|
||||
}
|
||||
|
||||
if ( x < 0 ) {
|
||||
x = 0;
|
||||
}
|
||||
|
||||
if ( y < 0 ) {
|
||||
y = 0;
|
||||
}
|
||||
|
||||
float[] hsb = new float[3];
|
||||
palette.getHSBForLocation( x, y, hsb );
|
||||
updateHSB( hsb[0], hsb[1], hsb[2] );
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void updatePalette( float h, float s, float b ) {
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
|
||||
switch ( currentMode ) {
|
||||
case HUE_MODE:
|
||||
if ( h != palette.getHue() ) {
|
||||
palette.setHue( h );
|
||||
palette.nextFrame();
|
||||
}
|
||||
x = PALETTE_DIMENSION - (int)(s * PALETTE_DIMENSION);
|
||||
y = PALETTE_DIMENSION - (int)(b * PALETTE_DIMENSION);
|
||||
break;
|
||||
case SATURATION_MODE:
|
||||
if ( s != palette.getSaturation() ) {
|
||||
palette.setSaturation( s );
|
||||
palette.nextFrame();
|
||||
}
|
||||
x = (int)(h * PALETTE_DIMENSION);
|
||||
y = PALETTE_DIMENSION - (int)(b * PALETTE_DIMENSION);
|
||||
break;
|
||||
case BRIGHTNESS_MODE:
|
||||
if ( b != palette.getBrightness() ) {
|
||||
palette.setBrightness( b );
|
||||
palette.nextFrame();
|
||||
}
|
||||
x = (int)(h * PALETTE_DIMENSION);
|
||||
y = PALETTE_DIMENSION - (int)(s * PALETTE_DIMENSION);
|
||||
break;
|
||||
}
|
||||
|
||||
paletteSelection.setLocation( x, y );
|
||||
paletteLabel.repaint();
|
||||
}
|
||||
|
||||
private void updateSlider( float h, float s, float b ) {
|
||||
// Update the slider palette if necessary.
|
||||
// When the slider is the hue slider or the hue hasn't changed,
|
||||
// the hue of the palette will not need to be updated.
|
||||
if (currentMode != HUE_MODE && h != sliderPalette.getHue() ) {
|
||||
sliderPalette.setHue( h );
|
||||
sliderPalette.nextFrame();
|
||||
}
|
||||
|
||||
float value = 0f;
|
||||
|
||||
switch ( currentMode ) {
|
||||
case HUE_MODE:
|
||||
value = h;
|
||||
break;
|
||||
case SATURATION_MODE:
|
||||
value = s;
|
||||
break;
|
||||
case BRIGHTNESS_MODE:
|
||||
value = b;
|
||||
break;
|
||||
}
|
||||
|
||||
slider.setValue( Math.round(value * (slider.getMaximum())) );
|
||||
}
|
||||
|
||||
private void updateHSBTextFields( float hue, float saturation, float brightness ) {
|
||||
int h = Math.round(hue * 359);
|
||||
int s = Math.round(saturation * 100);
|
||||
int b = Math.round(brightness * 100);
|
||||
|
||||
if (((Integer)hField.getValue()).intValue() != h) {
|
||||
hField.setValue(new Integer(h));
|
||||
}
|
||||
if (((Integer)sField.getValue()).intValue() != s) {
|
||||
sField.setValue(new Integer(s));
|
||||
}
|
||||
if (((Integer)bField.getValue()).intValue() != b) {
|
||||
bField.setValue(new Integer(b));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the values of the RGB fields to reflect the new color change
|
||||
*/
|
||||
private void updateRGBTextFields( Color color ) {
|
||||
redField.setText(String.valueOf(color.getRed()));
|
||||
greenField.setText(String.valueOf(color.getGreen()));
|
||||
blueField.setText(String.valueOf(color.getBlue()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Main internal method of updating the ui controls and the color model.
|
||||
*/
|
||||
private void updateHSB( float h, float s, float b ) {
|
||||
if ( !isAdjusting ) {
|
||||
isAdjusting = true;
|
||||
|
||||
updatePalette( h, s, b );
|
||||
updateSlider( h, s, b );
|
||||
updateHSBTextFields( h, s, b );
|
||||
|
||||
Color color = Color.getHSBColor(h, s, b);
|
||||
updateRGBTextFields( color );
|
||||
|
||||
getColorSelectionModel().setSelectedColor( color );
|
||||
|
||||
isAdjusting = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked automatically when the model's state changes.
|
||||
* It is also called by <code>installChooserPanel</code> to allow
|
||||
* you to set up the initial state of your chooser.
|
||||
* Override this method to update your <code>ChooserPanel</code>.
|
||||
*/
|
||||
public void updateChooser() {
|
||||
if ( !isAdjusting ) {
|
||||
float[] hsb = getHSBColorFromModel();
|
||||
updateHSB( hsb[0], hsb[1], hsb[2] );
|
||||
}
|
||||
}
|
||||
|
||||
public void installChooserPanel(JColorChooser enclosingChooser) {
|
||||
super.installChooserPanel(enclosingChooser);
|
||||
setInheritsPopupMenu(true);
|
||||
addHierarchyListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when the panel is removed from the chooser.
|
||||
*/
|
||||
public void uninstallChooserPanel(JColorChooser enclosingChooser) {
|
||||
super.uninstallChooserPanel(enclosingChooser);
|
||||
cleanupPalettesIfNecessary();
|
||||
removeAll();
|
||||
removeHierarchyListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an float array containing the HSB values of the selected color from
|
||||
* the ColorSelectionModel
|
||||
*/
|
||||
private float[] getHSBColorFromModel() {
|
||||
Color color = getColorFromModel();
|
||||
float[] hsb = new float[3];
|
||||
Color.RGBtoHSB( color.getRed(), color.getGreen(), color.getBlue(), hsb );
|
||||
|
||||
return hsb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a new chooser panel.
|
||||
*/
|
||||
protected void buildChooser() {
|
||||
setLayout(new BorderLayout());
|
||||
JComponent spp = buildSliderPalettePanel();
|
||||
spp.setInheritsPopupMenu(true);
|
||||
add(spp, BorderLayout.BEFORE_LINE_BEGINS);
|
||||
|
||||
JPanel controlHolder = new JPanel(new SmartGridLayout(1,3));
|
||||
JComponent hsbControls = buildHSBControls();
|
||||
hsbControls.setInheritsPopupMenu(true);
|
||||
controlHolder.add(hsbControls);
|
||||
|
||||
controlHolder.add(new JLabel(" ")); // spacer
|
||||
|
||||
JComponent rgbControls = buildRGBControls();
|
||||
rgbControls.setInheritsPopupMenu(true);
|
||||
controlHolder.add(rgbControls);
|
||||
controlHolder.setInheritsPopupMenu(true);
|
||||
|
||||
controlHolder.setBorder(new EmptyBorder( 10, 5, 10, 5));
|
||||
add( controlHolder, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the panel with the uneditable RGB field
|
||||
*/
|
||||
private JComponent buildRGBControls() {
|
||||
JPanel panel = new JPanel(new SmartGridLayout(2,3));
|
||||
panel.setInheritsPopupMenu(true);
|
||||
|
||||
Color color = getColorFromModel();
|
||||
redField = new JTextField( String.valueOf(color.getRed()), 3 );
|
||||
redField.setEditable(false);
|
||||
redField.setHorizontalAlignment( JTextField.RIGHT );
|
||||
redField.setInheritsPopupMenu(true);
|
||||
|
||||
greenField = new JTextField(String.valueOf(color.getGreen()), 3 );
|
||||
greenField.setEditable(false);
|
||||
greenField.setHorizontalAlignment( JTextField.RIGHT );
|
||||
greenField.setInheritsPopupMenu(true);
|
||||
|
||||
blueField = new JTextField( String.valueOf(color.getBlue()), 3 );
|
||||
blueField.setEditable(false);
|
||||
blueField.setHorizontalAlignment( JTextField.RIGHT );
|
||||
blueField.setInheritsPopupMenu(true);
|
||||
|
||||
Locale locale = getLocale();
|
||||
String redString = UIManager.getString("ColorChooser.hsbRedText", locale);
|
||||
String greenString = UIManager.getString("ColorChooser.hsbGreenText", locale);
|
||||
String blueString = UIManager.getString("ColorChooser.hsbBlueText", locale);
|
||||
|
||||
panel.add( new JLabel(redString) );
|
||||
panel.add( redField );
|
||||
panel.add( new JLabel(greenString) );
|
||||
panel.add( greenField );
|
||||
panel.add( new JLabel(blueString) );
|
||||
panel.add( blueField );
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the panel with the editable HSB fields and the radio buttons.
|
||||
*/
|
||||
private JComponent buildHSBControls() {
|
||||
|
||||
Locale locale = getLocale();
|
||||
String hueString = UIManager.getString("ColorChooser.hsbHueText", locale);
|
||||
String saturationString = UIManager.getString("ColorChooser.hsbSaturationText", locale);
|
||||
String brightnessString = UIManager.getString("ColorChooser.hsbBrightnessText", locale);
|
||||
|
||||
RadioButtonHandler handler = new RadioButtonHandler();
|
||||
|
||||
hRadio = new JRadioButton(hueString);
|
||||
hRadio.addActionListener(handler);
|
||||
hRadio.setSelected(true);
|
||||
hRadio.setInheritsPopupMenu(true);
|
||||
|
||||
sRadio = new JRadioButton(saturationString);
|
||||
sRadio.addActionListener(handler);
|
||||
sRadio.setInheritsPopupMenu(true);
|
||||
|
||||
bRadio = new JRadioButton(brightnessString);
|
||||
bRadio.addActionListener(handler);
|
||||
bRadio.setInheritsPopupMenu(true);
|
||||
|
||||
ButtonGroup group = new ButtonGroup();
|
||||
group.add(hRadio);
|
||||
group.add(sRadio);
|
||||
group.add(bRadio);
|
||||
|
||||
float[] hsb = getHSBColorFromModel();
|
||||
|
||||
hField = new JSpinner(new SpinnerNumberModel((int)(hsb[0] * 359), 0, 359, 1));
|
||||
sField = new JSpinner(new SpinnerNumberModel((int)(hsb[1] * 100), 0, 100, 1));
|
||||
bField = new JSpinner(new SpinnerNumberModel((int)(hsb[2] * 100), 0, 100, 1));
|
||||
|
||||
hField.addChangeListener(this);
|
||||
sField.addChangeListener(this);
|
||||
bField.addChangeListener(this);
|
||||
|
||||
hField.setInheritsPopupMenu(true);
|
||||
sField.setInheritsPopupMenu(true);
|
||||
bField.setInheritsPopupMenu(true);
|
||||
|
||||
JPanel panel = new JPanel( new SmartGridLayout(2, 3) );
|
||||
|
||||
panel.add(hRadio);
|
||||
panel.add(hField);
|
||||
panel.add(sRadio);
|
||||
panel.add(sField);
|
||||
panel.add(bRadio);
|
||||
panel.add(bField);
|
||||
panel.setInheritsPopupMenu(true);
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for the radio button classes.
|
||||
*/
|
||||
private class RadioButtonHandler implements ActionListener {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
Object obj = evt.getSource();
|
||||
|
||||
if (obj instanceof JRadioButton) {
|
||||
JRadioButton button = (JRadioButton)obj;
|
||||
if (button == hRadio) {
|
||||
setMode(HUE_MODE);
|
||||
} else if (button == sRadio) {
|
||||
setMode(SATURATION_MODE);
|
||||
} else if (button == bRadio) {
|
||||
setMode(BRIGHTNESS_MODE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setMode(int mode) {
|
||||
if (currentMode == mode) {
|
||||
return;
|
||||
}
|
||||
|
||||
isAdjusting = true; // Ensure no events propagate from changing slider value.
|
||||
currentMode = mode;
|
||||
|
||||
float[] hsb = getHSBColorFromModel();
|
||||
|
||||
switch (currentMode) {
|
||||
case HUE_MODE:
|
||||
slider.setInverted(true);
|
||||
slider.setMaximum(MAX_HUE_VALUE);
|
||||
palette.setValues(HSBImage.HSQUARE, hsb[0], 1.0f, 1.0f);
|
||||
sliderPalette.setValues(HSBImage.HSLIDER, 0f, 1.0f, 1.0f);
|
||||
break;
|
||||
case SATURATION_MODE:
|
||||
slider.setInverted(false);
|
||||
slider.setMaximum(MAX_SATURATION_VALUE);
|
||||
palette.setValues(HSBImage.SSQUARE, hsb[0], hsb[1], 1.0f);
|
||||
sliderPalette.setValues(HSBImage.SSLIDER, hsb[0], 1.0f, 1.0f);
|
||||
break;
|
||||
case BRIGHTNESS_MODE:
|
||||
slider.setInverted(false);
|
||||
slider.setMaximum(MAX_BRIGHTNESS_VALUE);
|
||||
palette.setValues(HSBImage.BSQUARE, hsb[0], 1.0f, hsb[2]);
|
||||
sliderPalette.setValues(HSBImage.BSLIDER, hsb[0], 1.0f, 1.0f);
|
||||
break;
|
||||
}
|
||||
|
||||
isAdjusting = false;
|
||||
|
||||
palette.nextFrame();
|
||||
sliderPalette.nextFrame();
|
||||
|
||||
updateChooser();
|
||||
}
|
||||
|
||||
protected JComponent buildSliderPalettePanel() {
|
||||
|
||||
// This slider has to have a minimum of 0. A lot of math in this file is simplified due to this.
|
||||
slider = new JSlider(JSlider.VERTICAL, 0, MAX_HUE_VALUE, 0);
|
||||
slider.setInverted(true);
|
||||
slider.setPaintTrack(false);
|
||||
slider.setPreferredSize(new Dimension(slider.getPreferredSize().width, PALETTE_DIMENSION + 15));
|
||||
slider.addChangeListener(this);
|
||||
slider.setInheritsPopupMenu(true);
|
||||
// We're not painting ticks, but need to ask UI classes to
|
||||
// paint arrow shape anyway, if possible.
|
||||
slider.putClientProperty("Slider.paintThumbArrowShape", Boolean.TRUE);
|
||||
paletteLabel = createPaletteLabel();
|
||||
addPaletteListeners();
|
||||
sliderPaletteLabel = new JLabel();
|
||||
|
||||
JPanel panel = new JPanel();
|
||||
panel.add( paletteLabel );
|
||||
panel.add( slider );
|
||||
panel.add( sliderPaletteLabel );
|
||||
|
||||
initializePalettesIfNecessary();
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
private void initializePalettesIfNecessary() {
|
||||
if (palette != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
float[] hsb = getHSBColorFromModel();
|
||||
|
||||
switch(currentMode){
|
||||
case HUE_MODE:
|
||||
palette = new HSBImage(HSBImage.HSQUARE, PALETTE_DIMENSION, PALETTE_DIMENSION, hsb[0], 1.0f, 1.0f);
|
||||
sliderPalette = new HSBImage(HSBImage.HSLIDER, 16, PALETTE_DIMENSION, 0f, 1.0f, 1.0f);
|
||||
break;
|
||||
case SATURATION_MODE:
|
||||
palette = new HSBImage(HSBImage.SSQUARE, PALETTE_DIMENSION, PALETTE_DIMENSION, 1.0f, hsb[1], 1.0f);
|
||||
sliderPalette = new HSBImage(HSBImage.SSLIDER, 16, PALETTE_DIMENSION, 1.0f, 0f, 1.0f);
|
||||
break;
|
||||
case BRIGHTNESS_MODE:
|
||||
palette = new HSBImage(HSBImage.BSQUARE, PALETTE_DIMENSION, PALETTE_DIMENSION, 1.0f, 1.0f, hsb[2]);
|
||||
sliderPalette = new HSBImage(HSBImage.BSLIDER, 16, PALETTE_DIMENSION, 1.0f, 1.0f, 0f);
|
||||
break;
|
||||
}
|
||||
paletteImage = Toolkit.getDefaultToolkit().createImage(palette);
|
||||
sliderPaletteImage = Toolkit.getDefaultToolkit().createImage(sliderPalette);
|
||||
|
||||
paletteLabel.setIcon(new ImageIcon(paletteImage));
|
||||
sliderPaletteLabel.setIcon(new ImageIcon(sliderPaletteImage));
|
||||
}
|
||||
|
||||
private void cleanupPalettesIfNecessary() {
|
||||
if (palette == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
palette.aborted = true;
|
||||
sliderPalette.aborted = true;
|
||||
|
||||
palette.nextFrame();
|
||||
sliderPalette.nextFrame();
|
||||
|
||||
palette = null;
|
||||
sliderPalette = null;
|
||||
|
||||
paletteImage = null;
|
||||
sliderPaletteImage = null;
|
||||
|
||||
paletteLabel.setIcon(null);
|
||||
sliderPaletteLabel.setIcon(null);
|
||||
}
|
||||
|
||||
protected JLabel createPaletteLabel() {
|
||||
return new JLabel() {
|
||||
protected void paintComponent( Graphics g ) {
|
||||
super.paintComponent( g );
|
||||
g.setColor( Color.white );
|
||||
g.drawOval( paletteSelection.x - 4, paletteSelection.y - 4, 8, 8 );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return UIManager.getString("ColorChooser.hsbNameText", getLocale());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a hint to the look and feel as to the
|
||||
* <code>KeyEvent.VK</code> constant that can be used as a mnemonic to
|
||||
* access the panel. A return value <= 0 indicates there is no mnemonic.
|
||||
* <p>
|
||||
* The return value here is a hint, it is ultimately up to the look
|
||||
* and feel to honor the return value in some meaningful way.
|
||||
* <p>
|
||||
* This implementation looks up the value from the default
|
||||
* <code>ColorChooser.hsbMnemonic</code>, or if it
|
||||
* isn't available (or not an <code>Integer</code>) returns -1.
|
||||
* The lookup for the default is done through the <code>UIManager</code>:
|
||||
* <code>UIManager.get("ColorChooser.rgbMnemonic");</code>.
|
||||
*
|
||||
* @return KeyEvent.VK constant identifying the mnemonic; <= 0 for no
|
||||
* mnemonic
|
||||
* @see #getDisplayedMnemonicIndex
|
||||
* @since 1.4
|
||||
*/
|
||||
public int getMnemonic() {
|
||||
return getInt("ColorChooser.hsbMnemonic", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a hint to the look and feel as to the index of the character in
|
||||
* <code>getDisplayName</code> that should be visually identified as the
|
||||
* mnemonic. The look and feel should only use this if
|
||||
* <code>getMnemonic</code> returns a value > 0.
|
||||
* <p>
|
||||
* The return value here is a hint, it is ultimately up to the look
|
||||
* and feel to honor the return value in some meaningful way. For example,
|
||||
* a look and feel may wish to render each
|
||||
* <code>AbstractColorChooserPanel</code> in a <code>JTabbedPane</code>,
|
||||
* and further use this return value to underline a character in
|
||||
* the <code>getDisplayName</code>.
|
||||
* <p>
|
||||
* This implementation looks up the value from the default
|
||||
* <code>ColorChooser.rgbDisplayedMnemonicIndex</code>, or if it
|
||||
* isn't available (or not an <code>Integer</code>) returns -1.
|
||||
* The lookup for the default is done through the <code>UIManager</code>:
|
||||
* <code>UIManager.get("ColorChooser.hsbDisplayedMnemonicIndex");</code>.
|
||||
*
|
||||
* @return Character index to render mnemonic for; -1 to provide no
|
||||
* visual identifier for this panel.
|
||||
* @see #getMnemonic
|
||||
* @since 1.4
|
||||
*/
|
||||
public int getDisplayedMnemonicIndex() {
|
||||
return getInt("ColorChooser.hsbDisplayedMnemonicIndex", -1);
|
||||
}
|
||||
|
||||
public Icon getSmallDisplayIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Icon getLargeDisplayIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Class for the slider and palette images.
|
||||
*/
|
||||
class HSBImage extends SyntheticImage {
|
||||
protected float h = .0f;
|
||||
protected float s = .0f;
|
||||
protected float b = .0f;
|
||||
protected float[] hsb = new float[3];
|
||||
|
||||
protected boolean isDirty = true;
|
||||
protected int cachedY;
|
||||
protected int cachedColor;
|
||||
protected int type;
|
||||
|
||||
private static final int HSQUARE = 0;
|
||||
private static final int SSQUARE = 1;
|
||||
private static final int BSQUARE = 2;
|
||||
private static final int HSLIDER = 3;
|
||||
private static final int SSLIDER = 4;
|
||||
private static final int BSLIDER = 5;
|
||||
|
||||
protected HSBImage(int type, int width, int height, float h, float s, float b) {
|
||||
super(width, height);
|
||||
setValues(type, h, s, b);
|
||||
}
|
||||
|
||||
public void setValues(int type, float h, float s, float b) {
|
||||
this.type = type;
|
||||
cachedY = -1;
|
||||
cachedColor = 0;
|
||||
setHue( h );
|
||||
setSaturation( s );
|
||||
setBrightness( b );
|
||||
}
|
||||
|
||||
public final void setHue( float hue ) {
|
||||
h = hue;
|
||||
}
|
||||
|
||||
public final void setSaturation( float saturation ) {
|
||||
s = saturation;
|
||||
}
|
||||
|
||||
public final void setBrightness( float brightness ) {
|
||||
b = brightness;
|
||||
}
|
||||
|
||||
public final float getHue() {
|
||||
return h;
|
||||
}
|
||||
|
||||
public final float getSaturation() {
|
||||
return s;
|
||||
}
|
||||
|
||||
public final float getBrightness() {
|
||||
return b;
|
||||
}
|
||||
|
||||
protected boolean isStatic() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public synchronized void nextFrame() {
|
||||
isDirty = true;
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
public synchronized void addConsumer(ImageConsumer ic) {
|
||||
isDirty = true;
|
||||
super.addConsumer(ic);
|
||||
}
|
||||
|
||||
private int getRGBForLocation( int x, int y ) {
|
||||
if (type >= HSLIDER && y == cachedY) {
|
||||
return cachedColor;
|
||||
}
|
||||
|
||||
getHSBForLocation( x, y, hsb );
|
||||
cachedY = y;
|
||||
cachedColor = Color.HSBtoRGB( hsb[0], hsb[1], hsb[2] );
|
||||
|
||||
return cachedColor;
|
||||
}
|
||||
|
||||
public void getHSBForLocation( int x, int y, float[] hsbArray ) {
|
||||
switch (type) {
|
||||
case HSQUARE: {
|
||||
float saturationStep = ((float)x) / width;
|
||||
float brightnessStep = ((float)y) / height;
|
||||
hsbArray[0] = h;
|
||||
hsbArray[1] = s - saturationStep;
|
||||
hsbArray[2] = b - brightnessStep;
|
||||
break;
|
||||
}
|
||||
case SSQUARE: {
|
||||
float brightnessStep = ((float)y) / height;
|
||||
float step = 1.0f / ((float)width);
|
||||
hsbArray[0] = x * step;
|
||||
hsbArray[1] = s;
|
||||
hsbArray[2] = 1.0f - brightnessStep;
|
||||
break;
|
||||
}
|
||||
case BSQUARE: {
|
||||
float saturationStep = ((float)y) / height;
|
||||
float step = 1.0f / ((float)width);
|
||||
hsbArray[0] = x * step;
|
||||
hsbArray[1] = 1.0f - saturationStep;
|
||||
hsbArray[2] = b;
|
||||
break;
|
||||
}
|
||||
case HSLIDER: {
|
||||
float step = 1.0f / ((float)height);
|
||||
hsbArray[0] = y * step;
|
||||
hsbArray[1] = s;
|
||||
hsbArray[2] = b;
|
||||
break;
|
||||
}
|
||||
case SSLIDER: {
|
||||
float saturationStep = ((float)y) / height;
|
||||
hsbArray[0] = h;
|
||||
hsbArray[1] = s - saturationStep;
|
||||
hsbArray[2] = b;
|
||||
break;
|
||||
}
|
||||
case BSLIDER: {
|
||||
float brightnessStep = ((float)y) / height;
|
||||
hsbArray[0] = h;
|
||||
hsbArray[1] = s;
|
||||
hsbArray[2] = b - brightnessStep;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Overriden method from SyntheticImage
|
||||
*/
|
||||
protected void computeRow( int y, int[] row ) {
|
||||
if ( y == 0 ) {
|
||||
synchronized ( this ) {
|
||||
try {
|
||||
while ( !isDirty ) {
|
||||
wait();
|
||||
}
|
||||
} catch (InterruptedException ie) {
|
||||
}
|
||||
isDirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (aborted) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( int i = 0; i < row.length; ++i ) {
|
||||
row[i] = getRGBForLocation( i, y );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
if (e.getSource() == slider) {
|
||||
boolean modelIsAdjusting = slider.getModel().getValueIsAdjusting();
|
||||
|
||||
if (!modelIsAdjusting && !isAdjusting) {
|
||||
int sliderValue = slider.getValue();
|
||||
int sliderRange = slider.getMaximum();
|
||||
float value = (float)sliderValue / (float)sliderRange;
|
||||
|
||||
float[] hsb = getHSBColorFromModel();
|
||||
|
||||
switch ( currentMode ){
|
||||
case HUE_MODE:
|
||||
updateHSB(value, hsb[1], hsb[2]);
|
||||
break;
|
||||
case SATURATION_MODE:
|
||||
updateHSB(hsb[0], value, hsb[2]);
|
||||
break;
|
||||
case BRIGHTNESS_MODE:
|
||||
updateHSB(hsb[0], hsb[1], value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (e.getSource() instanceof JSpinner) {
|
||||
float hue = ((Integer)hField.getValue()).floatValue() / 359f;
|
||||
float saturation = ((Integer)sField.getValue()).floatValue() / 100f;
|
||||
float brightness = ((Integer)bField.getValue()).floatValue() / 100f;
|
||||
|
||||
updateHSB(hue, saturation, brightness);
|
||||
}
|
||||
}
|
||||
|
||||
public void hierarchyChanged(HierarchyEvent he) {
|
||||
if ((he.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
|
||||
if (isDisplayable()) {
|
||||
initializePalettesIfNecessary();
|
||||
} else {
|
||||
cleanupPalettesIfNecessary();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,294 +0,0 @@
|
||||
/*
|
||||
* Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
import java.awt.*;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* The standard RGB chooser.
|
||||
* <p>
|
||||
* <strong>Warning:</strong>
|
||||
* Serialized objects of this class will not be compatible with
|
||||
* future Swing releases. The current serialization support is
|
||||
* appropriate for short term storage or RMI between applications running
|
||||
* the same version of Swing. As of 1.4, support for long term storage
|
||||
* of all JavaBeans<sup><font size="-2">TM</font></sup>
|
||||
* has been added to the <code>java.beans</code> package.
|
||||
* Please see {@link java.beans.XMLEncoder}.
|
||||
*
|
||||
* @author Steve Wilson
|
||||
* @author Mark Davidson
|
||||
* @see JColorChooser
|
||||
* @see AbstractColorChooserPanel
|
||||
*/
|
||||
class DefaultRGBChooserPanel extends AbstractColorChooserPanel implements ChangeListener {
|
||||
|
||||
protected JSlider redSlider;
|
||||
protected JSlider greenSlider;
|
||||
protected JSlider blueSlider;
|
||||
protected JSpinner redField;
|
||||
protected JSpinner blueField;
|
||||
protected JSpinner greenField;
|
||||
|
||||
private final int minValue = 0;
|
||||
private final int maxValue = 255;
|
||||
|
||||
private boolean isAdjusting = false; // indicates the fields are being set internally
|
||||
|
||||
public DefaultRGBChooserPanel() {
|
||||
super();
|
||||
setInheritsPopupMenu(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the values of the controls to reflect the color
|
||||
*/
|
||||
private void setColor( Color newColor ) {
|
||||
int red = newColor.getRed();
|
||||
int blue = newColor.getBlue();
|
||||
int green = newColor.getGreen();
|
||||
|
||||
if (redSlider.getValue() != red) {
|
||||
redSlider.setValue(red);
|
||||
}
|
||||
if (greenSlider.getValue() != green) {
|
||||
greenSlider.setValue(green);
|
||||
}
|
||||
if (blueSlider.getValue() != blue) {
|
||||
blueSlider.setValue(blue);
|
||||
}
|
||||
|
||||
if (((Integer)redField.getValue()).intValue() != red)
|
||||
redField.setValue(new Integer(red));
|
||||
if (((Integer)greenField.getValue()).intValue() != green)
|
||||
greenField.setValue(new Integer(green));
|
||||
if (((Integer)blueField.getValue()).intValue() != blue )
|
||||
blueField.setValue(new Integer(blue));
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return UIManager.getString("ColorChooser.rgbNameText", getLocale());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a hint to the look and feel as to the
|
||||
* <code>KeyEvent.VK</code> constant that can be used as a mnemonic to
|
||||
* access the panel. A return value <= 0 indicates there is no mnemonic.
|
||||
* <p>
|
||||
* The return value here is a hint, it is ultimately up to the look
|
||||
* and feel to honor the return value in some meaningful way.
|
||||
* <p>
|
||||
* This implementation looks up the value from the default
|
||||
* <code>ColorChooser.rgbMnemonic</code>, or if it
|
||||
* isn't available (or not an <code>Integer</code>) returns -1.
|
||||
* The lookup for the default is done through the <code>UIManager</code>:
|
||||
* <code>UIManager.get("ColorChooser.rgbMnemonic");</code>.
|
||||
*
|
||||
* @return KeyEvent.VK constant identifying the mnemonic; <= 0 for no
|
||||
* mnemonic
|
||||
* @see #getDisplayedMnemonicIndex
|
||||
* @since 1.4
|
||||
*/
|
||||
public int getMnemonic() {
|
||||
return getInt("ColorChooser.rgbMnemonic", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a hint to the look and feel as to the index of the character in
|
||||
* <code>getDisplayName</code> that should be visually identified as the
|
||||
* mnemonic. The look and feel should only use this if
|
||||
* <code>getMnemonic</code> returns a value > 0.
|
||||
* <p>
|
||||
* The return value here is a hint, it is ultimately up to the look
|
||||
* and feel to honor the return value in some meaningful way. For example,
|
||||
* a look and feel may wish to render each
|
||||
* <code>AbstractColorChooserPanel</code> in a <code>JTabbedPane</code>,
|
||||
* and further use this return value to underline a character in
|
||||
* the <code>getDisplayName</code>.
|
||||
* <p>
|
||||
* This implementation looks up the value from the default
|
||||
* <code>ColorChooser.rgbDisplayedMnemonicIndex</code>, or if it
|
||||
* isn't available (or not an <code>Integer</code>) returns -1.
|
||||
* The lookup for the default is done through the <code>UIManager</code>:
|
||||
* <code>UIManager.get("ColorChooser.rgbDisplayedMnemonicIndex");</code>.
|
||||
*
|
||||
* @return Character index to render mnemonic for; -1 to provide no
|
||||
* visual identifier for this panel.
|
||||
* @see #getMnemonic
|
||||
* @since 1.4
|
||||
*/
|
||||
public int getDisplayedMnemonicIndex() {
|
||||
return getInt("ColorChooser.rgbDisplayedMnemonicIndex", -1);
|
||||
}
|
||||
|
||||
public Icon getSmallDisplayIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Icon getLargeDisplayIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The background color, foreground color, and font are already set to the
|
||||
* defaults from the defaults table before this method is called.
|
||||
*/
|
||||
public void installChooserPanel(JColorChooser enclosingChooser) {
|
||||
super.installChooserPanel(enclosingChooser);
|
||||
}
|
||||
|
||||
protected void buildChooser() {
|
||||
|
||||
Locale locale = getLocale();
|
||||
String redString = UIManager.getString("ColorChooser.rgbRedText", locale);
|
||||
String greenString = UIManager.getString("ColorChooser.rgbGreenText", locale);
|
||||
String blueString = UIManager.getString("ColorChooser.rgbBlueText", locale);
|
||||
|
||||
setLayout( new BorderLayout() );
|
||||
Color color = getColorFromModel();
|
||||
|
||||
|
||||
JPanel enclosure = new JPanel();
|
||||
enclosure.setLayout( new SmartGridLayout( 3, 3 ) );
|
||||
enclosure.setInheritsPopupMenu(true);
|
||||
|
||||
// The panel that holds the sliders
|
||||
|
||||
add( enclosure, BorderLayout.CENTER );
|
||||
// sliderPanel.setBorder(new LineBorder(Color.black));
|
||||
|
||||
// The row for the red value
|
||||
JLabel l = new JLabel(redString);
|
||||
l.setDisplayedMnemonic(getInt("ColorChooser.rgbRedMnemonic", -1));
|
||||
enclosure.add(l);
|
||||
redSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getRed());
|
||||
redSlider.setMajorTickSpacing( 85 );
|
||||
redSlider.setMinorTickSpacing( 17 );
|
||||
redSlider.setPaintTicks( true );
|
||||
redSlider.setPaintLabels( true );
|
||||
redSlider.setInheritsPopupMenu(true);
|
||||
enclosure.add( redSlider );
|
||||
redField = new JSpinner(
|
||||
new SpinnerNumberModel(color.getRed(), minValue, maxValue, 1));
|
||||
l.setLabelFor(redSlider);
|
||||
redField.setInheritsPopupMenu(true);
|
||||
JPanel redFieldHolder = new JPanel(new CenterLayout());
|
||||
redFieldHolder.setInheritsPopupMenu(true);
|
||||
redField.addChangeListener(this);
|
||||
redFieldHolder.add(redField);
|
||||
enclosure.add(redFieldHolder);
|
||||
|
||||
|
||||
// The row for the green value
|
||||
l = new JLabel(greenString);
|
||||
l.setDisplayedMnemonic(getInt("ColorChooser.rgbGreenMnemonic", -1));
|
||||
enclosure.add(l);
|
||||
greenSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getGreen());
|
||||
greenSlider.setMajorTickSpacing( 85 );
|
||||
greenSlider.setMinorTickSpacing( 17 );
|
||||
greenSlider.setPaintTicks( true );
|
||||
greenSlider.setPaintLabels( true );
|
||||
greenSlider.setInheritsPopupMenu(true);
|
||||
enclosure.add(greenSlider);
|
||||
greenField = new JSpinner(
|
||||
new SpinnerNumberModel(color.getGreen(), minValue, maxValue, 1));
|
||||
l.setLabelFor(greenSlider);
|
||||
greenField.setInheritsPopupMenu(true);
|
||||
JPanel greenFieldHolder = new JPanel(new CenterLayout());
|
||||
greenFieldHolder.add(greenField);
|
||||
greenFieldHolder.setInheritsPopupMenu(true);
|
||||
greenField.addChangeListener(this);
|
||||
enclosure.add(greenFieldHolder);
|
||||
|
||||
// The slider for the blue value
|
||||
l = new JLabel(blueString);
|
||||
l.setDisplayedMnemonic(getInt("ColorChooser.rgbBlueMnemonic", -1));
|
||||
enclosure.add(l);
|
||||
blueSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getBlue());
|
||||
blueSlider.setMajorTickSpacing( 85 );
|
||||
blueSlider.setMinorTickSpacing( 17 );
|
||||
blueSlider.setPaintTicks( true );
|
||||
blueSlider.setPaintLabels( true );
|
||||
blueSlider.setInheritsPopupMenu(true);
|
||||
enclosure.add(blueSlider);
|
||||
blueField = new JSpinner(
|
||||
new SpinnerNumberModel(color.getBlue(), minValue, maxValue, 1));
|
||||
l.setLabelFor(blueSlider);
|
||||
blueField.setInheritsPopupMenu(true);
|
||||
JPanel blueFieldHolder = new JPanel(new CenterLayout());
|
||||
blueFieldHolder.add(blueField);
|
||||
blueField.addChangeListener(this);
|
||||
blueFieldHolder.setInheritsPopupMenu(true);
|
||||
enclosure.add(blueFieldHolder);
|
||||
|
||||
redSlider.addChangeListener( this );
|
||||
greenSlider.addChangeListener( this );
|
||||
blueSlider.addChangeListener( this );
|
||||
|
||||
redSlider.putClientProperty("JSlider.isFilled", Boolean.TRUE);
|
||||
greenSlider.putClientProperty("JSlider.isFilled", Boolean.TRUE);
|
||||
blueSlider.putClientProperty("JSlider.isFilled", Boolean.TRUE);
|
||||
}
|
||||
|
||||
public void uninstallChooserPanel(JColorChooser enclosingChooser) {
|
||||
super.uninstallChooserPanel(enclosingChooser);
|
||||
removeAll();
|
||||
}
|
||||
|
||||
public void updateChooser() {
|
||||
if (!isAdjusting) {
|
||||
isAdjusting = true;
|
||||
|
||||
setColor(getColorFromModel());
|
||||
|
||||
isAdjusting = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void stateChanged( ChangeEvent e ) {
|
||||
if ( e.getSource() instanceof JSlider && !isAdjusting) {
|
||||
|
||||
int red = redSlider.getValue();
|
||||
int green = greenSlider.getValue();
|
||||
int blue = blueSlider.getValue() ;
|
||||
Color color = new Color (red, green, blue);
|
||||
|
||||
getColorSelectionModel().setSelectedColor(color);
|
||||
} else if (e.getSource() instanceof JSpinner && !isAdjusting) {
|
||||
|
||||
int red = ((Integer)redField.getValue()).intValue();
|
||||
int green = ((Integer)greenField.getValue()).intValue();
|
||||
int blue = ((Integer)blueField.getValue()).intValue();
|
||||
Color color = new Color (red, green, blue);
|
||||
|
||||
getColorSelectionModel().setSelectedColor(color);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Insets;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.awt.event.MouseMotionListener;
|
||||
import java.awt.image.BufferedImage;
|
||||
import javax.swing.JComponent;
|
||||
|
||||
final class DiagramComponent extends JComponent implements MouseListener, MouseMotionListener {
|
||||
|
||||
private final ColorPanel panel;
|
||||
private final boolean diagram;
|
||||
|
||||
private final Insets insets = new Insets(0, 0, 0, 0);
|
||||
|
||||
private int width;
|
||||
private int height;
|
||||
|
||||
private int[] array;
|
||||
private BufferedImage image;
|
||||
|
||||
DiagramComponent(ColorPanel panel, boolean diagram) {
|
||||
this.panel = panel;
|
||||
this.diagram = diagram;
|
||||
addMouseListener(this);
|
||||
addMouseMotionListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paintComponent(Graphics g) {
|
||||
getInsets(this.insets);
|
||||
this.width = getWidth() - this.insets.left - this.insets.right;
|
||||
this.height = getHeight() - this.insets.top - this.insets.bottom;
|
||||
|
||||
boolean update = (this.image == null)
|
||||
|| (this.width != this.image.getWidth())
|
||||
|| (this.height != this.image.getHeight());
|
||||
if (update) {
|
||||
int size = this.width * this.height;
|
||||
if ((this.array == null) || (this.array.length < size)) {
|
||||
this.array = new int[size];
|
||||
}
|
||||
this.image = new BufferedImage(this.width, this.height, BufferedImage.TYPE_INT_RGB);
|
||||
}
|
||||
{
|
||||
float dx = 1.0f / (float) (this.width - 1);
|
||||
float dy = 1.0f / (float) (this.height - 1);
|
||||
|
||||
int offset = 0;
|
||||
float y = 0.0f;
|
||||
for (int h = 0; h < this.height; h++, y += dy) {
|
||||
if (this.diagram) {
|
||||
float x = 0.0f;
|
||||
for (int w = 0; w < this.width; w++, x += dx, offset++) {
|
||||
this.array[offset] = this.panel.getColor(x, y);
|
||||
}
|
||||
}
|
||||
else {
|
||||
int color = this.panel.getColor(y);
|
||||
for (int w = 0; w < this.width; w++, offset++) {
|
||||
this.array[offset] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.image.setRGB(0, 0, this.width, this.height, this.array, 0, this.width);
|
||||
g.drawImage(this.image, this.insets.left, this.insets.top, this.width, this.height, this);
|
||||
if (isEnabled()) {
|
||||
this.width--;
|
||||
this.height--;
|
||||
g.setXORMode(Color.WHITE);
|
||||
g.setColor(Color.BLACK);
|
||||
if (this.diagram) {
|
||||
int x = getValue(this.panel.getValueX(), this.insets.left, this.width);
|
||||
int y = getValue(this.panel.getValueY(), this.insets.top, this.height);
|
||||
g.drawLine(x - 8, y, x + 8, y);
|
||||
g.drawLine(x, y - 8, x, y + 8);
|
||||
}
|
||||
else {
|
||||
int z = getValue(this.panel.getValueZ(), this.insets.top, this.height);
|
||||
g.drawLine(this.insets.left, z, this.insets.left + this.width, z);
|
||||
}
|
||||
g.setPaintMode();
|
||||
}
|
||||
}
|
||||
|
||||
public void mousePressed(MouseEvent event) {
|
||||
mouseDragged(event);
|
||||
}
|
||||
|
||||
public void mouseReleased(MouseEvent event) {
|
||||
}
|
||||
|
||||
public void mouseClicked(MouseEvent event) {
|
||||
}
|
||||
|
||||
public void mouseEntered(MouseEvent event) {
|
||||
}
|
||||
|
||||
public void mouseExited(MouseEvent event) {
|
||||
}
|
||||
|
||||
public void mouseMoved(MouseEvent event) {
|
||||
}
|
||||
|
||||
public void mouseDragged(MouseEvent event) {
|
||||
if (isEnabled()) {
|
||||
float y = getValue(event.getY(), this.insets.top, this.height);
|
||||
if (this.diagram) {
|
||||
float x = getValue(event.getX(), this.insets.left, this.width);
|
||||
this.panel.setValue(x, y);
|
||||
}
|
||||
else {
|
||||
this.panel.setValue(y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static int getValue(float value, int min, int max) {
|
||||
return min + (int) (value * (float) (max));
|
||||
}
|
||||
|
||||
private static float getValue(int value, int min, int max) {
|
||||
if (min < value) {
|
||||
value -= min;
|
||||
return (value < max)
|
||||
? (float) value / (float) max
|
||||
: 1.0f;
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JSlider;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.JSpinner.DefaultEditor;
|
||||
import javax.swing.SpinnerNumberModel;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
|
||||
final class SlidingSpinner implements ChangeListener {
|
||||
|
||||
private final ColorPanel panel;
|
||||
private final JComponent label;
|
||||
private final SpinnerNumberModel model = new SpinnerNumberModel();
|
||||
private final JSlider slider = new JSlider();
|
||||
private final JSpinner spinner = new JSpinner(this.model);
|
||||
private float value;
|
||||
private boolean internal;
|
||||
|
||||
SlidingSpinner(ColorPanel panel, JComponent label) {
|
||||
this.panel = panel;
|
||||
this.label = label;
|
||||
this.slider.addChangeListener(this);
|
||||
this.spinner.addChangeListener(this);
|
||||
DefaultEditor editor = (DefaultEditor) this.spinner.getEditor();
|
||||
ValueFormatter.init(3, false, editor.getTextField());
|
||||
editor.setFocusable(false);
|
||||
this.spinner.setFocusable(false);
|
||||
}
|
||||
|
||||
JComponent getLabel() {
|
||||
return this.label;
|
||||
}
|
||||
|
||||
JSlider getSlider() {
|
||||
return this.slider;
|
||||
}
|
||||
|
||||
JSpinner getSpinner() {
|
||||
return this.spinner;
|
||||
}
|
||||
|
||||
float getValue() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
void setValue(float value) {
|
||||
int min = this.slider.getMinimum();
|
||||
int max = this.slider.getMaximum();
|
||||
this.internal = true;
|
||||
this.slider.setValue(min + (int) (value * (float) (max - min)));
|
||||
this.spinner.setValue(Integer.valueOf(this.slider.getValue()));
|
||||
this.internal = false;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
void setRange(int min, int max) {
|
||||
this.internal = true;
|
||||
this.slider.setMinimum(min);
|
||||
this.slider.setMaximum(max);
|
||||
this.model.setMinimum(Integer.valueOf(min));
|
||||
this.model.setMaximum(Integer.valueOf(max));
|
||||
this.internal = false;
|
||||
}
|
||||
|
||||
void setVisible(boolean visible) {
|
||||
this.label.setVisible(visible);
|
||||
this.slider.setVisible(visible);
|
||||
this.spinner.setVisible(visible);
|
||||
}
|
||||
|
||||
public void stateChanged(ChangeEvent event) {
|
||||
if (!this.internal) {
|
||||
if (this.spinner == event.getSource()) {
|
||||
Object value = this.spinner.getValue();
|
||||
if (value instanceof Integer) {
|
||||
this.internal = true;
|
||||
this.slider.setValue((Integer) value);
|
||||
this.internal = false;
|
||||
}
|
||||
}
|
||||
int value = this.slider.getValue();
|
||||
this.internal = true;
|
||||
this.spinner.setValue(Integer.valueOf(value));
|
||||
this.internal = false;
|
||||
int min = this.slider.getMinimum();
|
||||
int max = this.slider.getMaximum();
|
||||
this.value = (float) (value - min) / (float) (max - min);
|
||||
this.panel.colorChanged();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,166 +0,0 @@
|
||||
/*
|
||||
* Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.*;
|
||||
|
||||
/** A helper class to make computing synthetic images a little easier.
|
||||
* All you need to do is define a subclass that overrides computeRow
|
||||
* to compute a row of the image. It is passed the y coordinate of the
|
||||
* row and an array into which to put the pixels in
|
||||
* <a href="http://java.sun.com/products/jdk/1.1/docs/api/java.awt.image.ColorModel.html#getRGBdefault()">
|
||||
* standard ARGB format</a>.
|
||||
* <p>Normal usage looks something like this:
|
||||
* <pre> Image i = createImage(new SyntheticImage(200, 100) {
|
||||
* protected void computeRow(int y, int[] row) {
|
||||
* for(int i = width; --i>=0; ) {
|
||||
* int grey = i*255/(width-1);
|
||||
* row[i] = (255<<24)|(grey<<16)|(grey<<8)|grey;
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* </pre>This creates a image 200 pixels wide and 100 pixels high
|
||||
* that is a horizontal grey ramp, going from black on the left to
|
||||
* white on the right.
|
||||
* <p>
|
||||
* If the image is to be a movie, override isStatic to return false,
|
||||
* <i>y</i> cycling back to 0 is computeRow's signal that the next
|
||||
* frame has started. It is acceptable (expected?) for computeRow(0,r)
|
||||
* to pause until the appropriate time to start the next frame.
|
||||
*
|
||||
* @author James Gosling
|
||||
*/
|
||||
abstract class SyntheticImage implements ImageProducer {
|
||||
private SyntheticImageGenerator root;
|
||||
protected int width=10, height=100;
|
||||
static final ColorModel cm = ColorModel.getRGBdefault();
|
||||
public static final int pixMask = 0xFF;
|
||||
private Thread runner;
|
||||
protected SyntheticImage() { }
|
||||
protected SyntheticImage(int w, int h) { width = w; height = h; }
|
||||
protected void computeRow(int y, int[] row) {
|
||||
int p = 255-255*y/(height-1);
|
||||
p = (pixMask<<24)|(p<<16)|(p<<8)|p;
|
||||
for (int i = row.length; --i>=0; ) row[i] = p;
|
||||
}
|
||||
public synchronized void addConsumer(ImageConsumer ic){
|
||||
for (SyntheticImageGenerator ics = root; ics != null; ics = ics.next)
|
||||
if (ics.ic == ic) return;
|
||||
root = new SyntheticImageGenerator(ic, root, this);
|
||||
}
|
||||
public synchronized boolean isConsumer(ImageConsumer ic){
|
||||
for (SyntheticImageGenerator ics = root; ics != null; ics = ics.next)
|
||||
if (ics.ic == ic) return true;
|
||||
return false;
|
||||
}
|
||||
public synchronized void removeConsumer(ImageConsumer ic) {
|
||||
SyntheticImageGenerator prev = null;
|
||||
for (SyntheticImageGenerator ics = root; ics != null; ics = ics.next) {
|
||||
if (ics.ic == ic) {
|
||||
ics.useful = false;
|
||||
if (prev!=null) prev.next = ics.next;
|
||||
else root = ics.next;
|
||||
return;
|
||||
}
|
||||
prev = ics;
|
||||
}
|
||||
}
|
||||
public synchronized void startProduction(ImageConsumer ic) {
|
||||
addConsumer(ic);
|
||||
for (SyntheticImageGenerator ics = root; ics != null; ics = ics.next)
|
||||
if (ics.useful && !ics.isAlive())
|
||||
ics.start();
|
||||
}
|
||||
protected boolean isStatic() { return true; }
|
||||
public void nextFrame(int param) {}//Override if !isStatic
|
||||
public void requestTopDownLeftRightResend(ImageConsumer ic){}
|
||||
|
||||
protected volatile boolean aborted = false;
|
||||
}
|
||||
|
||||
class SyntheticImageGenerator extends Thread {
|
||||
ImageConsumer ic;
|
||||
boolean useful;
|
||||
SyntheticImageGenerator next;
|
||||
SyntheticImage parent;
|
||||
SyntheticImageGenerator(ImageConsumer ic, SyntheticImageGenerator next,
|
||||
SyntheticImage parent) {
|
||||
super("SyntheticImageGenerator");
|
||||
this.ic = ic;
|
||||
this.next = next;
|
||||
this.parent = parent;
|
||||
useful = true;
|
||||
setDaemon(true);
|
||||
}
|
||||
public void run() {
|
||||
ImageConsumer ic = this.ic;
|
||||
int w = parent.width;
|
||||
int h = parent.height;
|
||||
int hints = ic.SINGLEPASS|ic.COMPLETESCANLINES|ic.TOPDOWNLEFTRIGHT;
|
||||
if (parent.isStatic())
|
||||
hints |= ic.SINGLEFRAME;
|
||||
ic.setHints(hints);
|
||||
ic.setDimensions(w, h);
|
||||
ic.setProperties(null);
|
||||
ic.setColorModel(parent.cm);
|
||||
|
||||
if (useful) {
|
||||
int[] row=new int[w];
|
||||
doPrivileged( new Runnable() {
|
||||
public void run() {
|
||||
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
|
||||
}
|
||||
});
|
||||
|
||||
do {
|
||||
for (int y = 0; y<h && useful; y++) {
|
||||
parent.computeRow(y,row);
|
||||
|
||||
if (parent.aborted) {
|
||||
ic.imageComplete(ic.IMAGEABORTED);
|
||||
return;
|
||||
}
|
||||
|
||||
ic.setPixels(0, y, w, 1, parent.cm, row, 0, w);
|
||||
}
|
||||
ic.imageComplete(parent.isStatic() ? ic.STATICIMAGEDONE
|
||||
: ic.SINGLEFRAMEDONE );
|
||||
} while(!parent.isStatic() && useful);
|
||||
}
|
||||
}
|
||||
|
||||
private final static void doPrivileged(final Runnable doRun) {
|
||||
java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction() {
|
||||
public Object run() {
|
||||
doRun.run();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package javax.swing.colorchooser;
|
||||
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.FocusListener;
|
||||
import java.text.ParseException;
|
||||
import static java.util.Locale.ENGLISH;
|
||||
import javax.swing.JFormattedTextField;
|
||||
import javax.swing.JFormattedTextField.AbstractFormatter;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.text.AttributeSet;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.text.DefaultFormatterFactory;
|
||||
import javax.swing.text.DocumentFilter;
|
||||
|
||||
final class ValueFormatter extends AbstractFormatter implements FocusListener, Runnable {
|
||||
|
||||
static void init(int length, boolean hex, JFormattedTextField text) {
|
||||
ValueFormatter formatter = new ValueFormatter(length, hex);
|
||||
text.setColumns(length);
|
||||
text.setFormatterFactory(new DefaultFormatterFactory(formatter));
|
||||
text.setHorizontalAlignment(SwingConstants.RIGHT);
|
||||
text.setMinimumSize(text.getPreferredSize());
|
||||
text.addFocusListener(formatter);
|
||||
}
|
||||
|
||||
private final DocumentFilter filter = new DocumentFilter() {
|
||||
@Override
|
||||
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
|
||||
if (isValid(fb.getDocument().getLength() - length)) {
|
||||
fb.remove(offset, length);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet set) throws BadLocationException {
|
||||
if (isValid(fb.getDocument().getLength() + text.length() - length) && isValid(text)) {
|
||||
fb.replace(offset, length, text.toUpperCase(ENGLISH), set);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertString(FilterBypass fb, int offset, String text, AttributeSet set) throws BadLocationException {
|
||||
if (isValid(fb.getDocument().getLength() + text.length()) && isValid(text)) {
|
||||
fb.insertString(offset, text.toUpperCase(ENGLISH), set);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private final int length;
|
||||
private final int radix;
|
||||
|
||||
private JFormattedTextField text;
|
||||
|
||||
ValueFormatter(int length, boolean hex) {
|
||||
this.length = length;
|
||||
this.radix = hex ? 16 : 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object stringToValue(String text) throws ParseException {
|
||||
try {
|
||||
return Integer.valueOf(text, this.radix);
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
ParseException pe = new ParseException("illegal format", 0);
|
||||
pe.initCause(nfe);
|
||||
throw pe;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String valueToString(Object object) throws ParseException {
|
||||
if (object instanceof Integer) {
|
||||
if (this.radix == 10) {
|
||||
return object.toString();
|
||||
}
|
||||
int value = (Integer) object;
|
||||
int index = this.length;
|
||||
char[] array = new char[index];
|
||||
while (0 < index--) {
|
||||
array[index] = Character.forDigit(value & 0x0F, this.radix);
|
||||
value >>= 4;
|
||||
}
|
||||
return new String(array).toUpperCase(ENGLISH);
|
||||
}
|
||||
throw new ParseException("illegal object", 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DocumentFilter getDocumentFilter() {
|
||||
return this.filter;
|
||||
}
|
||||
|
||||
public void focusGained(FocusEvent event) {
|
||||
Object source = event.getSource();
|
||||
if (source instanceof JFormattedTextField) {
|
||||
this.text = (JFormattedTextField) source;
|
||||
SwingUtilities.invokeLater(this);
|
||||
}
|
||||
}
|
||||
|
||||
public void focusLost(FocusEvent event) {
|
||||
}
|
||||
|
||||
public void run() {
|
||||
if (this.text != null) {
|
||||
this.text.selectAll();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isValid(int length) {
|
||||
return (0 <= length) && (length <= this.length);
|
||||
}
|
||||
|
||||
private boolean isValid(String text) {
|
||||
int length = text.length();
|
||||
for (int i = 0; i < length; i++) {
|
||||
char ch = text.charAt(i);
|
||||
if (Character.digit(ch, this.radix) < 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -299,8 +299,10 @@ public class BasicColorChooserUI extends ColorChooserUI
|
||||
tabbedPane.addTab(name, centerWrapper);
|
||||
if (mnemonic > 0) {
|
||||
tabbedPane.setMnemonicAt(i, mnemonic);
|
||||
tabbedPane.setDisplayedMnemonicIndexAt(
|
||||
i, newPanels[i].getDisplayedMnemonicIndex());
|
||||
int index = newPanels[i].getDisplayedMnemonicIndex();
|
||||
if (index >= 0) {
|
||||
tabbedPane.setDisplayedMnemonicIndexAt(i, index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -34,14 +34,13 @@ import java.awt.Dimension;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.AbstractButton;
|
||||
import javax.swing.JColorChooser;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.WindowConstants;
|
||||
import javax.swing.colorchooser.AbstractColorChooserPanel;
|
||||
@ -59,31 +58,41 @@ public class Test6524757 {
|
||||
|
||||
"ColorChooser.swatchesNameText", // NON-NLS: string key from DefaultSwatchChooserPanel
|
||||
"ColorChooser.swatchesMnemonic", // NON-NLS: string key from DefaultSwatchChooserPanel:int
|
||||
"ColorChooser.swatchesDisplayedMnemonicIndex", // NON-NLS: int key from DefaultSwatchChooserPanel
|
||||
"ColorChooser.swatchesSwatchSize", // NON-NLS: dimension key from DefaultSwatchChooserPanel
|
||||
"ColorChooser.swatchesRecentText", // NON-NLS: string key from DefaultSwatchChooserPanel
|
||||
"ColorChooser.swatchesRecentSwatchSize", // NON-NLS: dimension key from DefaultSwatchChooserPanel
|
||||
//NotAvail: "ColorChooser.swatchesDefaultRecentColor", // NON-NLS: color key from DefaultSwatchChooserPanel
|
||||
|
||||
"ColorChooser.hsbNameText", // NON-NLS: string key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbMnemonic", // NON-NLS: int key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbDisplayedMnemonicIndex", // NON-NLS: int key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbHueText", // NON-NLS: string key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbSaturationText", // NON-NLS: string key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbBrightnessText", // NON-NLS: string key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbRedText", // NON-NLS: string key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbGreenText", // NON-NLS: string key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsbBlueText", // NON-NLS: string key from DefaultHSBChooserPanel
|
||||
"ColorChooser.hsvNameText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hsvMnemonic", // NON-NLS: int key from HSV ColorChooserPanel
|
||||
"ColorChooser.hsvHueText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hsvSaturationText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hsvValueText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hsvTransparencyText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
|
||||
"ColorChooser.rgbNameText", // NON-NLS: string key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbMnemonic", // NON-NLS: int key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbDisplayedMnemonicIndex", // NON-NLS: int key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbRedText", // NON-NLS: string key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbGreenText", // NON-NLS: string key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbBlueText", // NON-NLS: string key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbRedMnemonic", // NON-NLS: int key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbGreenMnemonic", // NON-NLS: int key from DefaultRGBChooserPanel
|
||||
"ColorChooser.rgbBlueMnemonic", // NON-NLS: int key from DefaultRGBChooserPanel
|
||||
"ColorChooser.hslNameText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hslMnemonic", // NON-NLS: int key from HSV ColorChooserPanel
|
||||
"ColorChooser.hslHueText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hslSaturationText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hslLightnessText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.hslTransparencyText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
|
||||
"ColorChooser.rgbNameText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.rgbMnemonic", // NON-NLS: int key from HSV ColorChooserPanel
|
||||
"ColorChooser.rgbRedText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.rgbGreenText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.rgbBlueText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.rgbAlphaText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.rgbHexCodeText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.rgbHexCodeMnemonic", // NON-NLS: int key from HSV ColorChooserPanel
|
||||
|
||||
"ColorChooser.cmykNameText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.cmykMnemonic", // NON-NLS: int key from HSV ColorChooserPanel
|
||||
"ColorChooser.cmykCyanText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.cmykMagentaText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.cmykYellowText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.cmykBlackText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
"ColorChooser.cmykAlphaText", // NON-NLS: string key from HSV ColorChooserPanel
|
||||
};
|
||||
private static final Object[] KOREAN = convert(Locale.KOREAN, KEYS);
|
||||
private static final Object[] FRENCH = convert(Locale.FRENCH, KEYS);
|
||||
@ -91,19 +100,15 @@ public class Test6524757 {
|
||||
public static void main(String[] args) {
|
||||
// it affects Swing because it is not initialized
|
||||
Locale.setDefault(Locale.KOREAN);
|
||||
Object[] korean = create();
|
||||
validate(KOREAN, create());
|
||||
|
||||
// it does not affect Swing because it is initialized
|
||||
Locale.setDefault(Locale.CANADA);
|
||||
Object[] canada = create();
|
||||
validate(KOREAN, create());
|
||||
|
||||
// it definitely should affect Swing
|
||||
JComponent.setDefaultLocale(Locale.FRENCH);
|
||||
Object[] french = create();
|
||||
|
||||
validate(KOREAN, korean);
|
||||
validate(KOREAN, canada);
|
||||
validate(FRENCH, french);
|
||||
validate(FRENCH, create());
|
||||
}
|
||||
|
||||
private static void validate(Object[] expected, Object[] actual) {
|
||||
@ -153,10 +158,47 @@ public class Test6524757 {
|
||||
|
||||
// process all values
|
||||
List<Object> list = new ArrayList<Object>(KEYS.length);
|
||||
addMain(list, dialog);
|
||||
addSwatch(list, chooser);
|
||||
addHSB(list, chooser);
|
||||
addRGB(list, chooser);
|
||||
|
||||
Component component = getC(getC(dialog.getLayeredPane(), 0), 1);
|
||||
AbstractButton ok = (AbstractButton) getC(component, 0);
|
||||
AbstractButton cancel = (AbstractButton) getC(component, 1);
|
||||
AbstractButton reset = (AbstractButton) getC(component, 2);
|
||||
list.add(ok.getText());
|
||||
list.add(cancel.getText());
|
||||
list.add(reset.getText());
|
||||
list.add(Integer.valueOf(reset.getMnemonic()));
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
AbstractColorChooserPanel panel = (AbstractColorChooserPanel) getC(getC(getC(chooser, 0), i), 0);
|
||||
list.add(panel.getDisplayName());
|
||||
list.add(Integer.valueOf(panel.getMnemonic()));
|
||||
if (i == 0) {
|
||||
JLabel label = (JLabel) getC(getC(panel, 0), 1);
|
||||
JPanel upper = (JPanel) getC(getC(getC(panel, 0), 0), 0);
|
||||
JPanel lower = (JPanel) getC(getC(getC(panel, 0), 2), 0);
|
||||
addSize(list, upper, 1, 1, 31, 9);
|
||||
list.add(label.getText());
|
||||
addSize(list, lower, 1, 1, 5, 7);
|
||||
}
|
||||
else {
|
||||
Component container = getC(panel, 0);
|
||||
for (int j = 0; j < 3; j++) {
|
||||
AbstractButton button = (AbstractButton) getC(container, j);
|
||||
list.add(button.getText());
|
||||
}
|
||||
JLabel label = (JLabel) getC(container, 3);
|
||||
list.add(label.getText());
|
||||
if (i == 4) {
|
||||
label = (JLabel) getC(container, 4);
|
||||
list.add(label.getText());
|
||||
}
|
||||
if (i == 3) {
|
||||
label = (JLabel) getC(panel, 1);
|
||||
list.add(label.getText());
|
||||
list.add(Integer.valueOf(label.getDisplayedMnemonic()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// close dialog
|
||||
dialog.setVisible(false);
|
||||
@ -169,56 +211,6 @@ public class Test6524757 {
|
||||
return list.toArray();
|
||||
}
|
||||
|
||||
private static void addMain(List<Object> list, JDialog dialog) {
|
||||
Component component = getC(getC(dialog.getLayeredPane(), 0), 1);
|
||||
JButton ok = (JButton) getC(component, 0);
|
||||
JButton cancel = (JButton) getC(component, 1);
|
||||
JButton reset = (JButton) getC(component, 2);
|
||||
list.add(ok.getText());
|
||||
list.add(cancel.getText());
|
||||
list.add(reset.getText());
|
||||
list.add(Integer.valueOf(reset.getMnemonic()));
|
||||
}
|
||||
|
||||
private static void addSwatch(List<Object> list, JColorChooser chooser) {
|
||||
Component component = addPanel(list, chooser, 0);
|
||||
JLabel label = (JLabel) getC(getC(component, 0), 1);
|
||||
JPanel upper = (JPanel) getC(getC(getC(component, 0), 0), 0);
|
||||
JPanel lower = (JPanel) getC(getC(getC(component, 0), 2), 0);
|
||||
addSize(list, upper, 1, 1, 31, 9);
|
||||
list.add(label.getText());
|
||||
addSize(list, lower, 1, 1, 5, 7);
|
||||
}
|
||||
|
||||
private static void addHSB(List<Object> list, JColorChooser chooser) {
|
||||
Component component = addPanel(list, chooser, 1);
|
||||
JRadioButton h = (JRadioButton) getC(getC(getC(component, 1), 0), 0);
|
||||
JRadioButton s = (JRadioButton) getC(getC(getC(component, 1), 0), 2);
|
||||
JRadioButton b = (JRadioButton) getC(getC(getC(component, 1), 0), 4);
|
||||
list.add(h.getText());
|
||||
list.add(s.getText());
|
||||
list.add(b.getText());
|
||||
JLabel red = (JLabel) getC(getC(getC(component, 1), 2), 0);
|
||||
JLabel green = (JLabel) getC(getC(getC(component, 1), 2), 2);
|
||||
JLabel blue = (JLabel) getC(getC(getC(component, 1), 2), 4);
|
||||
list.add(red.getText());
|
||||
list.add(green.getText());
|
||||
list.add(blue.getText());
|
||||
}
|
||||
|
||||
private static void addRGB(List<Object> list, JColorChooser chooser) {
|
||||
Component component = addPanel(list, chooser, 2);
|
||||
JLabel red = (JLabel) getC(getC(component, 0), 0);
|
||||
JLabel green = (JLabel) getC(getC(component, 0), 3);
|
||||
JLabel blue = (JLabel) getC(getC(component, 0), 6);
|
||||
list.add(red.getText());
|
||||
list.add(green.getText());
|
||||
list.add(blue.getText());
|
||||
list.add(Integer.valueOf(red.getDisplayedMnemonic()));
|
||||
list.add(Integer.valueOf(green.getDisplayedMnemonic()));
|
||||
list.add(Integer.valueOf(blue.getDisplayedMnemonic()));
|
||||
}
|
||||
|
||||
private static void addSize(List<Object> list, Component component, int x, int y, int w, int h) {
|
||||
Dimension size = component.getPreferredSize();
|
||||
int width = (size.width + 1) / w - x;
|
||||
@ -226,14 +218,6 @@ public class Test6524757 {
|
||||
list.add(new Dimension(width, height));
|
||||
}
|
||||
|
||||
private static Component addPanel(List<Object> list, JColorChooser chooser, int index) {
|
||||
AbstractColorChooserPanel panel = (AbstractColorChooserPanel) getC(getC(getC(chooser, 0), index), 0);
|
||||
list.add(panel.getDisplayName());
|
||||
list.add(Integer.valueOf(panel.getMnemonic()));
|
||||
list.add(Integer.valueOf(panel.getDisplayedMnemonicIndex()));
|
||||
return panel;
|
||||
}
|
||||
|
||||
private static Component getC(Component component, int index) {
|
||||
Container container = (Container) component;
|
||||
return container.getComponent(index);
|
||||
|
75
jdk/test/javax/swing/JColorChooser/Test6559154.java
Normal file
75
jdk/test/javax/swing/JColorChooser/Test6559154.java
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6559154
|
||||
* @summary Tests EDT hanging
|
||||
* @author Sergey Malenkov
|
||||
*/
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import javax.swing.JColorChooser;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.Timer;
|
||||
|
||||
public class Test6559154 implements ActionListener, Runnable {
|
||||
|
||||
private JDialog dialog;
|
||||
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
if (this.dialog != null) {
|
||||
this.dialog.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public void run() {
|
||||
Timer timer = new Timer(1000, this);
|
||||
timer.setRepeats(false);
|
||||
timer.start();
|
||||
|
||||
JColorChooser chooser = new JColorChooser();
|
||||
setEnabledRecursive(chooser, false);
|
||||
|
||||
this.dialog = new JDialog();
|
||||
this.dialog.add(chooser);
|
||||
this.dialog.setVisible(true);
|
||||
}
|
||||
|
||||
private static void setEnabledRecursive(Container container, boolean enabled) {
|
||||
for (Component component : container.getComponents()) {
|
||||
component.setEnabled(enabled);
|
||||
if (component instanceof Container) {
|
||||
setEnabledRecursive((Container) component, enabled);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
SwingUtilities.invokeAndWait(new Test6559154());
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user