Hi,

I finally wrote something which seems to do what I wanted. Of course, it
is far away from stable and lacks features. Anyway, I post it here :)

wagi


-- 
Daniel Wagner
email: [EMAIL PROTECTED]

GnuPG: 1024D/DCDE890A (public key available on any keyserver)
=== cd /usr/src/gnome/glade/glade/gnome-db/
=== cvs diff -u gnomedbbrowser.c

Index: gnomedbbrowser.c
===================================================================
RCS file: /cvs/gnome/glade/glade/gnome-db/gnomedbbrowser.c,v
retrieving revision 1.3
diff -u -r1.3 gnomedbbrowser.c
--- gnomedbbrowser.c	2001/02/23 01:06:57	1.3
+++ gnomedbbrowser.c	2001/03/26 23:03:00
@@ -24,18 +24,90 @@
 /* Include the 21x21 icon pixmap for this widget, to be used in the palette */
 #include "../graphics/gnome-db-browser.xpm"
 
+#define CONNECTION_INSTANCE_DATA "ConnectionInstanceData"
+
 /*
  * This is the GbWidget struct for this widget (see ../gbwidget.h).
  * It is initialized in the init() function at the end of this file
  */
-static GbWidget gbwidget;
 
+typedef struct {
+        Gda_Connection*            cnc;
+        GtkWidget*                 login_dialog;
+        gchar*                     gda_dsn;
+} connection_instance_data_t;
 
 
+static GbWidget gbwidget;
+static gchar *DbName = "GnomeDbBrowser::db_name";
+
 /******
  * NOTE: To use these functions you need to uncomment them AND add a pointer
  * to the function in the GbWidget struct at the end of this file.
  ******/
+static connection_instance_data_t *
+get_current_connection_from_widget (GtkWidget *browser) {
+  if (browser)
+    {
+      return gtk_object_get_data (GTK_OBJECT (browser), CONNECTION_INSTANCE_DATA);
+    }
+  return NULL;
+}
+
+
+static void
+cancel_connecting_cb (GnomeDbLoginDlg *dlg, connection_instance_data_t *instance_data) {
+  g_return_if_fail(instance_data != NULL);
+        
+  gnome_dialog_close (GNOME_DIALOG (instance_data->login_dialog));
+  gda_connection_free (instance_data->cnc);
+  g_free ((gpointer) instance_data);
+}
+
+
+static void
+error_in_connection_cb (Gda_Connection *cnc, connection_instance_data_t *instance_data) {
+  GtkWidget* error_dialog;
+        
+  error_dialog = gnome_db_errordlg_new (cnc, _("Error Viewer"));
+  gnome_db_errordlg_show_errors (GNOME_DB_ERRORDLG (error_dialog));
+}
+
+
+static void
+connection_initiated_cb (GtkWidget *w, connection_instance_data_t *instance_data) {
+  GnomeDbLogin* login;
+  gchar*        str;
+
+  g_return_if_fail (gda_connection_is_open (instance_data->cnc));
+  g_return_if_fail (instance_data != NULL);
+
+  /* get login dialog information */
+  login = GNOME_DB_LOGIN (GNOME_DB_LOGINDLG (instance_data->login_dialog)->login);
+  if (login)
+    str = gnome_db_login_get_gda_name(login);
+  else str = NULL;
+  gnome_dialog_close (GNOME_DIALOG (instance_data->login_dialog));
+  instance_data->login_dialog = NULL;
+  instance_data->gda_dsn = g_strdup (str);
+
+  gnome_db_browser_set_connection (GNOME_DB_BROWSER (property_get_widget ()), instance_data->cnc);
+
+  gtk_object_set_data (GTK_OBJECT (property_get_widget ()), CONNECTION_INSTANCE_DATA, instance_data);
+}
+
+
+static void
+connection_closed_cb (GtkWidget *w, connection_instance_data_t *instance_data) {
+  g_return_if_fail(instance_data != NULL);
+        
+  gda_connection_free(instance_data->cnc);
+  gnome_db_browser_set_connection (GNOME_DB_BROWSER (property_get_widget ()), NULL);
+
+  g_free((gpointer) instance_data->gda_dsn);
+  g_free((gpointer) instance_data);
+}
+
 
 /*
  * Creates a new GtkWidget of class GnomeDbBrowser, performing any specialized
@@ -54,16 +126,15 @@
 /*
  * Creates the components needed to edit the extra properties of this widget.
  */
