1 /***************************************************************************
2     begin       : Sun May 16 2010
3     copyright   : (C) 2010 by Martin Preuss
4     email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  *          Please see toplevel file COPYING for license details           *
8  ***************************************************************************/
9 
10 
11 
12 
13 
14 static GWENHYWFAR_CB
Gtk2Gui_WTextBrowser_SetIntProperty(GWEN_WIDGET * w,GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,int value,GWEN_UNUSED int doSignal)15 int Gtk2Gui_WTextBrowser_SetIntProperty(GWEN_WIDGET *w,
16                                         GWEN_DIALOG_PROPERTY prop,
17                                         GWEN_UNUSED int index,
18                                         int value,
19                                         GWEN_UNUSED int doSignal)
20 {
21   GtkWidget *g;  /* text view */
22   GtkWidget *gs; /* scrollable window */
23 
24   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_CONTENT));
25   assert(g);
26   gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
27   assert(gs);
28 
29   switch (prop) {
30   case GWEN_DialogProperty_Enabled:
31     gtk_widget_set_sensitive(GTK_WIDGET(gs), (value==0)?FALSE:TRUE);
32     return 0;
33 
34   case GWEN_DialogProperty_Focus:
35     gtk_widget_grab_focus(GTK_WIDGET(gs));
36     return 0;
37 
38   case GWEN_DialogProperty_Width:
39   case GWEN_DialogProperty_Height:
40     /* just ignore these for now */
41     return 0;
42 
43   default:
44     break;
45   }
46 
47   DBG_WARN(GWEN_LOGDOMAIN,
48            "Function is not appropriate for this type of widget (%s)",
49            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
50   return GWEN_ERROR_INVALID;
51 }
52 
53 
54 
55 
56 static GWENHYWFAR_CB
Gtk2Gui_WTextBrowser_GetIntProperty(GWEN_WIDGET * w,GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,int defaultValue)57 int Gtk2Gui_WTextBrowser_GetIntProperty(GWEN_WIDGET *w,
58                                         GWEN_DIALOG_PROPERTY prop,
59                                         GWEN_UNUSED int index,
60                                         int defaultValue)
61 {
62   GtkWidget *g;  /* text view */
63   GtkWidget *gs; /* scrollable window */
64 
65   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_CONTENT));
66   assert(g);
67   gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
68   assert(gs);
69 
70   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_CONTENT));
71   assert(g);
72 
73   switch (prop) {
74   case GWEN_DialogProperty_Enabled:
75     return (gtk_widget_get_sensitive(GTK_WIDGET(gs))==TRUE)?1:0;
76 
77   case GWEN_DialogProperty_Focus:
78     return (gtk_widget_has_focus(GTK_WIDGET(gs))==TRUE)?1:0;
79     return 0;
80 
81   case GWEN_DialogProperty_Width:
82   case GWEN_DialogProperty_Height:
83     /* just ignore these for now */
84     return 0;
85 
86   default:
87     break;
88   }
89 
90   DBG_WARN(GWEN_LOGDOMAIN,
91            "Function is not appropriate for this type of widget (%s)",
92            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
93   return defaultValue;
94 }
95 
96 
97 
98 static GWENHYWFAR_CB
Gtk2Gui_WTextBrowser_SetCharProperty(GWEN_WIDGET * w,GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,const char * value,GWEN_UNUSED int doSignal)99 int Gtk2Gui_WTextBrowser_SetCharProperty(GWEN_WIDGET *w,
100                                          GWEN_DIALOG_PROPERTY prop,
101                                          GWEN_UNUSED int index,
102                                          const char *value,
103                                          GWEN_UNUSED int doSignal)
104 {
105   GtkWidget *g;  /* text view */
106   GtkWidget *gs; /* scrollable window */
107   GWEN_BUFFER *tbuf;
108 
109   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_CONTENT));
110   assert(g);
111   gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
112   assert(gs);
113 
114   tbuf=GWEN_Buffer_new(0, 128, 0, 1);
115   if (value && *value)
116     Gtk2Gui_GetRawText(value, tbuf);
117 
118   switch (prop) {
119   case GWEN_DialogProperty_Value: {
120     GtkTextBuffer *tb;
121     GtkAdjustment *va;
122 
123     tb=gtk_text_view_get_buffer(GTK_TEXT_VIEW(g));
124     assert(tb);
125     gtk_text_buffer_set_text(tb, GWEN_Buffer_GetStart(tbuf), -1);
126 
127     /* scroll to end */
128     va=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gs));
129     if (va)
130       gtk_adjustment_set_value(va, va->upper);
131     GWEN_Buffer_free(tbuf);
132 
133     return 0;
134   }
135   default:
136     break;
137   }
138 
139   DBG_WARN(GWEN_LOGDOMAIN,
140            "Function is not appropriate for this type of widget (%s)",
141            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
142   GWEN_Buffer_free(tbuf);
143   return GWEN_ERROR_INVALID;
144 }
145 
146 
147 
148 static GWENHYWFAR_CB
Gtk2Gui_WTextBrowser_GetCharProperty(GWEN_WIDGET * w,GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,const char * defaultValue)149 const char *Gtk2Gui_WTextBrowser_GetCharProperty(GWEN_WIDGET *w,
150                                                  GWEN_DIALOG_PROPERTY prop,
151                                                  GWEN_UNUSED int index,
152                                                  const char *defaultValue)
153 {
154   GtkWidget *g;  /* text view */
155   GtkWidget *gs; /* scrollable window */
156 
157   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_CONTENT));
158   assert(g);
159   gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
160   assert(gs);
161 
162   switch (prop) {
163   case GWEN_DialogProperty_Value: {
164     GtkTextBuffer *tb;
165     GtkTextIter startIter;
166     GtkTextIter endIter;
167     gchar *s;
168 
169     tb=gtk_text_view_get_buffer(GTK_TEXT_VIEW(g));
170     assert(tb);
171 
172     gtk_text_buffer_get_start_iter(tb, &startIter);
173     gtk_text_buffer_get_end_iter(tb, &endIter);
174 
175     s=gtk_text_buffer_get_text(tb, &startIter, &endIter, FALSE);
176     if (s) {
177       GWEN_Widget_SetText(w, GTK2_DIALOG_STRING_VALUE, s);
178       g_free(s);
179       return GWEN_Widget_GetText(w, GTK2_DIALOG_STRING_VALUE);
180     }
181     return defaultValue;
182   }
183 
184   default:
185     break;
186   }
187 
188   DBG_WARN(GWEN_LOGDOMAIN,
189            "Function is not appropriate for this type of widget (%s)",
190            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
191   return defaultValue;
192 }
193 
194 
195 
Gtk2Gui_WTextBrowser_Setup(GWEN_WIDGET * w)196 int Gtk2Gui_WTextBrowser_Setup(GWEN_WIDGET *w)
197 {
198   GtkWidget *gs;
199   GtkWidget *g;
200   const char *s;
201   /*uint32_t flags;*/
202   GWEN_WIDGET *wParent;
203 
204   /*flags=GWEN_Widget_GetFlags(w);*/
205   wParent=GWEN_Widget_Tree_GetParent(w);
206   s=GWEN_Widget_GetText(w, 0);
207 
208   /* create widget */
209   gs=gtk_scrolled_window_new(NULL, NULL);
210   g=gtk_text_view_new();
211   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(gs), g);
212 
213   if (s && *s) {
214     GWEN_BUFFER *tbuf;
215 
216     tbuf=GWEN_Buffer_new(0, 128, 0, 1);
217     Gtk2Gui_GetRawText(s, tbuf);
218     gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(g)), GWEN_Buffer_GetStart(tbuf), -1);
219     GWEN_Buffer_free(tbuf);
220   }
221 
222   GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_REAL, (void *) gs);
223   GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_CONTENT, (void *) g);
224 
225   GWEN_Widget_SetSetIntPropertyFn(w, Gtk2Gui_WTextBrowser_SetIntProperty);
226   GWEN_Widget_SetGetIntPropertyFn(w, Gtk2Gui_WTextBrowser_GetIntProperty);
227   GWEN_Widget_SetSetCharPropertyFn(w, Gtk2Gui_WTextBrowser_SetCharProperty);
228   GWEN_Widget_SetGetCharPropertyFn(w, Gtk2Gui_WTextBrowser_GetCharProperty);
229 
230   if (wParent)
231     GWEN_Widget_AddChildGuiWidget(wParent, w);
232 
233   return 0;
234 }
235 
236 
237