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