/*
* 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 screenshotmaker;
import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Polyline;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
/**
* Tooltip composed of a Rectangle and a Text. The Rectangle width is
* bound to the Text width.
*/
public class Tooltip extends CustomNode {
public-init var text:String;
var _root: Group;
var t:Text;
function initializeCustomNode():Void {
_root = Group {
content: [
Rectangle {
fill: Color.WHITE
stroke: Color.BLACK
strokeWidth: 3.0
x: 0
y: 0
//Bind the rectangle width with the Text width.
width: bind t.boundsInLocal.width + 20
height: 50
},
t = Text {
x: inset
y: 30 + inset
content: text
font:Font {
size: 30
name:"Verdana"
}
}
]
}
}
protected override function create() : Node {
if (_root == null) {
initializeCustomNode();
}
return _root;
}
}
/**
* Offers a visual feedback similar to a swing button
*/
public class ButtonFeedback extends CustomNode {
public-init var button:Group;
public-init var selected:Boolean on replace {
//The selected button background is greyed.
if(selected) {
button.content[0].opacity = 0.8;
}else {
button.content[0].opacity = 1;
}
}
public override var disable on replace {
//A disabled button is greyed.
if(disable) {
button.opacity = 0.5
} else {
button.opacity = 1
}
}
var _root:Group;
function initializeCustomNode():Void {
if(disable)
button.opacity = 0.5;
_root = Group {
content: [
//This white background makes the black elements
// of opacity < 1 to be greyed.
Rectangle {
width: 100
height: 100
fill: Color.WHITE
// Visible when not selected. If selected, we need the white
// components of opacity < 1 to be greyed.
visible:bind not selected},
// This black background makes the white elements
// of opacity < 1 to be greyed. This is needed for the
// selected background button.
Rectangle {
width: 100
height: 100
fill: Color.BLACK
// Visible when selected. If selected, we need the white
// components of opacity < 1 to be greyed.
visible: bind selected},
Polyline{visible: bind selected
stroke: Color.BLACK
strokeWidth: 3.0
points: [ 0, 100, 0, 0, 100, 0 ]
},
Polyline{
visible: bind selected
stroke: Color.WHITE
strokeWidth: 3.0
points: [ 0, 100, 100, 100, 100, 0 ]
},
button
]
}
}
protected override function create():Node {
if (_root == null) {
initializeCustomNode();
}
return _root;
}
}
/**
* A Palette containing Image tooling.
*/
public class Palette extends CustomNode {
public var dragBtn:ButtonFeedback;
public var dragToolTip:Tooltip;
public var fitToScreenBtn:ButtonFeedback;
public var fitToolTip:Tooltip;
public var originalSizeBtn:ButtonFeedback;
public var originalToolTip:Tooltip;
public var arrowBtn:ButtonFeedback;
public var arrowToolTip:Tooltip;
public var textBtn:ButtonFeedback;
public var textToolTip:Tooltip;
public var selectBtn:ButtonFeedback;
public var selectToolTip:Tooltip;
public var currentButton:ButtonFeedback on replace {
// All other buttons are unselected.
for(node in _root.content) {
if(not (node instanceof ButtonFeedback)) continue;
var b:ButtonFeedback = node as ButtonFeedback;
if(b.equals(currentButton) and not b.disable) {
b.selected = true;
} else {
b.selected = false;
}
// No button has an effect.
b.effect = null;
}
}
var _root:Group;
var offset:Number = 10;
var offsetTitle:Number = 50;
var inset:Number = 5;
public function reset() {
currentButton = null;
originalSizeBtn.disable = true;
dragBtn.disable = false;
fitToScreenBtn.disable = false;
}
function initializeCustomNode():Void {
_root = Group {
content: [
Rectangle {
arcHeight: 20
arcWidth: 20
fill: Color.WHITE
x: 0
y: 0
width: 337
height: 180
opacity:0.8
},
Text {
content:"Image"
font:Font{
size: 40
name: "Verdana"
}
x:offset
y:offsetTitle
},
dragBtn = ButtonFeedback {
translateX: offset
translateY: offsetTitle + offset * 2
button: Group {
id: "drag"
content: [
Rectangle {
fill: Color.WHITE
x: 0
y: 0
width: 100
height: 100
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 50
startY: 25
endX: 50
endY: 75
},
Polygon {
points: [ 30, 25, 50, inset, 70, 25 ]
fill: Color.BLACK
},
Polygon {
points: [ 30, 75, 70, 75, 50, 100 - inset ]
fill: Color.BLACK
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 25
startY: 50
endX: 75
endY: 50
},
Polygon {
points: [ inset, 50, 25, 30, 25, 70 ]
fill: Color.BLACK
},
Polygon {
points: [ 75, 30, 100 - inset, 50, 75, 70 ]
fill: Color.BLACK
},
]
}
},
dragToolTip = Tooltip {
translateX: offset
translateY: offsetTitle + offset * 2 + 105
text: "Drag Image"
},
fitToScreenBtn = ButtonFeedback {
translateX: 100 + offset * 2
translateY: offsetTitle + offset * 2
button:Group {
id: "fitToScreen"
content: [
Rectangle {
fill: Color.WHITE
x: 0
y: 0
width: 100
height: 100
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 3
startY: 3
endX: 28
endY: 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 15, 30, 30, 30, 30, 15 ]
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 3
startY: 100 - 3
endX: 28
endY: 100 - 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 30 - 15, 100 - 30, 30, 100 - 30, 30, 100 - 15]
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 100 - 3
startY: 3
endX: 100 - 28
endY: 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 100 - 30, 15, 100 - 30, 30,
100 - 15, 30 ]
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 100 - 3
startY: 100 - 3
endX: 100 - 28
endY: 100 - 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 100 - 30, 100 - 15,
100 - 30, 100 - 30,
100 - 15, 100 - 30 ]
}
]
}
},
fitToolTip = Tooltip {
translateX: 100 + offset * 2
translateY: offsetTitle + offset * 2 + 105
text: "Fit to screen"
},
originalSizeBtn = ButtonFeedback {
disable: true
translateX: 200 + offset * 3
translateY: offsetTitle + offset * 2
button:Group {
id: "originalSizeBtn"
content: [
Rectangle {
fill: Color.WHITE
x: 0
y: 0
width: 100
height: 100
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 40
startY: 40
endX: 45 - 28
endY: 45 - 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 45 - 30, 45 - 15,
45 - 30, 45 - 30,
45 - 15, 45 - 30 ]
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 100 - 40
startY: 40
endX: 100 - 45 + 28
endY: 45 - 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 100 - 45 + 15, 45 - 30,
100 - 45 + 30, 45 - 30,
100 - 45 + 30, 45 - 15 ]
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 100 - 40
startY: 60
endX: 100 - 45 + 28
endY: 55 + 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 100 - 45 + 30, 55 + 15,
100 - 45 + 30, 55 + 30,
100 - 45 + 15, 55 + 30 ]
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 40
startY: 60
endX: 45 - 28
endY: 55 + 28
},
Polyline {
stroke: Color.BLACK
strokeWidth: 5.0
points: [ 45 - 30, 55 + 15,
45 - 30, 55 + 30,
45 - 15, 55 + 30 ]
}
]
}
},
originalToolTip = Tooltip {
translateX: 200 + offset * 3 - 120
translateY: offsetTitle + offset * 2 + 105
text: "Original Size"
},
Rectangle {
arcHeight: 20
arcWidth: 20
fill: Color.WHITE
x: 0
y: 185
width: 337
height: 175
opacity: 0.8
},
Text{
content:"Tools"
font:Font {
size: 40
name: "Verdana"
}
x: offset
y: offsetTitle * 2 + offset * 3 + 100
},
arrowBtn = ButtonFeedback {
translateX: offset
translateY: offsetTitle * 2 + offset * 5 + 100
button:Group {
id: "arrowBtn"
content: [
Rectangle {
fill: Color.WHITE
x: 0
y: 0
width: 100
height: 100
},
Line {
stroke: Color.BLACK
strokeWidth: 5.0
startX: 25
startY: 50
endX: 60
endY: 50
},
Polygon {
points: [60 ,50 + 15,
60, 50 - 15,
85, 50]
fill: Color.BLACK
}
]
}
},
arrowToolTip = Tooltip {
translateX: offset
translateY: offsetTitle * 2 + offset * 5 + 100 + 105
text: "Add Arrow"
},
textBtn = ButtonFeedback {
translateX: offset * 2 + 100
translateY: offsetTitle * 2 + offset * 5 + 100
button:Group {
id: "text"
content: [
Rectangle {
fill: Color.WHITE
x: 0
y: 0
width: 100
height: 100
},
Text {
x: 20
y: 90
content: "T"
font:Font {
size: 100
name: "Times New Roman"
}
}
]
}
},
textToolTip = Tooltip {
translateX: offset * 2 + 100
translateY: offsetTitle * 2 + offset * 5 + 100 + 105
text: "Add Text"
},
selectBtn = ButtonFeedback {
translateX: offset * 3 + 200
translateY: offsetTitle * 2 + offset * 5 + 100
button:Group {
id: "select"
content: [
Rectangle {
fill: Color.WHITE
x: 0
y: 0
width: 100
height: 100
},
Polygon {
points: [ 25, 25,
25 + 50, 25,
25 + 50, 25 + 50,
25, 25 + 50 ]
strokeWidth: 2
stroke: Color.BLACK
fill: Color.CHARTREUSE
strokeDashOffset: 0
strokeDashArray: [ 5, 5 ]
}
]
}
},
selectToolTip = Tooltip {
translateX: offset * 3 + 200 - 120
translateY: offsetTitle * 2 + offset * 5 + 100 + 105
text: "Select Region"
}
]
}
}
protected override function create() : Node {
if (_root == null) {
initializeCustomNode();
}
return _root;
}
}