/*
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_widget.h"

static void scol_widget_show (GtkWidget *widget, int flag)
{
    switch (flag)
    {
        case (0) :
            gtk_widget_show_all (widget);
            return;

        case (1) :
            gtk_widget_show (widget);
            return;

        default :
            return;
    }
}







/**
 * \brief Show a widget and all its childs : fun [ObjGtkWidget] ObjGtkWidget
 *
 */
int SCOL_gtkWidgetShowAll (mmachine m)
{
    int mwidget;

    g_message ("SCOL_gtkWidgetShowAll : entering");

    mwidget = MMget (m, 0);

    if (mwidget == NIL)
    {
        g_warning ("SCOL_gtkWidgetShowAll error : widget is nil");
        MMset (m, 0, NIL);
        return 0;
    }

    scol_widget_show ((GtkWidget *) MMfetch (m, MTOP (mwidget), OBJ2DGTK_WIDGET_HANDLE), 0);
    return 0;
}

/**
 * \brief Show / Hide a widget : fun [ObjGtkWidget I] ObjGtkWidget
 * \param I : flag : 1 show, 0 hide
 */
int SCOL_gtkWidgetShow (mmachine m)
{
    int mwidget, mflag;

    g_message ("SCOL_gtkWidgetShow : entering");

    mflag = MTOI (MMpull (m));
    mwidget = MMget (m, 0);
    if (mwidget == NIL)
    {
        g_warning ("SCOL_gtkWidgetShow error : widget is nil\n");
        MMset (m, 0, NIL);
        return 0;
    }

    if (mflag == 1)
        scol_widget_show ((GtkWidget*) MMfetch (m, MTOP (mwidget), OBJ2DGTK_WIDGET_HANDLE), 1);
    else
        gtk_widget_hide ((GtkWidget*) MMfetch (m, MTOP (mwidget), OBJ2DGTK_WIDGET_HANDLE));
    return 0;
}








int SCOL_gtkWidgetDestroy (mmachine m)
{
    int mgtk;
    GtkWidget *gtkw;

    g_message ("SCOL_gtkWidgetDestroy : entering ...");

    mgtk = MTOP (MMpull (m));
    gtkw = (GtkWidget*) MMfetch (m, mgtk, OBJ2DGTK_WIDGET_HANDLE);
    if ((int) gtkw == 0)
    {
        g_warning ("SCOL_gtkWidgetDestroy : object is nil ...");
        MMpush (m, NIL);
        return 0;
    }

    gtk_widget_destroy (gtkw);
    OBJdelTM (m, ObjGtkWidgetType, mgtk);
    MMpush (m, 0*2);

    return 0;
}






/*
    Define a callback to a widget
*/
int SCOL_gtkWidgetCB (mmachine m)
{
    return scol_gtkWidgetCB (m);
}





/**
 * \brief Returns the type of a widget (i.e. "GtkButton" or "GtkWindow", ...)
 *
 * fun [ObjGtkWidget] S
 */
int SCOL_gtkWidgetTypeName (mmachine m)
{
    int mwidget;
    GtkWidget *widget;
    char s[64];

    mwidget = MTOP (MMpull (m));
    if (mwidget == NIL)
    {
        g_warning ("SCOL_gtkWidgetTypeName error : widget is nil\n");
        MMpush (m, NIL);
        return 0;
    }
    widget = (GtkWidget *) MMfetch (m, mwidget, OBJ2DGTK_WIDGET_HANDLE);
    scol_gtk_common_object_type (widget, s, 64);

    Mpushstrbloc (m, (char *) s);
    return 0;
}


int SCOL_GTK_SIGNAL_MASK_PROPAGATE (mmachine m) { MMpush (m, ITOM (SIGNAL_MASK_PROPAGATE)); return 0; }
int SCOL_GTK_SIGNAL_MASK_STOP (mmachine m) { MMpush (m, ITOM (SIGNAL_MASK_STOP)); return 0; }

