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 stockquote;

import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.fxd.FXDLoader;
import javafx.scene.control.TextBox;
import javafx.scene.Group;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.paint.Color;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Screen;

import stockquote.StockQuoteUtil;

// @author JavaFX Samples Team


// Application Bounds
var stageX = 300.0;
var stageY = 300.0;
def stageWidth:Number = if({__PROFILE__}=="mobile") Screen.primary.visualBounds.width else 240;
def stageHeight:Number = if({__PROFILE__}=="mobile") Screen.primary.visualBounds.height else 320;

var stageDragInitialX:Number;
var stageDragInitialY:Number;

var fxdContent = FXDLoader.loadContent("{__DIR__}Stock_Quote.fxz");
var MainGroup = fxdContent.getNode("MainGroup");
var quoteBtn = fxdContent.getNode("quoteBtn");
var GetQuoteBtnText:Text = fxdContent.getNode("GetQuoteBtnText") as Text;
var closeButton:Text = fxdContent.getNode("closeButton") as Text;
public var userAction = false;
var arrayTickerSymbols:String[];
var tickerStockData:String;
var xVal: Number = 2;

function doActionOnQuoteBtn() {
    MainGroup.onMousePressed = function(e) {
        stageDragInitialX = e.screenX - stage.x;
        stageDragInitialY = e.screenY - stage.y;
    }
    MainGroup.onMouseDragged = function(e) {
        stage.x = e.screenX - stageDragInitialX;
        stage.y = e.screenY - stageDragInitialY;
     }

    quoteBtn.onKeyPressed = function (e) {
        if (e.code == KeyCode.VK_ENTER )
            validateSymbolInput();
        if (e.code == KeyCode.VK_LEFT)
           StockSymbolText.requestFocus();
    };
    quoteBtn.onMouseClicked = function(e) {
        validateSymbolInput();
    }

    quoteBtn.onMouseEntered = function (e) {
        GetQuoteBtnText.fill = Color.BLUE;
    }
    quoteBtn.onMouseExited = function (e) {
        GetQuoteBtnText.fill = Color.BLACK;
    }
    if(__PROFILE__ != "browser") {
        closeButton.onMouseClicked = function(e) {
            closeButton.fill = Color.RED;
            javafx.lang.FX.exit();
        }
        closeButton.onMouseEntered = function (e) {
            closeButton.fill = Color.RED;
        }
        closeButton.onMouseExited = function (e) {
            closeButton.fill = Color.WHITE;
        }
    }
}

def defaultFont = Font {
    name: "Helvetica"
    size: 12
};

public var StockSymbolText:TextBox = TextBox {
    scaleX: bind scaleX
    scaleY: bind scaleY
    layoutX: 10 layoutY: 67
    columns: 12
    selectOnFocus: false
    text: "ORCL"
    action:function() {
        validateSymbolInput();
    }
    onKeyPressed:function(e) {
        if(e.code == KeyCode.VK_RIGHT) {
            quoteBtn.requestFocus();
            GetQuoteBtnText.fill=Color.BLUE;
        }
    }
};

function validateSymbolInput():Void {
    def stockSymbol = StockSymbolText.rawText.trim();
    if(stockSymbol.equals("")) {
        StockSymbolText.text = "Not a valid symbol";
    }
    else {
        util_frame.ShowQuoteData(stockSymbol, true);
        userAction = true;
    }
}

var compNameText: Text ;
var lastTradeText: Text;
var ImgUpDown: ImageView;
var changeFrameDataColor = Color.WHITE;
var changeTickerDataColor = Color.BLACK;

var lastChange: Text;
var dayRange: Text;
var preClose: Text;

var mktCap: Text;
var volume: Text;
var lastTradeTime: Text;

var dataBox: Group = Group {
    scaleX: bind scaleX
    scaleY: bind scaleY
    content: [
        compNameText = Text {
            transforms: [Transform.affine(1.000000,0.000000,0.000000,1.000000,10,109.998050)]
            fill: Color.WHITE
            font: Font {
                name: "Helveticav bold"
                size: 14
            }
        },
        lastTradeText = Text {
            transforms: [ Transform.affine(1.000000,0.000000,0.000000,1.000000,10,133.991210)]
            fill: Color.WHITE
            font: defaultFont
        },
        lastChange = Text {
            transforms: [ Transform.affine(1.000000,0.000000,0.000000,1.000000,10,160.038090)]
            font: defaultFont
            fill: bind changeFrameDataColor
        },
        ImgUpDown = ImageView {
            x: 60 y: 148
            fitHeight: 18
            preserveRatio: true
        }
        dayRange = Text {
            transforms: [ Transform.affine(1.000000,0.000000,0.000000,1.000000,10,183.030270)]
            font: defaultFont
            fill: Color.WHITE
        },
        preClose = Text {
            transforms: [ Transform.affine(1.000000,0.000000,0.000000,1.000000,10,209.077150)]
            font: defaultFont
            fill: Color.WHITE
        },
        mktCap = Text {
            transforms: [ Transform.affine(1.000000,0.000000,0.000000,1.000000,10,232.069336)]
            fill: Color.WHITE
            font: defaultFont
        },
        volume = Text {
            transforms: [ Transform.affine(1.000000,0.000000,0.000000,1.000000,10,258.117188)]
            fill: Color.WHITE
           font: defaultFont
        },
        lastTradeTime = Text {
            transforms: [Transform.affine(1.000000,0.000000,0.000000,1.000000,10,281.109375)]
            fill: Color.WHITE
            font: defaultFont
        },
    ]
}
var arrayTickerSymbolsData:String[];
var arrayTickerElement = Text {
    scaleX: bind scaleX
    scaleY: bind scaleY
    x: bind xVal with inverse
    y: 50
    font: Font {
        name: "ARIAL BOLD"
        size: 16
    }
    fill: bind changeTickerDataColor
    content: bind tickerStockData
    clip: Rectangle {
        fill: Color.rgb(0x24,0x31,0x44,1.0)
        stroke: null
        x: 1.73
        y: 28.97
        width: stageWidth -5
        height: 30.0
    }
};
var symbolIndex = 0;
var tickerTimeline:Timeline = Timeline {
    repeatCount: Timeline.INDEFINITE
    keyFrames: [
        KeyFrame {
            time: 0s
            values: xVal => stageWidth
        },
        KeyFrame {
            time: 10s
            canSkip: true
            values: xVal => 2 tween Interpolator.LINEAR
            action:function():Void {
                if(symbolIndex >= sizeof arrayTickerSymbols)
                    symbolIndex = 0;
                util_ticker.ShowQuoteData(arrayTickerSymbols[symbolIndex],false);
                symbolIndex++;
            }
        },
    ]
};

