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