/**
 * GUI.Grid
 *
 * Demonstrates implementation of a GUI grid.
 */

import("guilib")

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

    
    /**
     * Draw cell
     *
     * params:  grid
     *          dc (DrawCanvas)
     *          line, column
     *          xmin, xmax, ymin, ymax
     * return:  result
     */
    method draw (grid, dc, line, col, xmin, xmax, ymin, ymax)
    {
        xm = (xmax + xmin) / 2
        ym = (ymax + ymin) / 2

        dc.set_fgcolor(DrawCanvas.encode_color(line*20, col*100, line+100))
        dc.draw_box(xmin, xmax, ymin, ymax)
        dc.set_text_align(DrawCanvas.CENTER)
        dc.set_fgcolor(DrawCanvas.BLACK)
        dc.draw_text(xm, ym, "(" + line.to_string() + ", " + col.to_string() + ")")

        DEFAULT
    }

    
    /**
     * Create grid control
     *
     * params:  
     * return:  grid
     */
    method create_grid ()
    {
        grid = Grid.new({Attribute.BOXED:false})

        grid.set_event(Event.NLINES, EventHandler.new(method (grid) {6}, self))
        grid.set_event(Event.NCOLS, EventHandler.new(method (grid) {6}, self))
        grid.set_event(Event.WIDTH, EventHandler.new(method (grid,line) {70}, self))
        grid.set_event(Event.HEIGHT, EventHandler.new(method (grid,col) {50}, self))
        grid.set_event(Event.DRAW, EventHandler.new(get_method("draw"), self))

        @grid = grid
    }

    
    /**
     * Show dialog
     *
     * params:  
     * return:  
     */
    public method show ()
    {
        @dialog.popup(CENTER, CENTER)
        @grid.set_raster_size(nil)
    }

    
    /**
     * Initialize
     *
     * params:  
     * return:  
     */
    method initialize ()
    {
        field @dialog
        field @grid

        // dialog attributes
        attr =
          {Attribute.TITLE        : "Sample Grid",
           Attribute.OPACITY      : 255}

        // create grid
        create_grid()

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

        // set grid size
        @grid.set_raster_size({"width":400, "height":400})
    }
}


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

main()