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