int SCOL_GTK_WIDGET_BUTTONPRESSED (mmachine m) { MMpush (m, ITOM (WIDGET_BUTTONPRESSED)); return 0; }
int SCOL_GTK_WIDGET_BUTTONRELEASED (mmachine m) { MMpush (m, ITOM (WIDGET_BUTTONRELEASED)); return 0; }
int SCOL_GTK_WIDGET_MOVERESIZE (mmachine m) { MMpush (m, ITOM (WIDGET_MOVERESIZE)); return 0; }
int SCOL_GTK_WIDGET_DESTROY (mmachine m) { MMpush (m, ITOM (WIDGET_DESTROY)); return 0; }
int SCOL_GTK_WIDGET_ENTERLEAVE (mmachine m) { MMpush (m, ITOM (WIDGET_ENTERLEAVE)); return 0; }
int SCOL_GTK_WIDGET_KEYB_FOCUS (mmachine m) { MMpush (m, ITOM (WIDGET_KEYB_FOCUS)); return 0; }
int SCOL_GTK_WIDGET_HIDE (mmachine m) { MMpush (m, ITOM (WIDGET_HIDE)); return 0; }
int SCOL_GTK_WIDGET_SHOW (mmachine m) { MMpush (m, ITOM (WIDGET_SHOW)); return 0; }
int SCOL_GTK_WIDGET_KEY (mmachine m) { MMpush (m, ITOM (WIDGET_KEY)); return 0; }
int SCOL_GTK_BUTTON_CLICKED (mmachine m) { MMpush (m, ITOM (BUTTON_CLICKED)); return 0; }
int SCOL_GTK_WIDGET_MOTION (mmachine m) { MMpush (m, ITOM (WIDGET_MOTION)); return 0; }
int SCOL_GTK_WIDGET_SCROLL (mmachine m) { MMpush (m, ITOM (WIDGET_SCROLL)); return 0; }
int SCOL_GTK_WINDOW_STATE (mmachine m) { MMpush (m, ITOM (WINDOW_STATE)); return 0; }
int SCOL_GTK_NOTEBOOK_CHANGE (mmachine m) { MMpush (m, ITOM (NOTEBOOK_CHANGE)); return 0; }
int SCOL_GTK_TEXTBUFFER_CHANGED (mmachine m) { MMpush (m, ITOM (TEXTBUFFER_CHANGED)); return 0; }
int SCOL_GTK_TEXTBUFFER_MODIFIED (mmachine m) { MMpush (m, ITOM (TEXTBUFFER_MODIFIED)); return 0; }
int SCOL_GTK_WIDGET_VALUE_CHANGED (mmachine m) { MMpush (m, ITOM (WIDGET_VALUE_CHANGED)); return 0; }

int SCOL_GTK_EVENT_NOTHING (mmachine m) { MMpush (m, ITOM (EVENT_NOTHING)); return 0; }

int SCOL_GTK_EVENT_BUTTON_PRESSED (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_PRESSED)); return 0; }
int SCOL_GTK_EVENT_BUTTON_PRESSED2 (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_PRESSED2)); return 0; }
int SCOL_GTK_EVENT_BUTTON_PRESSED3 (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_PRESSED3)); return 0; }
int SCOL_GTK_EVENT_BUTTON_RELEASE (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_RELEASE)); return 0; }

int SCOL_GTK_EVENT_BUTTON_1 (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_1)); return 0; }
int SCOL_GTK_EVENT_BUTTON_2 (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_2)); return 0; }
int SCOL_GTK_EVENT_BUTTON_3 (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_3)); return 0; }
int SCOL_GTK_EVENT_BUTTON_4 (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_4)); return 0; }
int SCOL_GTK_EVENT_BUTTON_5 (mmachine m) { MMpush (m, ITOM (EVENT_BUTTON_5)); return 0; }

int SCOL_GTK_EVENT_KEY_SHIFT (mmachine m) { MMpush (m, ITOM (EVENT_KEY_SHIFT)); return 0; }
int SCOL_GTK_EVENT_KEY_CONTROL (mmachine m) { MMpush (m, ITOM (EVENT_KEY_CONTROL)); return 0; }
int SCOL_GTK_EVENT_KEY_ALT (mmachine m) { MMpush (m, ITOM (EVENT_KEY_ALT)); return 0; }
int SCOL_GTK_EVENT_KEY_CAPS (mmachine m) { MMpush (m, ITOM (EVENT_KEY_CAPS)); return 0; }
int SCOL_GTK_EVENT_KEY_HYPER (mmachine m) { MMpush (m, ITOM (EVENT_KEY_HYPER)); return 0; }
int SCOL_GTK_EVENT_KEY_SUPER (mmachine m) { MMpush (m, ITOM (EVENT_KEY_SUPER)); return 0; }
int SCOL_GTK_EVENT_KEY_OTHER (mmachine m) { MMpush (m, ITOM (EVENT_KEY_OTHER)); return 0; }

