1 /* TextEdit.c */
2 /**********************************************************************************************************
3 Copyright (c) 2002-2013 Abdul-Rahman Allouche. All rights reserved
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6 documentation files (the Gabedit), to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8 and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
10 The above copyright notice and this permission notice shall be included in all copies or substantial portions
11 of the Software.
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
14 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
16 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17 DEALINGS IN THE SOFTWARE.
18 ************************************************************************************************************/
19
20
21 #include "../../Config.h"
22 #include <string.h>
23
24 #include "Global.h"
25 #include "../Utils/UtilsInterface.h"
26 #include "../Utils/Utils.h"
27 #include "../Utils/GabeditTextEdit.h"
28 #include "../Geometry/ResultsAnalise.h"
29 #include "Windows.h"
30
31 #define COUPER 7
32 #define COPIER 8
33 #define COLLER 9
34 #define SELECTALL 10
35 #define FIND 11
36
37 #define DIML 10
38 /********************************************************************************/
39 gchar *liste[DIML];
40 guint nliste = 1;
41 void find_text_win();
42 /******************************************************************************/
change_liste(G_CONST_RETURN gchar * str)43 static void change_liste(G_CONST_RETURN gchar *str)
44 {
45 gboolean OK;
46 guint i;
47 OK=FALSE;
48 for(i=0;i<nliste;i++)
49 if(!strcmp(str,liste[i]) )
50 {
51 OK=TRUE;
52 break;
53 }
54 if(!OK) {
55 if(nliste<DIML)
56 nliste++;
57 for(i=nliste-1;i>0;i--)
58 liste[i]=liste[i-1];
59 liste[0]=g_strdup(str);
60 }
61
62 }
63 /********************************************************************************/
find_text_forward(GtkWidget * wid,gpointer entry)64 static void find_text_forward(GtkWidget *wid,gpointer entry)
65 {
66 GtkWidget* view;
67 GtkWidget* label;
68 gchar* t;
69 G_CONST_RETURN gchar *str;
70 guint i;
71 gint n;
72 str = gtk_entry_get_text(GTK_ENTRY(entry));
73 change_liste(str);
74 i=gtk_notebook_get_current_page(GTK_NOTEBOOK(NoteBookText));
75 view = text;
76 if(i==1)view = textresult;
77
78 label = g_object_get_data(G_OBJECT (entry), "Label");
79 gtk_label_set_text(GTK_LABEL(label)," ");
80
81 n = gabedit_text_search_forward(view, str);
82
83 if(n>0) t = g_strdup_printf(_(" %d strings found and marked in red"),n);
84 else t = g_strdup_printf(_(" no strings found"));
85 gtk_label_set_text(GTK_LABEL(label),t);
86 g_free(t);
87 }
88 /********************************************************************************/
find_text_backward(GtkWidget * wid,gpointer entry)89 static void find_text_backward(GtkWidget *wid,gpointer entry)
90 {
91 GtkWidget* view;
92 GtkWidget* label;
93 gchar* t;
94 G_CONST_RETURN gchar *str;
95 guint i;
96 gint n;
97 str = gtk_entry_get_text(GTK_ENTRY(entry));
98 change_liste(str);
99 i=gtk_notebook_get_current_page(GTK_NOTEBOOK(NoteBookText));
100 view = text;
101 if(i==1)view = textresult;
102
103 label = g_object_get_data(G_OBJECT (entry), "Label");
104 gtk_label_set_text(GTK_LABEL(label)," ");
105
106 n = gabedit_text_search_backward(view, str);
107
108 if(n>0) t = g_strdup_printf(_(" %d strings found and marked in red"),n);
109 else t = g_strdup_printf(_(" no strings found"));
110 gtk_label_set_text(GTK_LABEL(label),t);
111 g_free(t);
112 }
113 /*****************************************************************************************/
find_text_all(GtkWidget * wid,gpointer entry)114 static void find_text_all(GtkWidget *wid,gpointer entry)
115 {
116 GtkWidget* view;
117 GtkWidget* label;
118 gchar* t;
119 G_CONST_RETURN gchar *str;
120 guint i;
121 gint n;
122 str = gtk_entry_get_text(GTK_ENTRY(entry));
123 change_liste(str);
124 i=gtk_notebook_get_current_page(GTK_NOTEBOOK(NoteBookText));
125 view = text;
126 if(i==1)view = textresult;
127
128 label = g_object_get_data(G_OBJECT (entry), "Label");
129 gtk_label_set_text(GTK_LABEL(label)," ");
130
131 n = gabedit_text_search_all(view, str);
132
133 if(n>0) t = g_strdup_printf(_(" %d strings found and marked in red"),n);
134 else t = g_strdup_printf(_(" no strings found"));
135 gtk_label_set_text(GTK_LABEL(label),t);
136 g_free(t);
137 }
138 /*****************************************************************************************/
create_combo_box_entry_liste_find(GtkWidget * Window,GtkWidget * hbox,gchar * lname,gchar ** liste,int n)139 GtkWidget *create_combo_box_entry_liste_find(GtkWidget* Window,GtkWidget* hbox,gchar *lname,gchar **liste,int n)
140 {
141 int i;
142 GtkWidget *label;
143 GtkWidget *combo;
144 GtkWidget *combo_entry;
145 GList *combo_items = NULL;
146 label = gtk_label_new (lname);
147 gtk_widget_show (label);
148 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE,FALSE, 2);
149
150 combo = gtk_combo_box_entry_new_text ();
151 gtk_widget_set_size_request(combo, (gint)(ScreenHeight*0.150), -1);
152 gtk_widget_show (combo);
153 gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 2);
154 for (i=0;i<n;i++) combo_items = g_list_append (combo_items, liste[i]);
155 gtk_combo_box_entry_set_popdown_strings (combo, combo_items);
156 g_list_free (combo_items);
157
158 combo_entry = GTK_BIN (combo)->child;
159 gtk_widget_show (combo_entry);
160 gtk_entry_set_text (GTK_ENTRY (combo_entry), liste[0]);
161 return combo_entry;
162 }
163 /*****************************************************************************************/
find_text_win()164 void find_text_win()
165 {
166 GtkWidget *fp;
167 GtkWidget *frame;
168 GtkWidget *entry;
169 GtkWidget *vboxall;
170 GtkWidget *vboxframe;
171 GtkWidget *hbox1;
172 GtkWidget *hbox2;
173 GtkWidget *button;
174 GtkWidget *label;
175 GtkWidget *hseparator;
176
177 if(nliste==1)liste[0]=g_strdup("");
178 fp = gtk_window_new(GTK_WINDOW_TOPLEVEL);
179 gtk_window_set_transient_for(GTK_WINDOW(fp),GTK_WINDOW(Fenetre));
180 gtk_window_set_title(GTK_WINDOW(fp),"Search");
181 gtk_window_set_position(GTK_WINDOW(fp),GTK_WIN_POS_CENTER);
182 gtk_window_set_transient_for(GTK_WINDOW(fp),GTK_WINDOW(Fenetre));
183 gtk_container_set_border_width (GTK_CONTAINER (fp), 5);
184
185 g_signal_connect(G_OBJECT(fp), "delete_event", (GCallback)destroy_button_windows, NULL);
186 g_signal_connect(G_OBJECT(fp), "delete_event", (GCallback)gtk_widget_destroy, NULL);
187
188 vboxall = create_vbox(fp);
189 frame = gtk_frame_new (_("FIND"));
190 gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
191 gtk_container_add (GTK_CONTAINER (vboxall), frame);
192 gtk_widget_show (frame);
193
194 vboxframe = create_vbox(frame);
195 hbox1 = gtk_hbox_new (FALSE, 5);
196 g_object_ref (hbox1);
197 gtk_widget_show (hbox1);
198 gtk_box_pack_start (GTK_BOX (vboxframe), hbox1, FALSE, FALSE, 2);
199 entry= create_combo_box_entry_liste_find(fp,hbox1,_(" String to find :"),liste,nliste);
200
201
202 hseparator = gtk_hseparator_new ();
203 gtk_widget_show (hseparator);
204 gtk_box_pack_start (GTK_BOX (vboxframe), hseparator, FALSE, FALSE, 1);
205
206 label = gtk_label_new(" ");
207 gtk_box_pack_start (GTK_BOX (vboxframe), label, FALSE, FALSE, 4);
208 g_object_set_data(G_OBJECT (entry), "Label", label);
209
210 hbox2 = gtk_hbox_new (TRUE, 0);
211 g_object_ref (hbox2);
212 gtk_widget_show (hbox2);
213 gtk_box_pack_start (GTK_BOX (vboxall), hbox2, FALSE, FALSE, 4);
214
215 button = gtk_button_new_with_label (_("All"));
216 gtk_box_pack_start (GTK_BOX( hbox2), button, TRUE, TRUE, 3);
217 gtk_widget_show (button);
218 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(find_text_all),(gpointer)entry);
219
220 button = gtk_button_new_with_label (_("Forward"));
221 gtk_box_pack_start (GTK_BOX( hbox2), button, TRUE, TRUE, 3);
222 gtk_widget_show (button);
223 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(find_text_forward),(gpointer)entry);
224
225 button = gtk_button_new_with_label (_("Backward"));
226 gtk_box_pack_start (GTK_BOX( hbox2), button, TRUE, TRUE, 3);
227 gtk_widget_show (button);
228 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(find_text_backward),(gpointer)entry);
229
230
231 button = gtk_button_new_with_label ("Close");
232 gtk_box_pack_start (GTK_BOX( hbox2), button, TRUE, TRUE, 3);
233 g_signal_connect_swapped(G_OBJECT(button),"clicked",
234 (GCallback)destroy_button_windows,
235 GTK_OBJECT(fp));
236 g_signal_connect_swapped(G_OBJECT(button), "clicked",
237 G_CALLBACK(gtk_widget_destroy),GTK_OBJECT(fp));
238
239 gtk_widget_show (button);
240
241 add_button_windows(_(" Find "),fp);
242 gtk_widget_show_all(fp);
243 }
244 /*****************************************************************************************/
AddBarResult(GtkWidget * Frame)245 GtkWidget *AddBarResult(GtkWidget *Frame)
246 {
247 GtkWidget *hboxframe;
248 GtkWidget *frame;
249 GtkWidget *vbox;
250
251 /* For result NoteBook */
252 hboxframe = gtk_hbox_new (FALSE, 0);
253 gtk_widget_show (hboxframe);
254 gtk_container_add(GTK_CONTAINER(Frame),hboxframe);
255
256 vbox = gtk_vbox_new (TRUE, 0);
257 gtk_widget_show (vbox);
258 gtk_box_pack_start (GTK_BOX(hboxframe), vbox, TRUE, TRUE, 2);
259
260 frame = gtk_frame_new(NULL);
261 gtk_container_set_border_width(GTK_CONTAINER(frame), 2);
262 gtk_container_add(GTK_CONTAINER(vbox),frame);
263
264 vbox = gtk_vbox_new (FALSE, 0);
265 gtk_widget_show (vbox);
266 gtk_box_pack_start (GTK_BOX(hboxframe), vbox, FALSE, FALSE, 2);
267
268 create_bar_result(vbox);
269
270 return frame;
271
272 }
273 /*****************************************************************************************/
AjoutePageNotebook(char * label,GtkWidget ** TextP)274 void AjoutePageNotebook(char *label,GtkWidget **TextP)
275 {
276 GtkWidget *scrolledwindow;
277 GtkWidget *Frame;
278 GtkWidget *LabelOnglet;
279 GtkWidget *LabelMenu;
280 GtkStyle *stylered;
281 GtkStyle *styledef;
282
283
284 Frame = gtk_frame_new(NULL);
285 gtk_container_set_border_width(GTK_CONTAINER(Frame), 2);
286
287 LabelOnglet = gtk_label_new(label);
288 LabelMenu = gtk_label_new(label);
289 gtk_notebook_append_page_menu(GTK_NOTEBOOK(NoteBookText),
290 Frame,
291 LabelOnglet, LabelMenu);
292
293 g_object_set_data(G_OBJECT (Frame), "Frame", Frame);
294
295 if(strcmp(label,_("Data")) )
296 Frame = AddBarResult(Frame);
297 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
298 gtk_widget_show (scrolledwindow);
299 gtk_container_add (GTK_CONTAINER (Frame), scrolledwindow);
300 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC );
301
302 *TextP = gabedit_text_new ();
303 set_tab_size (*TextP, 8);
304 /* gabedit_text_set_word_wrap (GABEDIT_TEXT(*TextP), FALSE);*/
305
306 /*
307 GABEDIT_TEXT(*TextP)->default_tab_width=7;
308 */
309
310 g_object_ref (*TextP);
311 g_object_set_data_full (G_OBJECT (Frame), "text", *TextP, (GDestroyNotify) g_object_unref);
312 gtk_widget_show (*TextP);
313 gtk_container_add (GTK_CONTAINER (scrolledwindow), *TextP);
314 g_object_set_data(G_OBJECT (*TextP), "LabelOnglet", LabelOnglet);
315 if( !strcmp(label,_("Data")) )
316 {
317 static guint start_pos = 0;
318 static guint end_pos = 0;
319
320 styledef = gtk_style_copy(LabelOnglet->style);
321 stylered = gtk_style_copy(LabelOnglet->style);
322 stylered->fg[0].red=65535;
323 stylered->fg[0].green=0;
324 stylered->fg[0].blue=0;
325 g_object_set_data(G_OBJECT (*TextP), "StyleDef", styledef);
326 g_object_set_data(G_OBJECT (*TextP), "StyleRed", stylered);
327 g_object_set_data(G_OBJECT (*TextP), "StartPos", &start_pos);
328 g_object_set_data(G_OBJECT (*TextP), "EndPos", &end_pos);
329 }
330 }
331 /*****************************************************************************************/
view_result_calcul(GtkWidget * noteb,gpointer d)332 void view_result_calcul(GtkWidget *noteb,gpointer d)
333 {
334 int numpage;
335 numpage = gtk_notebook_get_current_page ((GtkNotebook *)noteb);
336 if(numpage == 0)
337 get_result();
338 }
339 /*****************************************************************************************/
set_imodif(GtkWidget * wid,gpointer data)340 void set_imodif(GtkWidget *wid, gpointer data)
341 {
342 data_modify(TRUE);
343 }
344 /*****************************************************************************************/
cree_text_notebook()345 void cree_text_notebook()
346 {
347 GtkWidget *hbox;
348
349 hbox =create_hbox_false(vboxtexts);
350
351 iedit=1;
352 NoteBookText = gtk_notebook_new();
353 g_object_set_data_full (G_OBJECT (NoteBookText), "Fenetre", Fenetre, (GDestroyNotify) g_object_unref);
354 g_signal_connect(G_OBJECT(NoteBookText),"switch_page", (GCallback)view_result_calcul,NULL);
355
356 gtk_box_pack_start(GTK_BOX (vboxtexts), NoteBookText,TRUE, TRUE, 0);
357
358 AjoutePageNotebook(_("Data"),&text);
359 gabedit_text_set_editable (GABEDIT_TEXT (text), TRUE);
360 set_font (text,FontsStyleData.fontname);
361 set_base_style(text,FontsStyleData.BaseColor.red ,FontsStyleData.BaseColor.green ,FontsStyleData.BaseColor.blue);
362 set_text_style(text,FontsStyleData.TextColor.red ,FontsStyleData.TextColor.green ,FontsStyleData.TextColor.blue);
363
364 AjoutePageNotebook(_("Result"),&textresult);
365 gabedit_text_set_editable (GABEDIT_TEXT (textresult), TRUE);
366 set_font (textresult,FontsStyleResult.fontname);
367 set_base_style(textresult,FontsStyleResult.BaseColor.red ,FontsStyleResult.BaseColor.green ,FontsStyleResult.BaseColor.blue);
368 set_text_style(textresult,FontsStyleResult.TextColor.red ,FontsStyleResult.TextColor.green ,FontsStyleResult.TextColor.blue);
369
370 {
371 GtkTextBuffer *buffer;
372 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
373 if(buffer) g_signal_connect(G_OBJECT(buffer),"changed", (GCallback)set_imodif,NULL);
374 }
375 }
376 /*****************************************************************************************/
377