/*
This source file is part of Scol
For the latest info, see http://www.scolring.org

Copyright (c) 2010 Stephane Bisaro, aka Iri <iri@irizone.net>

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA, or go to
http://www.gnu.org/copyleft/lesser.txt

For others informations, please contact us from http://www.scolring.org/
*/


#include "../include/scol_gtk_range.h"







/**
 * \brief _gtkRangeSetValues : Sets min et max, step and page size to a range object (scale, scrollbar, ...)
 * fun [ObjGtkWidget [F F] [F F]] ObjGtkWidget
 * \param ObjGtkWidget : a valid object
 * \param [F F] : the min and the max values
 * \param [F F] : the step and the page size values
 * \return ObjGtkWidget : the same object or nil if error
 */
int SCOL_gtkRangeSetValues (mmachine m)
{
    int mrange, mminmax, msteppage;
    int val;
    gdouble min = 0, max = 100, step = 1, page = 10, tmp;
    GtkWidget *range;

    g_message ("SCOL_gtkRangeSetValues : entering");

    msteppage = MMpull (m);
    mminmax = MMpull (m);
    mrange = MMget (m, 0);
    if (mrange == NIL)
    {
        g_warning ("SCOL_gtkRangeSetValues error : object is nil");
        MMpush (m, NIL);
        return 0;
    }
    range = (GtkWidget*) MMfetch (m, MTOP (mrange), OBJ2DGTK_WIDGET_HANDLE);

    if (mminmax != NIL)
    {
        val = MMfetch (m, MTOP (mminmax), 0);
        min = (gdouble) FGET (val);
        val = MMfetch (m, MTOP (mminmax), 1);
        max = (gdouble) FGET (val);
        if (min > max)
        {
            tmp = min;
            min = max;
            max = tmp;
        }
    }
    if (msteppage != NIL)
    {
        val = MMfetch (m, MTOP (msteppage), 0);
        step = (gdouble) FGET (val);
        val = MMfetch (m, MTOP (msteppage), 1);
        page = (gdouble) FGET (val);
    }

    gtk_range_set_range (GTK_RANGE (range), min, max);g_message ("SCOL_gtkRangeSetValues : 0");
    gtk_range_set_increments (GTK_RANGE (range), step, page);g_message ("SCOL_gtkRangeSetValues : 0");
    return 0;
}

/**
 * \brief _gtkRangeGet : Returns the current value
 * fun [ObjGtkWidget] F
 * \param ObjGtkWidget : a valid object
 * \return I : this value or nil if error
 */
int SCOL_gtkRangeGet (mmachine m)
{
    int mrange;
    float f;
    GtkWidget *range;

    g_message ("SCOL_gtkRangeGet : entering");

    mrange = MMpull (m);
    if (mrange == NIL)
    {
        g_warning ("SCOL_gtkRangeGet error : object is nil");
        MMpush (m, NIL);
        return 0;
    }
    range = (GtkWidget*) MMfetch (m, MTOP (mrange), OBJ2DGTK_WIDGET_HANDLE);
    FSET (f, (float) gtk_range_get_value (GTK_RANGE (range)));
    return MMpush (m, f);
}

/**
 * \brief _gtkRangeSet : Sets the value
 * fun [ObjGtkWidget F] ObjGtkWidget
 * \param ObjGtkWidget : a valid existing object
 * \param I : the new value
 * \return ObjGtkWidget : the same object or nil if error
 */
int SCOL_gtkRangeSet (mmachine m)
{
    int mrange, mvalue;
    GtkWidget *range;

    g_message ("SCOL_gtkRangeSet : entering");

    mvalue = MMpull (m);
    mrange = MMget (m, 0);
    if ((mrange == NIL) || (mvalue == NIL))
    {
        g_warning ("SCOL_gtkRangeSet error : argument is nil");
        MMpush (m, NIL);
        return 0;
    }
    range = (GtkWidget*) MMfetch (m, MTOP (mrange), OBJ2DGTK_WIDGET_HANDLE);
    gtk_range_set_value (GTK_RANGE (range), FGET (mvalue));
    return 0;
}




/* API definitions */
char* gtk_range_name[GTK_RANGE_PKG_NB]=
{
    "_gtkRangeSetValues",
    "_gtkRangeGet",
    "_gtkRangeSet"
};

int (*gtk_range_fun[GTK_RANGE_PKG_NB])(mmachine m)=
{
    SCOL_gtkRangeSetValues,
    SCOL_gtkRangeGet,
    SCOL_gtkRangeSet
};

int gtk_range_narg[GTK_RANGE_PKG_NB]=
{
    3,              /* SCOL_gtkRangeSetValues */
    1,              /* SCOL_gtkRangeGet */
    2               /* SCOL_gtkRangeSet */
};

char* gtk_range_type[GTK_RANGE_PKG_NB]=
{
    "fun [ObjGtkWidget [F F] [F F]] ObjGtkWidget",                  /* SCOL_gtkRangeSetValues */
    "fun [ObjGtkWidget] F",                                         /* SCOL_gtkRangeGet */
    "fun [ObjGtkWidget F] ObjGtkWidget"                             /* SCOL_gtkRangeSet */
};

int SCOLloadGTKrange (mmachine m)
{
    int k;

    MMechostr (0, "SCOLloadGTKrange : entering\n");

    k = PKhardpak (m, "GTK2DrangeEngine", GTK_RANGE_PKG_NB, gtk_range_name, gtk_range_fun, gtk_range_narg, gtk_range_type);
    return k;
}



