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

import javafx.scene.Scene;
import javafx.stage.Stage;
import lazyloader.view.Menu;
import lazyloader.view.MenuBar;
import javafx.scene.Group;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.ext.swing.SwingComponent;
import javafx.scene.image.ImageView;
import javafx.scene.image.Image;
import javafx.scene.layout.VBox;
import javafx.scene.layout.LayoutInfo;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.Node;

/**
 @author Rakesh Menon
 */

var appNode : Node;
var appImageView = ImageView {
    translateY: 50
    fitWidth: 240
    preserveRatio: true
    visible: false
};

var loadProgress = Text {
    content: "Loading..."
    font: Font.font("sansserif", FontWeight.BOLD, 12);
    fill: Color.BLACK
    visible: bind appImageView.visible
    translateX: 10
    translateY: 35
    wrappingWidth: 200
    layoutInfo: LayoutInfo {
        width: 220
        height: 20
    }
}

var vBox = VBox {
    spacing: 50
    content: appImageView, loadProgress ]
}

var appGroup = Group {
    translateX: 240
    translateY: 10
    content: [
        Rectangle width: 240 height: 320 fill: Color.GRAY opacity: 0.25 },
        vBox
    ]
}

def thumbnailImage = Image {
    url: "{__DIR__}images/thumbnail.gif"
}

/**
 * Load specified class using set of URLClassLoader
 */
public function launchApplication(thumbnail : String, className : String, urls : String[]) : Void {

    loadProgress.content = "Please wait while I load \"{className}\" from \"{urls[0]}\"!";
    
    appImageView.image = Image {
        url: "{thumbnail}"
        backgroundLoading: true
        placeholder: thumbnailImage
    }
    appImageView.visible = true;
    
    try {
        
        var app = Application {
            
            className: className
            urls: urls

            onLoad: function(jc) {
                jc.setSize(240320);
                jc.requestDefaultFocus();
                jc.requestFocus();
                appNode = SwingComponent.wrap(jc);
                appNode.focusTraversable = true;
                appNode.visible = true;
                insert appNode into appGroup.content;
                appNode.requestFocus();
                menuBar.disable = false;
                appImageView.visible = false;
            }
        };

        menuBar.disable = true;

        if(appNode != null) {
            delete appNode from appGroup.content;
        }
        
        app.start();
        
        
        //Application.launch(className, urls[0]);
        
    catch (e : java.lang.Exception) {
        e.printStackTrace();
        appImageView.visible = false;
    }
}

var codebase = "http://javafx.com";

var menuBar : MenuBar = MenuBar {

    translateX: 3
    
    content: [
        Menu {
            name: ""
            className: ""
            urls: [ ]
            thumbnail: ""
            disable: false
        },
        Menu {
            name: "Tweeter"
            className: "tweeter.Main"
            urls: "{codebase}/samples/Tweeter/webstart/Tweeter.jar" ]
            thumbnail: "{codebase}/samples/Tweeter/desc-resources/thumbnail.jpg"
        },
        Menu {
            name: "ShoppingService"
            className: "shoppingservice.Main"
            urls: "{codebase}/samples/ShoppingService/webstart/ShoppingService.jar" ]
            thumbnail: "{codebase}/samples/ShoppingService/desc-resources/thumbnail.jpg"
        },
        Menu {
            name: "Calculator"
            className: "calculator.Main"
            urls: "{codebase}/samples/Calculator/webstart/Calculator.jar" ]
            thumbnail: "{codebase}/samples/Calculator/desc-resources/thumbnail.jpg"
        },
        Menu {
            name: "Calendar"
            className: "calendar.Main"
            urls: "{codebase}/samples/Calendar/webstart/Calendar.jar" ]
            thumbnail: "{codebase}/samples/Calendar/desc-resources/thumbnail.jpg"
        },
        Menu {
            name: "ProjectManager"
            className: "projectmanager.Main"
            urls: "{codebase}/samples/ProjectManager/webstart/ProjectManager.jar" ]
            thumbnail: "{codebase}/samples/ProjectManager/desc-resources/thumbnail.jpg"
        },
        Menu {
            name: "InterestingPhotos"
            className: "interesting.Main"
            urls: "http://blogs.sun.com/rakeshmenonp/resource/ZemblyIP/InterestingPhotos.jar" ]
            thumbnail: "{codebase}/samples/InterestingPhotos/desc-resources/thumbnail.jpg"
        },
        Menu {
            name: "BouncingBall"
            className: "bounce.Main"
            urls: "{codebase}/samples/BouncingBall/webstart/BouncingBall.jar" ]
            thumbnail: "{codebase}/samples/BouncingBall/desc-resources/thumbnail.jpg"
        },
        Menu {
            name: "AnalogClock"
            className: "analogclock.Main"
            urls: "{codebase}/samples/AnalogClock/webstart/AnalogClock.jar" ]
            thumbnail: "{codebase}/samples/AnalogClock/desc-resources/thumbnail.jpg"
        }
    ]
}

/**
 * Background image from
 * http://www.flickr.com/photos/photoshoproadmap/
 */
var bgImage = ImageView {
    image: Image {
        url: "{__DIR__}images/background.jpg"
    }
}

var stage = Stage {

    title: "Lazy-Loader"
    
    scene: Scene {
        content: bgImage, menuBar, appGroup ]
        width: 490
        height: 340
    }
    resizable: false
    visible: false
    onClose: function() {
        FX.exit();
    }
}

function run() {
    stage.visible = true;
}