diff options
Diffstat (limited to 'app/wlib/gtklib/gtkbutton.c')
| -rw-r--r-- | app/wlib/gtklib/gtkbutton.c | 461 | 
1 files changed, 0 insertions, 461 deletions
| diff --git a/app/wlib/gtklib/gtkbutton.c b/app/wlib/gtklib/gtkbutton.c deleted file mode 100644 index 7780535..0000000 --- a/app/wlib/gtklib/gtkbutton.c +++ /dev/null @@ -1,461 +0,0 @@ -/** \file gtkbutton.c - * Toolbar button creation and handling - * - * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/wlib/gtklib/gtkbutton.c,v 1.8 2009-10-03 04:49:01 dspagnol Exp $ - */ - -/*  XTrkCad - Model Railroad CAD - *  Copyright (C) 2005 Dave Bullis - * - *  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 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <gtk/gtk.h> -#include <gdk/gdk.h> - -#include "gtkint.h" -#include "i18n.h" - -#define MIN_BUTTON_WIDTH (80) - -/* - ***************************************************************************** - * - * Simple Buttons - * - ***************************************************************************** - */ - -struct wButton_t { -		WOBJ_COMMON -		GtkLabel * labelG; -		GtkWidget * imageG; -		wButtonCallBack_p action; -		int busy; -		int recursion; -		}; - - -void wButtonSetBusy( wButton_p bb, int value ) { -	bb->recursion++; -	gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(bb->widget), value ); -	bb->recursion--; -	bb->busy = value; -} - - -void gtkSetLabel( -		GtkWidget *widget, -		long option, -		const char * labelStr, -		GtkLabel * * labelG, -		GtkWidget * * imageG ) -{ -	wIcon_p bm; -	GdkPixbuf *pixbuf; -	 -	GdkPixmap * pixmap; -	GdkBitmap * mask; -	 -	GtkWidget * hbox; -	if (widget == 0) abort(); -	if (labelStr){ -		if (option&BO_ICON) { -			bm = (wIcon_p)labelStr; -			 -			// for XPM files use the pixbuf functions -			if( bm->gtkIconType == gtkIcon_pixmap ) { -				pixbuf = gdk_pixbuf_new_from_xpm_data( (const char**)bm->bits ); -				if (*imageG==NULL) { -					*imageG = gtk_image_new_from_pixbuf( pixbuf ); -					gtk_container_add( GTK_CONTAINER( widget ), *imageG ); -					gtk_widget_show( *imageG ); -				} else { -					gtk_image_set_from_pixbuf( GTK_IMAGE(*imageG), pixbuf ); -				} -				g_object_unref( pixbuf ); -			} else { -				// otherwise use the conversion to XPM -				/** \todo { Should use the way via a pixbuf as well } */ -				pixmap = gtkMakeIcon( widget, bm, &mask ); -				if (*imageG==NULL) { -					*imageG = gtk_image_new_from_pixmap( pixmap, NULL ); -					gtk_widget_show( *imageG ); -					gtk_container_add( GTK_CONTAINER( widget ), *imageG ); -				} else { -					gtk_image_set_from_pixmap( GTK_IMAGE(*imageG), pixmap, NULL ); -				} -				gdk_pixmap_unref( pixmap ); -				gdk_bitmap_unref( mask ); -			} -		} else { -			if (*labelG==NULL) { -				*labelG = (GtkLabel*)gtk_label_new( gtkConvertInput(labelStr) ); -				gtk_container_add( GTK_CONTAINER(widget), (GtkWidget*)*labelG ); -				gtk_widget_show( (GtkWidget*)*labelG ); -			} else { -				gtk_label_set( *labelG, gtkConvertInput(labelStr) ); -			} -		} -	} -} - -void wButtonSetLabel( wButton_p bb, const char * labelStr) { -	gtkSetLabel( bb->widget, bb->option, labelStr, &bb->labelG, &bb->imageG ); -} - - - -void gtkButtonDoAction(  -		wButton_p bb ) -{ -	if (bb->action) -		bb->action( bb->data ); -} - - -static void pushButt( -		GtkWidget *widget, -		gpointer value ) -{ -	wButton_p b = (wButton_p)value; -	if (debugWindow >= 2) printf("%s button pushed\n", b->labelStr?b->labelStr:"No label" ); -	if (b->recursion) -		return; -	if (b->action) -		b->action(b->data); -	if (!b->busy) { -		b->recursion++; -		gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(b->widget), FALSE ); -		b->recursion--; -	} -} - -wButton_p wButtonCreate( -		wWin_p	parent, -		wPos_t	x, -		wPos_t	y, -		const char 	* helpStr, -		const char	* labelStr, -		long 	option, -		wPos_t 	width, -		wButtonCallBack_p action, -		void 	* data ) -{ -	wButton_p b; -	b = gtkAlloc( parent, B_BUTTON, x, y, labelStr, sizeof *b, data ); -	b->option = option; -	b->action = action; -	gtkComputePos( (wControl_p)b ); - -	b->widget = gtk_toggle_button_new(); -				 -	gtk_signal_connect (GTK_OBJECT(b->widget), "clicked", -						GTK_SIGNAL_FUNC(pushButt), b ); -	if (width > 0) -		gtk_widget_set_size_request( b->widget, width, -1 ); -	wButtonSetLabel( b, labelStr ); - -	gtk_fixed_put( GTK_FIXED(parent->widget), b->widget, b->realX, b->realY ); -	if (option & BB_DEFAULT) { -		GTK_WIDGET_SET_FLAGS( b->widget, GTK_CAN_DEFAULT ); -		gtk_widget_grab_default( b->widget ); -		gtk_window_set_default( GTK_WINDOW(parent->gtkwin), b->widget ); -	} -	gtkControlGetSize( (wControl_p)b ); -	if (width == 0 && b->w < MIN_BUTTON_WIDTH && (b->option&BO_ICON)==0) { -		b->w = MIN_BUTTON_WIDTH; -		gtk_widget_set_size_request( b->widget, b->w, b->h ); -	} -	gtk_widget_show( b->widget ); -	gtkAddButton( (wControl_p)b ); -	gtkAddHelpString( b->widget, helpStr ); -	return b; -} - - -/* - ***************************************************************************** - * - * Choice Boxes - * - ***************************************************************************** - */ - -struct wChoice_t { -		WOBJ_COMMON -		long *valueP; -		wChoiceCallBack_p action; -		int recursion; -		}; - - -static long choiceGetValue( -		wChoice_p bc ) -{ -	GList * child, * children; -	long value, inx; -	if (bc->type == B_TOGGLE) -		value = 0; -	else -		value = -1; -	for ( children=child=gtk_container_children(GTK_CONTAINER(bc->widget)),inx=0; child; child=child->next,inx++ ) { -		if ( GTK_TOGGLE_BUTTON(child->data)->active ) { -			if (bc->type == B_TOGGLE) { -				value |= (1<<inx); -			} else { -				value = inx; -			} -		} -	} -	if ( children ) -		g_list_free( children ); -	return value; -} - -EXPORT void wRadioSetValue( -		wChoice_p bc,		/* Radio box */ -		long value )		/* Value */ -/* -*/ -{ -	GList * child, * children; -	long inx; -	for ( children=child=gtk_container_children(GTK_CONTAINER(bc->widget)),inx=0; child; child=child->next,inx++ ) { -		if (inx == value) { -			bc->recursion++; -			gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(child->data), TRUE ); -			bc->recursion--; -		} -	} -	if ( children ) -		g_list_free( children ); -} - - -EXPORT long wRadioGetValue( -		wChoice_p bc )		/* Radio box */ -/* -*/ -{ -	return choiceGetValue(bc); -} - - -EXPORT void wToggleSetValue( -		wChoice_p bc,		/* Toggle box */ -		long value )		/* Values */ -/* -*/ -{ -	GList * child, * children; -	long inx; -	bc->recursion++; -	for ( children=child=gtk_container_children(GTK_CONTAINER(bc->widget)),inx=0; child; child=child->next,inx++ ) { -		gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(child->data), (value&(1<<inx))!=0 );  -	} -	if ( children ) -		g_list_free( children ); -	bc->recursion--; -} - - -EXPORT long wToggleGetValue( -		wChoice_p b )		/* Toggle box */ -/* -*/ -{ -	return choiceGetValue(b); -} - - -static int pushChoice( -		GtkWidget *widget, -		gpointer b ) -{ -	wChoice_p bc = (wChoice_p)b; -	long value = choiceGetValue( bc ); -	if (debugWindow >= 2) printf("%s choice pushed = %ld\n", bc->labelStr?bc->labelStr:"No label", value ); -	if ( bc->type == B_RADIO && !(GTK_TOGGLE_BUTTON(widget))->active ) -		return 1; -	if (bc->recursion) -		return 1; -	if (bc->valueP) -		*bc->valueP = value; -	if (bc->action) -		bc->action( value, bc->data); -	return 1; -} - - -static void choiceRepaint( -		wControl_p b ) -{ -	wChoice_p bc = (wChoice_p)b; -	if ( GTK_WIDGET_VISIBLE( b->widget ) ) -		gtkDrawBox( bc->parent, wBoxBelow, bc->realX-1, bc->realY-1, bc->w+1, bc->h+1 ); -} - - -EXPORT wChoice_p wRadioCreate( -		wWin_p	parent,		/* Parent window */ -		wPos_t	x,		/* X-position */ -		wPos_t	y,		/* Y-position */ -		const char 	* helpStr,	/* Help string */ -		const char	* labelStr,	/* Label */ -		long	option,		/* Options */ -		const char	**labels,	/* Labels */ -		long	*valueP,	/* Selected value */ -		wChoiceCallBack_p action,	/* Callback */ -		void 	*data )		/* Context */ -/* -*/ -{ -	wChoice_p b; -	const char ** label; -	GtkWidget *butt0=NULL, *butt; - -	if ((option & BC_NOBORDER)==0) { -		if (x>=0) -			x++; -		else -			x--; -		if (y>=0) -			y++; -		else -			y--; -	} -	b = gtkAlloc( parent, B_RADIO, x, y, labelStr, sizeof *b, data ); -	b->option = option; -	b->action = action; -	b->valueP = valueP; -	gtkComputePos( (wControl_p)b ); - -	if (option&BC_HORZ) -		b->widget = gtk_hbox_new( FALSE, 0 ); -	else -		b->widget = gtk_vbox_new( FALSE, 0 ); -	if (b->widget == 0) abort(); -	for ( label=labels; *label; label++ ) { -		butt = gtk_radio_button_new_with_label(  -				butt0?gtk_radio_button_group(GTK_RADIO_BUTTON(butt0)):NULL, _(*label) ); -		if (butt0==NULL) -			butt0 = butt; -		gtk_box_pack_start( GTK_BOX(b->widget), butt, TRUE, TRUE, 0 ); -		gtk_widget_show( butt ); -		gtk_signal_connect (GTK_OBJECT(butt), "toggled", -						GTK_SIGNAL_FUNC( pushChoice ), b ); -		gtkAddHelpString( butt, helpStr ); -	} -	if (option & BB_DEFAULT) { -		GTK_WIDGET_SET_FLAGS( b->widget, GTK_CAN_DEFAULT ); -		gtk_widget_grab_default( b->widget ); -		/*gtk_window_set_default( GTK_WINDOW(parent->gtkwin), b->widget );*/ -	} -	if (valueP) -		wRadioSetValue( b, *valueP ); - -	if ((option & BC_NOBORDER)==0) { -		if (parent->gc == NULL) { -			parent->gc = gdk_gc_new( parent->gtkwin->window ); -			gdk_gc_copy( parent->gc, parent->gtkwin->style->base_gc[GTK_STATE_NORMAL] ); -			parent->gc_linewidth = 0; -			gdk_gc_set_line_attributes( parent->gc, parent->gc_linewidth, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER ); -		} -		b->repaintProc = choiceRepaint; -		b->w += 2; -		b->h += 2; -	} - -	gtk_fixed_put( GTK_FIXED(parent->widget), b->widget, b->realX, b->realY ); -	gtkControlGetSize( (wControl_p)b ); -	if (labelStr) -		b->labelW = gtkAddLabel( (wControl_p)b, labelStr ); -	gtk_widget_show( b->widget ); -	gtkAddButton( (wControl_p)b ); -	return b; -} - -wChoice_p wToggleCreate( -		wWin_p	parent,		/* Parent window */ -		wPos_t	x,		/* X-position */ -		wPos_t	y,		/* Y-position */ -		const char 	* helpStr,	/* Help string */ -		const char	* labelStr,	/* Label */ -		long	option,		/* Options */ -		const char	**labels,	/* Labels */ -		long	*valueP,	/* Selected value */ -		wChoiceCallBack_p action,	/* Callback */ -		void 	*data )		/* Context */ -/* -*/ -{ -	wChoice_p b; -	const char ** label; -	GtkWidget *butt; - -	if ((option & BC_NOBORDER)==0) { -		if (x>=0) -			x++; -		else -			x--; -		if (y>=0) -			y++; -		else -			y--; -	} -	b = gtkAlloc( parent, B_TOGGLE, x, y, labelStr, sizeof *b, data ); -	b->option = option; -	b->action = action; -	gtkComputePos( (wControl_p)b ); - -	if (option&BC_HORZ) -		b->widget = gtk_hbox_new( FALSE, 0 ); -	else -		b->widget = gtk_vbox_new( FALSE, 0 ); -	if (b->widget == 0) abort(); -	for ( label=labels; *label; label++ ) { -		butt = gtk_check_button_new_with_label(_(*label)); -		gtk_box_pack_start( GTK_BOX(b->widget), butt, TRUE, TRUE, 0 ); -		gtk_widget_show( butt ); -		gtk_signal_connect (GTK_OBJECT(butt), "toggled", -						GTK_SIGNAL_FUNC( pushChoice ), b ); -		gtkAddHelpString( butt, helpStr ); -	} -	if (valueP) -		wToggleSetValue( b, *valueP ); - -	if ((option & BC_NOBORDER)==0) { -		if (parent->gc == NULL) { -			parent->gc = gdk_gc_new( parent->gtkwin->window ); -			gdk_gc_copy( parent->gc, parent->gtkwin->style->base_gc[GTK_STATE_NORMAL] ); -			parent->gc_linewidth = 0; -			gdk_gc_set_line_attributes( parent->gc, parent->gc_linewidth, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER ); -		} -		b->repaintProc = choiceRepaint; -		b->w += 2; -		b->h += 2; -	} - -	gtk_fixed_put( GTK_FIXED(parent->widget), b->widget, b->realX, b->realY ); -	gtkControlGetSize( (wControl_p)b ); -	if (labelStr) -		b->labelW = gtkAddLabel( (wControl_p)b, labelStr ); -	gtk_widget_show( b->widget ); -	gtkAddButton( (wControl_p)b ); -	return b; -} | 
