/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
* Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems 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 sudoku;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.lang.FX;
import javafx.scene.Cursor;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.scene.text.TextOrigin;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import sudoku.Button;
import sudoku.SudokuNode;
var stageDragInitialX:Number;
var stageDragInitialY:Number;
var stylesheets = "{__DIR__}black.css";
var black = false on replace {
if(black) {
stylesheets = "{__DIR__}black.css";
cssButton.data = "Blue";
} else {
stylesheets = "{__DIR__}blue.css";
cssButton.data = "Black";
}
}
var newButton: Button = Button {
data: "New"
width: 52
height: 25
}
var hintButton = Button {
data: "Hint"
width: 52
height: 25
}
var verifyButton = Button {
data: "Verify"
width: 52
height: 25
}
var timeline: Timeline = Timeline {
keyFrames: [
KeyFrame {
time: 250ms
action: function() {
black = not black;
glassRect.visible = false;
}
}
]
}
var cssButton: Button = Button {
data: "Black"
width: 52
height: 25
onMousePressed: function(e) {
cssButton.opacity = 1.0;
glassRect.visible = true;
timeline.playFromStart();
}
}
var dropShadow = DropShadow {
offsetX: 2
offsetY: 3
color: Color.color(0.4, 0.4, 0.4)
};
var titleText = Text {
content: "Sudoku"
translateX: 15
translateY: 15
textOrigin: TextOrigin.TOP
effect: dropShadow
styleClass: "titleText"
}
var buttonGrid: HBox = HBox {
spacing: -10
content: [ newButton, hintButton, verifyButton, cssButton ]
translateX: bind (281 - buttonGrid.boundsInLocal.width) / 2.0 + 2
translateY: titleText.translateY + 22
}
var bgRect = Rectangle {
x: 1
y: 1
width: 278
height: 405
styleClass: "borderRectangle"
};
var glassRect = Rectangle {
x: 1
y: 1
width: 278
height: 405
opacity: 0.75
styleClass: "borderRectangle"
blocksMouse: true
cursor: Cursor.WAIT
visible: false
};
var loadingText : Text = Text {
content: "Loading Theme..."
translateX: bind (bgRect.width - loadingText.boundsInLocal.width)/ 2.0 + 10
translateY: bind (bgRect.height - loadingText.boundsInLocal.height)/ 2.0
textOrigin: TextOrigin.TOP
effect: dropShadow
styleClass: "titleText"
visible: bind glassRect.visible
}
var closeButton = Text {
content: "X"
translateX: bgRect.width - 25
translateY: 15
textOrigin: TextOrigin.TOP
effect: dropShadow
cursor: Cursor.HAND
styleClass: "titleText"
visible: bind ("{__PROFILE__}" != "browser")
onMousePressed: function(e) {
FX.exit();
}
}
var sudokuNode: SudokuNode = SudokuNode {
translateY: buttonGrid.translateY + 43
translateX: 4
};
newButton.onMousePressed = function(e) {
sudokuNode.updateData();
}
hintButton.onMousePressed = function(e) {
sudokuNode.hint();
}
verifyButton.onMousePressed = function(e) {
sudokuNode.verifyData();
}
var stage = Stage {
scene: Scene {
content: [ bgRect, titleText, sudokuNode, buttonGrid, closeButton, glassRect, loadingText ]
width: 281
height: 408
stylesheets: bind stylesheets
}
title: "JavaFX Sudoku"
style: StageStyle.UNDECORATED
}
bgRect.onMousePressed = function(e) {
if("{__PROFILE__}" != "browser") {
stageDragInitialX = e.screenX - stage.x;
stageDragInitialY = e.screenY - stage.y;
}
}
bgRect.onMouseDragged = function(e) {
if("{__PROFILE__}" != "browser") {
stage.x = e.screenX - stageDragInitialX;
stage.y = e.screenY - stageDragInitialY;
}
}
sudokuNode.updateData();
sudokuNode.requestFocus();