/*
* 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;
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];
}
}
}
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();
}