/*
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_label.h"


/*
    1 - Label
    2 - Entry
    3 - Entry buffer
*/


/* ************************************************************************* *\
 * *                                                                       * *
 * *               LABEL                                                   * *
 * *                                                                       * *
\* ************************************************************************* */



void scol_gtk_label_get (GtkWidget *widget, gchar **s)
{
    const gchar * a;
    int len;

    a = gtk_label_get_text (GTK_LABEL (widget));
    len = strlen (a);
    *s = (gchar *) g_malloc (sizeof (gchar) * (len + 1));
    strncpy (*s, a, len);
    (*s)[len] = '\0';
    *s = UTF8SCOL (*s);
    return;
}



/**
 * \brief _gtkLabelNew : Creates a newlabel object
 * \param Chn : a channel
 * \param S : a string (the content of the label). Can be nil.
 * \return ObjGtkWidget : a new label object or nil if error
 */
int SCOL_gtkLabelNew (mmachine m)
{
    int mchannel, mtitle;
    int len;
    gchar *title;
    GtkWidget *label;

    MMechostr (MSKDEBUG, "SCOL_gtkLabelNew : entering\n");

    mtitle = MTOP (MMpull (m));
    mchannel = MMget (m, 0);

    if (mchannel == NIL)
    {
        MMechostr (0, "SCOL_gtkLabelNew error : channel is nil\n");
        MMpull (m);
        MMpush (m, NIL);
        return 0;
    }

    label = gtk_label_new (NULL);

    if (mtitle == NIL)
        return SCOL_gtk_memory_createObjectTAB (m, label, ObjGtkWidgetType, OBJ2DGTK_WIDGET_HANDLE);

    len = MMsizestr (m, mtitle);
    title = (gchar *) g_malloc (sizeof (gchar) * (len+1));
    strncpy (title, SCOLUTF8 (MMstartstr (m, mtitle)), len);
    title[len] = '\0';
    gtk_label_set_text (GTK_LABEL (label), title);
    g_free (title);
    return SCOL_gtk_memory_createObjectTAB (m, label, ObjGtkWidgetType, OBJ2DGTK_WIDGET_HANDLE);
}

/**
 * \brief _gtkLabelGet : Returns the content of a label object
 * \param ObjGtkWidget : a label object
 * \return S : the content or nil if error
 */
int SCOL_gtkLabelGet (mmachine m)
{
    int mlabel;
    GtkWidget *label;

    g_message ("SCOL_gtkLabelGet : entering");

    mlabel = MMpull (m);
    if (mlabel == NIL)
    {
        g_warning ("SCOL_gtkLabelGet error : label is nil");
        MMpush (m, NIL);
        return 0;
    }

    label = (GtkWidget*) MMfetch (m, MTOP (mlabel), OBJ2DGTK_WIDGET_HANDLE);
    Mpushstrbloc (m, (char *) gtk_label_get_text (GTK_LABEL (label)));
    return 0;
}

/**
 * \brief _gtkLabelSet : Sets the content of a label object
 * fun [ObjGtkWidget S] ObjGtkWidget
 * \param ObjGtkWidget : a label object
 * \param S : the new content. The old content will be overwritten.
 * \return ObjGtkWidget : the same object or nil if error
 */
int SCOL_gtkLabelSet (mmachine m)
{
    int mlabel, ms;
    GtkWidget *label;
    gchar *s = "";

    g_message ("SCOL_gtkLabelSet : entering");

    ms = MMpull (m);
    mlabel = MMget (m, 0);
    if (mlabel == NIL)
    {
        g_warning ("SCOL_gtkLabelSet error : label is nil");
        MMpush (m, NIL);
        return 0;
    }
    label = (GtkWidget*) MMfetch (m, MTOP (mlabel), OBJ2DGTK_WIDGET_HANDLE);
    if (ms != NIL)
        s = SCOLUTF8 (MMstartstr (m, MTOP (ms)));
    gtk_label_set_text (GTK_LABEL (label), s);
    g_free (s);
    return 0;
}





/* ************************************************************************* *\
 * *                                                                       * *
 * *               ENTRY                                                   * *
 * *                                                                       * *
\* ************************************************************************* */




void scol_gtk_entry_get (GtkWidget *widget, gchar **s)
{
    int len;

    len = strlen (gtk_entry_get_text (GTK_ENTRY (widget)));
    *s = (gchar *) g_malloc (sizeof (gchar) * (len+1));
    strncpy (*s, gtk_entry_get_text (GTK_ENTRY (widget)), len);
    (*s)[len] = '\0';
    *s = UTF8SCOL (*s);
    return;
}



int SCOL_gtkEntryGet (mmachine m)
{
    int mentry;
    GtkWidget *entry;
    gchar *s; /* don't free s ! */

    g_message ("SCOL_gtkEntryGet : entering");

    mentry = MMpull (m);
    if (mentry == NIL)
    {
        g_warning ("SCOL_gtkEntryGet error : object is nil");
        MMpush (m, NIL);
        return 0;
    }

    entry = (GtkWidget*) MMfetch (m, MTOP (mentry), OBJ2DGTK_WIDGET_HANDLE);
    scol_gtk_entry_get (entry, &s);
    Mpushstrbloc (m, (char *) s);
    g_free (s);
    return 0;
}




/* API definitions : */

char* gtk_lab_name[GTK_LABEL_PKG_NB]=
{
    "_gtkLabelNew",
    "_gtkLabelGet",
    "_gtkLabelSet",

    "_gtkEntryGet"
};

int (*gtk_lab_fun[GTK_LABEL_PKG_NB])(mmachine m)=
{
    SCOL_gtkLabelNew,
    SCOL_gtkLabelGet,
    SCOL_gtkLabelSet,

    SCOL_gtkEntryGet
};

int gtk_lab_narg[GTK_LABEL_PKG_NB]=
{
    2,
    1,
    2,

    1
};

char* gtk_lab_type[GTK_LABEL_PKG_NB]=
{
    "fun [Chn S] ObjGtkWidget",
    "fun [ObjGtkWidget] S",
    "fun [ObjGtkWidget S] ObjGtkWidget",

    "fun [ObjGtkWidget] S"
};

int SCOLloadGTKlabel (mmachine m)
{
    int k;

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

    k = PKhardpak (m, "GTK2DlabelEngine", GTK_LABEL_PKG_NB, gtk_lab_name, gtk_lab_fun, gtk_lab_narg, gtk_lab_type);
    return k;
}

