1 #   include	"appFrameConfig.h"
2 
3 #   include	<stdlib.h>
4 #   include	<stdio.h>
5 
6 #   include	"guiWidgets.h"
7 #   include	"appListGtk.h"
8 
9 #   include	<appDebugon.h>
10 
11 #   ifdef USE_GTK
12 
13 /************************************************************************/
14 /*									*/
15 /*  List specific functionality.					*/
16 /*									*/
17 /************************************************************************/
18 
19 static const char	APP_ListAction[]= "ListAction";
20 
appGuiGtkFreeListAction(void * voidla)21 static void appGuiGtkFreeListAction( void * voidla )
22     { free( voidla );	}
23 
appListGtkMakeParent(GtkAdjustment ** pVAdjustment,GtkWidget * column)24 GtkWidget * appListGtkMakeParent(	GtkAdjustment **	pVAdjustment,
25 					GtkWidget *		column )
26     {
27     GtkWidget *		scrolled_window;
28     GtkAdjustment *	vadjust;
29 
30     gboolean		expand= TRUE;
31     gboolean		fill= TRUE;
32 
33     scrolled_window= gtk_scrolled_window_new(
34 				(GtkAdjustment *)0, (GtkAdjustment *)0 );
35 
36     gtk_box_pack_start( GTK_BOX( column ), scrolled_window, expand, fill, 0 );
37 
38     gtk_scrolled_window_set_placement( GTK_SCROLLED_WINDOW( scrolled_window ),
39 						    GTK_CORNER_BOTTOM_LEFT );
40     gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolled_window ),
41 						    GTK_POLICY_NEVER,
42 						    GTK_POLICY_AUTOMATIC );
43 
44     vadjust= gtk_scrolled_window_get_vadjustment(
45 				    GTK_SCROLLED_WINDOW( scrolled_window ) );
46     gtk_adjustment_set_value( vadjust, 0 );
47 
48     gtk_container_set_focus_vadjustment(
49 				    GTK_CONTAINER( scrolled_window ), vadjust );
50 
51     gtk_widget_show( scrolled_window );
52 
53     *pVAdjustment= vadjust;
54     return scrolled_window;
55     }
56 
appListGtkSetVisibleSize(GtkWidget * list,GtkWidget * scrolled_window,int visibleItems)57 void appListGtkSetVisibleSize(		GtkWidget *		list,
58 					GtkWidget *		scrolled_window,
59 					int			visibleItems )
60     {
61     int		pixelSize= 9;
62     GtkStyle *	gs= gtk_widget_get_style( list );
63 
64     if  ( gs->font_desc )
65 	{
66 	if  ( pango_font_description_get_size_is_absolute( gs->font_desc ) )
67 	    {
68 	    int		sz;
69 
70 	    sz= pango_font_description_get_size( gs->font_desc );
71 	    if  ( sz > 0 )
72 		{ pixelSize= sz;	}
73 	    }
74 	}
75     else{
76 	GdkFont *	gf;
77 
78 #	if GTK_MAJOR_VERSION < 2
79 	gf= gs->font;
80 #	else
81 	gf= gtk_style_get_font( gs );
82 #	endif
83 
84 	pixelSize= gf->ascent+ gf->descent;
85 	}
86 
87 #   if GTK_MAJOR_VERSION < 2
88     gtk_widget_set_usize( scrolled_window, -1,
89 				( 110* visibleItems* pixelSize )/ 100 );
90 #   else
91     gtk_widget_set_size_request( scrolled_window, 0,
92 				( 110* visibleItems* pixelSize )/ 100 );
93 #   endif
94     }
95 
appListGtkResized(GtkWidget * w,GdkRectangle * allocation,gpointer voidla)96 static void appListGtkResized(	GtkWidget *		w,
97 				GdkRectangle *		allocation,
98 				gpointer		voidla )
99     {
100     ListAction *	la= (ListAction *)voidla;
101 
102     la->laListHigh= allocation->height;
103 
104     if  ( la->laListHigh > 0		&&
105 	  la->laParentHigh > 0		&&
106 	  la->laSelectedPosition >= 0	)
107 	{
108 	appGuiGtkSetListAdjustment( la, la->laSelectedPosition );
109 	}
110 
111     /*  NO gtk_adjustment_set_upper( la->laAdjustment ): crashes Gtk ) */
112     }
113 
appListGtkParentResized(GtkWidget * w,GdkRectangle * allocation,gpointer voidla)114 static void appListGtkParentResized(	GtkWidget *		w,
115 					GdkRectangle *		allocation,
116 					gpointer		voidla )
117     {
118     ListAction *	la= (ListAction *)voidla;
119 
120     la->laParentHigh= allocation->height;
121 
122     if  ( la->laListHigh > 0		&&
123 	  la->laParentHigh > 0		&&
124 	  la->laSelectedPosition >= 0	)
125 	{
126 	appGuiGtkSetListAdjustment( la, la->laSelectedPosition );
127 	}
128 
129     /*  NO gtk_adjustment_set_page_size( la->laAdjustment ): crashes Gtk ) */
130     }
131 
appListGtkSetFocusChild(GtkTreeView * parent,GtkWidget * w,gpointer voidla)132 static void appListGtkSetFocusChild(	GtkTreeView *		parent,
133 					GtkWidget *		w,
134 					gpointer		voidla )
135     {
136     ListAction *	la= (ListAction *)voidla;
137 
138     if  ( la->laListHigh > 0		&&
139 	  la->laParentHigh > 0		&&
140 	  la->laSelectedPosition >= 0	)
141 	{
142 	appGuiGtkSetListAdjustment( la, la->laSelectedPosition );
143 	}
144 
145     }
146 
appListGtkSetCallbacks(GtkWidget * widget,GtkWidget * scrolled_window,GtkAdjustment * adjustment,APP_LIST_CALLBACK_T listCallback,APP_BUTTON_CALLBACK_T actionCallback,void * through)147 ListAction * appListGtkSetCallbacks(
148 				GtkWidget *		widget,
149 				GtkWidget *		scrolled_window,
150 				GtkAdjustment *		adjustment,
151 				APP_LIST_CALLBACK_T	listCallback,
152 				APP_BUTTON_CALLBACK_T	actionCallback,
153 				void *			through )
154     {
155     ListAction *	la= malloc( sizeof(ListAction) );
156 
157     if  ( ! la )
158 	{ XDEB(la); return (void *)0;	}
159 
160     la->laWidget= widget;
161     la->laParentWidget= scrolled_window;
162     la->laAdjustment= adjustment;
163     la->laThrough= through;
164     la->laActionCallback= actionCallback;
165     la->laListCallback= listCallback;
166 
167     la->laListHigh= 0;
168     la->laParentHigh= 0;
169     la->laItemCount= 0;
170     la->laSelectedPosition= -1;
171 
172     gtk_object_set_data_full( GTK_OBJECT(widget), APP_ListAction, la,
173 						    appGuiGtkFreeListAction );
174 
175     gtk_signal_connect( GTK_OBJECT( la->laWidget ), "size-allocate",
176 			    (GCallback)appListGtkResized, (void *)la );
177     if  ( la->laParentWidget )
178 	{
179 	gtk_signal_connect( GTK_OBJECT( la->laParentWidget ), "size-allocate",
180 			    (GCallback)appListGtkParentResized, (void *)la );
181 	}
182 
183     gtk_signal_connect( GTK_OBJECT( la->laParentWidget ), "set-focus-child",
184 			    (GCallback)appListGtkSetFocusChild, (void *)la );
185 
186     return la;
187     }
188 
appListGtkGetListAction(GtkWidget * widget)189 ListAction * appListGtkGetListAction(
190 				GtkWidget *		widget )
191     {
192     return (ListAction *)gtk_object_get_data(
193 			    GTK_OBJECT(widget), APP_ListAction );
194     }
195 
appGuiGtkSetListAdjustment(ListAction * la,int position)196 void appGuiGtkSetListAdjustment(		ListAction *	la,
197 						int		position )
198     {
199     int	increment;
200     int	old_value;
201     int	new_value;
202 
203     la->laSelectedPosition= position;
204 
205     if  ( la->laItemCount == 0 )
206 	{ /*LLDEB(position,la->laItemCount);*/ return; }
207 
208     increment= la->laListHigh/ la->laItemCount;
209     if  ( increment == 0 )
210 	{ /*LDEB(increment);*/ return;	}
211 
212     old_value= gtk_adjustment_get_value( la->laAdjustment );
213     new_value= position* increment;
214 
215     if  ( new_value < old_value )
216 	{
217 	gtk_adjustment_set_value( la->laAdjustment, new_value );
218 	}
219     else{
220 	int	pagesize= la->laParentHigh;
221 
222 	if  ( new_value+ increment > old_value+ pagesize )
223 	    {
224 	    int	upper= la->laListHigh;
225 	    int	visible_increments= la->laParentHigh/ increment;
226 
227 	    new_value -= ( visible_increments- 1 )* increment;
228 
229 	    if  ( new_value > upper- pagesize )
230 		{ new_value= upper- pagesize;	}
231 
232 	    gtk_adjustment_set_value( la->laAdjustment, new_value );
233 	    }
234 	}
235 
236     return;
237     }
238 
239 #   endif
240