home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / script-fu / dbbrowser_utils.c next >
Encoding:
C/C++ Source or Header  |  2000-08-24  |  24.6 KB  |  790 lines

  1. /* The GIMP -- an image manipulation program
  2.  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License as published by
  6.  * the Free Software Foundation; either version 2 of the License, or
  7.  * (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17.  */
  18.  
  19. /* 
  20.  * dbbrowser_utils.c
  21.  * 0.08  26th sept 97  by Thomas NOEL <thomas@minet.net>
  22.  *
  23.  * 98/12/13  Sven Neumann <sven@gimp.org> : added help display
  24.  */
  25.  
  26. #include "config.h"
  27.  
  28. #include <string.h>
  29. #include <gtk/gtk.h>
  30.  
  31. #include <libgimp/gimp.h>
  32. #include <libgimp/gimpui.h>
  33.  
  34. #include "dbbrowser_utils.h"
  35.  
  36. #include "libgimp/stdplugins-intl.h"
  37.  
  38. /* configuration */
  39.  
  40. #define DBL_LIST_WIDTH 220
  41. #define DBL_WIDTH DBL_LIST_WIDTH+400
  42. #define DBL_HEIGHT 250
  43.  
  44. /* end of configuration */
  45.  
  46. typedef struct
  47. {
  48.   gchar *label;
  49.   gchar *func;
  50. } ListEntry_t;
  51.  
  52. typedef struct
  53. {
  54.   GtkWidget *dlg;
  55.  
  56.   GtkWidget *search_entry;
  57.   GtkWidget *name_button;
  58.   GtkWidget *blurb_button;
  59.  
  60.   GtkWidget *descr_scroll;
  61.   GtkWidget *descr_table;
  62.  
  63.   GtkWidget *clist;
  64.   GtkWidget *scrolled_win;
  65.  
  66.   /* the currently selected procedure */
  67.   gchar           *selected_proc_name;
  68.   gchar           *selected_scheme_proc_name;
  69.   gchar           *selected_proc_blurb;
  70.   gchar           *selected_proc_help;
  71.   gchar           *selected_proc_author;
  72.   gchar           *selected_proc_copyright;
  73.   gchar           *selected_proc_date;
  74.   GimpPDBProcType  selected_proc_type;
  75.   gint             selected_nparams;
  76.   gint             selected_nreturn_vals;
  77.   GimpParamDef    *selected_params;
  78.   GimpParamDef    *selected_return_vals; 
  79.  
  80.   void (* apply_callback) (gchar           *proc_name,
  81.                gchar           *scheme_proc_name,
  82.                gchar           *proc_blurb,
  83.                gchar           *proc_help,
  84.                gchar           *proc_author,
  85.                gchar           *proc_copyright,
  86.                gchar           *proc_date,
  87.                GimpPDBProcType  proc_type,
  88.                gint             nparams,
  89.                gint             nreturn_vals,
  90.                GimpParamDef    *params,
  91.                GimpParamDef    *return_vals);
  92.  
  93. } dbbrowser_t;
  94.  
  95. /* local functions */
  96.  
  97. static void    dialog_apply_callback     (GtkWidget      *widget,
  98.                       gpointer        data);
  99. static gint    procedure_select_callback (GtkWidget      *widget,
  100.                       gint            row,
  101.                       gint            column,
  102.                       GdkEventButton *bevent,
  103.                       gpointer        data);
  104. static void    dialog_search_callback    (GtkWidget      *widget, 
  105.                       gpointer        data);
  106. static void    dialog_select             (dbbrowser_t    *dbbrowser, 
  107.                       gchar          *proc_name);
  108. static void    dialog_close_callback     (GtkWidget      *widget, 
  109.                       gpointer        data);
  110. static void    convert_string            (gchar          *str);
  111. static gchar * GParamType2char           (GimpPDBArgType  t);
  112.  
  113. GList * proc_table = NULL;
  114.  
  115. /* create the dialog box
  116.  * console_entry != NULL => called from the script-fu-console
  117.  */
  118. GtkWidget *
  119. gimp_db_browser (void (* apply_callback) (gchar           *proc_name,
  120.                       gchar           *scheme_proc_name,
  121.                       gchar           *proc_blurb,
  122.                       gchar           *proc_help,
  123.                       gchar           *proc_author,
  124.                       gchar           *proc_copyright,
  125.                       gchar           *proc_date,
  126.                       GimpPDBProcType  proc_type,
  127.                       gint             nparams,
  128.                       gint             nreturn_vals,
  129.                       GimpParamDef    *params,
  130.                       GimpParamDef    *return_vals))
  131. {
  132.   dbbrowser_t* dbbrowser;
  133.   
  134.   GtkWidget *hbox;
  135.   GtkWidget *searchhbox;
  136.   GtkWidget *vbox;
  137.   GtkWidget *label;
  138.  
  139.   dbbrowser = g_new (dbbrowser_t, 1);
  140.   
  141.   dbbrowser->apply_callback = apply_callback;
  142.   
  143.   /* the dialog box */
  144.  
  145.   if (apply_callback)
  146.     {
  147.       dbbrowser->dlg =
  148.     gimp_dialog_new (_("DB Browser (init...)"), "dbbrowser",
  149.              gimp_standard_help_func, "filters/dbbrowser.html",
  150.              GTK_WIN_POS_MOUSE,
  151.              FALSE, TRUE, FALSE,
  152.  
  153.              _("Search by Name"), dialog_search_callback,
  154.              dbbrowser, NULL, &dbbrowser->name_button, TRUE, FALSE,
  155.              _("Search by Blurb"), dialog_search_callback,
  156.              dbbrowser, NULL, &dbbrowser->blurb_button, FALSE, FALSE,
  157.              _("Apply"), dialog_apply_callback,
  158.              dbbrowser, NULL, NULL, FALSE, FALSE,
  159.              _("Close"), dialog_close_callback,
  160.              dbbrowser, NULL, NULL, FALSE, TRUE,
  161.  
  162.              NULL);
  163.     }
  164.   else
  165.     {
  166.       dbbrowser->dlg =
  167.     gimp_dialog_new (_("DB Browser (init...)"), "dbbrowser",
  168.              gimp_standard_help_func, "filters/dbbrowser.html",
  169.              GTK_WIN_POS_MOUSE,
  170.              FALSE, TRUE, FALSE,
  171.  
  172.              _("Search by Name"), dialog_search_callback,
  173.              dbbrowser, NULL, &dbbrowser->name_button, TRUE, FALSE,
  174.              _("Search by Blurb"), dialog_search_callback,
  175.              dbbrowser, NULL, &dbbrowser->blurb_button, FALSE, FALSE,
  176.              _("Close"), dialog_close_callback,
  177.              dbbrowser, NULL, NULL, FALSE, TRUE,
  178.  
  179.              NULL);
  180.     }
  181.  
  182.   gtk_signal_connect (GTK_OBJECT (dbbrowser->dlg), "destroy",
  183.                       GTK_SIGNAL_FUNC (dialog_close_callback),
  184.                       dbbrowser);
  185.   
  186.   /* hbox : left=list ; right=description */
  187.   
  188.   hbox = gtk_hbox_new (FALSE, 0);
  189.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->vbox), 
  190.               hbox, TRUE, TRUE, 0);
  191.   gtk_widget_show (hbox);
  192.  
  193.   /* left = vbox : the list and the search entry */
  194.   
  195.   vbox = gtk_vbox_new (FALSE, 0);
  196.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); 
  197.   gtk_box_pack_start (GTK_BOX (hbox), 
  198.               vbox, FALSE, TRUE, 0);
  199.   gtk_widget_show(vbox);
  200.   
  201.   /* list : list in a scrolled_win */
  202.   
  203.   dbbrowser->clist = gtk_clist_new (1);
  204.   dbbrowser->scrolled_win = gtk_scrolled_window_new (NULL, NULL);
  205.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dbbrowser->scrolled_win),
  206.                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  207.   gtk_clist_set_selection_mode (GTK_CLIST (dbbrowser->clist),
  208.                     GTK_SELECTION_BROWSE);
  209.  
  210.   gtk_widget_set_usize (dbbrowser->clist, DBL_LIST_WIDTH, DBL_HEIGHT);
  211.   gtk_signal_connect (GTK_OBJECT (dbbrowser->clist), "select_row",
  212.               (GtkSignalFunc) procedure_select_callback,
  213.               dbbrowser);
  214.   gtk_box_pack_start (GTK_BOX (vbox), dbbrowser->scrolled_win, TRUE, TRUE, 0);
  215.   gtk_container_add (GTK_CONTAINER (dbbrowser->scrolled_win), dbbrowser->clist);
  216.   gtk_widget_show (dbbrowser->clist);
  217.   gtk_widget_show (dbbrowser->scrolled_win);
  218.  
  219.   /* search entry */
  220.  
  221.   searchhbox = gtk_hbox_new (FALSE, 4);
  222.   gtk_box_pack_start (GTK_BOX (vbox),
  223.               searchhbox, FALSE, TRUE, 0);
  224.   gtk_widget_show (searchhbox);
  225.  
  226.   label = gtk_label_new (_("Search:"));
  227.   gtk_misc_set_alignment( GTK_MISC (label), 0.0, 0.5);
  228.   gtk_box_pack_start (GTK_BOX (searchhbox), 
  229.               label, TRUE, TRUE, 0);
  230.   gtk_widget_show (label);
  231.  
  232.   dbbrowser->search_entry = gtk_entry_new ();
  233.   gtk_box_pack_start (GTK_BOX (searchhbox), 
  234.               dbbrowser->search_entry, TRUE, TRUE, 0);
  235.   gtk_widget_show(dbbrowser->search_entry);
  236.  
  237.   /* right = description */
  238.  
  239.   dbbrowser->descr_scroll = gtk_scrolled_window_new (NULL, NULL);
  240.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dbbrowser->descr_scroll),
  241.                   GTK_POLICY_ALWAYS, 
  242.                   GTK_POLICY_ALWAYS);
  243.   gtk_box_pack_start (GTK_BOX (hbox), 
  244.               dbbrowser->descr_scroll, TRUE, TRUE, 0);
  245.   gtk_widget_set_usize (dbbrowser->descr_scroll, DBL_WIDTH - DBL_LIST_WIDTH, 0);
  246.   gtk_widget_show (dbbrowser->descr_scroll);
  247.  
  248.   /* now build the list */
  249.  
  250.   gtk_widget_show (dbbrowser->clist); 
  251.   gtk_widget_show (dbbrowser->dlg);
  252.  
  253.   /* initialize the "return" value (for "apply") */
  254.  
  255.   dbbrowser->descr_table = NULL;
  256.   dbbrowser->selected_proc_name = NULL;
  257.   dbbrowser->selected_scheme_proc_name = NULL;
  258.   dbbrowser->selected_proc_blurb = NULL;
  259.   dbbrowser->selected_proc_help = NULL;
  260.   dbbrowser->selected_proc_author = NULL;
  261.   dbbrowser->selected_proc_copyright = NULL;
  262.   dbbrowser->selected_proc_date = NULL;
  263.   dbbrowser->selected_proc_type = 0;
  264.   dbbrowser->selected_nparams = 0;
  265.   dbbrowser->selected_nreturn_vals = 0;
  266.   dbbrowser->selected_params = NULL;
  267.   dbbrowser->selected_return_vals = NULL;
  268.  
  269.   /* first search (all procedures) */
  270.   dialog_search_callback (NULL, (gpointer) dbbrowser);
  271.  
  272.   return dbbrowser->dlg;
  273. }
  274.  
  275. static gint
  276. procedure_select_callback (GtkWidget      *widget,
  277.                gint            row,
  278.                gint            column,
  279.                GdkEventButton *bevent,
  280.                gpointer        data)
  281. {
  282.   dbbrowser_t *dbbrowser = data;
  283.   gchar *func;
  284.  
  285.   g_return_val_if_fail (widget != NULL, FALSE);
  286.   /*  g_return_val_if_fail (bevent != NULL, FALSE);  */
  287.   g_return_val_if_fail (dbbrowser != NULL, FALSE);
  288.  
  289.   if ((func = (gchar *) (gtk_clist_get_row_data (GTK_CLIST (widget), row))))
  290.     dialog_select (dbbrowser, func);
  291.   return FALSE;
  292. }
  293.  
  294. /* update the description box (right) */
  295. static void 
  296. dialog_select (dbbrowser_t *dbbrowser, 
  297.            gchar       *proc_name)
  298. {
  299.   GtkWidget *label;
  300.   GtkWidget *old_table;
  301.   GtkWidget *help;
  302.   GtkWidget *text = NULL;
  303.   GtkWidget *vscrollbar;
  304.   gint i, row = 0;
  305.  
  306.   g_free (dbbrowser->selected_proc_name);
  307.   dbbrowser->selected_proc_name = g_strdup (proc_name);
  308.  
  309.   g_free (dbbrowser->selected_scheme_proc_name);
  310.   dbbrowser->selected_scheme_proc_name = g_strdup (proc_name);
  311.   convert_string (dbbrowser->selected_scheme_proc_name);
  312.  
  313.   g_free (dbbrowser->selected_proc_blurb);
  314.   g_free (dbbrowser->selected_proc_help);
  315.   g_free (dbbrowser->selected_proc_author);
  316.   g_free (dbbrowser->selected_proc_copyright);
  317.   g_free (dbbrowser->selected_proc_date);
  318.   g_free (dbbrowser->selected_params);
  319.   g_free (dbbrowser->selected_return_vals);
  320.  
  321.   gimp_procedural_db_proc_info (proc_name, 
  322.                 &(dbbrowser->selected_proc_blurb), 
  323.                 &(dbbrowser->selected_proc_help), 
  324.                 &(dbbrowser->selected_proc_author),
  325.                 &(dbbrowser->selected_proc_copyright), 
  326.                 &(dbbrowser->selected_proc_date), 
  327.                 &(dbbrowser->selected_proc_type), 
  328.                 &(dbbrowser->selected_nparams),
  329.                 &(dbbrowser->selected_nreturn_vals), 
  330.                 &(dbbrowser->selected_params), 
  331.                 &(dbbrowser->selected_return_vals));
  332.   
  333.   /* save the "old" table */
  334.   old_table = dbbrowser->descr_table;
  335.  
  336.   dbbrowser->descr_table = gtk_table_new
  337.     (10 + dbbrowser->selected_nparams + dbbrowser->selected_nreturn_vals,
  338.      5, FALSE);
  339.  
  340.   gtk_table_set_col_spacings (GTK_TABLE (dbbrowser->descr_table), 4);
  341.  
  342.   /* show the name */
  343.  
  344.   label = gtk_label_new (_("Name:"));
  345.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  346.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  347.             0, 1, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  348.   gtk_widget_show (label);
  349.  
  350.   label = gtk_entry_new ();
  351.   gtk_entry_set_text (GTK_ENTRY (label), dbbrowser->selected_scheme_proc_name);
  352.   gtk_entry_set_editable (GTK_ENTRY (label), FALSE);
  353.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  354.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  355.   gtk_widget_show (label);
  356.   row++;
  357.  
  358.   /* show the description */
  359.  
  360.   label = gtk_label_new (_("Blurb:"));
  361.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  362.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  363.             0, 1, row, row+1, GTK_FILL, GTK_FILL, 3, 0);
  364.   gtk_widget_show (label);
  365.  
  366.   label = gtk_label_new (dbbrowser->selected_proc_blurb);
  367.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  368.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  369.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  370.   gtk_widget_show (label);
  371.   row++;
  372.  
  373.   label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  374.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  375.             0, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  376.   gtk_widget_show (label);
  377.   row++;
  378.  
  379.   /* in parameters */
  380.   if (dbbrowser->selected_nparams) 
  381.     {
  382.       label = gtk_label_new (_("In:"));
  383.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  384.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  385.             0, 1, row, row+(dbbrowser->selected_nparams), 
  386.             GTK_FILL, GTK_FILL, 3, 0);
  387.       gtk_widget_show (label);
  388.       for (i = 0; i < dbbrowser->selected_nparams; i++) 
  389.     {
  390.       /* name */
  391.       label = gtk_label_new ((dbbrowser->selected_params[i]).name);
  392.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  393.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  394.                 1, 2, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  395.       gtk_widget_show (label);
  396.  
  397.       /* type */
  398.       label = gtk_label_new (GParamType2char ((dbbrowser->selected_params[i]).type));
  399.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  400.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  401.                 2, 3, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  402.       gtk_widget_show (label);
  403.  
  404.       /* description */
  405.       label = gtk_label_new ((dbbrowser->selected_params[i]).description);
  406.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
  407.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  408.                 3, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  409.       gtk_widget_show (label);
  410.       
  411.       row++;
  412.     }
  413.     }
  414.  
  415.   if ((dbbrowser->selected_nparams) && 
  416.       (dbbrowser->selected_nreturn_vals))
  417.     {
  418.       label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  419.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  420.             0, 4, row, row+1,
  421.             GTK_FILL, GTK_FILL, 3, 6);
  422.       gtk_widget_show (label);
  423.       row++;
  424.     }
  425.  
  426.   /* out parameters */
  427.   if (dbbrowser->selected_nreturn_vals)
  428.     {
  429.       label = gtk_label_new (_("Out:"));
  430.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  431.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  432.             0, 1, row, row+(dbbrowser->selected_nreturn_vals), 
  433.             GTK_FILL, GTK_FILL, 3, 0);
  434.       gtk_widget_show (label);
  435.       for (i = 0; i < dbbrowser->selected_nreturn_vals; i++) 
  436.     {
  437.       /* name */
  438.       label = gtk_label_new ((dbbrowser->selected_return_vals[i]).name);
  439.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  440.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  441.                 1, 2, row, row+1, 
  442.                 GTK_FILL, GTK_FILL, 0, 0);
  443.       gtk_widget_show (label);
  444.  
  445.       /* type */
  446.       label = gtk_label_new (GParamType2char((dbbrowser->selected_return_vals[i]).type));
  447.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  448.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  449.                 2, 3, row, row+1, 
  450.                 GTK_FILL, GTK_FILL, 0, 0);
  451.       gtk_widget_show (label);
  452.  
  453.       /* description */
  454.       label = gtk_label_new ((dbbrowser->selected_return_vals[i]).description);
  455.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  456.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  457.                 3, 4, row, row+1, 
  458.                 GTK_FILL, GTK_FILL, 0, 0);
  459.       gtk_widget_show (label);
  460.       row++;
  461.     }
  462.     }
  463.  
  464.   if ((dbbrowser->selected_nparams) || 
  465.       (dbbrowser->selected_nreturn_vals))
  466.     {
  467.       label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  468.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  469.             0, 4, row, row+1,
  470.             GTK_FILL, GTK_FILL, 3, 6);
  471.       gtk_widget_show (label);
  472.     row++;
  473.   }
  474.  
  475.   /* show the help */
  476.   if ((dbbrowser->selected_proc_help) &&
  477.       (strlen (dbbrowser->selected_proc_help) > 1))
  478.     {
  479.       label = gtk_label_new (_("Help:"));
  480.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  481.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  482.             0, 1, row, row+1, 
  483.             GTK_FILL, GTK_FILL, 3, 0);
  484.       gtk_widget_show (label);
  485.  
  486.       help = gtk_table_new (2, 2, FALSE);
  487.       gtk_table_set_row_spacing (GTK_TABLE (help), 0, 2);
  488.       gtk_table_set_col_spacing (GTK_TABLE (help), 0, 2);
  489.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), help,
  490.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 0);
  491.       gtk_widget_show (help);
  492.       row++;
  493.       
  494.       text = gtk_text_new (NULL, NULL);
  495.       gtk_text_set_editable (GTK_TEXT (text), FALSE);
  496.       gtk_text_set_word_wrap (GTK_TEXT (text), TRUE);
  497.       gtk_widget_set_usize (text, -1, 60);
  498.       gtk_table_attach (GTK_TABLE (help), text, 0, 1, 0, 1,
  499.             GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  500.             GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  501.       gtk_widget_show (text);
  502.       
  503.       vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
  504.       gtk_table_attach (GTK_TABLE (help), vscrollbar, 1, 2, 0, 1,
  505.             GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  506.       gtk_widget_show (vscrollbar);
  507.  
  508.       label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  509.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  510.             0, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  511.       gtk_widget_show (label);
  512.       row++;
  513.     }
  514.  
  515.   /* show the author & the copyright */
  516.  
  517.   label = gtk_label_new (_("Author:"));
  518.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  519.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  520.             0, 1, row, row+1, 
  521.             GTK_FILL, GTK_FILL, 3, 0);
  522.   gtk_widget_show (label);
  523.  
  524.   label = gtk_label_new (dbbrowser->selected_proc_author);
  525.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  526.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  527.             1, 4,  row, row+1,
  528.             GTK_FILL, GTK_FILL, 0, 0);
  529.   gtk_widget_show (label);
  530.   row++;
  531.  
  532.   label = gtk_label_new (_("Date:"));
  533.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  534.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  535.             0, 1, row, row+1, 
  536.             GTK_FILL, GTK_FILL, 3, 0);
  537.   gtk_widget_show (label);
  538.  
  539.   label = gtk_label_new (dbbrowser->selected_proc_date);
  540.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  541.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  542.             1, 4,  row, row+1,
  543.             GTK_FILL, GTK_FILL, 0, 0);
  544.   gtk_widget_show (label);
  545.   row++;
  546.  
  547.   label = gtk_label_new (_("Copyright:"));
  548.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  549.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  550.             0, 1, row, row+1, 
  551.             GTK_FILL, GTK_FILL, 3, 0);
  552.   gtk_widget_show (label);
  553.  
  554.   label = gtk_label_new (dbbrowser->selected_proc_copyright);
  555.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  556.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  557.             1, 4,  row, row+1,
  558.             GTK_FILL, GTK_FILL, 0, 0);
  559.   gtk_widget_show (label);
  560.   row++;
  561.  
  562.   if (old_table)
  563.     gtk_widget_destroy (old_table);
  564.  
  565.   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (dbbrowser->descr_scroll), 
  566.                      dbbrowser->descr_table);
  567.  
  568.   /* now after the table is added to a window add the text */
  569.   if (text != NULL)
  570.     {
  571.       gtk_widget_realize (text);
  572.       gtk_text_freeze (GTK_TEXT (text));
  573.       gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
  574.                dbbrowser->selected_proc_help, -1);
  575.       gtk_text_thaw (GTK_TEXT (text));
  576.     }
  577.   gtk_widget_show (dbbrowser->descr_table);
  578. }
  579.  
  580. /* end of the dialog */
  581. static void
  582. dialog_close_callback (GtkWidget *widget, 
  583.                gpointer   data)
  584. {
  585.   dbbrowser_t* dbbrowser = data;
  586.  
  587.   if (dbbrowser->apply_callback)
  588.     {
  589.       /* we are called by another application : just kill the dialog box */
  590.       gtk_widget_hide (dbbrowser->dlg);
  591.       gtk_widget_destroy (dbbrowser->dlg);
  592.     }
  593.   else
  594.     {
  595.       /* we are in the plug_in : kill the gtk application */
  596.       gtk_widget_destroy (dbbrowser->dlg);
  597.       gtk_main_quit ();
  598.     }
  599. }
  600.  
  601. /* end of the dialog */
  602. static void 
  603. dialog_apply_callback (GtkWidget *widget, 
  604.                gpointer   data)
  605. {
  606.   dbbrowser_t* dbbrowser = data;
  607.  
  608.   (dbbrowser->apply_callback) (dbbrowser->selected_proc_name,
  609.                    dbbrowser->selected_scheme_proc_name,
  610.                    dbbrowser->selected_proc_blurb,
  611.                    dbbrowser->selected_proc_help,
  612.                    dbbrowser->selected_proc_author,
  613.                    dbbrowser->selected_proc_copyright,
  614.                    dbbrowser->selected_proc_date,
  615.                    dbbrowser->selected_proc_type,
  616.                    dbbrowser->selected_nparams,
  617.                    dbbrowser->selected_nreturn_vals,
  618.                    dbbrowser->selected_params,
  619.                    dbbrowser->selected_return_vals);
  620. }
  621.  
  622. /* search in the whole db */
  623. static void 
  624. dialog_search_callback (GtkWidget *widget, 
  625.             gpointer   data)
  626. {
  627.   gchar **proc_list;
  628.   gint num_procs;
  629.   gint i, j;
  630.   dbbrowser_t* dbbrowser = data;
  631.   gchar *func_name, *label, *query_text;
  632.   GString *query;
  633.  
  634.   gtk_clist_freeze (GTK_CLIST (dbbrowser->clist));
  635.   gtk_clist_clear (GTK_CLIST (dbbrowser->clist));
  636.  
  637.   /* search */
  638.  
  639.   if (widget == (dbbrowser->name_button))
  640.     {
  641.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  642.                 _("DB Browser (by name - please wait)"));
  643.  
  644.       query = g_string_new ("");
  645.       query_text = gtk_entry_get_text (GTK_ENTRY (dbbrowser->search_entry));
  646.  
  647.       while (*query_text)
  648.     {
  649.       if ((*query_text == '_') || (*query_text == '-'))
  650.         g_string_append (query, "[-_]");
  651.       else
  652.         g_string_append_c (query, *query_text);
  653.  
  654.       query_text++;
  655.     }
  656.  
  657.       gimp_procedural_db_query (query->str,
  658.                     ".*", ".*", ".*", ".*", ".*", ".*", 
  659.                     &num_procs, &proc_list);
  660.  
  661.       g_string_free (query, TRUE);
  662.     }
  663.   else if (widget == (dbbrowser->blurb_button))
  664.     {
  665.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  666.                 _("DB Browser (by blurb - please wait)"));
  667.       gimp_procedural_db_query (".*", 
  668.                     gtk_entry_get_text(
  669.                   GTK_ENTRY(dbbrowser->search_entry) ),
  670.                     ".*", ".*", ".*", ".*", ".*",
  671.                     &num_procs, &proc_list);
  672.     }
  673.   else
  674.     {
  675.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  676.                 _("DB Browser (please wait)"));
  677.       gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", ".*", 
  678.                     &num_procs, &proc_list);
  679.     }
  680.  
  681.   for (i = 0; i < num_procs; i++)
  682.     {
  683.       j = 0;
  684.       while ((j < i) &&
  685.          (strcmp (gtk_clist_get_row_data (GTK_CLIST (dbbrowser->clist), j),
  686.               proc_list[i]) < 0))
  687.     j++;
  688.  
  689.       label = g_strdup (proc_list[i]);
  690.       convert_string (label);
  691.       gtk_clist_insert (GTK_CLIST (GTK_CLIST(dbbrowser->clist)), j,
  692.             &label);
  693.       func_name = g_strdup (proc_list[i]);
  694.  
  695.       gtk_clist_set_row_data_full (GTK_CLIST (dbbrowser->clist), j,
  696.                    func_name, g_free);
  697.     }
  698.  
  699.   if (num_procs > 0)
  700.     {
  701.       dialog_select (dbbrowser,
  702.              gtk_clist_get_row_data (GTK_CLIST (dbbrowser->clist), 0));
  703.       gtk_clist_select_row (GTK_CLIST (dbbrowser->clist), 0, 0);
  704.     }
  705.  
  706.   /*
  707.   if (num_procs != 0) {
  708.     gchar *insert_name, *label_name;
  709.     int i,j,savej;
  710.     
  711.     for (i = 0; i < num_procs ; i++) {
  712.  
  713.       insert_name=g_strdup(proc_list[0]); savej=0;
  714.       for (j = 0; j < num_procs ; j++) {
  715.     if (strcmp(proc_list[j],insert_name)<0) {
  716.       g_free(insert_name);
  717.       insert_name=g_strdup(proc_list[j]);
  718.       savej=j;
  719.     }
  720.       }
  721.   
  722.       proc_list[savej][0]='\255';
  723.  
  724.       label_name = g_strdup( insert_name );
  725.       convert_string( label_name );
  726.       gtk_clist_append (GTK_CLIST (dbbrowser->clist), &label_name);
  727.  
  728.       if (i==0) dialog_select( dbbrowser , insert_name );
  729.  
  730.       g_free(label_name);
  731.     }
  732.   }
  733.   */
  734.   
  735.   if (dbbrowser->clist)
  736.     {
  737.       ;
  738.     }
  739.   
  740.   g_free (proc_list);
  741.  
  742.   gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), _("DB Browser"));
  743.   gtk_clist_thaw (GTK_CLIST (dbbrowser->clist));
  744.  
  745. }
  746.  
  747. /* utils ... */
  748.  
  749. static void 
  750. convert_string (gchar *str)
  751. {
  752.   while (*str)
  753.     {
  754.       if (*str == '_') *str = '-';
  755.       str++;
  756.     }
  757. }
  758.  
  759. static gchar * 
  760. GParamType2char (GimpPDBArgType t)
  761. {
  762.   switch (t)
  763.     {
  764.     case GIMP_PDB_INT32: return "INT32";
  765.     case GIMP_PDB_INT16: return "INT16";
  766.     case GIMP_PDB_INT8: return "INT8";
  767.     case GIMP_PDB_FLOAT: return "FLOAT";
  768.     case GIMP_PDB_STRING: return "STRING";
  769.     case GIMP_PDB_INT32ARRAY: return "INT32ARRAY";
  770.     case GIMP_PDB_INT16ARRAY: return "INT16ARRAY";
  771.     case GIMP_PDB_INT8ARRAY: return "INT8ARRAY";
  772.     case GIMP_PDB_FLOATARRAY: return "FLOATARRAY";
  773.     case GIMP_PDB_STRINGARRAY: return "STRINGARRAY";
  774.     case GIMP_PDB_COLOR: return "COLOR";
  775.     case GIMP_PDB_REGION: return "REGION";
  776.     case GIMP_PDB_DISPLAY: return "DISPLAY";
  777.     case GIMP_PDB_IMAGE: return "IMAGE";
  778.     case GIMP_PDB_LAYER: return "LAYER";
  779.     case GIMP_PDB_CHANNEL: return "CHANNEL";
  780.     case GIMP_PDB_DRAWABLE: return "DRAWABLE";
  781.     case GIMP_PDB_SELECTION: return "SELECTION";
  782.     case GIMP_PDB_BOUNDARY: return "BOUNDARY";
  783.     case GIMP_PDB_PATH: return "PATH";
  784.     case GIMP_PDB_PARASITE: return "PARASITE";
  785.     case GIMP_PDB_STATUS: return "STATUS";
  786.     case GIMP_PDB_END: return "END";
  787.     default: return "UNKNOWN?";
  788.     }
  789. }
  790.