/*************************************************************************** CPaint.cpp (c) 2004-2006 - Daniel Campos Fernández GTK+ component Realizado para la Junta de Extremadura. Consejería de Educación Ciencia y Tecnología. Proyecto gnuLinEx This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***************************************************************************/ #define __CPAINT_CPP #include "main.h" #include "CPaint.h" #include "../CWidget.h" #include "../gdraw.h" #include static void *CLASS_Window; static void *CLASS_Picture; static void *CLASS_DrawingArea; static GB_DRAW *DRIVER; static GdkDrawable *DRAWABLE; static GtkStyle *STYLE; typedef struct { gDraw *dr; } GB_DRAW_EXTRA; #define EXTRA() ((GB_DRAW_EXTRA *)(&(DRIVER->extra))) #define DR() (EXTRA()->dr) static GdkRectangle genrect; #define CHECK_CURRENT_DEVICE() { DRIVER=DRAW.GetCurrent(); \ if (!DRIVER) { GB.Error("No current device"); return; } \ DRAWABLE=(GdkDrawable*)GTK.Draw.GetDrawable(DR()); \ STYLE=(GtkStyle*)GTK.Draw.GetStyle(DR()); } void set_clip_rect(GdkRectangle **rect) { if (!DRIVER) { *rect=NULL; return; } if (!DRIVER->desc->Clip.IsEnabled(DRIVER)) { *rect=NULL; return; } DRIVER->desc->Clip.Get(DRIVER,&genrect.x,&genrect.y,&genrect.width,&genrect.height); *rect=&genrect; } BEGIN_METHOD_VOID(CPAINT_init) CLASS_Window = GB.FindClass("Window"); CLASS_Picture = GB.FindClass("Picture"); CLASS_DrawingArea = GB.FindClass("DrawingArea"); DRIVER=NULL; END_METHOD BEGIN_METHOD(CPAINT_arrow,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height; GB_INTEGER Type; GB_BOOLEAN Filled;) GdkRectangle *rect; gboolean filled=FALSE; GtkArrowType type; switch (VARG(Type)) { case 0: type=GTK_ARROW_UP; break; case 1: type=GTK_ARROW_DOWN; break; case 2: type=GTK_ARROW_LEFT; break; case 3: type=GTK_ARROW_RIGHT; break; default: { GB.Error("Unknown arrow type"); return; } } if (!MISSING(Filled)) filled=VARG(Filled); CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_arrow(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,type,filled,VARG(X),VARG(Y),VARG(Width),VARG(Height)); END_METHOD BEGIN_METHOD(CPAINT_box,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height) GdkRectangle *rect; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_box(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height)); END_METHOD BEGIN_METHOD(CPAINT_boxgap,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER W; GB_INTEGER H; GB_INTEGER GapSide; GB_INTEGER GapX; GB_INTEGER GapW;) GdkRectangle *rect; GtkPositionType side; switch (VARG(GapSide)) { case 0: side=GTK_POS_TOP; break; case 1: side=GTK_POS_BOTTOM; break; case 2: side=GTK_POS_LEFT; break; case 3: side=GTK_POS_RIGHT; break; default: GB.Error("Unknown gap side"); return; } CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_box_gap(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(W),VARG(H),side,VARG(GapX),VARG(GapW)); END_METHOD BEGIN_METHOD(CPAINT_check,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height) GdkRectangle *rect; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_check(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height)); END_METHOD BEGIN_METHOD(CPAINT_diamond,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height) GdkRectangle *rect; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_diamond(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height)); END_METHOD BEGIN_METHOD(CPAINT_extension,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height; GB_INTEGER Type;) GdkRectangle *rect; GtkPositionType type; switch(VARG(Type)) { case 0: type=GTK_POS_TOP; break; case 1: type=GTK_POS_BOTTOM; break; case 2: type=GTK_POS_LEFT; break; case 3: type=GTK_POS_RIGHT; break; default: GB.Error("Unknown position type"); return; } CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_extension(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height),type); END_METHOD BEGIN_METHOD(CPAINT_expander,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Style;) GdkRectangle *rect; GtkExpanderStyle style; switch(VARG(Style)) { case GTK_EXPANDER_COLLAPSED: case GTK_EXPANDER_SEMI_COLLAPSED: case GTK_EXPANDER_SEMI_EXPANDED: case GTK_EXPANDER_EXPANDED: style=(GtkExpanderStyle)VARG(Style); break; default: GB.Error("Unknown style"); return; } CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_expander(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), rect,NULL,NULL,VARG(X),VARG(Y),style); END_METHOD BEGIN_METHOD(CPAINT_flatbox,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height) GdkRectangle *rect; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_flat_box(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height)); END_METHOD BEGIN_METHOD(CPAINT_focus,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height) GdkRectangle *rect; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_focus(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height)); END_METHOD BEGIN_METHOD(CPAINT_handle,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height; GB_BOOLEAN Vertical;) GdkRectangle *rect; int orientation=GTK_ORIENTATION_HORIZONTAL; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); if (!MISSING(Vertical)) if (VARG(Vertical)) orientation=GTK_ORIENTATION_VERTICAL; gtk_paint_handle(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height), (GtkOrientation)orientation); END_METHOD BEGIN_METHOD(CPAINT_hline,GB_INTEGER X1; GB_INTEGER X2; GB_INTEGER Y;) GdkRectangle *rect; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_hline(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), rect,NULL,NULL,VARG(X1),VARG(X2),VARG(Y)); END_METHOD BEGIN_METHOD(CPAINT_option,GB_INTEGER X; GB_INTEGER Y; GB_INTEGER Width; GB_INTEGER Height) GdkRectangle *rect; CHECK_CURRENT_DEVICE(); set_clip_rect(&rect); gtk_paint_option(STYLE, DRAWABLE, (GtkStateType)GTK.Draw.GetState(DR()), (GtkShadowType)GTK.Draw.GetShadow(DR()), rect,NULL,NULL,VARG(X),VARG(Y),VARG(Width),VARG(Height)); END_METHOD BEGIN_METHOD(CPAINT_polygon,GB_OBJECT Points;GB_BOOLEAN Filled) GdkRectangle *rect; GdkPoint *points; GB_ARRAY arr=VARG(Points); long arrcount,bc,ct=0; int *vl; gboolean fill=FALSE; if (!arr) return; arrcount=GB.Array.Count(arr); if ( (arrcount % 2) != 0) arrcount--; if (!arrcount) return; if (!MISSING(Filled)) fill=VARG(Filled); GB.Alloc(POINTER(&points),sizeof(GdkPoint)*(arrcount/2) ); for (bc=0; bc