License text

/*
 * 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 stopwatch;

import javafx.scene.effect.*;
import javafx.scene.effect.light.*;
import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.shape.*;
import javafx.scene.image.*;
import javafx.scene.paint.*;
import javafx.scene.input.*;
import javafx.scene.transform.*;


public class LightTheme extends Theme {
     var resetPressedAmount:Integer = 7;
     var startPressedAmount:Integer = 7;

    init {
        var numOfMarks = 12;
        var numOfMinorMarks = 60;
        var minutesNumOfMarks = 10;
        var minutesNumOfMinorMarks = 50;
        var tenthsNumOfMarks = 10;
        var tenthsNumOfMinorMarks = 50;
        
        frontContent = Group {
            id: "Front"
            content: [
                // MAIN DIAL
                Group {
                    translateX: 40
                    translateY: 60
                    cache: true
                    content: [
                            ImageView {
                                translateX: 0
                                translateY: 0
                                image: Image {url: "{__DIR__}stopwatch.png"}
                            },
                        Circle {
                            centerX: 140
                            centerY: 140
                            radius: 140
                            fill: null
                            stroke: Color.web("#818a89")
                        },
                        // Tick Marks
                        Circle {
                            centerX: 140
                            centerY: 140
                            radius: 120
                            fill: null
                            strokeWidth: 0.5
                            stroke: Color.web("#0A0A0A")
                        },
                        Circle {
                            centerX: 140
                            centerY: 140
                            radius: 118
                            fill: null
                            strokeWidth: 0.5
                            stroke: Color.web("#0A0A0A")
                        },
                        for (i in [ 1..numOfMinorMarks ]) {
                            Line {
                                startX: 0
                                startY: 120
                                endX: 0 endY: 114
                                stroke: Color.rgb(10,10,10)
                                transforms: Transform.rotate((360/numOfMinorMarks)*i,0,0)
                                translateX: 140
                                translateY: 140
                            }
                        },
                        for (i in [ 1..numOfMarks ]) {
                            Line{
                                startX: 0
                                startY: 122
                                endX: 0
                                endY: 110
                                stroke: Color.rgb(10,10,10)
                                strokeWidth: 1.5
                                transforms: Transform.rotate((360/numOfMarks)*i,0,0)
                                translateX: 140
                                translateY: 140
                            }
                        },
//                        for (i in [1..numOfMinorMarks]) {
//                            Line{startX: 0 startY: 120 endX: 0 endY: 114
//                                    stroke: Color.web("#FFFFFF")
//                                    rotate: (360/numOfMinorMarks)*i
//                                    translateX: 140
//                                    translateY: 140}
//                        },
                        // Numbers
                        Text {
                            font:Font{
                                name: "Arial"
                                size: 16
                            }
                            x: 132
                            y: 244
                            content: "30"
                            textAlignment: TextAlignment.CENTER
                            fill: Color.web("#0A0A0A")
                        },
                        Text {
                            font:Font {
                                name: "Arial"
                                size: 16
                            }
                            x: 136
                            y: 47
                            content: "0"
                            textAlignment: TextAlignment.CENTER
                            fill: Color.web("#0A0A0A")
                        },
                        Text {
                            font:Font {
                                name: "Arial"
                                size: 16
                            }
                            x: 38
                            y: 145
                            content: "45"
                            textOrigin: TextOrigin.BASELINE
                            fill: Color.web("#0A0A0A")
                        },
                        Text {
                            font:Font {
                                name: "Arial"
                                size: 16
                            }
                            x: 225
                            y: 145
                            content: "15"
                            textOrigin: TextOrigin.BASELINE
                            fill: Color.web("#0A0A0A")
                        },
                        // Tenths Dial
                        Group {
                            content: [
                                Text {
                                    font:Font {
                                        name: "Arial"
                                        size: 9
                                    }
                                    x: -10
                                    y: 10
                                    content: "10ths"
                                    textAlignment: TextAlignment.CENTER
                                    textOrigin: TextOrigin.TOP
                                    fill: Color.web("#0A0A0A")
                                },
                                // Tick Marks
                                for (i in [ 1..tenthsNumOfMarks ]) {
                                    Line {
                                        startX: 0
                                        startY: 30
                                        endX: 0
                                        endY: 26
                                        strokeWidth: 1.5
                                        stroke: Color.web("#0A0A0A")
                                        transforms: Transform.rotate((360/tenthsNumOfMarks)*i,0,0) }
                                },
                                for (i in [1..tenthsNumOfMinorMarks]) {
                                    Line {
                                        startX: 0
                                        startY: 30
                                        endX: 0
                                        endY: 28
                                        stroke: Color.web("#0A0A0A")
                                        transforms: Transform.rotate((360/tenthsNumOfMinorMarks)*i,0,0)}
                                },
                            ]
                            translateX: 180
                            translateY: 100
                        },
                        // Minutes Dial
                        Group {
                            content: [
                                Text {
                                    font:Font{
                                        name: "Arial"
                                        size: 9
                                    }
                                    x: -15
                                    y: 10
                                    content: "Minutes"
                                    textAlignment: TextAlignment.CENTER
                                    textOrigin: TextOrigin.TOP
                                    fill: Color.web("#0A0A0A")
                                },
                                // Tick Marks
                                for (i in [ 1..minutesNumOfMarks ]) {
                                    Line {
                                        startX: 0
                                        startY: 30
                                        endX: 0
                                        endY: 26
                                        strokeWidth: 1.5
                                        stroke: Color.web("#0A0A0A")
                                        transforms: Transform.rotate((360/tenthsNumOfMarks)*i,0,0) }
                                },
                                for (i in [ 1..minutesNumOfMinorMarks ]) {
                                    Line {
                                        startX: 0
                                        startY: 30
                                        endX: 0
                                        endY: 28
                                        stroke: Color.web("#0A0A0A")
                                        transforms: Transform.rotate((360/tenthsNumOfMinorMarks)*i,0,0)}
                                },
                            ]
                            translateX: 100
                            translateY: 100
                        },
                        // Digits Cells
                        Group {
                            effect: Lighting {}
                            content: [
                                Group {
                                    content: [
                                        Rectangle {
                                            x: -7
                                            y: -9
                                            width: 15
                                            height: 19
                                            fill: Color.web("#a39f91")
                                        },
                                        Rectangle {
                                            x: -5
                                            y: -7
                                            width: 11
                                            height: 15
                                            fill: Color.web("#FFFFFF")
                                        },
                                    ]
                                    translateX: 91
                                    translateY: 210
                                },
                                Group {
                                    content: [
                                        Rectangle {
                                            x: -7
                                            y: -9
                                            width: 15
                                            height: 19
                                            fill: Color.web("#a39f91")
                                        },
                                        Rectangle {
                                            x: -5
                                            y: -7
                                            width: 11
                                            height: 15
                                            fill: Color.web("#FFFFFF")
                                        },
                                    ]
                                    translateX: 107
                                    translateY: 210
                                },
                                Group {
                                    content: [
                                        Rectangle {
                                            x: -7
                                            y: -9
                                            width: 15
                                            height: 19
                                            fill: Color.web("#bdbeb3")
                                        },
                                        Rectangle {
                                            x: -5
                                            y: -7
                                            width: 11
                                            height: 15
                                            fill: Color.web("#FFFFFF")
                                        },
                                    ]
                                    translateX: 130
                                    translateY: 210
                                },
                                Group {
                                    content: [
                                        Rectangle {
                                            x: -7
                                            y: -9
                                            width: 15
                                            height: 19
                                            fill: Color.web("#bdbeb3")
                                        },
                                        Rectangle {
                                            x: -5
                                            y: -7
                                            width: 11
                                            height: 15
                                            fill: Color.web("#FFFFFF")
                                        },
                                    ]
                                    translateX: 146
                                    translateY: 210
                                },
                                Group {
                                    content: [
                                        Rectangle {
                                            x: -7
                                            y: -9
                                            width: 15
                                            height: 19
                                            fill: Color.web("#bdbeb3")
                                        },
                                        Rectangle {
                                            x: -5
                                            y: -7
                                            width: 11
                                            height: 15
                                            fill: Color.web("#FF0000")
                                        },
                                    ]
                                    translateX: 168
                                    translateY: 210
                                },
                                Group {
                                    content: [
                                        Rectangle {
                                            x: -7
                                            y: -9
                                            width: 15
                                            height: 19
                                            fill: Color.web("#bdbeb3")
                                        },
                                        Rectangle {
                                            x: -5
                                            y: -7
                                            width: 11
                                            height: 15
                                            fill: Color.web("#FF0000")
                                        },
                                    ]
                                    translateX: 184
                                    translateY: 210
                                },
                            ]
                        }
                    ]
                },
                Group {
                    translateX: 40
                    translateY: 60
                    content: [
                    // Digits
                        Group {
                            content: [
                                Text {
                                    font:Font.font("Courier", FontWeight.BOLD, 16)
                                    x: -4
                                    y: 6
                                    content: bind model.timeString.substring(0,1)
                                    fill: Color.web("#000000")
                                },
                            ]
                        translateX: 91
                        translateY: 210
                    },
                    Group {
                        content: [
                            Text {
                                font:Font.font("Courier", FontWeight.BOLD, 16)
                                x: -4
                                y: 6
                                content: bind model.timeString.substring(1,2)
                                fill: Color.web("#000000")
                            },
                        ]
                        translateX: 107
                        translateY: 210
                    },
                    Text {
                        font:Font {
                            name: "Courier"
                            size: 16
                        }
                        x: 114
                        y: 214
                        content: ":"
                        fill: Color.web("#FFFFFF")
                    },
                    Group {
                        content: [
                            Text {
                                font:Font.font("Courier", FontWeight.BOLD, 16)
                                x: -4
                                y: 6
                                content: bind model.timeString.substring(3,4)
                                fill: Color.web("#000000")
                            },
                        ]
                        translateX: 130 translateY: 210
                    },
                    Group {
                        content: [
                            Text {
                                font:Font.font("Courier", FontWeight.BOLD, 16)
                                x: -4
                                y: 6
                                content: bind model.timeString.substring(4,5)
                                fill: Color.web("#000000")
                            },
                        ]
                        translateX: 146
                        translateY: 210
                    },
                    Text {
                        font:Font {
                            name: "Courier"
                            size: 16
                        }
                        x: 153
                        y: 214
                        content: "."
                        fill: Color.web("#FFFFFF")
                    },
                    Group {
                        content: [
                            Text {
                                font:Font.font("Courier", FontWeight.BOLD, 16)
                                x: -4
                                y: 6
                                content: bind model.timeString.substring(6,7)
                                fill: Color.web("#FFFFFF")
                            },
                        ]
                        translateX: 168
                        translateY: 210
                    },
                    Group {
                        content: [
                            Text {
                                font:Font.font("Courier", FontWeight.BOLD, 16)
                                x: -4
                                y: 6
                                content: bind model.timeString.substring(7,8)
                                fill: Color.web("#FFFFFF")
                            },
                        ]
                        translateX: 184
                        translateY: 210
                    },
                    // Tenths Hand
                    Group {
                        content: [
                            Group {
                                content: [
                                    Circle {
                                        centerX: 0
                                        centerY: 0
                                        radius: 3
                                        fill: Color.web("#0A0A0A")
                                    },
                                    Rectangle {
                                        x: -1
                                        y: -8
                                        width: 2
                                        height: 35
                                        fill: Color.web("#0A0A0A")
                                        transforms: bind [ Transform.rotate(model.tenthsHandAngle,0,0)]
                                    },
                                ]
                            }
                        ]
                        translateX: 182
                        translateY: 100
                    },
                    // Minutes Hand
                    Group {
                        content: [
                            Group {
                                content: [
                                    Circle {
                                        centerX: 0
                                        centerY: 0
                                        radius: 3
                                        fill: Color.web("#0A0A0A")
                                    },
                                    Rectangle{
                                        x: -1
                                        y: -8
                                        width: 2
                                        height: 35
                                        fill: Color.web("#0A0A0A")
                                        //rotate: bind model.minutesHandAngle
                                        transforms: bind [Transform.rotate(model.minutesHandAngle,0,0)]
                                    },
                                ]
                            }
                        ]
                        translateX: 102
                        translateY: 100
                    },
                    // Hand
                    Group {
                        content: [
                            Group {
                                content: [
                                    Circle {
                                        centerX: 142
                                        centerY: 140
                                        radius: 8
                                        fill: Color.web("#FF0000")
                                    },
                                    Rectangle {
                                        x: -1.5
                                        y: -20
                                        width: 3
                                        height: 120
                                        fill: Color.web("#FF0000")
                                        transforms: bind [Transform.rotate(model.handAngle,0,0)]
                                        //rotate: bind model.handAngle
                                        translateX: 142
                                        translateY: 140
                                    },
                                ]
                                effect: Lighting{
                                    light: DistantLight {azimuth: 225}
                                }
                            },
                            Rectangle {
                                x: -1.5
                                y: -40
                                width: 3
                                height: 20
                                fill: Color.web("#FFFFFF")
                                //rotate: bind model.handAngle
                                transforms: bind [Transform.rotate(model.handAngle,0,0)]
                                translateX: 142
                                translateY: 140
                            }
                        ]
                        effect: DropShadow {
                            offsetX: 4
                            offsetY: 4
                            radius: 6
                            color: Color.web("#000000")
                        }
                    },
                    // Highlight
                    Group {
                        cache: true
                        content: [
                            Ellipse {
                                centerX: 140
                                centerY: 95
                                radiusX: 180
                                radiusY: 95
                                clip: Circle {
                                    centerX: 140
                                    centerY: 140
                                    radius: 140
                                }
                                fill: Color.web("#535450")
                                stroke: null
                                effect: GaussianBlur{ radius: 10 }
                                opacity: 0.1
                            },
                        ]
                    },
                ]
            },
                // Reset Button
                Group {
                    content: [
                        Rectangle {
                            x: -7
                            y: bind -(150+resetPressedAmount)
                            width: 14
                            height: 7
                            fill:LinearGradient {
                                startX: 0
                                startY: 0
                                endX: 1
                                endY: 0
                                stops: [
                                    Stop {
                                        offset:0
                                        color: Color.web("#AA0000")
                                    },
                                    Stop {
                                        offset:0.5
                                        color: Color.web("#660000")
                                    },
                                    Stop {
                                        offset:1
                                        color: Color.web("#AA0000")
                                    }
                                ]
                            }
                        },
                        Rectangle {
                            x: -12
                            y: -150
                            width: 24
                            height: 14
                            fill:LinearGradient {
                                startX:0
                                startY:0
                                endX:1
                                endY:0
                                stops: [
                                    Stop {
                                        offset: 0
                                        color: Color.web("#4e605f")
                                    },
                                    Stop {
                                        offset: 0.2
                                        color: Color.web("#c3d6d5")
                                    },
                                    Stop {
                                        offset: 0.5
                                        color: Color.web("#f9ffff")
                                    },
                                    Stop {
                                        offset: 0.8
                                        color: Color.web("#c3d6d5")
                                    },
                                    Stop {
                                        offset: 1
                                        color: Color.web("#4e605f")
                                    }
                                ]
                            }
                        },
                        Rectangle {
                            x: -14
                            y: bind -(155 + resetPressedAmount)
                            width: 28
                            height: 5
                            fill:LinearGradient {
                                startX: 0
                                startY: 0
                                endX: 1
                                endY: 0
                                stops: [
                                    Stop {
                                        offset: 0
                                        color: Color.web("#FF0000")
                                    },
                                    Stop {
                                        offset:0.5
                                        color: Color.web("#AA0000")
                                    },
                                    Stop {
                                        offset:1
                                        color: Color.web("#FF0000")
                                    }
                                ]
                            }
                        },
                    ]
                    transforms: Transform.rotate(-360/12,0,0)
                    translateX: 180 translateY: 200
                    onMousePressed: function(e:MouseEvent) {
                        resetPressedAmount=0;
                    }
                    onMouseReleased: function(e:MouseEvent) {
                        resetPressedAmount=7;
                    }
                    onMouseClicked: function(e:MouseEvent) {
                        model.reset();
                    }
                    cursor: Cursor.HAND
                },
                // Start/Stop Button
                Group {
                    content: [
                        Rectangle {
                            x: -7
                            y: bind -(150+startPressedAmount)
                            width: 14
                            height: 7
                            fill:LinearGradient {
                                startX: 0
                                startY: 0
                                endX: 1
                                endY: 0
                                stops: [
                                    Stop {
                                        offset: 0
                                        color: Color.web("#8cc700")
                                    },
                                    Stop {
                                        offset: 0.5
                                        color: Color.web("#71a000")
                                    },
                                    Stop {
                                        offset: 1
                                        color: Color.web("#8cc700")
                                    }
                                ]
                            }
                        },
                        Rectangle {
                            x: -12
                            y: -150
                            width: 24
                            height: 14
                            fill:LinearGradient {
                                startX: 0
                                startY: 0
                                endX: 1
                                endY: 0
                                stops: [
                                       Stop {
                                        offset: 0
                                    color: Color.web("#4e605f")
                                    },
                                    Stop {
                                        offset: 0.2
                                        color: Color.web("#c3d6d5")
                                    },
                                    Stop {
                                        offset: 0.5
                                        color: Color.web("#f9ffff")
                                    },
                                    Stop {
                                        offset: 0.8
                                        color: Color.web("#c3d6d5")
                                    },
                                    Stop {
                                        offset: 1
                                        color: Color.web("#4e605f")
                                    }
                                ]
                            }
                        },
                        Rectangle {
                            x: -14
                            y: bind -(155 + startPressedAmount)
                            width: 28
                            height: 5
                            fill:LinearGradient {
                                startX: 0
                                startY: 0
                                endX: 1
                                endY: 0
                                stops: [
                                    Stop {
                                        offset:0
                                        color: Color.web("#b4FF00")
                                    },
                                    Stop {
                                        offset:0.5
                                        color: Color.web("#8cc700")
                                    },
                                    Stop {
                                        offset:1
                                        color: Color.web("#b4FF00")
                                    }
                                ]
                            }
                        },
                    ]
                    transforms: Transform.rotate(360/12,0,0)
                    translateX: 180 translateY: 200
                    onMousePressed: function(e:MouseEvent) {
                        startPressedAmount=0;
                    }
                    onMouseReleased: function(e:MouseEvent) {
                        startPressedAmount=7;
                    }
                    onMouseClicked: function(e:MouseEvent) {
                        model.startStop();
                    }
                    cursor: Cursor.HAND
                },
            ]
        };
    }
}