int SCOL_GTK_EVENT_SCROLL_UP (mmachine m) { MMpush (m, ITOM (EVENT_SCROLL_UP)); return 0; }
int SCOL_GTK_EVENT_SCROLL_DOWN (mmachine m) { MMpush (m, ITOM (EVENT_SCROLL_DOWN)); return 0; }
int SCOL_GTK_EVENT_SCROLL_LEFT (mmachine m) { MMpush (m, ITOM (EVENT_SCROLL_LEFT)); return 0; }
int SCOL_GTK_EVENT_SCROLL_RIGHT (mmachine m) { MMpush (m, ITOM (EVENT_SCROLL_RIGHT)); return 0; }
int SCOL_GTK_EVENT_SCROLL_UNKNOWN (mmachine m) { MMpush (m, ITOM (EVENT_SCROLL_UNKNOWN)); return 0; }


/* API définitions : */

char* gtk_wid_name[GTK_WIDGET_PKG_NB]=
{
    "SCOL_GTK_SIGNAL_MASK_PROPAGATE", "SCOL_GTK_SIGNAL_MASK_STOP",

    "SCOL_GTK_WIDGET_BUTTONPRESSED", "SCOL_GTK_WIDGET_BUTTONRELEASED", "SCOL_GTK_WIDGET_MOVERESIZE",
    "SCOL_GTK_WIDGET_DESTROY", "SCOL_GTK_WIDGET_ENTERLEAVE", "SCOL_GTK_WIDGET_KEYB_FOCUS",
    "SCOL_GTK_WIDGET_HIDE", "SCOL_GTK_WIDGET_SHOW", "SCOL_GTK_WIDGET_KEY",
    "SCOL_GTK_BUTTON_CLICKED", "SCOL_GTK_WIDGET_MOTION", "SCOL_GTK_WIDGET_SCROLL",
    "SCOL_GTK_WINDOW_STATE", "SCOL_GTK_NOTEBOOK_CHANGE", "SCOL_GTK_TEXTBUFFER_CHANGED",
    "SCOL_GTK_TEXTBUFFER_MODIFIED", "SCOL_GTK_WIDGET_VALUE_CHANGED",

    "SCOL_GTK_EVENT_NOTHING",

    "SCOL_GTK_EVENT_BUTTON_PRESSED", "SCOL_GTK_EVENT_BUTTON_PRESSED2", "SCOL_GTK_EVENT_BUTTON_PRESSED3",
    "SCOL_GTK_EVENT_BUTTON_RELEASE",

    "SCOL_GTK_EVENT_BUTTON_1", "SCOL_GTK_EVENT_BUTTON_2", "SCOL_GTK_EVENT_BUTTON_3",
    "SCOL_GTK_EVENT_BUTTON_4", "SCOL_GTK_EVENT_BUTTON_5",

    "SCOL_GTK_EVENT_KEY_SHIFT", "SCOL_GTK_EVENT_KEY_CONTROL", "SCOL_GTK_EVENT_KEY_ALT",
    "SCOL_GTK_EVENT_KEY_CAPS", "SCOL_GTK_EVENT_KEY_HYPER", "SCOL_GTK_EVENT_KEY_SUPER",
    "SCOL_GTK_EVENT_KEY_OTHER",

    "SCOL_GTK_EVENT_SCROLL_UP", "SCOL_GTK_EVENT_SCROLL_DOWN", "SCOL_GTK_EVENT_SCROLL_LEFT",
    "SCOL_GTK_EVENT_SCROLL_RIGHT", "SCOL_GTK_EVENT_SCROLL_UNKNOWN",

    "_gtkWidgetShowAll",
    "_gtkWidgetShow",
    "_gtkWidgetDestroy",
    "_gtkWidgetCB",
    "_gtkWidgetTypeName"
};