public function displayInFrame(result:String[]):Void {
    var changeVal = { result[4] } ;
    var changeValInPrecntage = { result[11] };
    if(changeVal.startsWith("-")) {
        changeFrameDataColor = Color.rgb(0xff,0x4e,0x0,1.0);
        ImgUpDown.image = Image { url: "{__DIR__}Images/Down.PNG" };
        changeVal = changeVal.substring(1);
        changeValInPrecntage = changeValInPrecntage.substring(1);
    }
    else if(changeVal.startsWith("+")) {
        changeFrameDataColor=Color.rgb(128,255,0);
        ImgUpDown.image = Image { url: "{__DIR__}Images/Up.PNG" };
        changeVal = changeVal.substring(1);
        changeValInPrecntage = changeValInPrecntage.substring(1);
    }
    else {
        ImgUpDown.image = null;
        changeFrameDataColor = Color.WHITE;
    }
    compNameText.content="{ result[15] }";
    preClose.content = "Previous Close: { result[5] }";
    lastTradeText.content="Last Trade: { result[1] } ";
    lastChange.content =  "Change:    { changeVal } ({changeValInPrecntage})";
    dayRange.content = "Today's Range: {result[7]} - {result[6]}";
    mktCap.content = "Market Cap: {result[9]}";
    volume.content = "Volume: {result[7]}";
    lastTradeTime.content = "Date & Time: {result[2]} {result[3]}";
}

public function addArrayTickerSymbols(newSymbol:String,result:String[]):Void {
    if( sizeof arrayTickerSymbols == 0) {
        insert newSymbol into arrayTickerSymbols;
        println("adding first symbol into arrayTickerSymbols: {newSymbol}");
        setTickerDataColor(result[4]);
        tickerStockData = "{result[0]}: {result[1]} {result[4]} ({result[11]})";
        insert tickerStockData into arrayTickerSymbolsData;
        return;
    }
    var symbolExist=false;
    for(symbol in arrayTickerSymbols ) {
        if(newSymbol.equals(symbol))
            symbolExist=true;
    }
    if(not symbolExist) {
        insert newSymbol into arrayTickerSymbols;
        setTickerDataColor(result[4]);
        tickerStockData = "{result[0]}: {result[1]} {result[4]} ({result[11]})";
        insert tickerStockData into arrayTickerSymbolsData;
    }
}
function setTickerDataColor(lastChange:String) {
    if(lastChange.startsWith("-")) {
        changeTickerDataColor = Color.rgb(0xff,0x4e,0x0,1.0);
    }
    else  if(lastChange.startsWith("+")) {
        changeTickerDataColor = Color.rgb(128,255,0,1.0);
    }
    else {
        changeTickerDataColor = Color.WHITE;
    }
}

public function showTicker(result:String[],symbol:String): Void {
    for(i in [0.. sizeof arrayTickerSymbolsData]) {
        if(arrayTickerSymbolsData[i].indexOf(symbol) != -1) {
            setTickerDataColor(result[4]);
            arrayTickerSymbolsData[i] =
                "{result[0]}: {result[1]} {result[4]} ({result[11]})";
            tickerStockData = arrayTickerSymbolsData[i];
        }
    }
}

// Application User Interface
def stage = Stage {
    resizable: false
    x: bind stageX with inverse
    y: bind stageY with inverse
    width: stageWidth
    height: stageHeight
    visible: true
    style: StageStyle.TRANSPARENT
    scene:Scene {
        fill: Color.TRANSPARENT
        content: [
            Group {
                content: [
                    MainGroup,
                    arrayTickerElement,
                    StockSymbolText,
                    dataBox
                ]
            }
        ]
    }
}

var util_frame:StockQuoteUtil;
var util_ticker:StockQuoteUtil;
var scaleX = 1.0;
var scaleY = 1.0;
function run() {
    if(stageWidth > 250) {
        scaleX = stageWidth/236;
        scaleY = stageHeight/320;
        MainGroup.scaleX = scaleX;
        MainGroup.scaleY = scaleY;

        MainGroup.translateX = stageWidth/4 +2;
        MainGroup.translateY = stageHeight/4;
        dataBox.translateX = stageWidth/4 -5;
        dataBox.translateY = stageHeight/4 +30;
        arrayTickerElement.translateX = stageWidth/4 -5;
        arrayTickerElement.translateY = stageHeight/10 - 22;
        StockSymbolText.translateX = stageWidth/8;
        StockSymbolText.translateY = stageHeight/8;
    }
    doActionOnQuoteBtn();

    util_frame = new StockQuoteUtil();
    util_ticker = new StockQuoteUtil();
    userAction = true;
    util_frame.ShowQuoteData("ORCL",true);
    tickerTimeline.play();
}