1 /*HydrogenBond.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 <stdlib.h>
23 #include <math.h>
24 
25 #include "../Common/Global.h"
26 #include "../Utils/UtilsInterface.h"
27 #include "../Utils/Utils.h"
28 #include "../Utils/AtomsProp.h"
29 
30 
31 #include "../Geometry/GeomGlobal.h"
32 #include "../Geometry/Fragments.h"
33 #include "../Geometry/DrawGeom.h"
34 #include "../Common/Windows.h"
35 #include "../Display/GLArea.h"
36 #include "../Common/StockIcons.h"
37 
38 static gint nAtomsCanConnect = 6;
39 static gchar** atomsCanConnect = NULL;
40 static gdouble minDistance = 1.50; /* in Agnstrom */
41 static gdouble maxDistance = 3.15; /* in Agnstrom */
42 static gdouble minAngle = 145.0;
43 static gdouble maxAngle = 215.0;
44 static gint rowSelected = -1;
45 static	GtkTreeView *treeViewOfAtoms = NULL;
46 
47 static void rafreshTreeView(GtkTreeView *treeView);
48 /************************************************************************/
initHBonds()49 void initHBonds()
50 {
51 	nAtomsCanConnect = 6;
52 	atomsCanConnect = g_malloc(nAtomsCanConnect*sizeof(gchar*));
53 	atomsCanConnect[0] = g_strdup("N");
54 	atomsCanConnect[1] = g_strdup("O");
55 	atomsCanConnect[2] = g_strdup("F");
56 	atomsCanConnect[3] = g_strdup("Cl");
57 	atomsCanConnect[4] = g_strdup("Br");
58 	atomsCanConnect[5] = g_strdup("I");
59 	minDistance = 1.50; /* in Agnstrom */
60 	maxDistance = 3.15; /* in Agnstrom */
61 	minAngle = 145.0;
62 	maxAngle = 215.0;
63 }
64 /******************************************************************/
save_HBonds_properties()65 void save_HBonds_properties()
66 {
67 	gchar *hbondsfile;
68 	FILE *file;
69 	gint i;
70 
71 	hbondsfile = g_strdup_printf("%s%shbonds",gabedit_directory(),G_DIR_SEPARATOR_S);
72 
73 	file = FOpen(hbondsfile, "w");
74 	if(!file) return;
75 
76  	fprintf(file,"%f\n",minDistance);
77  	fprintf(file,"%f\n",maxDistance);
78  	fprintf(file,"%f\n",minAngle);
79  	fprintf(file,"%f\n",maxAngle);
80  	fprintf(file,"%d\n",nAtomsCanConnect);
81 	for(i=0;i<nAtomsCanConnect;i++) fprintf(file,"%s\n",atomsCanConnect[i]);
82 	fclose(file);
83 
84 	g_free(hbondsfile);
85 }
86 /******************************************************************/
read_HBonds_properties()87 void read_HBonds_properties()
88 {
89 	gchar *hbondsfile;
90 	FILE *file;
91 	gint n;
92 	gint i;
93 
94 	initHBonds();
95 	hbondsfile = g_strdup_printf("%s%shbonds",gabedit_directory(),G_DIR_SEPARATOR_S);
96 
97 	file = FOpen(hbondsfile, "rb");
98 	if(!file) return;
99 
100  	n = fscanf(file,"%lf\n",&minDistance);
101 	if(n != 1) { initHBonds(); return ; fclose(file); g_free(hbondsfile);}
102 
103  	n = fscanf(file,"%lf\n",&maxDistance);
104 	if(n != 1) { initHBonds(); return ; fclose(file); g_free(hbondsfile);}
105 
106  	n = fscanf(file,"%lf\n",&minAngle);
107 	if(n != 1) { initHBonds(); return ; fclose(file); g_free(hbondsfile);}
108  	n = fscanf(file,"%lf\n",&maxAngle);
109 	if(n != 1) { initHBonds(); return ; fclose(file); g_free(hbondsfile);}
110 
111  	n = fscanf(file,"%d\n",&nAtomsCanConnect);
112 	if(n != 1 || nAtomsCanConnect<0 ) { initHBonds(); return ; fclose(file); g_free(hbondsfile);}
113 
114 	for(i=0;i<nAtomsCanConnect;i++)
115 	{
116  		n = fscanf(file,"%s\n",atomsCanConnect[i]);
117 		if(n != 1) { initHBonds(); return ; fclose(file); g_free(hbondsfile);}
118 		delete_last_spaces(atomsCanConnect[i]);
119 		delete_first_spaces(atomsCanConnect[i]);
120 		str_delete_n(atomsCanConnect[i]);
121 	}
122 
123 	fclose(file);
124 
125 	g_free(hbondsfile);
126 }
127 /******************************************************************/
set_HBonds(GtkWidget * fp,gpointer data)128 static void set_HBonds(GtkWidget* fp,gpointer data)
129 {
130 	GtkWidget** entrys = (GtkWidget**)data;
131 	G_CONST_RETURN gchar* tentry;
132 	gchar* t;
133 
134 	tentry = gtk_entry_get_text(GTK_ENTRY(entrys[0]));
135 	minDistance = atof(tentry);
136 	if(minDistance<1e-6)minDistance = 1.5;
137 
138 	tentry = gtk_entry_get_text(GTK_ENTRY(entrys[1]));
139 	maxDistance = atof(tentry);
140 	if(maxDistance<1e-6)maxDistance = 3.5;
141 	if(maxDistance<=minDistance) maxDistance = minDistance + 1.0;
142 
143 	tentry = gtk_entry_get_text(GTK_ENTRY(entrys[2]));
144 	minAngle = atof(tentry);
145 	if(minAngle<1e-6)minAngle = 145.0;
146 
147 	tentry = gtk_entry_get_text(GTK_ENTRY(entrys[3]));
148 	maxAngle = atof(tentry);
149 	if(maxAngle<1e-6)maxAngle = 215.0;
150 	if(maxAngle<=minAngle) maxAngle = minAngle + 70.0;
151 
152 	t = g_strdup_printf("%f",minDistance);
153 	gtk_entry_set_text(GTK_ENTRY(entrys[0]),t);
154 	g_free(t);
155 
156 	t = g_strdup_printf("%f",maxDistance);
157 	gtk_entry_set_text(GTK_ENTRY(entrys[1]),t);
158 	g_free(t);
159 
160 	t = g_strdup_printf("%f",minAngle);
161 	gtk_entry_set_text(GTK_ENTRY(entrys[2]),t);
162 	g_free(t);
163 
164 	t = g_strdup_printf("%f",maxAngle);
165 	gtk_entry_set_text(GTK_ENTRY(entrys[3]),t);
166 	g_free(t);
167 
168 
169 	rafresh_window_orb();
170         if(GeomDrawingArea != NULL) draw_geometry(NULL,NULL);
171 }
172 /******************************************************************/
deleteAnAtomDlg()173 static void deleteAnAtomDlg()
174 {
175 
176 	gint j;
177 	gint k = rowSelected;
178 
179 	if(k<0 || k >= nAtomsCanConnect) return;
180 	if(!atomsCanConnect) return;
181 	if(nAtomsCanConnect == 1)
182 	{
183 		GtkWidget* win;
184 		win = Message(_("Sorry, You can not delete all atoms"),_("Warning"),TRUE);
185 		gtk_window_set_modal(GTK_WINDOW(win),TRUE);
186 		return;
187 	}
188 
189 	for(j=k;j<nAtomsCanConnect-1;j++)
190 	{
191 		if(atomsCanConnect[j])
192 		{
193 			g_free(atomsCanConnect[j]);
194 			atomsCanConnect[j] = g_strdup(atomsCanConnect[j+1]);
195 		}
196 		else break;
197 	}
198 	nAtomsCanConnect--;
199 	atomsCanConnect = g_realloc(atomsCanConnect, nAtomsCanConnect*sizeof(gchar*));
200 
201 	rafreshTreeView(treeViewOfAtoms);
202 	return;
203 }
204 /********************************************************************************/
addAtom(GtkWidget * button,gpointer data)205 static void addAtom(GtkWidget *button,gpointer data)
206 {
207 	GtkWidget* winTable = g_object_get_data(G_OBJECT(button),"WinTable");
208 	gchar* atomToInsert = (gchar*)data;
209 	gint i;
210 
211 	gtk_widget_destroy(winTable);
212 	for(i=0;i<nAtomsCanConnect;i++) if(strcmp(atomToInsert,atomsCanConnect[i])==0) return;
213 
214 	if(nAtomsCanConnect==0) atomsCanConnect = g_malloc(sizeof(gchar*));
215 	else atomsCanConnect = g_realloc(atomsCanConnect,(nAtomsCanConnect+1)*sizeof(gchar*));
216 	atomsCanConnect[nAtomsCanConnect] = g_strdup(atomToInsert);
217 	nAtomsCanConnect++;
218 	rafreshTreeView(treeViewOfAtoms);
219 }
220 /********************************************************************************/
addAnAtomDlg()221 static void addAnAtomDlg()
222 {
223 	GtkWidget* table;
224 	GtkWidget* button;
225 	GtkWidget* frame;
226 	GtkWidget* winTable;
227 	guint i;
228 	guint j;
229         GtkStyle *button_style;
230         GtkStyle *style;
231 
232 
233 	gchar*** Symb = get_periodic_table();
234 
235   winTable = gtk_window_new(GTK_WINDOW_TOPLEVEL);
236   gtk_window_set_modal(GTK_WINDOW(winTable),TRUE);
237   gtk_window_set_title(GTK_WINDOW(winTable),_("Select your atom"));
238   gtk_window_set_default_size (GTK_WINDOW(winTable),(gint)(ScreenWidth*0.5),(gint)(ScreenHeight*0.4));
239 
240   frame = gtk_frame_new (NULL);
241   gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
242   gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
243 
244   gtk_container_add(GTK_CONTAINER(winTable),frame);
245   gtk_widget_show (frame);
246 
247   table = gtk_table_new(PERIODIC_TABLE_N_ROWS-1,PERIODIC_TABLE_N_COLUMNS,TRUE);
248   gtk_container_add(GTK_CONTAINER(frame),table);
249   button_style = gtk_widget_get_style(winTable);
250 
251   for ( i = 0;i<PERIODIC_TABLE_N_ROWS-1;i++)
252 	  for ( j = 0;j<PERIODIC_TABLE_N_COLUMNS;j++)
253   {
254 	  if(strcmp(Symb[j][i],"00"))
255 	  {
256 	  button = gtk_button_new_with_label(Symb[j][i]);
257           style=set_button_style(button_style,button,Symb[j][i]);
258           g_signal_connect(G_OBJECT(button), "clicked",
259                             (GCallback)addAtom,(gpointer )Symb[j][i]);
260 	  g_object_set_data(G_OBJECT(button),"WinTable",winTable);
261 	  gtk_table_attach(GTK_TABLE(table),button,j,j+1,i,i+1,
262 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
263 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
264 		  1,1);
265 	  }
266 
267   }
268 
269   gtk_widget_show_all(winTable);
270 
271 }
272 /******************************************************************/
setDefaultAtomsDlg()273 static void setDefaultAtomsDlg()
274 {
275 	if(atomsCanConnect)
276 	{
277 		gint i;
278 		for(i=0;i<nAtomsCanConnect;i++)
279 			if(atomsCanConnect[i]) g_free(atomsCanConnect[i]);
280 		g_free(atomsCanConnect);
281 	}
282 	nAtomsCanConnect = 6;
283 	atomsCanConnect = g_malloc(nAtomsCanConnect*sizeof(gchar*));
284 	atomsCanConnect[0] = g_strdup("N");
285 	atomsCanConnect[1] = g_strdup("O");
286 	atomsCanConnect[2] = g_strdup("F");
287 	atomsCanConnect[3] = g_strdup("Cl");
288 	atomsCanConnect[4] = g_strdup("Br");
289 	atomsCanConnect[5] = g_strdup("I");
290 	rafreshTreeView(treeViewOfAtoms);
291 }
292 /********************************************************************************/
set_sensitive_option(GtkUIManager * manager,gchar * path)293 static void set_sensitive_option(GtkUIManager *manager, gchar* path)
294 {
295 	GtkWidget *wid = gtk_ui_manager_get_widget (manager, path);
296 	gboolean sensitive = TRUE;
297   	if(nAtomsCanConnect<2) sensitive = FALSE;
298 	if(GTK_IS_WIDGET(wid)) gtk_widget_set_sensitive(wid, sensitive);
299 }
300 /**********************************************************************************/
show_menu_popup(GtkUIManager * manager,guint button,guint32 time)301 static gboolean show_menu_popup(GtkUIManager *manager, guint button, guint32 time)
302 {
303 	GtkWidget *menu = gtk_ui_manager_get_widget (manager, "/MenuHBonds");
304 	if (GTK_IS_MENU (menu))
305 	{
306 		set_sensitive_option(manager,"/MenuHBonds/DeleteAtom");
307 		gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, time);
308 		return TRUE;
309 	}
310 	return FALSE;
311 }
312 /*********************************************************************************************************************/
activate_action(GtkAction * action)313 static void activate_action (GtkAction *action)
314 {
315 	const gchar *name = gtk_action_get_name (action);
316 	if(!strcmp(name, "DeleteAtom")) deleteAnAtomDlg();
317 	else if(!strcmp(name, "AddAtom")) addAnAtomDlg();
318 	else if(!strcmp(name, "DefaultAtoms")) setDefaultAtomsDlg();
319 }
320 /*--------------------------------------------------------------------*/
321 static GtkActionEntry gtkActionEntries[] =
322 {
323 	{"DeleteAtom", GABEDIT_STOCK_CUT, N_("_Delete selected atom"), NULL, "Delete selected atom", G_CALLBACK (activate_action) },
324 	{"AddAtom", GABEDIT_STOCK_NEW, N_("_Add an atom"), NULL, "Add an atom", G_CALLBACK (activate_action) },
325 	{"DefaultAtoms", NULL, N_("_Default atoms"), NULL, "Default atoms", G_CALLBACK (activate_action) },
326 };
327 static guint numberOfGtkActionEntries = G_N_ELEMENTS (gtkActionEntries);
328 /********************************************************************************/
329 /* XML description of the menus for the test app.  The parser understands
330  * a subset of the Bonobo UI XML format, and uses GMarkup for parsing */
331 static const gchar *uiMenuInfo =
332 "  <popup name=\"MenuHBonds\">\n"
333 "    <separator name=\"sepMenuPopDelete\" />\n"
334 "    <menuitem name=\"DeleteAtom\" action=\"DeleteAtom\" />\n"
335 "    <separator name=\"sepMenuPopAdd\" />\n"
336 "    <menuitem name=\"AddAtom\" action=\"AddAtom\" />\n"
337 "    <separator name=\"sepMenuPopDefault\" />\n"
338 "    <menuitem name=\"DefaultAtoms\" action=\"DefaultAtoms\" />\n"
339 "  </popup>\n"
340 ;
341 /*******************************************************************************************************************************/
create_menu(GtkWidget * win)342 static GtkUIManager *create_menu(GtkWidget* win)
343 {
344 	GtkActionGroup *actionGroup = NULL;
345 	GtkUIManager *manager = NULL;
346 	GError *error = NULL;
347 
348   	manager = gtk_ui_manager_new ();
349   	g_signal_connect_swapped (win, "destroy", G_CALLBACK (g_object_unref), manager);
350 
351 	actionGroup = gtk_action_group_new ("GabeditHBonds");
352 	gtk_action_group_set_translation_domain(actionGroup,GETTEXT_PACKAGE);
353 	gtk_action_group_add_actions (actionGroup, gtkActionEntries, numberOfGtkActionEntries, NULL);
354 
355   	gtk_ui_manager_insert_action_group (manager, actionGroup, 0);
356 
357   	gtk_window_add_accel_group (GTK_WINDOW (win), gtk_ui_manager_get_accel_group (manager));
358 	if (!gtk_ui_manager_add_ui_from_string (manager, uiMenuInfo, -1, &error))
359 	{
360 		g_message ("building menus failed: %s", error->message);
361 		g_error_free (error);
362 	}
363 	return manager;
364 }
365 /*******************************************************************************************************************************/
rafreshTreeView(GtkTreeView * treeView)366 static void rafreshTreeView(GtkTreeView *treeView)
367 {
368 	gint i;
369 
370         GtkTreeIter iter;
371 	GtkTreeModel *model = gtk_tree_view_get_model(treeView);
372         GtkTreeStore *store = GTK_TREE_STORE (model);
373 
374 	gtk_tree_store_clear(store);
375         model = GTK_TREE_MODEL (store);
376 
377 	for(i=0;i<nAtomsCanConnect;i++)
378 	{
379 		gchar* string = g_strdup_printf("%s",atomsCanConnect[i]);
380         	gtk_tree_store_append (store, &iter, NULL);
381         	gtk_tree_store_set (store, &iter, 0, string, -1);
382 		g_free(string);
383 	}
384 
385 	if(nAtomsCanConnect>0)
386 	{
387 		GtkTreePath *path;
388 
389 		rowSelected = 0;
390 		path = gtk_tree_path_new_from_string  ("0");
391 		gtk_tree_selection_select_path  (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)), path);
392 		gtk_tree_path_free(path);
393 	}
394 }
395 /*******************************************************************************************************************************/
event_dispatcher2(GtkWidget * widget,GdkEventButton * event,gpointer user_data)396 static void event_dispatcher2(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
397 {
398 
399 	GtkTreePath *path;
400 	gint row = -1;
401 	if (event->window == gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget))
402 	    && !gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
403 					       event->x, event->y, NULL, NULL, NULL, NULL)) {
404 		gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)));
405 	}
406 	if(gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), event->x, event->y, &path, NULL, NULL, NULL))
407 	{
408 		if(path)
409 		{
410 			gtk_tree_selection_select_path  (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)), path);
411 			row = atoi(gtk_tree_path_to_string(path));
412 			gtk_tree_path_free(path);
413 		}
414 	}
415 
416 	rowSelected = row;
417 	if(row<0) return;
418   	if (event->type == GDK_BUTTON_PRESS && ((GdkEventButton *) event)->button == 3)
419 	{
420 		GdkEventButton *bevent = (GdkEventButton *) event;
421 		GtkUIManager *manager = GTK_UI_MANAGER(user_data);
422 		show_menu_popup(manager, bevent->button, bevent->time);
423 	}
424 }
425 /********************************************************************************/
addListOfAtoms(GtkWidget * vbox,GtkUIManager * manager)426 static GtkTreeView* addListOfAtoms(GtkWidget *vbox, GtkUIManager *manager)
427 {
428 	GtkWidget *scr;
429 	gint i;
430 	gint widall=0;
431 	gint widths[]={10};
432 	gint Factor=7;
433 	gint len = 1;
434 
435         GtkTreeStore *store;
436 	GtkTreeModel *model;
437 	GtkCellRenderer *renderer;
438 	GtkTreeView *treeView;
439 	GtkTreeViewColumn *column;
440 
441 
442 	store = gtk_tree_store_new (1,G_TYPE_STRING);
443         model = GTK_TREE_MODEL (store);
444 
445 	for(i=0;i<len;i++) widall+=widths[i];
446 
447 	widall=widall*Factor+40;
448 
449 	scr=gtk_scrolled_window_new(NULL,NULL);
450 	gtk_widget_set_size_request(scr,widall,(gint)(ScreenHeight*0.1));
451 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr),GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
452 	gtk_box_pack_start(GTK_BOX (vbox), scr,TRUE, TRUE, 2);
453 
454 	treeView = (GtkTreeView*)gtk_tree_view_new_with_model (model);
455 	gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeView), TRUE);
456 	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeView), FALSE);
457   	gtk_container_add(GTK_CONTAINER(scr),GTK_WIDGET(treeView));
458 
459 	for (i=0;i<len;i++)
460 	{
461 		column = gtk_tree_view_column_new ();
462 		gtk_tree_view_column_set_title (column, "There atoms can do an hydrogen bonds");
463 		gtk_tree_view_column_set_min_width(column, widths[i]*Factor);
464 		gtk_tree_view_column_set_reorderable(column, TRUE);
465 		{
466 			GtkWidget*  t = gtk_tree_view_column_get_widget (column);
467 			if(t) gtk_widget_hide(t);
468 		}
469 
470 		renderer = gtk_cell_renderer_text_new ();
471 		gtk_tree_view_column_pack_start (column, renderer, TRUE);
472 		gtk_tree_view_column_set_attributes (column, renderer, "text", 0, NULL);
473 		gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column);
474 	}
475 
476   	set_base_style(GTK_WIDGET(treeView),55000,55000,55000);
477 	gtk_widget_show (GTK_WIDGET(treeView));
478 
479 	g_signal_connect (treeView, "button_press_event", G_CALLBACK (event_dispatcher2), manager);
480 
481 	return treeView;
482 }
483 /******************************************************************/
set_HBonds_dialog(GtkWidget * winParent)484 void set_HBonds_dialog (GtkWidget* winParent)
485 {
486 	GtkWidget *fp;
487 	GtkWidget *frame;
488 	GtkWidget *vboxall;
489 	GtkWidget *vboxframe;
490 	GtkWidget *hbox;
491 	GtkWidget *button;
492 	GtkWidget *hseparator;
493 	GtkWidget *label;
494 	static GtkWidget* entrys[4];
495 	gchar* tlabel[4]={N_("Min Distance (Angstroms)"),N_("Max Distance (Angstroms)"),N_("Min angle (degrees)"),N_("Max angle (degrees)")};
496 	gint i;
497 	GtkWidget* table;
498 	gchar* t = NULL;
499 	GtkUIManager *manager = NULL;
500 
501 	if(!winParent || !GTK_IS_WIDGET(winParent)) return;
502 
503 	fp = gtk_window_new(GTK_WINDOW_TOPLEVEL);
504 	gtk_window_set_modal(GTK_WINDOW(fp),TRUE);
505 	gtk_window_set_title(GTK_WINDOW(fp),_("Set the hydrogen's bonds parameters"));
506 	gtk_container_set_border_width (GTK_CONTAINER (fp), 5);
507 
508 	gtk_window_set_position(GTK_WINDOW(fp),GTK_WIN_POS_CENTER);
509 	gtk_window_set_modal (GTK_WINDOW (fp), TRUE);
510 	gtk_window_set_transient_for(GTK_WINDOW(fp),GTK_WINDOW(winParent));
511 
512 	g_signal_connect(G_OBJECT(fp),"delete_event",(GCallback)gtk_widget_destroy,NULL);
513 
514 	vboxall = create_vbox(fp);
515 	frame = gtk_frame_new (NULL);
516 	gtk_container_set_border_width (GTK_CONTAINER (frame), 5);
517 	gtk_container_add (GTK_CONTAINER (vboxall), frame);
518 	gtk_widget_show (frame);
519 
520 	vboxframe = create_vbox(frame);
521 	table = gtk_table_new(10,3,FALSE);
522 	gtk_box_pack_start(GTK_BOX(vboxframe), table,TRUE,TRUE,0);
523 
524 	for(i=0;i<4;i++)
525 	{
526 		add_label_table(table,tlabel[i],(gushort)i,0);
527 		add_label_table(table," : ",(gushort)i,1);
528 
529 		entrys[i] = gtk_entry_new ();
530 		gtk_table_attach(GTK_TABLE(table),entrys[i],2,2+1,i,i+1,
531 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
532 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
533 		  3,3);
534 	}
535 	t = g_strdup_printf("%f",minDistance);
536 	gtk_entry_set_text(GTK_ENTRY(entrys[0]),t);
537 	g_free(t);
538 	t = g_strdup_printf("%f",maxDistance);
539 	gtk_entry_set_text(GTK_ENTRY(entrys[1]),t);
540 	g_free(t);
541 	t = g_strdup_printf("%f",minAngle);
542 	gtk_entry_set_text(GTK_ENTRY(entrys[2]),t);
543 	g_free(t);
544 	t = g_strdup_printf("%f",maxAngle);
545 	gtk_entry_set_text(GTK_ENTRY(entrys[3]),t);
546 	g_free(t);
547 
548 	i = 4;
549 	hseparator = gtk_hseparator_new ();
550 	gtk_table_attach(GTK_TABLE(table),hseparator,0,0+3,i,i+1,
551 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
552 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
553 		  3,3);
554 	i = 5;
555 	hbox = gtk_hbox_new(0,FALSE);
556 	label = gtk_label_new (_("  There atoms can do an hydrogen bonds.\n  Use right button of mouse to modify this list."));
557    	gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT);
558 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
559 	gtk_table_attach(GTK_TABLE(table),hbox,0,0+3,i,i+1,
560 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
561 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
562 		  3,3);
563 	i = 6;
564   	hbox = gtk_hbox_new (TRUE, 0);
565 	gtk_table_attach(GTK_TABLE(table),hbox,0,0+3,i,i+1,
566 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
567 		  (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
568 		  3,3);
569 	manager = create_menu(fp);
570 	treeViewOfAtoms = addListOfAtoms(hbox, manager);
571 
572 	hbox = create_hbox(vboxall);
573 
574 	button = create_button(winParent,"OK");
575 	gtk_box_pack_start (GTK_BOX( hbox), button, TRUE, TRUE, 3);
576 	g_signal_connect(G_OBJECT(button), "clicked",G_CALLBACK(set_HBonds),(gpointer)entrys);
577 	g_signal_connect_swapped(G_OBJECT(button), "clicked",G_CALLBACK(gtk_widget_destroy),GTK_OBJECT(fp));
578 	gtk_widget_show (button);
579 
580 	button = create_button(winParent,"Apply");
581 	gtk_box_pack_start (GTK_BOX( hbox), button, TRUE, TRUE, 3);
582 	g_signal_connect(G_OBJECT(button), "clicked",G_CALLBACK(set_HBonds),(gpointer)entrys);
583 	gtk_widget_show (button);
584 
585 	button = create_button(winParent,"Close");
586 	gtk_box_pack_start (GTK_BOX( hbox), button, TRUE, TRUE, 3);
587 	g_signal_connect_swapped(G_OBJECT(button), "clicked",G_CALLBACK(gtk_widget_destroy),GTK_OBJECT(fp));
588 
589 	gtk_widget_show (button);
590 	rafreshTreeView(treeViewOfAtoms);
591 
592 	gtk_widget_show_all(fp);
593 }
594 /************************************************************************/
getMinDistanceHBonds()595 gdouble getMinDistanceHBonds()
596 {
597 	return minDistance;
598 }
599 /************************************************************************/
getMaxDistanceHBonds()600 gdouble getMaxDistanceHBonds()
601 {
602 	return maxDistance;
603 }
604 /************************************************************************/
getMinAngleHBonds()605 gdouble getMinAngleHBonds()
606 {
607 	return minAngle;
608 }
609 /************************************************************************/
getMaxAngleHBonds()610 gdouble getMaxAngleHBonds()
611 {
612 	return maxAngle;
613 }
614 /************************************************************************/
atomCanDoHydrogenBond(gchar * symbol)615 gboolean atomCanDoHydrogenBond(gchar* symbol)
616 {
617 	gint k;
618 	for(k=0;k<nAtomsCanConnect;k++) if(strcmp(symbol,atomsCanConnect[k])==0) return TRUE;
619 	return FALSE;
620 }
621 /************************************************************************/
622