static void addkeywords_to_list(GtkWidget* widget, LPCSTR attrs, TGENSETUP *gensetup_t) { char *curr, *cour; char *data[2]; if (!GTK_IS_CLIST (widget)) return; gtk_clist_clear (GTK_CLIST (widget)); for (curr = (LPSTR) attrs; *curr; curr += (STRLEN (curr) + 1)) { if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")) || !strncasecmp (curr, "Driver=", STRLEN ("Driver=")) || !strncasecmp (curr, "Description=", STRLEN ("Description="))) continue; if ((cour = strchr (curr, '='))) { *cour = '\0'; data[0] = curr; data[1] = cour + 1; gtk_clist_append (GTK_CLIST (widget), data); *cour = '='; } else { data[0] = ""; gtk_clist_append (GTK_CLIST (widget), data); } } if (GTK_CLIST (widget)->rows > 0) gtk_clist_sort (GTK_CLIST (widget)); }
/** Called whenever the user clicks on any CList object. It's a * dispatcher -- it calls the function passed to it as 'd' if the click * was a double-click. * @param clist The widget clicked upon. * @param row The row clicked (ignored). * @param column The column clicked (ignored). * @param ev Event information (ignored). * @param d A pointer to the function to be called, if this was a * double-click event. */ void clist_select_row_callback(GtkWidget *clist, int row, int column, GdkEventButton *ev, gpointer d) { g_return_if_fail(GTK_IS_CLIST(clist)); if (ev) switch (ev->type) { case GDK_2BUTTON_PRESS: ((double_click_callback_t)d)(clist); break; default: ; } }
void cl_draw_treeview_header (GtkStyle *style, GdkWindow *window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle *area, GtkWidget *widget, const gchar *detail, gint x, gint y, gint width, gint height) { ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); gint columns = 0, column_index = -1, fill_width = width; gboolean is_etree = strcmp("ETree", G_OBJECT_TYPE_NAME(widget->parent)) == 0; gboolean resizable = TRUE; GdkGC *bottom = clearlooks_style->shade_gc[5]; if ( width < 2 || height < 2 ) return; if (GTK_IS_TREE_VIEW (widget->parent)) { gtk_treeview_get_header_index (GTK_TREE_VIEW(widget->parent), widget, &column_index, &columns, &resizable); } else if (GTK_IS_CLIST (widget->parent)) { gtk_clist_get_header_index (GTK_CLIST(widget->parent), widget, &column_index, &columns); } if (area) { gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area); gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], area); gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area); gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], area); } if (state_type != GTK_STATE_NORMAL) fill_width-=2; gdk_draw_rectangle (window, style->bg_gc[state_type], TRUE, x, y, fill_width, height-(height/3)+1); draw_hgradient (window, style->bg_gc[state_type], style, x, 1+y+height-(height/3), fill_width, height/3, &style->bg[state_type], &clearlooks_style->inset_dark[state_type]); if (resizable || (column_index != columns-1)) { gdk_draw_line (window, clearlooks_style->shade_gc[4], x+width-2, y+4, x+width-2, y+height-5); gdk_draw_line (window, clearlooks_style->shade_gc[0], x+width-1, y+4, x+width-1, y+height-5); } /* left light line */ if (column_index == 0) gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y+1, x, y+height-2); /* top light line */ gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y, x+width-1, y); /* bottom dark line */ if (state_type == GTK_STATE_INSENSITIVE) bottom = clearlooks_style->shade_gc[3]; gdk_draw_line (window, bottom, x, y+height-1, x+width-1, y+height-1); if (area) { gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL); gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], NULL); gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL); gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], NULL); } }
gboolean pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) { GtkWidget *event_widget; static guint32 button_click_time = 0; static GdkWindow *button_window = NULL; static guint button_number = -1; static jint click_count = 1; /* If it is not a focus change event, the widget must be realized already. If not, ignore the event (Gtk+ will do the same). */ if (!(event->type == GDK_FOCUS_CHANGE || GTK_WIDGET_REALIZED(widget))) return FALSE; /* Do not handle propagated events. AWT has its own propagation rules */ gdk_window_get_user_data (event->any.window, (void **) &event_widget); if (event_widget != widget) return FALSE; /* We only care about input events */ if (!(event->type == GDK_BUTTON_PRESS || event->type == GDK_BUTTON_RELEASE || event->type == GDK_ENTER_NOTIFY || event->type == GDK_LEAVE_NOTIFY || event->type == GDK_CONFIGURE || event->type == GDK_EXPOSE || event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE || event->type == GDK_FOCUS_CHANGE || event->type == GDK_MOTION_NOTIFY)) { return FALSE; } /* g_print("event %u widget %s peer %p\n", event->type, gtk_widget_get_name (widget), peer); */ /* If it has no jobject associated we can send no AWT event */ if (!peer) return FALSE; /* for all input events, which have a window with a jobject attached, send the AWT input event corresponding to the Gtk event off to Java */ /* keep track of clickCount ourselves, since the AWT allows more than a triple click to occur */ if (event->type == GDK_BUTTON_PRESS) { if ((event->button.time < (button_click_time + MULTI_CLICK_TIME)) && (event->button.window == button_window) && (event->button.button == button_number)) click_count++; else click_count = 1; button_click_time = event->button.time; button_window = event->button.window; button_number = event->button.button; } switch (event->type) { case GDK_BUTTON_PRESS: (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_PRESSED, (jlong)event->button.time, state_to_awt_mods (event->button.state) | button_to_awt_mods (event->button.button), (jint)event->button.x, (jint)event->button.y, click_count, (event->button.button == 3) ? JNI_TRUE : JNI_FALSE); break; case GDK_BUTTON_RELEASE: { int width, height; (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_RELEASED, (jlong)event->button.time, state_to_awt_mods (event->button.state) | button_to_awt_mods (event->button.button), (jint)event->button.x, (jint)event->button.y, click_count, JNI_FALSE); /* check to see if the release occured in the window it was pressed in, and if so, generate an AWT click event */ gdk_window_get_size (event->any.window, &width, &height); if (event->button.x >= 0 && event->button.y >= 0 && event->button.x <= width && event->button.y <= height) { (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_CLICKED, (jlong)event->button.time, state_to_awt_mods (event->button.state) | button_to_awt_mods (event->button.button), (jint)event->button.x, (jint)event->button.y, click_count, JNI_FALSE); } } break; case GDK_MOTION_NOTIFY: (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_MOVED, (jlong)event->motion.time, state_to_awt_mods (event->motion.state), (jint)event->motion.x, (jint)event->motion.y, 0, JNI_FALSE); if (event->motion.state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)) { (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_DRAGGED, (jlong)event->motion.time, state_to_awt_mods (event->motion.state), (jint)event->motion.x, (jint)event->motion.y, 0, JNI_FALSE); } break; case GDK_ENTER_NOTIFY: (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_ENTERED, (jlong)event->crossing.time, state_to_awt_mods (event->crossing.state), (jint)event->crossing.x, (jint)event->crossing.y, 0, JNI_FALSE); break; case GDK_LEAVE_NOTIFY: if (event->crossing.mode == GDK_CROSSING_NORMAL) (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_EXITED, (jlong)event->crossing.time, state_to_awt_mods (event->crossing.state), (jint)event->crossing.x, (jint)event->crossing.y, 0, JNI_FALSE); break; case GDK_CONFIGURE: { /* GtkWidget *widget; gdk_window_get_user_data (event->any.window, (void **) &widget); */ if (widget && GTK_WIDGET_TOPLEVEL (widget)) { /* Configure events are not posted to the AWT event queue, and as such, the gdk/gtk peer functions will be called back before postConfigureEvent returns. */ gdk_threads_leave (); (*gdk_env)->CallVoidMethod (gdk_env, peer, postConfigureEventID, (jint) event->configure.x, (jint) event->configure.y, (jint) event->configure.width, (jint) event->configure.height); gdk_threads_enter (); } } break; case GDK_EXPOSE: { (*gdk_env)->CallVoidMethod (gdk_env, peer, postExposeEventID, (jint)event->expose.area.x, (jint)event->expose.area.y, (jint)event->expose.area.width, (jint)event->expose.area.height); } break; case GDK_FOCUS_CHANGE: (*gdk_env)->CallVoidMethod (gdk_env, peer, postFocusEventID, (jint) (event->focus_change.in) ? AWT_FOCUS_GAINED : AWT_FOCUS_LOST, JNI_FALSE); break; case GDK_KEY_PRESS: case GDK_KEY_RELEASE: { GdkWindow *obj_window; jobject *focus_obj_ptr = NULL; int generates_key_typed = 0; /* A widget with a grab will get key events */ if (!GTK_IS_WINDOW (widget)) focus_obj_ptr = &peer; else { GtkWindow *window; /* Check if we have an enabled focused widget in this window. If not don't handle the event. */ window = GTK_WINDOW (widget); if (!window->focus_widget || !GTK_WIDGET_IS_SENSITIVE (window->focus_widget) || !window->focus_widget->window) return FALSE; /* TextArea peers are attached to the scrolled window that contains the GtkTextView, not to the text view itself. Same for List. */ if (GTK_IS_TEXT_VIEW (window->focus_widget) || GTK_IS_CLIST (window->focus_widget)) { obj_window = gtk_widget_get_parent (window->focus_widget)->window; } else if (GTK_IS_BUTTON (window->focus_widget)) /* GtkButton events go to the "event_window" and this is what we registered when the button was created. */ obj_window = GTK_BUTTON (window->focus_widget)->event_window; else obj_window = window->focus_widget->window; gdk_property_get (obj_window, gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE), gdk_atom_intern ("CARDINAL", FALSE), 0, sizeof (jobject), FALSE, NULL, NULL, NULL, (guchar **)&focus_obj_ptr); /* If the window has no jobject attached we can't send anything */ if (!focus_obj_ptr) return FALSE; /* Should we generate an AWT_KEY_TYPED event? */ generates_key_typed = generates_key_typed_event (event, window->focus_widget); } if (event->type == GDK_KEY_PRESS) { (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, postKeyEventID, (jint) AWT_KEY_PRESSED, (jlong) event->key.time, keyevent_state_to_awt_mods (event), keysym_to_awt_keycode (event), keyevent_to_awt_keychar (event), keysym_to_awt_keylocation (event)); if (generates_key_typed) { (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, postKeyEventID, (jint) AWT_KEY_TYPED, (jlong) event->key.time, state_to_awt_mods (event->key.state), VK_UNDEFINED, keyevent_to_awt_keychar (event), AWT_KEY_LOCATION_UNKNOWN); } } else /* GDK_KEY_RELEASE */ { (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr, postKeyEventID, (jint) AWT_KEY_RELEASED, (jlong) event->key.time, keyevent_state_to_awt_mods (event), keysym_to_awt_keycode (event), keyevent_to_awt_keychar (event), keysym_to_awt_keylocation (event)); } } break; default: break; } return FALSE; }
void addtranslators_to_list (GtkWidget *widget, GtkWidget *dlg) { char *curr, *buffer = (char *) malloc (sizeof (char) * 65536), *szDriver; char driver[1024], _date[1024], _size[1024]; char *data[4]; int len, i; BOOL careabout; UWORD confMode = ODBC_USER_DSN; struct stat _stat; if (!buffer || !GTK_IS_CLIST (widget)) return; gtk_clist_clear (GTK_CLIST (widget)); /* Get the current config mode */ while (confMode != ODBC_SYSTEM_DSN + 1) { /* Get the list of drivers in the user context */ SQLSetConfigMode (confMode); #ifdef WIN32 len = SQLGetPrivateProfileString ("ODBC 32 bit Translators", NULL, "", buffer, 65535, "odbcinst.ini"); #else len = SQLGetPrivateProfileString ("ODBC Translators", NULL, "", buffer, 65535, "odbcinst.ini"); #endif if (len) goto process; goto end; process: for (curr = buffer; *curr; curr += (STRLEN (curr) + 1)) { /* Shadowing system odbcinst.ini */ for (i = 0, careabout = TRUE; i < GTK_CLIST (widget)->rows; i++) { gtk_clist_get_text (GTK_CLIST (widget), i, 0, &szDriver); if (!strcmp (szDriver, curr)) { careabout = FALSE; break; } } if (!careabout) continue; SQLSetConfigMode (confMode); #ifdef WIN32 SQLGetPrivateProfileString ("ODBC 32 bit Translators", curr, "", driver, sizeof (driver), "odbcinst.ini"); #else SQLGetPrivateProfileString ("ODBC Translators", curr, "", driver, sizeof (driver), "odbcinst.ini"); #endif /* Check if the driver is installed */ if (strcasecmp (driver, "Installed")) goto end; /* Get the driver library name */ SQLSetConfigMode (confMode); if (!SQLGetPrivateProfileString (curr, "Translator", "", driver, sizeof (driver), "odbcinst.ini")) { SQLSetConfigMode (confMode); SQLGetPrivateProfileString ("Default", "Translator", "", driver, sizeof (driver), "odbcinst.ini"); } if (STRLEN (curr) && STRLEN (driver)) { data[0] = curr; data[1] = driver; /* Get some information about the driver */ if (!stat (driver, &_stat)) { sprintf (_size, "%lu Kb", (unsigned long) _stat.st_size / 1024L); sprintf (_date, "%s", ctime (&_stat.st_mtime)); data[2] = _date; data[3] = _size; gtk_clist_append (GTK_CLIST (widget), data); } } } end: if (confMode == ODBC_USER_DSN) confMode = ODBC_SYSTEM_DSN; else confMode = ODBC_SYSTEM_DSN + 1; } if (GTK_CLIST (widget)->rows > 0) { gtk_clist_columns_autosize (GTK_CLIST (widget)); gtk_clist_sort (GTK_CLIST (widget)); } /* Make the clean up */ free (buffer); }
void adddrivers_to_list (GtkWidget *widget, GtkWidget *dlg) { SQLCHAR drvdesc[1024], drvattrs[1024], driver[1024], size[64]; SQLCHAR *data[4]; void *handle; struct stat _stat; SQLSMALLINT len, len1; SQLRETURN ret; HENV henv, drv_henv; HDBC drv_hdbc; pSQLGetInfoFunc funcHdl; pSQLAllocHandle allocHdl; pSQLAllocEnv allocEnvHdl = NULL; pSQLAllocConnect allocConnectHdl = NULL; pSQLFreeHandle freeHdl; pSQLFreeEnv freeEnvHdl; pSQLFreeConnect freeConnectHdl; if (!GTK_IS_CLIST (widget)) return; gtk_clist_clear (GTK_CLIST (widget)); /* Create a HENV to get the list of drivers then */ ret = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) { _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE); goto end; } /* Set the version ODBC API to use */ SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); /* Get the list of drivers */ ret = SQLDrivers (henv, SQL_FETCH_FIRST, drvdesc, sizeof (drvdesc) / sizeof (SQLTCHAR), &len, drvattrs, sizeof (drvattrs) / sizeof (SQLTCHAR), &len1); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO && ret != SQL_NO_DATA) { _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE); goto error; } while (ret != SQL_NO_DATA) { data[0] = drvdesc; /* Get the driver library name */ SQLSetConfigMode (ODBC_BOTH_DSN); SQLGetPrivateProfileString (drvdesc, "Driver", "", driver, sizeof (driver) / sizeof (SQLTCHAR), "odbcinst.ini"); if (driver[0] == '\0') SQLGetPrivateProfileString ("Default", "Driver", "", driver, sizeof (driver) / sizeof (SQLTCHAR), "odbcinst.ini"); if (driver[0] == '\0') { data[0] = NULL; goto skip; } data[1] = driver; drv_hdbc = NULL; drv_henv = NULL; if ((handle = (void *) DLL_OPEN (driver)) != NULL) { if ((allocHdl = (pSQLAllocHandle) DLL_PROC (handle, "SQLAllocHandle")) != NULL) { ret = allocHdl (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &drv_henv); if (ret == SQL_ERROR) goto nodriverver; ret = allocHdl (SQL_HANDLE_DBC, drv_henv, &drv_hdbc); if (ret == SQL_ERROR) goto nodriverver; } else { if ((allocEnvHdl = (pSQLAllocEnv) DLL_PROC (handle, "SQLAllocEnv")) != NULL) { ret = allocEnvHdl (&drv_henv); if (ret == SQL_ERROR) goto nodriverver; } else goto nodriverver; if ((allocConnectHdl = (pSQLAllocConnect) DLL_PROC (handle, "SQLAllocConnect")) != NULL) { ret = allocConnectHdl (drv_henv, &drv_hdbc); if (ret == SQL_ERROR) goto nodriverver; } else goto nodriverver; } if ((funcHdl = (pSQLGetInfoFunc) DLL_PROC (handle, "SQLGetInfo")) != NULL) { /* Retrieve some information */ ret = funcHdl (drv_hdbc, SQL_DRIVER_VER, drvattrs, sizeof (drvattrs), &len); if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { unsigned int z; /* Drop the description if one provided */ for (z = 0; ((char *) drvattrs)[z]; z++) if (((char *) drvattrs)[z] == ' ') ((char *) drvattrs)[z] = '\0'; data[2] = drvattrs; } else goto nodriverver; } else goto nodriverver; } else { nodriverver: data[2] = "##.##"; } if (drv_hdbc || drv_henv) { if (allocConnectHdl && (freeConnectHdl = (pSQLFreeConnect) DLL_PROC (handle, "SQLFreeConnect")) != NULL) { freeConnectHdl (drv_hdbc); drv_hdbc = NULL; } if (allocEnvHdl && (freeEnvHdl = (pSQLFreeEnv) DLL_PROC (handle, "SQLFreeEnv")) != NULL) { freeEnvHdl (drv_henv); drv_henv = NULL; } } if ((drv_hdbc || drv_henv) && (freeHdl = (pSQLFreeHandle) DLL_PROC (handle, "SQLFreeHandle")) != NULL) { if (drv_hdbc) freeHdl (SQL_HANDLE_DBC, drv_hdbc); if (drv_henv) freeHdl (SQL_HANDLE_ENV, drv_henv); } if (handle) DLL_CLOSE (handle); /* Get the size of the driver */ if (!stat (driver, &_stat)) { sprintf (size, "%d Kb", (int) (_stat.st_size / 1024)); data[3] = size; } else data[3] = "-"; gtk_clist_append (GTK_CLIST (widget), data); skip: ret = SQLDrivers (henv, SQL_FETCH_NEXT, drvdesc, sizeof (drvdesc) / sizeof (SQLTCHAR), &len, drvattrs, sizeof (drvattrs) / sizeof (SQLTCHAR), &len1); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO && ret != SQL_NO_DATA) { _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE); goto error; } } error: /* Clean all that */ SQLFreeHandle (SQL_HANDLE_ENV, henv); end: if (GTK_CLIST (widget)->rows > 0) { gtk_clist_columns_autosize (GTK_CLIST (widget)); gtk_clist_sort (GTK_CLIST (widget)); } }