-/*
 static void
 gb_gnome_db_browser_create_properties (GtkWidget * widget, GbWidgetCreateArgData * data)
 {
-
+  property_add_connection (DbName, "Data Source", "Choose Gda Connection");
 }
-*/
 
 
 
+
 /*
  * Gets the properties of the widget. This is used for both displaying the
  * properties in the property editor, and also for saving the properties.
@@ -76,20 +147,57 @@
 }
 */
 
-
-
 /*
  * Sets the properties of the widget. This is used for both applying the
  * properties changed in the property editor, and also for loading.
  */
-/*
 static void
 gb_gnome_db_browser_set_properties (GtkWidget * widget, GbWidgetSetArgData * data)
 {
-
+  if (data->action == GB_APPLYING)
+    {
+      GtkWidget *login;
+      gchar *gda_dsn;
+      connection_instance_data_t* instance_data;
+      
+      instance_data = get_current_connection_from_widget (widget);
+      if (instance_data) 
+	{
+	  gda_connection_close(instance_data->cnc);
+	}
+
+      /* create a new instance_data */
+      instance_data = g_new0 (connection_instance_data_t, 1);
+
+      instance_data->cnc = gda_connection_new (gda_corba_get_orb ());
+      gtk_signal_connect (GTK_OBJECT (instance_data->cnc),
+			  "error",
+			  GTK_SIGNAL_FUNC (error_in_connection_cb),
+			  (gpointer) instance_data);
+      gtk_signal_connect (GTK_OBJECT (instance_data->cnc),
+			  "open",
+			  GTK_SIGNAL_FUNC (connection_initiated_cb),
+			  (gpointer) instance_data);
+      gtk_signal_connect (GTK_OBJECT(instance_data->cnc),
+			  "close",
+			  GTK_SIGNAL_FUNC (connection_closed_cb),
+			  (gpointer) instance_data);
+      
+      /* create login dialog box */
+      gda_dsn = property_get_connection (DbName, widget, FALSE);
+      login = gnome_db_login_new (instance_data->cnc, NULL, gda_dsn);
+      instance_data->login_dialog = gnome_db_logindlg_new (GNOME_DB_LOGIN (login), 
+							   _("Open Connection"));
+      gtk_signal_connect (GTK_OBJECT (instance_data->login_dialog),
+			  "cancel",
+			  GTK_SIGNAL_FUNC (cancel_connecting_cb),
+			  (gpointer) instance_data);
+      
+      /* run dialog */
+      while (gtk_events_pending()) gtk_main_iteration();
+      gnome_db_logindlg_popup(GNOME_DB_LOGINDLG(instance_data->login_dialog));
+    } 
 }
-*/
-
 
 
 /*
@@ -143,14 +251,16 @@
   gbwidget.tooltip = _("Database Browser");
 
   /* Fill in any functions that this GbWidget has */
-  gbwidget.gb_widget_new		= gb_gnome_db_browser_new;
-  gbwidget.gb_widget_write_source	= gb_gnome_db_browser_write_source;
-/*
-  gbwidget.gb_widget_create_properties	= gb_gnome_db_browser_create_properties;
-  gbwidget.gb_widget_get_properties	= gb_gnome_db_browser_get_properties;
-  gbwidget.gb_widget_set_properties	= gb_gnome_db_browser_set_properties;
+  gbwidget.gb_widget_new                = gb_gnome_db_browser_new;
+  gbwidget.gb_widget_write_source       = gb_gnome_db_browser_write_source;
+  gbwidget.gb_widget_create_properties  = gb_gnome_db_browser_create_properties;
+  /*
+  gbwidget.gb_widget_get_properties     = gb_gnome_db_browser_get_properties;
+  */
+  gbwidget.gb_widget_set_properties     = gb_gnome_db_browser_set_properties;
+  /*
   gbwidget.gb_widget_create_popup_menu	= gb_gnome_db_browser_create_popup_menu;
-*/
+  */
 
   return &gbwidget;
 }
=== Exit status: 1

Reply via email to