<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to you under the Apache License,
Version 2.0 (the "License"); you may not use this file except in
compliance with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<document id="hello-bxml">
    <properties>
        <title>Hello, BXML!</title>
    </properties>

    <body>
        <p>
            Below is the output of the "hello world" application written using BXML. Note that,
            with the exception of the actual text, it is identical to the output of the Java
            version:
        </p>

        <application class="org.apache.pivot.tutorials.HelloBXML"
            width="240" height="80">
            <libraries>
                <library>core</library>
                <library>wtk</library>
                <library>wtk-terra</library>
                <library>tutorials</library>
            </libraries>
        </application>

        <p>
            The following is the Java source code for the BXML version. The content of the user
            interface is defined entirely by the BXML source file. It is loaded using an instance
            of the <tt>BXMLSerializer</tt> class defined in the <tt>org.apache.pivot.bxml</tt>
            package.
        </p>

        <source type="java" location="org/apache/pivot/tutorials/HelloBXML.java">
            <![CDATA[
            package org.apache.pivot.tutorials;

            import org.apache.pivot.beans.BXMLSerializer;
            import org.apache.pivot.collections.Map;
            import org.apache.pivot.wtk.Application;
            import org.apache.pivot.wtk.Display;
            import org.apache.pivot.wtk.Window;

            public class HelloBXML implements Application {
                private Window window = null;

                @Override
                public void startup(Display display, Map<String, String> properties)
                    throws Exception {
                    BXMLSerializer bxmlSerializer = new BXMLSerializer();
                    window = (Window)bxmlSerializer.readObject(HelloBXML.class, "hello.bxml");
                    window.open(display);
                }

                @Override
                public boolean shutdown(boolean optional) {
                    if (window != null) {
                        window.close();
                    }

                    return false;
                }

                @Override
                public void suspend() {
                }

                @Override
                public void resume() {
                }
            }
            ]]>
        </source>

        <p>
            The BXML that is used to create the UI is shown below:
        </p>

        <source type="xml" location="org/apache/pivot/tutorials/hello.bxml">
            <![CDATA[
            <Window title="Hello BXML!" maximized="true"
                xmlns:bxml="http://pivot.apache.org/bxml"
                xmlns="org.apache.pivot.wtk">
                <Label text="Hello BXML!"
                    styles="{font:'Arial bold 24', color:'#ff0000',
                        horizontalAlignment:'center', verticalAlignment:'center'}"/>
            </Window>
            ]]>
        </source>

        <p>
            Most Pivot applications will be constructed this way, declaring the structure of the
            UI in BXML rather than creating it programmatically in code. However, event handlers,
            which allow an application to respond to user input, are always defined in code (either
            Java or a compatible JVM scripting language). For example, the following BXML produces
            output very similar to the previous two versions, using a combination of BXML and
            JavaScript:
        </p>

        <source type="xml" location="org/apache/pivot/tutorials/hello_javascript.bxml">
            <![CDATA[
            <Window title="Hello JavaScript!" maximized="true"
                xmlns:bxml="http://pivot.apache.org/bxml"
                xmlns="org.apache.pivot.wtk">
                <windowStateListeners>
                    importPackage(org.apache.pivot.wtk);

                    function windowOpened(window) {
                        var label = new Label();
                        label.setText("Hello JavaScript!");
                        label.getStyles().put("font", "Arial BOLD 24");
                        label.getStyles().put("color", "#ff0000");
                        label.getStyles().put("horizontalAlignment", HorizontalAlignment.CENTER);
                        label.getStyles().put("verticalAlignment", VerticalAlignment.CENTER);

                        window.setContent(label);
                    }
                </windowStateListeners>
            </Window>
            ]]>
        </source>

        <p>
            The output of this version is shown below:
        </p>

        <application class="org.apache.pivot.wtk.ScriptApplication"
            width="240" height="80">
            <libraries>
                <library>core</library>
                <library>wtk</library>
                <library>wtk-terra</library>
                <library>tutorials</library>
            </libraries>
            <startup-properties>
                <src>/org/apache/pivot/tutorials/hello_javascript.bxml</src>
            </startup-properties>
        </application>

        <p>
            Note that this example does not provide an implementation of the <tt>Application</tt>
            interface. Rather, it is launched using the <tt>org.apache.pivot.wtk.ScriptApplication</tt> class.
            This class, which is included with the Pivot platform, implements the
            <tt>Application</tt> interface and takes the name of a BXML file to launch as a startup
            property named <tt>src</tt>. The source file is expected to contain a root element representing a
            <tt>Window</tt> subclass.
        </p>

        <p>
            The class is named <tt>ScriptApplication</tt> because it is often used to launch
            applications whose logic is defined entirely in script; however, it can actually be
            used to launch any application whose main window is defined in a single BXML file. Many
            of the examples in the following sections are executed using this class.
            Scripting is discussed in more detail in the <a href="scripting.html">Scripting</a> section.
        </p>
    </body>
</document>