int (*gtk_wid_fun[GTK_WIDGET_PKG_NB])(mmachine m)=
{
    SCOL_GTK_SIGNAL_MASK_PROPAGATE, SCOL_GTK_SIGNAL_MASK_STOP,

    SCOL_GTK_WIDGET_BUTTONPRESSED, SCOL_GTK_WIDGET_BUTTONRELEASED, SCOL_GTK_WIDGET_MOVERESIZE,
    SCOL_GTK_WIDGET_DESTROY, SCOL_GTK_WIDGET_ENTERLEAVE, SCOL_GTK_WIDGET_KEYB_FOCUS,
    SCOL_GTK_WIDGET_HIDE, SCOL_GTK_WIDGET_SHOW, SCOL_GTK_WIDGET_KEY,
    SCOL_GTK_BUTTON_CLICKED, SCOL_GTK_WIDGET_MOTION, SCOL_GTK_WIDGET_SCROLL,
    SCOL_GTK_WINDOW_STATE, SCOL_GTK_NOTEBOOK_CHANGE, SCOL_GTK_TEXTBUFFER_CHANGED,
    SCOL_GTK_TEXTBUFFER_MODIFIED, SCOL_GTK_WIDGET_VALUE_CHANGED,

    SCOL_GTK_EVENT_NOTHING,

    SCOL_GTK_EVENT_BUTTON_PRESSED, SCOL_GTK_EVENT_BUTTON_PRESSED2, SCOL_GTK_EVENT_BUTTON_PRESSED3,
    SCOL_GTK_EVENT_BUTTON_RELEASE,

    SCOL_GTK_EVENT_BUTTON_1, SCOL_GTK_EVENT_BUTTON_2, SCOL_GTK_EVENT_BUTTON_3,
    SCOL_GTK_EVENT_BUTTON_4, SCOL_GTK_EVENT_BUTTON_5,

    SCOL_GTK_EVENT_KEY_SHIFT, SCOL_GTK_EVENT_KEY_CONTROL, SCOL_GTK_EVENT_KEY_ALT,
    SCOL_GTK_EVENT_KEY_CAPS, SCOL_GTK_EVENT_KEY_HYPER, SCOL_GTK_EVENT_KEY_SUPER,
    SCOL_GTK_EVENT_KEY_OTHER,

    SCOL_GTK_EVENT_SCROLL_UP, SCOL_GTK_EVENT_SCROLL_DOWN, SCOL_GTK_EVENT_SCROLL_LEFT,
    SCOL_GTK_EVENT_SCROLL_RIGHT, SCOL_GTK_EVENT_SCROLL_UNKNOWN,

    SCOL_gtkWidgetShowAll,
    SCOL_gtkWidgetShow,
    SCOL_gtkWidgetDestroy,
    SCOL_gtkWidgetCB,
    SCOL_gtkWidgetTypeName
};

int gtk_wid_narg[GTK_WIDGET_PKG_NB]=
{
    0, 0,

    0, 0, 0,
    0, 0, 0,
    0, 0, 0,
    0, 0, 0,
    0, 0, 0,
    0, 0,

    0,

    0, 0, 0,
    0,

    0, 0, 0,
    0, 0,

    0, 0, 0,
    0, 0, 0,
    0,

    0, 0, 0,
    0, 0,

    1,
    2,
    1,
    5,
    1
};

char* gtk_wid_type[GTK_WIDGET_PKG_NB]=
{
    "fun [] I", "fun [] I",

    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I",

    "fun [] I",

    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I",

    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I",

    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I",

    "fun [] I", "fun [] I", "fun [] I",
    "fun [] I", "fun [] I",

    "fun [ObjGtkWidget] ObjGtkWidget",
    "fun [ObjGtkWidget I] ObjGtkWidget",
    "fun [ObjGtkWidget] I",
    "fun [ObjGtkWidget u1 u0 I I] ObjGtkWidget",
    "fun [ObjGtkWidget] S"
};

int SCOLloadGTKwidget (mmachine m)
{
    int k;

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

    k = PKhardpak (m, "GTK2DwidgetEngine", GTK_WIDGET_PKG_NB, gtk_wid_name, gtk_wid_fun, gtk_wid_narg, gtk_wid_type);
    return k;
}




