1/* 2 * gensetup.c 3 * 4 * $Id: gensetup.c,v 1.5 2007/02/02 11:58:14 source Exp $ 5 * 6 * The iODBC driver manager. 7 * 8 * Copyright (C) 1996-2006 by OpenLink Software <iodbc@openlinksw.com> 9 * All Rights Reserved. 10 * 11 * This software is released under the terms of either of the following 12 * licenses: 13 * 14 * - GNU Library General Public License (see LICENSE.LGPL) 15 * - The BSD License (see LICENSE.BSD). 16 * 17 * Note that the only valid version of the LGPL license as far as this 18 * project is concerned is the original GNU Library General Public License 19 * Version 2, dated June 1991. 20 * 21 * While not mandated by the BSD license, any patches you make to the 22 * iODBC source code may be contributed back into the iODBC project 23 * at your discretion. Contributions will benefit the Open Source and 24 * Data Access community as a whole. Submissions may be made at: 25 * 26 * http://www.iodbc.org 27 * 28 * 29 * GNU Library Generic Public License Version 2 30 * ============================================ 31 * This library is free software; you can redistribute it and/or 32 * modify it under the terms of the GNU Library General Public 33 * License as published by the Free Software Foundation; only 34 * Version 2 of the License dated June 1991. 35 * 36 * This library is distributed in the hope that it will be useful, 37 * but WITHOUT ANY WARRANTY; without even the implied warranty of 38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 39 * Library General Public License for more details. 40 * 41 * You should have received a copy of the GNU Library General Public 42 * License along with this library; if not, write to the Free 43 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 44 * 45 * 46 * The BSD License 47 * =============== 48 * Redistribution and use in source and binary forms, with or without 49 * modification, are permitted provided that the following conditions 50 * are met: 51 * 52 * 1. Redistributions of source code must retain the above copyright 53 * notice, this list of conditions and the following disclaimer. 54 * 2. Redistributions in binary form must reproduce the above copyright 55 * notice, this list of conditions and the following disclaimer in 56 * the documentation and/or other materials provided with the 57 * distribution. 58 * 3. Neither the name of OpenLink Software Inc. nor the names of its 59 * contributors may be used to endorse or promote products derived 60 * from this software without specific prior written permission. 61 * 62 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 63 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 64 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 65 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OPENLINK OR 66 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 67 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 68 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 69 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 70 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 71 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 72 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 73 */ 74 75 76#include "gui.h" 77 78 79static char* STRCONN = "DSN=%s\0Description=%s\0\0"; 80static int STRCONN_NB_TOKENS = 2; 81 82static char *szKeysColumnNames[] = { 83 "Keyword", 84 "Value" 85}; 86 87static char *szKeysButtons[] = { 88 "_Add", 89 "_Update" 90}; 91 92 93static void 94addkeywords_to_list(GtkWidget* widget, LPCSTR attrs, TGENSETUP *gensetup_t) 95{ 96 char *curr, *cour; 97 char *data[2]; 98 99 if (!GTK_IS_CLIST (widget)) 100 return; 101 gtk_clist_clear (GTK_CLIST (widget)); 102 103 for (curr = (LPSTR) attrs; *curr; curr += (STRLEN (curr) + 1)) 104 { 105 if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")) || 106 !strncasecmp (curr, "Driver=", STRLEN ("Driver=")) || 107 !strncasecmp (curr, "Description=", STRLEN ("Description="))) 108 continue; 109 110 if ((cour = strchr (curr, '='))) 111 { 112 *cour = '\0'; 113 data[0] = curr; 114 data[1] = cour + 1; 115 gtk_clist_append (GTK_CLIST (widget), data); 116 *cour = '='; 117 } 118 else 119 { 120 data[0] = ""; 121 gtk_clist_append (GTK_CLIST (widget), data); 122 } 123 } 124 125 if (GTK_CLIST (widget)->rows > 0) 126 gtk_clist_sort (GTK_CLIST (widget)); 127} 128 129 130static void 131parse_attribute_line(TGENSETUP *gensetup_t, LPCSTR dsn, LPCSTR attrs, BOOL add) 132{ 133 if (dsn && gensetup_t->dsn_entry) 134 { 135 gtk_entry_set_text (GTK_ENTRY (gensetup_t->dsn_entry), dsn); 136 if (add) 137 gtk_widget_set_sensitive (gensetup_t->dsn_entry, TRUE); 138 else 139 gtk_widget_set_sensitive (gensetup_t->dsn_entry, FALSE); 140 } 141 142 addkeywords_to_list (gensetup_t->key_list, attrs, gensetup_t); 143} 144 145 146static void 147gensetup_add_clicked(GtkWidget* widget, TGENSETUP *gensetup_t) 148{ 149 char *szKey; 150 char *data[2]; 151 int i = 0; 152 153 if (gensetup_t) 154 { 155 data[0] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->key_entry)); 156 if (STRLEN (data[0])) 157 { 158 data[1] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->value_entry)); 159 160 /* Try to see if the keyword already exists */ 161 for (i = 0; i < GTK_CLIST (gensetup_t->key_list)->rows; i++) 162 { 163 gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 0, 164 &szKey); 165 if (STREQ (data[0], szKey)) 166 goto done; 167 } 168 169 /* An update operation */ 170 if (i < GTK_CLIST (gensetup_t->key_list)->rows) 171 { 172 gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 1, 173 data[1]); 174 } 175 else if (STRLEN (data[1])) 176 { 177 gtk_clist_append (GTK_CLIST (gensetup_t->key_list), data); 178 } 179 } 180 181 gtk_clist_sort (GTK_CLIST (gensetup_t->key_list)); 182 183 done: 184 gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), ""); 185 gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), ""); 186 } 187} 188 189 190static void 191gensetup_update_clicked(GtkWidget* widget, TGENSETUP *gensetup_t) 192{ 193 char *data[2]; 194 int i; 195 196 if (gensetup_t) 197 { 198 data[0] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->key_entry)); 199 if (STRLEN (data[0])) 200 { 201 data[1] = gtk_entry_get_text (GTK_ENTRY (gensetup_t->value_entry)); 202 203 if (GTK_CLIST (gensetup_t->key_list)->selection != NULL) 204 i = GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection-> 205 data); 206 else 207 i = 0; 208 209 /* An update operation */ 210 if (i < GTK_CLIST (gensetup_t->key_list)->rows) 211 { 212 gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 0, 213 data[0]); 214 gtk_clist_set_text (GTK_CLIST (gensetup_t->key_list), i, 1, 215 data[1]); 216 } 217 } 218 219 gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), ""); 220 gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), ""); 221 } 222} 223 224 225static void 226gensetup_list_select(GtkWidget* widget, gint row, gint column, GdkEvent *event, TGENSETUP *gensetup_t) 227{ 228 char *szKey, *szValue; 229 230 if (gensetup_t && GTK_CLIST (gensetup_t->key_list)->selection != NULL) 231 { 232 gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), 233 GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->data), 234 0, &szKey); 235 gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), 236 GPOINTER_TO_INT (GTK_CLIST (gensetup_t->key_list)->selection->data), 237 1, &szValue); 238 gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), szKey); 239 gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), szValue); 240 gtk_widget_set_sensitive (gensetup_t->bupdate, TRUE); 241 } 242} 243 244 245static void 246gensetup_list_unselect(GtkWidget* widget, gint row, gint column, GdkEvent *event, TGENSETUP *gensetup_t) 247{ 248 if (gensetup_t) 249 { 250 gtk_widget_set_sensitive (gensetup_t->bupdate, FALSE); 251 gtk_entry_set_text (GTK_ENTRY (gensetup_t->key_entry), ""); 252 gtk_entry_set_text (GTK_ENTRY (gensetup_t->value_entry), ""); 253 } 254} 255 256 257static void 258gensetup_ok_clicked(GtkWidget* widget, TGENSETUP *gensetup_t) 259{ 260 char *curr, *cour, *szKey, *szValue; 261 int i = 0, size = 0; 262 263 if (gensetup_t) 264 { 265 /* What is the size of the block to malloc */ 266 if (gensetup_t->dsn_entry) 267 { 268 size += 269 STRLEN (gtk_entry_get_text (GTK_ENTRY (gensetup_t->dsn_entry))) + 270 STRLEN ("DSN=") + 1; 271 size += STRLEN ("Description=") + 1; 272 } 273 else 274 { 275 size = 1; 276 } 277 /* Malloc it (+1 for list-terminating NUL) */ 278 if ((gensetup_t->connstr = (char *) calloc (sizeof(char), ++size))) 279 { 280 if (gensetup_t->dsn_entry) 281 { 282 for (curr = STRCONN, cour = gensetup_t->connstr; 283 i < STRCONN_NB_TOKENS; i++, curr += (STRLEN (curr) + 1)) 284 switch (i) 285 { 286 case 0: 287 sprintf (cour, curr, 288 gtk_entry_get_text (GTK_ENTRY (gensetup_t->dsn_entry))); 289 cour += (STRLEN (cour) + 1); 290 break; 291 case 1: 292 sprintf (cour, curr, ""); 293 cour += (STRLEN (cour) + 1); 294 break; 295 }; 296 } 297 else 298 size = 1; 299 300 for (i = 0; i < GTK_CLIST (gensetup_t->key_list)->rows; i++) 301 { 302 gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 0, 303 &szKey); 304 gtk_clist_get_text (GTK_CLIST (gensetup_t->key_list), i, 1, 305 &szValue); 306 307 cour = gensetup_t->connstr; 308 gensetup_t->connstr = 309 (char *) malloc (size + STRLEN (szKey) + STRLEN (szValue) + 310 2); 311 if (gensetup_t->connstr) 312 { 313 memcpy (gensetup_t->connstr, cour, size); 314 sprintf (gensetup_t->connstr + size - 1, "%s=%s", szKey, szValue); 315 free (cour); 316 size += STRLEN (szKey) + STRLEN (szValue) + 2; 317 } 318 else 319 gensetup_t->connstr = cour; 320 } 321 322 /* add list-terminating NUL */ 323 gensetup_t->connstr[size - 1] = '\0'; 324 } 325 326 gensetup_t->dsn_entry = NULL; 327 gensetup_t->key_list = NULL; 328 gensetup_t->verify_conn = gtk_toggle_button_get_active(gensetup_t->verify_conn_cb); 329 330 gtk_signal_disconnect_by_func (GTK_OBJECT (gensetup_t->mainwnd), 331 GTK_SIGNAL_FUNC (gtk_main_quit), NULL); 332 gtk_main_quit (); 333 gtk_widget_destroy (gensetup_t->mainwnd); 334 } 335} 336 337 338static void 339gensetup_cancel_clicked(GtkWidget* widget, TGENSETUP *gensetup_t) 340{ 341 if (gensetup_t) 342 { 343 gensetup_t->connstr = (LPSTR) -1L; 344 345 gensetup_t->dsn_entry = NULL; 346 gensetup_t->key_list = NULL; 347 348 gtk_signal_disconnect_by_func (GTK_OBJECT (gensetup_t->mainwnd), 349 GTK_SIGNAL_FUNC (gtk_main_quit), NULL); 350 gtk_main_quit (); 351 gtk_widget_destroy (gensetup_t->mainwnd); 352 } 353} 354 355 356static gint delete_event( GtkWidget *widget, 357 GdkEvent *event, TGENSETUP *gensetup_t) 358{ 359 gensetup_cancel_clicked (widget, gensetup_t); 360 361 return FALSE; 362} 363 364 365LPSTR 366create_fgensetup (HWND hwnd, LPCSTR dsn, LPCSTR attrs, BOOL add, BOOL *verify_conn) 367{ 368 GtkWidget *gensetup, *dialog_vbox1, *fixed1, *t_dsn, *l_dsn; 369 GtkWidget *l_comment, *scrolledwindow1, *clist1; 370 GtkWidget *l_key, *l_value, *t_keyword, *t_value, *l_copyright; 371 GtkWidget *vbuttonbox1, *b_add, *b_update, *l_keyword, *l_valeur; 372 GtkWidget *dialog_action_area1, *hbuttonbox1, *b_ok, *b_cancel; 373 GtkWidget *cb_verify; 374 guint button_key; 375 GtkAccelGroup *accel_group; 376 TGENSETUP gensetup_t; 377 char buff[1024]; 378 379 if (hwnd == NULL || !GTK_IS_WIDGET (hwnd)) 380 return (LPSTR) attrs; 381 382 accel_group = gtk_accel_group_new (); 383 384 gensetup = gtk_dialog_new (); 385 gtk_object_set_data (GTK_OBJECT (gensetup), "gensetup", gensetup); 386 gtk_window_set_title (GTK_WINDOW (gensetup), "File DSN Generic Setup"); 387 gtk_window_set_position (GTK_WINDOW (gensetup), GTK_WIN_POS_CENTER); 388 gtk_window_set_modal (GTK_WINDOW (gensetup), TRUE); 389 gtk_window_set_policy (GTK_WINDOW (gensetup), FALSE, FALSE, FALSE); 390 391#if GTK_CHECK_VERSION(2,0,0) 392 gtk_widget_show (gensetup); 393#endif 394 395 dialog_vbox1 = GTK_DIALOG (gensetup)->vbox; 396 gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_vbox1", dialog_vbox1); 397 gtk_widget_show (dialog_vbox1); 398 399 fixed1 = gtk_fixed_new (); 400 gtk_widget_ref (fixed1); 401 gtk_object_set_data_full (GTK_OBJECT (gensetup), "fixed1", fixed1, 402 (GtkDestroyNotify) gtk_widget_unref); 403 gtk_widget_show (fixed1); 404 gtk_box_pack_start (GTK_BOX (dialog_vbox1), fixed1, TRUE, TRUE, 0); 405 gtk_container_set_border_width (GTK_CONTAINER (fixed1), 6); 406 407 t_dsn = gtk_entry_new (); 408 gtk_widget_ref (t_dsn); 409 gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_dsn", t_dsn, 410 (GtkDestroyNotify) gtk_widget_unref); 411 gtk_widget_show (t_dsn); 412 gtk_fixed_put (GTK_FIXED (fixed1), t_dsn, 168, 16); 413 gtk_widget_set_uposition (t_dsn, 168, 16); 414 gtk_widget_set_usize (t_dsn, 0, 0); 415 416 l_dsn = gtk_label_new ("File Data Source Name : "); 417 gtk_widget_ref (l_dsn); 418 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_dsn", l_dsn, 419 (GtkDestroyNotify) gtk_widget_unref); 420 gtk_widget_show (l_dsn); 421 gtk_fixed_put (GTK_FIXED (fixed1), l_dsn, 8, 19); 422 gtk_widget_set_uposition (l_dsn, 8, 19); 423 gtk_widget_set_usize (l_dsn, 0, 0); 424 gtk_label_set_justify (GTK_LABEL (l_dsn), GTK_JUSTIFY_LEFT); 425 426 l_comment = gtk_label_new ("If you know the driver-specific keywords for this data source, you can type them and their values here. For more information on driver-specific keywords, please consult your ODBC driver documentation."); 427 gtk_widget_ref (l_comment); 428 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_comment", l_comment, 429 (GtkDestroyNotify) gtk_widget_unref); 430 gtk_widget_show (l_comment); 431 gtk_fixed_put (GTK_FIXED (fixed1), l_comment, 8, 47); 432 gtk_widget_set_uposition (l_comment, 8, 47); 433 gtk_widget_set_usize (l_comment, 330, 70); 434 gtk_label_set_justify (GTK_LABEL (l_comment), GTK_JUSTIFY_LEFT); 435 gtk_label_set_line_wrap (GTK_LABEL (l_comment), TRUE); 436 437 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); 438 gtk_widget_ref (scrolledwindow1); 439 gtk_object_set_data_full (GTK_OBJECT (gensetup), "scrolledwindow1", 440 scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref); 441 gtk_widget_show (scrolledwindow1); 442 gtk_fixed_put (GTK_FIXED (fixed1), scrolledwindow1, 8, 128); 443 gtk_widget_set_uposition (scrolledwindow1, 8, 128); 444 gtk_widget_set_usize (scrolledwindow1, 320, 184); 445 446 clist1 = gtk_clist_new (2); 447 gtk_widget_ref (clist1); 448 gtk_object_set_data_full (GTK_OBJECT (gensetup), "clist1", clist1, 449 (GtkDestroyNotify) gtk_widget_unref); 450 gtk_widget_show (clist1); 451 gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist1); 452 gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 137); 453 gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 80); 454 gtk_clist_column_titles_show (GTK_CLIST (clist1)); 455 456 l_key = gtk_label_new (szKeysColumnNames[0]); 457 gtk_widget_ref (l_key); 458 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_key", l_key, 459 (GtkDestroyNotify) gtk_widget_unref); 460 gtk_widget_show (l_key); 461 gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, l_key); 462 463 l_value = gtk_label_new (szKeysColumnNames[1]); 464 gtk_widget_ref (l_value); 465 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_value", l_value, 466 (GtkDestroyNotify) gtk_widget_unref); 467 gtk_widget_show (l_value); 468 gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, l_value); 469 470 t_keyword = gtk_entry_new (); 471 gtk_widget_ref (t_keyword); 472 gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_keyword", t_keyword, 473 (GtkDestroyNotify) gtk_widget_unref); 474 gtk_widget_show (t_keyword); 475 gtk_fixed_put (GTK_FIXED (fixed1), t_keyword, 80, 328); 476 gtk_widget_set_uposition (t_keyword, 80, 328); 477 gtk_widget_set_usize (t_keyword, 158, 22); 478 479 t_value = gtk_entry_new (); 480 gtk_widget_ref (t_value); 481 gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_value", t_value, 482 (GtkDestroyNotify) gtk_widget_unref); 483 gtk_widget_show (t_value); 484 gtk_fixed_put (GTK_FIXED (fixed1), t_value, 80, 360); 485 gtk_widget_set_uposition (t_value, 80, 360); 486 gtk_widget_set_usize (t_value, 158, 22); 487 488 489 vbuttonbox1 = gtk_vbutton_box_new (); 490 gtk_widget_ref (vbuttonbox1); 491 gtk_object_set_data_full (GTK_OBJECT (gensetup), "vbuttonbox1", vbuttonbox1, 492 (GtkDestroyNotify) gtk_widget_unref); 493 gtk_widget_show (vbuttonbox1); 494 gtk_fixed_put (GTK_FIXED (fixed1), vbuttonbox1, 248, 320); 495 gtk_widget_set_uposition (vbuttonbox1, 248, 320); 496 gtk_widget_set_usize (vbuttonbox1, 85, 69); 497 498 b_add = gtk_button_new_with_label (""); 499 button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_add)->child), 500 szKeysButtons[0]); 501 gtk_widget_add_accelerator (b_add, "clicked", accel_group, 502 button_key, GDK_MOD1_MASK, 0); 503 gtk_widget_ref (b_add); 504 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_add", b_add, 505 (GtkDestroyNotify) gtk_widget_unref); 506 gtk_widget_show (b_add); 507 gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_add); 508 GTK_WIDGET_SET_FLAGS (b_add, GTK_CAN_DEFAULT); 509 gtk_widget_add_accelerator (b_add, "clicked", accel_group, 510 'A', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 511 512 b_update = gtk_button_new_with_label (""); 513 button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_update)->child), 514 szKeysButtons[1]); 515 gtk_widget_add_accelerator (b_update, "clicked", accel_group, 516 button_key, GDK_MOD1_MASK, 0); 517 gtk_widget_ref (b_update); 518 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_update", b_update, 519 (GtkDestroyNotify) gtk_widget_unref); 520 gtk_widget_show (b_update); 521 gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_update); 522 GTK_WIDGET_SET_FLAGS (b_update, GTK_CAN_DEFAULT); 523 gtk_widget_add_accelerator (b_update, "clicked", accel_group, 524 'U', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 525 gtk_widget_set_sensitive (b_update, FALSE); 526 527 l_keyword = gtk_label_new ("Keyword : "); 528 gtk_widget_ref (l_keyword); 529 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_keyword", l_keyword, 530 (GtkDestroyNotify) gtk_widget_unref); 531 gtk_widget_show (l_keyword); 532 gtk_fixed_put (GTK_FIXED (fixed1), l_keyword, 8, 330); 533 gtk_widget_set_uposition (l_keyword, 8, 330); 534 gtk_widget_set_usize (l_keyword, 69, 16); 535 gtk_label_set_justify (GTK_LABEL (l_keyword), GTK_JUSTIFY_LEFT); 536 537 l_valeur = gtk_label_new ("Value : "); 538 gtk_widget_ref (l_valeur); 539 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_valeur", l_valeur, 540 (GtkDestroyNotify) gtk_widget_unref); 541 gtk_widget_show (l_valeur); 542 gtk_fixed_put (GTK_FIXED (fixed1), l_valeur, 8, 363); 543 gtk_widget_set_uposition (l_valeur, 8, 363); 544 gtk_widget_set_usize (l_valeur, 51, 16); 545 gtk_label_set_justify (GTK_LABEL (l_valeur), GTK_JUSTIFY_LEFT); 546 547 cb_verify = gtk_check_button_new_with_label ("Verify this connection(recommended)"); 548 gtk_widget_ref (cb_verify); 549 gtk_object_set_data_full (GTK_OBJECT (gensetup), "cb_verify", 550 cb_verify, (GtkDestroyNotify) gtk_widget_unref); 551 gtk_widget_show (cb_verify); 552 gtk_fixed_put (GTK_FIXED (fixed1), cb_verify, 8, 390); 553 gtk_widget_set_uposition (cb_verify, 8, 390); 554 gtk_widget_set_usize (cb_verify, 240, 24); 555 556 dialog_action_area1 = GTK_DIALOG (gensetup)->action_area; 557 gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_action_area1", 558 dialog_action_area1); 559 gtk_widget_show (dialog_action_area1); 560 gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 5); 561 562 hbuttonbox1 = gtk_hbutton_box_new (); 563 gtk_widget_ref (hbuttonbox1); 564 gtk_object_set_data_full (GTK_OBJECT (gensetup), "hbuttonbox1", hbuttonbox1, 565 (GtkDestroyNotify) gtk_widget_unref); 566 gtk_widget_show (hbuttonbox1); 567 gtk_box_pack_start (GTK_BOX (dialog_action_area1), hbuttonbox1, TRUE, TRUE, 568 0); 569 gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END); 570 gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox1), 10); 571 572 b_ok = gtk_button_new_with_label (""); 573 button_key = 574 gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_ok)->child), "_Ok"); 575 gtk_widget_add_accelerator (b_ok, "clicked", accel_group, button_key, 576 GDK_MOD1_MASK, 0); 577 gtk_widget_ref (b_ok); 578 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_ok", b_ok, 579 (GtkDestroyNotify) gtk_widget_unref); 580 gtk_widget_show (b_ok); 581 gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_ok); 582 GTK_WIDGET_SET_FLAGS (b_ok, GTK_CAN_DEFAULT); 583 gtk_widget_add_accelerator (b_ok, "clicked", accel_group, 584 'O', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 585 586 b_cancel = gtk_button_new_with_label (""); 587 button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_cancel)->child), 588 "_Cancel"); 589 gtk_widget_add_accelerator (b_cancel, "clicked", accel_group, 590 button_key, GDK_MOD1_MASK, 0); 591 gtk_widget_ref (b_cancel); 592 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_cancel", b_cancel, 593 (GtkDestroyNotify) gtk_widget_unref); 594 gtk_widget_show (b_cancel); 595 gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_cancel); 596 GTK_WIDGET_SET_FLAGS (b_cancel, GTK_CAN_DEFAULT); 597 gtk_widget_add_accelerator (b_cancel, "clicked", accel_group, 598 'C', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 599 600 /* Ok button events */ 601 gtk_signal_connect (GTK_OBJECT (b_ok), "clicked", 602 GTK_SIGNAL_FUNC (gensetup_ok_clicked), &gensetup_t); 603 /* Cancel button events */ 604 gtk_signal_connect (GTK_OBJECT (b_cancel), "clicked", 605 GTK_SIGNAL_FUNC (gensetup_cancel_clicked), &gensetup_t); 606 /* Add button events */ 607 gtk_signal_connect (GTK_OBJECT (b_add), "clicked", 608 GTK_SIGNAL_FUNC (gensetup_add_clicked), &gensetup_t); 609 /* Update button events */ 610 gtk_signal_connect (GTK_OBJECT (b_update), "clicked", 611 GTK_SIGNAL_FUNC (gensetup_update_clicked), &gensetup_t); 612 /* Close window button events */ 613 gtk_signal_connect (GTK_OBJECT (gensetup), "delete_event", 614 GTK_SIGNAL_FUNC (delete_event), &gensetup_t); 615 gtk_signal_connect (GTK_OBJECT (gensetup), "destroy", 616 GTK_SIGNAL_FUNC (gtk_main_quit), NULL); 617 /* List events */ 618 gtk_signal_connect (GTK_OBJECT (clist1), "select_row", 619 GTK_SIGNAL_FUNC (gensetup_list_select), &gensetup_t); 620 gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row", 621 GTK_SIGNAL_FUNC (gensetup_list_unselect), &gensetup_t); 622 623 gtk_window_add_accel_group (GTK_WINDOW (gensetup), accel_group); 624 625 gensetup_t.dsn_entry = t_dsn; 626 gensetup_t.key_list = clist1; 627 gensetup_t.bupdate = b_update; 628 gensetup_t.key_entry = t_keyword; 629 gensetup_t.value_entry = t_value; 630 gensetup_t.mainwnd = gensetup; 631 gensetup_t.verify_conn_cb = cb_verify; 632 gensetup_t.verify_conn = *verify_conn; 633 634 gtk_toggle_button_set_active(cb_verify, *verify_conn); 635 636 /* Parse the attributes line */ 637 parse_attribute_line (&gensetup_t, dsn, attrs, add); 638 639 gtk_widget_show_all (gensetup); 640 gtk_main (); 641 642 *verify_conn = gensetup_t.verify_conn; 643 644 return gensetup_t.connstr; 645} 646 647 648 649LPSTR 650create_keyval (HWND hwnd, LPCSTR attrs, BOOL *verify_conn) 651{ 652 GtkWidget *gensetup, *dialog_vbox1, *fixed1; 653 GtkWidget *l_comment, *scrolledwindow1, *clist1; 654 GtkWidget *l_key, *l_value, *t_keyword, *t_value, *l_copyright; 655 GtkWidget *vbuttonbox1, *b_add, *b_update, *l_keyword, *l_valeur; 656 GtkWidget *dialog_action_area1, *hbuttonbox1, *b_ok, *b_cancel; 657 GtkWidget *cb_verify; 658 guint button_key; 659 GtkAccelGroup *accel_group; 660 TGENSETUP gensetup_t; 661 char buff[1024]; 662 663 if (hwnd == NULL || !GTK_IS_WIDGET (hwnd)) 664 return (LPSTR) attrs; 665 666 accel_group = gtk_accel_group_new (); 667 668 gensetup = gtk_dialog_new (); 669 gtk_object_set_data (GTK_OBJECT (gensetup), "gensetup", gensetup); 670 gtk_window_set_title (GTK_WINDOW (gensetup), "Advanced File DSN Creation Settings"); 671 gtk_window_set_position (GTK_WINDOW (gensetup), GTK_WIN_POS_CENTER); 672 gtk_window_set_modal (GTK_WINDOW (gensetup), TRUE); 673 gtk_window_set_policy (GTK_WINDOW (gensetup), FALSE, FALSE, FALSE); 674 675#if GTK_CHECK_VERSION(2,0,0) 676 gtk_widget_show (gensetup); 677#endif 678 679 dialog_vbox1 = GTK_DIALOG (gensetup)->vbox; 680 gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_vbox1", dialog_vbox1); 681 gtk_widget_show (dialog_vbox1); 682 683 fixed1 = gtk_fixed_new (); 684 gtk_widget_ref (fixed1); 685 gtk_object_set_data_full (GTK_OBJECT (gensetup), "fixed1", fixed1, 686 (GtkDestroyNotify) gtk_widget_unref); 687 gtk_widget_show (fixed1); 688 gtk_box_pack_start (GTK_BOX (dialog_vbox1), fixed1, TRUE, TRUE, 0); 689 gtk_container_set_border_width (GTK_CONTAINER (fixed1), 6); 690 691 692 l_comment = gtk_label_new ("If you know the driver-specific keywords for this data source, you can type them and their values here. For more information on driver-specific keywords, please consult your ODBC driver documentation."); 693 gtk_widget_ref (l_comment); 694 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_comment", l_comment, 695 (GtkDestroyNotify) gtk_widget_unref); 696 gtk_widget_show (l_comment); 697 gtk_fixed_put (GTK_FIXED (fixed1), l_comment, 8, 7); 698 gtk_widget_set_uposition (l_comment, 8, 7); 699 gtk_widget_set_usize (l_comment, 330, 70); 700 gtk_label_set_justify (GTK_LABEL (l_comment), GTK_JUSTIFY_LEFT); 701 gtk_label_set_line_wrap (GTK_LABEL (l_comment), TRUE); 702 703 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); 704 gtk_widget_ref (scrolledwindow1); 705 gtk_object_set_data_full (GTK_OBJECT (gensetup), "scrolledwindow1", 706 scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref); 707 gtk_widget_show (scrolledwindow1); 708 gtk_fixed_put (GTK_FIXED (fixed1), scrolledwindow1, 8, 88); 709 gtk_widget_set_uposition (scrolledwindow1, 8, 88); 710 gtk_widget_set_usize (scrolledwindow1, 320, 184); 711 712 clist1 = gtk_clist_new (2); 713 gtk_widget_ref (clist1); 714 gtk_object_set_data_full (GTK_OBJECT (gensetup), "clist1", clist1, 715 (GtkDestroyNotify) gtk_widget_unref); 716 gtk_widget_show (clist1); 717 gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist1); 718 gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 137); 719 gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 80); 720 gtk_clist_column_titles_show (GTK_CLIST (clist1)); 721 722 l_key = gtk_label_new (szKeysColumnNames[0]); 723 gtk_widget_ref (l_key); 724 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_key", l_key, 725 (GtkDestroyNotify) gtk_widget_unref); 726 gtk_widget_show (l_key); 727 gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, l_key); 728 729 l_value = gtk_label_new (szKeysColumnNames[1]); 730 gtk_widget_ref (l_value); 731 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_value", l_value, 732 (GtkDestroyNotify) gtk_widget_unref); 733 gtk_widget_show (l_value); 734 gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, l_value); 735 736 t_keyword = gtk_entry_new (); 737 gtk_widget_ref (t_keyword); 738 gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_keyword", t_keyword, 739 (GtkDestroyNotify) gtk_widget_unref); 740 gtk_widget_show (t_keyword); 741 gtk_fixed_put (GTK_FIXED (fixed1), t_keyword, 80, 288); 742 gtk_widget_set_uposition (t_keyword, 80, 288); 743 gtk_widget_set_usize (t_keyword, 158, 22); 744 745 t_value = gtk_entry_new (); 746 gtk_widget_ref (t_value); 747 gtk_object_set_data_full (GTK_OBJECT (gensetup), "t_value", t_value, 748 (GtkDestroyNotify) gtk_widget_unref); 749 gtk_widget_show (t_value); 750 gtk_fixed_put (GTK_FIXED (fixed1), t_value, 80, 320); 751 gtk_widget_set_uposition (t_value, 80, 320); 752 gtk_widget_set_usize (t_value, 158, 22); 753 754 755 vbuttonbox1 = gtk_vbutton_box_new (); 756 gtk_widget_ref (vbuttonbox1); 757 gtk_object_set_data_full (GTK_OBJECT (gensetup), "vbuttonbox1", vbuttonbox1, 758 (GtkDestroyNotify) gtk_widget_unref); 759 gtk_widget_show (vbuttonbox1); 760 gtk_fixed_put (GTK_FIXED (fixed1), vbuttonbox1, 248, 280); 761 gtk_widget_set_uposition (vbuttonbox1, 248, 280); 762 gtk_widget_set_usize (vbuttonbox1, 85, 69); 763 764 b_add = gtk_button_new_with_label (""); 765 button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_add)->child), 766 szKeysButtons[0]); 767 gtk_widget_add_accelerator (b_add, "clicked", accel_group, 768 button_key, GDK_MOD1_MASK, 0); 769 gtk_widget_ref (b_add); 770 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_add", b_add, 771 (GtkDestroyNotify) gtk_widget_unref); 772 gtk_widget_show (b_add); 773 gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_add); 774 GTK_WIDGET_SET_FLAGS (b_add, GTK_CAN_DEFAULT); 775 gtk_widget_add_accelerator (b_add, "clicked", accel_group, 776 'A', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 777 778 b_update = gtk_button_new_with_label (""); 779 button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_update)->child), 780 szKeysButtons[1]); 781 gtk_widget_add_accelerator (b_update, "clicked", accel_group, 782 button_key, GDK_MOD1_MASK, 0); 783 gtk_widget_ref (b_update); 784 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_update", b_update, 785 (GtkDestroyNotify) gtk_widget_unref); 786 gtk_widget_show (b_update); 787 gtk_container_add (GTK_CONTAINER (vbuttonbox1), b_update); 788 GTK_WIDGET_SET_FLAGS (b_update, GTK_CAN_DEFAULT); 789 gtk_widget_add_accelerator (b_update, "clicked", accel_group, 790 'U', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 791 gtk_widget_set_sensitive (b_update, FALSE); 792 793 l_keyword = gtk_label_new ("Keyword : "); 794 gtk_widget_ref (l_keyword); 795 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_keyword", l_keyword, 796 (GtkDestroyNotify) gtk_widget_unref); 797 gtk_widget_show (l_keyword); 798 gtk_fixed_put (GTK_FIXED (fixed1), l_keyword, 8, 290); 799 gtk_widget_set_uposition (l_keyword, 8, 290); 800 gtk_widget_set_usize (l_keyword, 69, 16); 801 gtk_label_set_justify (GTK_LABEL (l_keyword), GTK_JUSTIFY_LEFT); 802 803 l_valeur = gtk_label_new ("Value : "); 804 gtk_widget_ref (l_valeur); 805 gtk_object_set_data_full (GTK_OBJECT (gensetup), "l_valeur", l_valeur, 806 (GtkDestroyNotify) gtk_widget_unref); 807 gtk_widget_show (l_valeur); 808 gtk_fixed_put (GTK_FIXED (fixed1), l_valeur, 8, 323); 809 gtk_widget_set_uposition (l_valeur, 8, 323); 810 gtk_widget_set_usize (l_valeur, 51, 16); 811 gtk_label_set_justify (GTK_LABEL (l_valeur), GTK_JUSTIFY_LEFT); 812 813 cb_verify = gtk_check_button_new_with_label ("Verify this connection(recommended)"); 814 gtk_widget_ref (cb_verify); 815 gtk_object_set_data_full (GTK_OBJECT (gensetup), "cb_verify", 816 cb_verify, (GtkDestroyNotify) gtk_widget_unref); 817 gtk_widget_show (cb_verify); 818 gtk_fixed_put (GTK_FIXED (fixed1), cb_verify, 8, 350); 819 gtk_widget_set_uposition (cb_verify, 8, 350); 820 gtk_widget_set_usize (cb_verify, 230, 24); 821 822 dialog_action_area1 = GTK_DIALOG (gensetup)->action_area; 823 gtk_object_set_data (GTK_OBJECT (gensetup), "dialog_action_area1", 824 dialog_action_area1); 825 gtk_widget_show (dialog_action_area1); 826 gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 5); 827 828 hbuttonbox1 = gtk_hbutton_box_new (); 829 gtk_widget_ref (hbuttonbox1); 830 gtk_object_set_data_full (GTK_OBJECT (gensetup), "hbuttonbox1", hbuttonbox1, 831 (GtkDestroyNotify) gtk_widget_unref); 832 gtk_widget_show (hbuttonbox1); 833 gtk_box_pack_start (GTK_BOX (dialog_action_area1), hbuttonbox1, TRUE, TRUE, 834 0); 835 gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END); 836 gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox1), 10); 837 838 b_ok = gtk_button_new_with_label (""); 839 button_key = 840 gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_ok)->child), "_Ok"); 841 gtk_widget_add_accelerator (b_ok, "clicked", accel_group, button_key, 842 GDK_MOD1_MASK, 0); 843 gtk_widget_ref (b_ok); 844 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_ok", b_ok, 845 (GtkDestroyNotify) gtk_widget_unref); 846 gtk_widget_show (b_ok); 847 gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_ok); 848 GTK_WIDGET_SET_FLAGS (b_ok, GTK_CAN_DEFAULT); 849 gtk_widget_add_accelerator (b_ok, "clicked", accel_group, 850 'O', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 851 852 b_cancel = gtk_button_new_with_label (""); 853 button_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (b_cancel)->child), 854 "_Cancel"); 855 gtk_widget_add_accelerator (b_cancel, "clicked", accel_group, 856 button_key, GDK_MOD1_MASK, 0); 857 gtk_widget_ref (b_cancel); 858 gtk_object_set_data_full (GTK_OBJECT (gensetup), "b_cancel", b_cancel, 859 (GtkDestroyNotify) gtk_widget_unref); 860 gtk_widget_show (b_cancel); 861 gtk_container_add (GTK_CONTAINER (hbuttonbox1), b_cancel); 862 GTK_WIDGET_SET_FLAGS (b_cancel, GTK_CAN_DEFAULT); 863 gtk_widget_add_accelerator (b_cancel, "clicked", accel_group, 864 'C', GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); 865 866 /* Ok button events */ 867 gtk_signal_connect (GTK_OBJECT (b_ok), "clicked", 868 GTK_SIGNAL_FUNC (gensetup_ok_clicked), &gensetup_t); 869 /* Cancel button events */ 870 gtk_signal_connect (GTK_OBJECT (b_cancel), "clicked", 871 GTK_SIGNAL_FUNC (gensetup_cancel_clicked), &gensetup_t); 872 /* Add button events */ 873 gtk_signal_connect (GTK_OBJECT (b_add), "clicked", 874 GTK_SIGNAL_FUNC (gensetup_add_clicked), &gensetup_t); 875 /* Update button events */ 876 gtk_signal_connect (GTK_OBJECT (b_update), "clicked", 877 GTK_SIGNAL_FUNC (gensetup_update_clicked), &gensetup_t); 878 /* Close window button events */ 879 gtk_signal_connect (GTK_OBJECT (gensetup), "delete_event", 880 GTK_SIGNAL_FUNC (delete_event), &gensetup_t); 881 gtk_signal_connect (GTK_OBJECT (gensetup), "destroy", 882 GTK_SIGNAL_FUNC (gtk_main_quit), NULL); 883 /* List events */ 884 gtk_signal_connect (GTK_OBJECT (clist1), "select_row", 885 GTK_SIGNAL_FUNC (gensetup_list_select), &gensetup_t); 886 gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row", 887 GTK_SIGNAL_FUNC (gensetup_list_unselect), &gensetup_t); 888 889 gtk_window_add_accel_group (GTK_WINDOW (gensetup), accel_group); 890 891 gensetup_t.dsn_entry = NULL; 892 gensetup_t.key_list = clist1; 893 gensetup_t.bupdate = b_update; 894 gensetup_t.key_entry = t_keyword; 895 gensetup_t.value_entry = t_value; 896 gensetup_t.mainwnd = gensetup; 897 gensetup_t.verify_conn_cb = cb_verify; 898 gensetup_t.verify_conn = *verify_conn; 899 900 gtk_toggle_button_set_active(cb_verify, *verify_conn); 901 902 /* Parse the attributes line */ 903 parse_attribute_line (&gensetup_t, NULL, attrs, TRUE); 904 905 gtk_widget_show_all (gensetup); 906 gtk_main (); 907 908 *verify_conn = gensetup_t.verify_conn; 909 910 return gensetup_t.connstr; 911} 912