/**
 * Tree
 *
 * Demonstrates implementation of a GUI tree.
 */

import("gui")

class SampleTree
{
    // inject GUI module for convenience
    inject(System.GUI)

    
    /**
     * Create label control
     *
     * params:  
     * return:  label (Label)
     */
    method create_label ()
    {
        // label attributes
        attr = {Attribute.FONT     : {"family":"Verdana","size":12}}

        // create label
        Label.new("Node data:", attr)
    }

    
    /**
     * Create text control
     *
     * params:  
     * return:  label (Label)
     */
    method create_text ()
    {
        // text attributes
        attr =
         {Attribute.FONT     : {"family":"Verdana","size":12},
          Attribute.SIZE     : {"w":100}}

        // create text
        @text = Text.new(attr)
    }

    
    /**
     * Map event handler
     *
     * params:  tree (Tree)
     * return:  result (Number)
     */
    method map_event (tree)
    {
        tree.set_node_title(0, "Root")
        tree.add_branch(0, "Branch_1")
        tree.set_node_data(1, "Branch_1_Data")
        tree.add_branch(0, "Branch_2")
        tree.set_node_data(1, "Branch_2_Data")
        tree.add_leaf(0, "Leaf_1")
        tree.set_node_data(1, "Leaf_1_Data")
        tree.add_leaf(0, "Leaf_2")
        tree.set_node_data(1, "Leaf_2_Data")
    }

    
    /**
     * Select event handler
     *
     * params:  tree (Tree)
     *          id (Number)
     *          status (Number)
     * return:  result (Number)
     */
    method select_event (tree, id, status)
    {
        if {status = 0;
            data = tree.get_node_data(id)

            if {data.is_nil() ? @text.set_value("");
                @text.set_value(data)
            }
        }
    }

    
    /**
     * Create tree control
     *
     * params:  
     * return:  tree (Tree)
     */
    method create_tree ()
    {
        tree = Tree.new()

        tree.set_event(Event.MAP, EventHandler.new(get_method("map_event"), self))
        tree.set_event(Event.SELECTION, EventHandler.new(get_method("select_event"), self))

        @tree = tree
    }

    
    /**
     * Create container
     *
     * params:  
     * return:  child (Container)
     */
    method create_child ()
    {
        // container
        VBox.new({HBox.new({create_label(), create_text()}), Fill.new(), create_tree()})
    }

    
    /**
     * Show dialog
     *
     * params:  
     * return:  
     */
    public method show ()
    {
        @dialog.show()

        System.GUI.main_loop()
    }

    
    /**
     * Initialize
     *
     * params:  
     * return:  dialog (TreeDialog)
     */
    method initialize ()
    {
        // fields
        field @dialog
        field @tree
        field @text

        // dialog attributes
        attr =
         {Attribute.TITLE    : "Sample Tree",
          Attribute.SIZE     : {"w":300, "h":200},
          Attribute.OPACITY  : 255}

        // create dialog
        @dialog = Dialog.new(create_child(), attr)
    }
}


/**
 * Entry point
 *
 * params:  
 * return:  
 */
method main ()
{
    SampleTree.new().show()
}

main()