/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
* Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of Oracle Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package colorchooser;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.image.Image;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextOrigin;
import colorchooser.FeedUtil;
import colorchooser.ImageButton;
public class ColorPalette extends CustomNode {
public var color = Color.RED;
var x = 0.0;
var y = 5.0;
var width = 225.0;
var height = 255.0;
var timeline = Timeline {
keyFrames: [
KeyFrame {
time: 0s
values: [ y => - (height + 3 - x) ]
},
KeyFrame {
time: 250ms
values: [ y => 5.0 tween Interpolator.EASEOUT ]
}
]
};
public var show = false on replace {
if(show) {
timeline.rate = 1;
timeline.playFromStart();
visible = true;
} else {
timeline.rate = -1;
timeline.time = 250ms;
timeline.play();
}
}
var bgRect = Rectangle {
width: width
height: height
strokeWidth: 5.0
stroke: Color.web("#505050")
fill: Color.web("#3E3E3E")
}
var innerRect = Rectangle {
x: 5
y: 35
width: width - 10
height: height - 80
fill: Color.web("#464646")
}
var paletteRect = Rectangle {
x: 20
y: innerRect.y + 15
width: width - 40
height: height - innerRect.y - 75
fill: Color.WHITE
}
var paletteWidth = (paletteRect.width - 10)/5.0;
var paletteHeight = paletteRect.height - 10;
var paletteColor:Rectangle[] = [
Rectangle {
id: "#ff0000"
fill: Color.web("#ff0000")
width: paletteWidth
height: paletteHeight
onMouseEntered: onMouseEntered
onMousePressed: onMousePressed
},
Rectangle {
id: "#00ff00"
fill: Color.web("#00ff00")
width: paletteWidth
height: paletteHeight
onMouseEntered: onMouseEntered
onMousePressed: onMousePressed
},
Rectangle {
id: "#0000ff"
fill: Color.web("#0000ff")
width: paletteWidth
height: paletteHeight
onMouseEntered: onMouseEntered
onMousePressed: onMousePressed
},
Rectangle {
id: "#ffffff"
fill: Color.WHITE
width: paletteWidth
height: paletteHeight
onMouseEntered: onMouseEntered
onMousePressed: onMousePressed
},
Rectangle {
id: "#000000"
fill: Color.BLACK
width: paletteWidth
height: paletteHeight
onMouseEntered: onMouseEntered
onMousePressed: onMousePressed
}
];
var line1 = Line {
startX: 5
startY: 5
endX: width - 5
endY: 5
stroke: Color.web("#393939")
}
var line2 = Line {
startX: 5
startY: height - 45
endX: width - 5
endY: height - 45
stroke: Color.web("#393939")
}
var line3 = Line {
startX: 5
startY: height - 46
endX: width - 5
endY: height - 46
stroke: Color.web("#414141")
}
var backButton:ImageButton = ImageButton {
translateX: 5
translateY: height - 40
normalImage: Image { url: "{__DIR__}images/back_n.png" }
disabledImage: Image { url: "{__DIR__}images/back_d.png" }
enabled: bind isBackButtonEnabled(index, topTitles, newTitles)
onMousePressed:function(e) {
if(not backButton.enabled) { return; }
index--;
if(index >= (sizeof topTitles)) {
var newIndex = index - (sizeof topTitles);
setPalette(newTitles[newIndex], newColors[newIndex]);
} else {
setPalette(topTitles[index], topColors[index]);
}
}
}
function isBackButtonEnabled(index:Integer, topTtls:String[], newTtls:String[]):Boolean {
return (index > 0);
}
var nextButton:ImageButton = ImageButton {
translateX: width - 38
translateY: height - 40
normalImage: Image { url: "{__DIR__}images/next_n.png" }
disabledImage: Image { url: "{__DIR__}images/next_d.png" }
enabled: bind isNextButtonEnabled(index, topTitles, newTitles)
onMousePressed: function(e) {
if(not nextButton.enabled) { return; }
index++;
if(index >= (sizeof topTitles)) {
var newIndex = index - (sizeof topTitles);
setPalette(newTitles[newIndex], newColors[newIndex]);
} else {
setPalette(topTitles[index], topColors[index]);
}
}
}
function isNextButtonEnabled(index:Integer, topTtls:String[], newTtls:String[]):Boolean {
return (((sizeof topTtls) + (sizeof newTtls)) > (index + 1));
}
var closeButton = ImageButton {
translateY: 0
translateX: width - 25
normalImage:Image {
url: "{__DIR__}images/close.png"
width: 32
height: 32
}
onMousePressed:function(e) {
show = false;
}
visible: ("{__PROFILE__}" != "browser")
}
var titleText :Text = Text {
translateX: bind (width - titleText.boundsInLocal.width)/2.0
translateY: 12
font:Font {
name: "dialog"
size: 14
}
fill: Color.WHITE
content: "Color Chooser"
textOrigin: TextOrigin.TOP
clip:Rectangle {
width: bind width - 70
height: bind height - 10
}
};
var colorRect:Rectangle = Rectangle {
x: backButton.translateX + backButton.boundsInLocal.width + 5
y: backButton.translateY + 5
width: nextButton.translateX - backButton.translateX - backButton.boundsInLocal.width - 10
height: backButton.boundsInLocal.height - 10
fill: Color.RED
arcWidth: 10
arcHeight: 10
stroke: Color.WHITE
strokeWidth: 2.0
}
var colorText:Text = Text {
translateX: bind colorRect.x + (colorRect.width - colorText.boundsInLocal.width)/2.0
translateY: bind colorRect.y + (colorRect.height - colorText.boundsInLocal.height)/2.0 + 1.0
font:Font {
name: "dialog"
size: 14
}
fill: Color.WHITE
content: "#ff000000"
textOrigin: TextOrigin.TOP
clip:Rectangle {
width: bind width - 70
height: bind height - 10
}
};
var newTitles:String[];
var newColors:String[];
var topTitles:String[];
var topColors:String[];
var index = 0;
init {
var newFeedUtil = FeedUtil {
url: "http:
updatePalette: updateNewPalette
};
newFeedUtil.start();
var topFeedUtil = FeedUtil {
url: "http:
updatePalette: updateTopPalette
};
topFeedUtil.start();
}
override function create():Node {
clip = Rectangle {
x: x
y: y
width: width
height: height
};
var colorBox = HBox {
translateX: paletteRect.x + 5
translateY: paletteRect.y + 5
content: paletteColor
};
Group {
translateX: bind x
translateY: bind y
content: [
bgRect,
innerRect,
paletteRect,
colorBox,
line1,
line2,
line3,
titleText,
backButton,
nextButton,
closeButton,
colorRect,
colorText
]
}
}
function setPalette(title:String, palette:String) {
titleText.content = title;
var colors:String[] = palette.split("/");
var index = 0;
for(color in colors) {
paletteColor[index].id = "#{color}";
paletteColor[index].fill = Color.web("#{color}");
index++;
}
}
public function updateNewPalette(ttls:String[], clrs:String[]):Void {
topTitles = ttls;
topColors = clrs;
}
public function updateTopPalette(ttls:String[], clrs:String[]):Void {
newTitles = ttls;
newColors = clrs;
}
function onMouseEntered(e:MouseEvent):Void {
colorRect.fill = (e.node as Rectangle).fill;
colorText.content = e.node.id;
}
function onMousePressed(e:MouseEvent):Void {
colorRect.fill = (e.node as Rectangle).fill;
color = Color.web("{e.node.id}");
show = false;
}
}