home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / gap / gap_dbbrowser_utils.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-28  |  26.4 KB  |  793 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. /* 
  21.    gap_dbbrowser_utils.c (original code dbbrowser_utils.c by Thomas NOEL <thomas@minet.net>
  22.  
  23.    27. jan .1999   hof: update for GIMP 1.1.1 (show help)
  24.    09. dec .1998   hof: update for GIMP 1.1
  25.    12. jan .1998   hof: added "Gen Code" button
  26.    
  27.    23. dec .1997   hof: GAP variant of DBbrowser
  28.                         removed apply_callback
  29.                         added constraint_procedure, 
  30.                         added 2 buttons
  31.                         added return type
  32.    
  33.  
  34.    0.08  26th sept 97  by Thomas NOEL <thomas@minet.net> )
  35. */
  36.  
  37. #include "config.h"
  38. #include "libgimp/stdplugins-intl.h"
  39. #include "gap_dbbrowser_utils.h"
  40.  
  41. extern int gap_debug;
  42.  
  43. int 
  44. gap_db_browser_dialog(char *title_txt,
  45.                       char *button_1_txt,
  46.                       char *button_2_txt,
  47.                       t_constraint_func        constraint_func,
  48.                       t_constraint_func        constraint_func_sel1,
  49.                       t_constraint_func        constraint_func_sel2,
  50.                       t_gap_db_browse_result  *result,
  51.               gint                     init_gtk_flag)
  52.   /* create the dialog box */
  53. {
  54.   gchar **l_argsv;
  55.   gint    l_argsc;
  56.   
  57.   dbbrowser_t* dbbrowser;
  58.   
  59.   GtkWidget *button;
  60.   GtkWidget *hbox,*searchhbox,*vbox;
  61.   GtkWidget *label;
  62.   
  63.   l_argsc = 1;
  64.   l_argsv = g_new (gchar *, 1);
  65.   l_argsv[0] = g_strdup ( _("GAP Animated Filter apply"));
  66.  
  67.   if (init_gtk_flag)
  68.   {
  69.     /* gtk init (should be called only once in a plugin-process) */
  70.     gtk_init (&l_argsc, &l_argsv);
  71.   }
  72.  
  73.   dbbrowser = (gpointer)g_malloc(sizeof(dbbrowser_t));
  74.  
  75.   /* store pointers to gap constraint procedures */  
  76.   dbbrowser->constraint_func      = constraint_func;
  77.   dbbrowser->constraint_func_sel1 = constraint_func_sel1;
  78.   dbbrowser->constraint_func_sel2 = constraint_func_sel2;
  79.   dbbrowser->result  = result;
  80.   dbbrowser->codegen_flag  = 0;   /* default: no code generation */
  81.  
  82.   /* the dialog box */
  83.   
  84.   dbbrowser->dlg = gtk_dialog_new ();
  85.   
  86.   gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), _("Animated Filter apply (init)"));
  87.   gtk_window_set_position (GTK_WINDOW (dbbrowser->dlg), GTK_WIN_POS_MOUSE);
  88.   gtk_signal_connect (GTK_OBJECT (dbbrowser->dlg), "destroy",
  89.                       (GtkSignalFunc) dialog_close_callback,
  90.                       dbbrowser);
  91.   
  92.   /* label (fill 1. table_row) */
  93.   label = gtk_label_new(title_txt);
  94.   gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  95.   gtk_widget_show(label);
  96.  
  97.   /* hbox : left=list ; right=description */
  98.   
  99.   hbox = gtk_hbox_new(FALSE, 0);
  100.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->vbox), 
  101.               hbox, TRUE, TRUE, 0);
  102.   gtk_widget_show (hbox);
  103.   
  104.   /* left = vbox : the list and the search entry */
  105.   
  106.   vbox = gtk_vbox_new( FALSE, 0 );
  107.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); 
  108.   gtk_box_pack_start (GTK_BOX (hbox), 
  109.               vbox, FALSE, TRUE, 0);
  110.   gtk_widget_show(vbox);
  111.   
  112.   /* list : list in a scrolled_win */
  113.   
  114.   dbbrowser->clist = gtk_clist_new(1);
  115.   dbbrowser->scrolled_win = gtk_scrolled_window_new (NULL, NULL);
  116.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dbbrowser->scrolled_win),
  117.                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  118.   gtk_clist_set_selection_mode (GTK_CLIST (dbbrowser->clist),
  119.                     GTK_SELECTION_BROWSE);
  120.  
  121.   gtk_widget_set_usize(dbbrowser->clist, DBL_LIST_WIDTH, DBL_HEIGHT);
  122.   gtk_signal_connect (GTK_OBJECT (dbbrowser->clist), "select_row",
  123.               (GtkSignalFunc) procedure_select_callback,
  124.               dbbrowser);
  125.   gtk_box_pack_start (GTK_BOX (vbox), dbbrowser->scrolled_win, TRUE, TRUE, 0);
  126.   gtk_container_add (GTK_CONTAINER (dbbrowser->scrolled_win), dbbrowser->clist);
  127.   gtk_widget_show(dbbrowser->clist);
  128.   gtk_widget_show(dbbrowser->scrolled_win);
  129.  
  130.   /* search entry */
  131.  
  132.   searchhbox = gtk_hbox_new(FALSE,0);
  133.   gtk_box_pack_start (GTK_BOX (vbox),
  134.               searchhbox, FALSE, TRUE, 0);
  135.   gtk_widget_show(searchhbox);
  136.  
  137.   label = gtk_label_new( _("Search:"));
  138.   gtk_misc_set_alignment( GTK_MISC(label), 0.0, 0.5);
  139.   gtk_box_pack_start (GTK_BOX (searchhbox), 
  140.               label, TRUE, TRUE, 0);
  141.   gtk_widget_show(label);
  142.  
  143.   dbbrowser->search_entry = gtk_entry_new();
  144.   gtk_box_pack_start (GTK_BOX (searchhbox), 
  145.               dbbrowser->search_entry, TRUE, TRUE, 0);
  146.   gtk_widget_show(dbbrowser->search_entry);
  147.  
  148.   /* right = description */
  149.  
  150.   dbbrowser->descr_scroll = gtk_scrolled_window_new (NULL, NULL);
  151.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dbbrowser->descr_scroll),
  152.                   GTK_POLICY_ALWAYS, 
  153.                   GTK_POLICY_ALWAYS
  154.                   );
  155.   gtk_box_pack_start (GTK_BOX (hbox), 
  156.               dbbrowser->descr_scroll, TRUE, TRUE, 0);
  157.   gtk_widget_set_usize (dbbrowser->descr_scroll, DBL_WIDTH - DBL_LIST_WIDTH, 0);
  158.   gtk_widget_show (dbbrowser->descr_scroll);
  159.  
  160.   /* buttons in dlg->action_aera */
  161.  
  162.   gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG(dbbrowser->dlg)->action_area), 0);
  163.  
  164.   if (gap_debug) {
  165.     button = gtk_button_new_with_label ( _("Gen Code by name"));
  166.     GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  167.     gtk_signal_connect (GTK_OBJECT (button), "clicked",
  168.             (GtkSignalFunc) dialog_button_3_callback, dbbrowser );
  169.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->action_area), 
  170.             button, TRUE, TRUE, 0);
  171.     gtk_widget_show (button);
  172.   }
  173.  
  174.   dbbrowser->name_button = gtk_button_new_with_label ( _("Search by Name"));
  175.   GTK_WIDGET_SET_FLAGS (dbbrowser->name_button, GTK_CAN_DEFAULT);
  176.   gtk_signal_connect (GTK_OBJECT (dbbrowser->name_button), "clicked",
  177.                       (GtkSignalFunc) dialog_search_callback, dbbrowser);
  178.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->action_area), 
  179.             dbbrowser->name_button , TRUE, TRUE, 0);
  180.   gtk_widget_show(dbbrowser->name_button);
  181.  
  182.   dbbrowser->blurb_button = gtk_button_new_with_label ( _("Search by Blurb"));
  183.   GTK_WIDGET_SET_FLAGS (dbbrowser->blurb_button, GTK_CAN_DEFAULT);
  184.   gtk_signal_connect (GTK_OBJECT (dbbrowser->blurb_button), "clicked",
  185.                       (GtkSignalFunc) dialog_search_callback, dbbrowser);
  186.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->action_area), 
  187.             dbbrowser->blurb_button , TRUE, TRUE, 0);
  188.   gtk_widget_show(dbbrowser->blurb_button);
  189.  
  190.   if (button_1_txt) {
  191.     dbbrowser->app_const_button = gtk_button_new_with_label (button_1_txt);
  192.     GTK_WIDGET_SET_FLAGS (dbbrowser->app_const_button, GTK_CAN_DEFAULT);
  193.     gtk_signal_connect (GTK_OBJECT (dbbrowser->app_const_button), "clicked",
  194.             (GtkSignalFunc) dialog_button_1_callback, dbbrowser );
  195.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->action_area), 
  196.             dbbrowser->app_const_button, TRUE, TRUE, 0);
  197.     gtk_widget_show (dbbrowser->app_const_button);
  198.   } else dbbrowser->app_const_button = NULL;
  199.  
  200.   if (button_2_txt) {
  201.     dbbrowser->app_vary_button = gtk_button_new_with_label (button_2_txt);
  202.     GTK_WIDGET_SET_FLAGS (dbbrowser->app_vary_button, GTK_CAN_DEFAULT);
  203.     gtk_signal_connect (GTK_OBJECT (dbbrowser->app_vary_button), "clicked",
  204.             (GtkSignalFunc) dialog_button_2_callback, dbbrowser );
  205.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->action_area), 
  206.             dbbrowser->app_vary_button, TRUE, TRUE, 0);
  207.     gtk_widget_show (dbbrowser->app_vary_button);
  208.   } else dbbrowser->app_vary_button = NULL;
  209.  
  210.   button = gtk_button_new_with_label ( _("Cancel"));
  211.   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  212.   gtk_signal_connect (GTK_OBJECT (button), "clicked",
  213.               (GtkSignalFunc) dialog_close_callback, dbbrowser);
  214.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->action_area), 
  215.               button, TRUE, TRUE, 0);
  216.   gtk_widget_show (button);
  217.  
  218.  
  219.   /* now build the list */
  220.  
  221.   gtk_widget_show (dbbrowser->clist); 
  222.   gtk_widget_show (dbbrowser->dlg);
  223.  
  224.   /* initialize the "return" value (for "apply") */
  225.  
  226.   dbbrowser->descr_table = NULL;
  227.   dbbrowser->selected_proc_name = NULL;
  228.   dbbrowser->selected_scheme_proc_name = NULL;
  229.   dbbrowser->selected_proc_blurb = NULL;
  230.   dbbrowser->selected_proc_help = NULL;
  231.   dbbrowser->selected_proc_author = NULL;
  232.   dbbrowser->selected_proc_copyright = NULL;
  233.   dbbrowser->selected_proc_date = NULL;
  234.   dbbrowser->selected_proc_type = 0;
  235.   dbbrowser->selected_nparams = 0;
  236.   dbbrowser->selected_nreturn_vals = 0;
  237.   dbbrowser->selected_params = NULL;
  238.   dbbrowser->selected_return_vals = NULL;
  239.  
  240.   dbbrowser->result->selected_proc_name[0] = '\0';
  241.   dbbrowser->result->button_nr = -1;
  242.  
  243.   /* first search (all procedures) */
  244.   dialog_search_callback( NULL, (gpointer)dbbrowser );
  245.   gtk_main ();
  246.   gdk_flush ();
  247.  
  248.   return  (dbbrowser->result->button_nr);
  249. }
  250.  
  251. static gint
  252. procedure_select_callback (GtkWidget *widget,
  253.                gint row, 
  254.                gint column, 
  255.                GdkEventButton * bevent,
  256.                gpointer data)
  257. {
  258.   dbbrowser_t *dbbrowser = data;
  259.   gchar *func;
  260.  
  261.   g_return_val_if_fail (widget != NULL, FALSE);
  262.   /*  g_return_val_if_fail (bevent != NULL, FALSE);  */
  263.   g_return_val_if_fail (dbbrowser != NULL, FALSE);
  264.  
  265.   if ((func = (gchar *) (gtk_clist_get_row_data (GTK_CLIST (widget), row))))
  266.       dialog_select (dbbrowser, func);
  267.   return FALSE;
  268. }
  269.  
  270.  
  271. static void 
  272. dialog_select (dbbrowser_t *dbbrowser, 
  273.            gchar       *proc_name)
  274.   /* update the description box (right) */
  275. {
  276.   GtkWidget *label;
  277.   GtkWidget *old_table;
  278.   GtkWidget *help;
  279.   GtkWidget *text = NULL;
  280.   GtkWidget *vscrollbar;
  281.   gint i,row=0;
  282.   
  283.   if (dbbrowser->selected_proc_name) 
  284.     g_free(dbbrowser->selected_proc_name);
  285.   dbbrowser->selected_proc_name = g_strdup(proc_name);
  286.  
  287.   if (dbbrowser->selected_scheme_proc_name)
  288.     g_free(dbbrowser->selected_scheme_proc_name);
  289.   dbbrowser->selected_scheme_proc_name = 
  290.     g_strdup(proc_name);
  291.   convert_string(dbbrowser->selected_scheme_proc_name);
  292.  
  293.   if (dbbrowser->selected_proc_blurb) g_free(dbbrowser->selected_proc_blurb);
  294.   if (dbbrowser->selected_proc_help) g_free(dbbrowser->selected_proc_help);
  295.   if (dbbrowser->selected_proc_author) g_free(dbbrowser->selected_proc_author);
  296.   if (dbbrowser->selected_proc_copyright) g_free(dbbrowser->selected_proc_copyright);
  297.   if (dbbrowser->selected_proc_date) g_free(dbbrowser->selected_proc_date);
  298.   if (dbbrowser->selected_params) g_free(dbbrowser->selected_params);
  299.   if (dbbrowser->selected_return_vals) g_free(dbbrowser->selected_return_vals);
  300.  
  301.   gimp_procedural_db_proc_info (proc_name, 
  302.                 &(dbbrowser->selected_proc_blurb), 
  303.                 &(dbbrowser->selected_proc_help), 
  304.                 &(dbbrowser->selected_proc_author),
  305.                 &(dbbrowser->selected_proc_copyright), 
  306.                 &(dbbrowser->selected_proc_date), 
  307.                 &(dbbrowser->selected_proc_type), 
  308.                 &(dbbrowser->selected_nparams),
  309.                 &(dbbrowser->selected_nreturn_vals), 
  310.                 &(dbbrowser->selected_params), 
  311.                 &(dbbrowser->selected_return_vals));
  312.   
  313.   /* save the "old" table */
  314.   old_table = dbbrowser->descr_table;
  315.  
  316.   dbbrowser->descr_table = gtk_table_new( 
  317.        10 + dbbrowser->selected_nparams + dbbrowser->selected_nreturn_vals ,
  318.        5 , FALSE );
  319.  
  320.   gtk_table_set_col_spacings( GTK_TABLE(dbbrowser->descr_table), 3);
  321.  
  322.   /* show the name */
  323.  
  324.   label = gtk_label_new( _("Name:"));
  325.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  326.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  327.             0, 1, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  328.   gtk_widget_show(label);
  329.  
  330.   label = gtk_entry_new();
  331.   gtk_entry_set_text(GTK_ENTRY(label),dbbrowser->selected_scheme_proc_name);
  332.   
  333.   gtk_entry_set_editable(GTK_ENTRY(label), FALSE);
  334.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  335.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  336.   gtk_widget_show(label);
  337.   row++;
  338.  
  339.   /* show the description */
  340.  
  341.   label = gtk_label_new( _("Blurb:"));
  342.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  343.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  344.             0, 1, row, row+1, GTK_FILL, GTK_FILL, 3, 0);
  345.   gtk_widget_show(label);
  346.  
  347.   label = gtk_label_new(dbbrowser->selected_proc_blurb);
  348.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  349.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  350.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  351.   gtk_widget_show(label);
  352.   row++;
  353.  
  354.   label = gtk_hseparator_new(); /* ok, not really a label ... :) */
  355.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  356.             0, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  357.   gtk_widget_show(label);
  358.   row++;
  359.  
  360.   /* in parameters */
  361.   if (dbbrowser->selected_nparams) 
  362.     {
  363.       label = gtk_label_new( _("In:"));
  364.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  365.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  366.        0, 1, row, row+(dbbrowser->selected_nparams), 
  367.        GTK_FILL, GTK_FILL, 3, 0);
  368.       gtk_widget_show(label);
  369.       for (i=0;i<(dbbrowser->selected_nparams);i++) 
  370.     {
  371.       /* name */
  372.       label = gtk_label_new((dbbrowser->selected_params[i]).name);
  373.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  374.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  375.                 1, 2, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  376.       gtk_widget_show(label);
  377.  
  378.       /* type */
  379.       label = gtk_label_new(GParamType2char((dbbrowser->selected_params[i]).type));
  380.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  381.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  382.                 2, 3, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  383.       gtk_widget_show(label);
  384.  
  385.       /* description */
  386.       label = gtk_label_new((dbbrowser->selected_params[i]).description);
  387.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
  388.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  389.                 3, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  390.       gtk_widget_show(label);
  391.       
  392.       row++;
  393.     }
  394.     }
  395.   
  396.   if ((dbbrowser->selected_nparams) && 
  397.       (dbbrowser->selected_nreturn_vals)) {
  398.     label = gtk_hseparator_new(); /* ok, not really a label ... :) */
  399.     gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  400.               0, 4, row, row+1,
  401.               GTK_FILL, GTK_FILL, 3, 6);
  402.     gtk_widget_show( label );
  403.     row++;
  404.   }
  405.  
  406.   /* out parameters */
  407.   if (dbbrowser->selected_nreturn_vals)
  408.     {
  409.       label = gtk_label_new( _("Out:"));
  410.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  411.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  412.             0, 1, row, row+(dbbrowser->selected_nreturn_vals), 
  413.             GTK_FILL, GTK_FILL, 3, 0);
  414.       gtk_widget_show(label);
  415.       for (i=0;i<(dbbrowser->selected_nreturn_vals);i++) 
  416.     {
  417.       /* name */
  418.       label = gtk_label_new((dbbrowser->selected_return_vals[i]).name);
  419.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  420.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  421.                 1, 2, row, row+1, 
  422.                 GTK_FILL, GTK_FILL, 0, 0);
  423.       gtk_widget_show(label);
  424.  
  425.       /* type */
  426.       label = gtk_label_new(GParamType2char((dbbrowser->selected_return_vals[i]).type));
  427.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  428.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  429.                 2, 3, row, row+1, 
  430.                 GTK_FILL, GTK_FILL, 0, 0);
  431.       gtk_widget_show(label);
  432.  
  433.       /* description */
  434.       label = gtk_label_new((dbbrowser->selected_return_vals[i]).description);
  435.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  436.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  437.                 3, 4, row, row+1, 
  438.                 GTK_FILL, GTK_FILL, 0, 0);
  439.       gtk_widget_show(label);
  440.       row++;
  441.  
  442.     }
  443.     }
  444.  
  445.   if ((dbbrowser->selected_nparams) || 
  446.       (dbbrowser->selected_nreturn_vals)) {
  447.     label = gtk_hseparator_new(); /* ok, not really a label ... :) */
  448.     gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  449.               0, 4, row, row+1,
  450.               GTK_FILL, GTK_FILL, 3, 6);
  451.     gtk_widget_show( label );
  452.     row++;
  453.   }
  454.  
  455.   /* show the help */
  456.   if ((dbbrowser->selected_proc_help) && (strlen(dbbrowser->selected_proc_help) > 1))
  457.     {
  458.       label = gtk_label_new( _("Help:"));
  459.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  460.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  461.             0, 1, row, row+1, 
  462.             GTK_FILL, GTK_FILL, 3, 0);
  463.       gtk_widget_show(label);
  464.       
  465.       help = gtk_table_new (2, 2, FALSE);
  466.       gtk_table_set_row_spacing (GTK_TABLE (help), 0, 2);
  467.       gtk_table_set_col_spacing (GTK_TABLE (help), 0, 2);
  468.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), help,
  469.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 0);
  470.       gtk_widget_show (help);
  471.       row++;
  472.       
  473.       text = gtk_text_new (NULL, NULL);
  474.       gtk_text_set_editable (GTK_TEXT (text), FALSE);
  475.       gtk_text_set_word_wrap(GTK_TEXT(text), TRUE);
  476.       gtk_widget_set_usize (text, -1, 60);
  477.       gtk_table_attach (GTK_TABLE (help), text, 0, 1, 0, 1,
  478.             GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  479.             GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  480.       gtk_widget_show (text);
  481.       
  482.       vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
  483.       gtk_table_attach (GTK_TABLE (help), vscrollbar, 1, 2, 0, 1,
  484.             GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  485.       gtk_widget_show (vscrollbar);
  486.             
  487.       label = gtk_hseparator_new(); /* ok, not really a label ... :) */
  488.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  489.             0, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  490.       gtk_widget_show(label);
  491.       row++;
  492.     }
  493.  
  494.   /* show the author & the copyright */
  495.  
  496.   label = gtk_label_new( _("Author:"));
  497.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  498.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  499.             0, 1, row, row+1, 
  500.             GTK_FILL, GTK_FILL, 3, 0);
  501.   gtk_widget_show(label);
  502.  
  503.   label = gtk_label_new(dbbrowser->selected_proc_author);
  504.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  505.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  506.             1, 4,  row, row+1,
  507.             GTK_FILL, GTK_FILL, 0, 0);
  508.   gtk_widget_show(label);
  509.   row++;
  510.   
  511.   label = gtk_label_new( _("Date:"));
  512.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  513.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  514.             0, 1, row, row+1, 
  515.             GTK_FILL, GTK_FILL, 3, 0);
  516.   gtk_widget_show(label);
  517.  
  518.   label = gtk_label_new(dbbrowser->selected_proc_date);
  519.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  520.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  521.             1, 4,  row, row+1,
  522.             GTK_FILL, GTK_FILL, 0, 0);
  523.   gtk_widget_show(label);
  524.   row++;
  525.  
  526.   label = gtk_label_new( _("Copyright:"));
  527.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  528.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  529.             0, 1, row, row+1, 
  530.             GTK_FILL, GTK_FILL, 3, 0);
  531.   gtk_widget_show(label);
  532.  
  533.   label = gtk_label_new(dbbrowser->selected_proc_copyright);
  534.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  535.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  536.             1, 4,  row, row+1,
  537.             GTK_FILL, GTK_FILL, 0, 0);
  538.   gtk_widget_show(label);
  539.   row++;
  540.  
  541.  
  542.   if (old_table) gtk_widget_destroy(old_table);
  543.  
  544.   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (dbbrowser->descr_scroll), 
  545.                      dbbrowser->descr_table);
  546.  
  547.   /* now after the table is added to a window add the text */
  548.   if (text != NULL)
  549.     {
  550.       gtk_widget_realize (text);
  551.       gtk_text_freeze (GTK_TEXT (text));
  552.       gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
  553.                dbbrowser->selected_proc_help, -1);
  554.       gtk_text_thaw (GTK_TEXT (text));
  555.     }
  556.   
  557.                 
  558.   gtk_widget_show(dbbrowser->descr_table);
  559.  
  560.   /* call constraint functions to check sensibility for the apply buttons */ 
  561.   if(dbbrowser->app_const_button != NULL)
  562.   {
  563.      if(0 != (dbbrowser->constraint_func_sel1)(dbbrowser->selected_proc_name))
  564.      { 
  565.        gtk_widget_set_sensitive (dbbrowser->app_const_button, TRUE);
  566.      }
  567.      else 
  568.      {
  569.        gtk_widget_set_sensitive (dbbrowser->app_const_button, FALSE);
  570.      }
  571.   }
  572.   if(dbbrowser->app_vary_button != NULL)
  573.   {
  574.      if(0 != (dbbrowser->constraint_func_sel2)(dbbrowser->selected_proc_name))
  575.      { 
  576.         gtk_widget_set_sensitive (dbbrowser->app_vary_button, TRUE);
  577.      }
  578.      else
  579.      {
  580.         gtk_widget_set_sensitive (dbbrowser->app_vary_button, FALSE);
  581.      }
  582.   }
  583. }
  584.  
  585. static void
  586. dialog_close_callback (GtkWidget *widget, 
  587.                gpointer   data)
  588.      /* end of the dialog */
  589. {
  590.   dbbrowser_t* dbbrowser = data;
  591.  
  592.     /* we are in the plug_in : kill the gtk application */
  593.     gtk_widget_destroy(dbbrowser->dlg);
  594.     gtk_main_quit ();
  595.  
  596. static void 
  597. dialog_button_1_callback (GtkWidget *widget, 
  598.                gpointer   data)
  599.      /* end of the dialog */
  600. {
  601.   dbbrowser_t* dbbrowser = data;
  602.  
  603.   if (dbbrowser->selected_proc_name==NULL) return;
  604.  
  605.   strcpy(dbbrowser->result->selected_proc_name, dbbrowser->selected_proc_name);
  606.   dbbrowser->result->button_nr = 0;
  607.   
  608.   gtk_widget_hide(dbbrowser->dlg);
  609.   gtk_widget_destroy(dbbrowser->dlg);
  610.   gtk_main_quit ();
  611. }
  612.  
  613. static void 
  614. dialog_button_2_callback (GtkWidget *widget, 
  615.                gpointer   data)
  616.      /* end of the dialog */
  617. {
  618.   dbbrowser_t* dbbrowser = data;
  619.  
  620.   if (dbbrowser->selected_proc_name==NULL) return;
  621.  
  622.   strcpy(dbbrowser->result->selected_proc_name, dbbrowser->selected_proc_name);
  623.   dbbrowser->result->button_nr = 1;
  624.   
  625.   gtk_widget_hide(dbbrowser->dlg);
  626.   gtk_widget_destroy(dbbrowser->dlg);
  627.   gtk_main_quit ();
  628. }
  629.  
  630. static void 
  631. dialog_button_3_callback (GtkWidget *widget, 
  632.                gpointer   data)
  633.      /* end of the dialog */
  634. {
  635.   dbbrowser_t* dbbrowser = data;
  636.  
  637.   p_remove_codegen_files();      /* remove old versions of generated CODE */
  638.   dbbrowser->codegen_flag = 1;   /* let dialog_search_callback generate */
  639.   dialog_search_callback(dbbrowser->name_button, (gpointer)dbbrowser );
  640.   dbbrowser->codegen_flag = 0;
  641. }
  642.  
  643. static void 
  644. dialog_search_callback (GtkWidget *widget, 
  645.             gpointer   data)
  646.      /* search in the whole db */
  647. {
  648.   char **proc_list;
  649.   int num_procs;
  650.   int i, j;
  651.   int i_added;
  652.   dbbrowser_t* dbbrowser = data;
  653.   gchar *func_name, *label, *query_text;
  654.   GString *query;
  655.  
  656.   gtk_clist_freeze(GTK_CLIST(dbbrowser->clist));
  657.   gtk_clist_clear(GTK_CLIST(dbbrowser->clist));
  658.  
  659.   /* search */
  660.  
  661.   if ( widget == (dbbrowser->name_button) ) 
  662.     {
  663.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  664.                 _("Animated Filter apply (by name - please wait)"));
  665.  
  666.       query = g_string_new ("");
  667.       query_text = gtk_entry_get_text(GTK_ENTRY(dbbrowser->search_entry));
  668.  
  669.       while (*query_text)
  670.     {
  671.       if ((*query_text == '_') || (*query_text == '-'))
  672.         g_string_append (query, "[-_]");
  673.       else
  674.         g_string_append_c (query, *query_text);
  675.  
  676.       query_text++;
  677.     }
  678.  
  679.       gimp_procedural_db_query (query->str,
  680.                ".*", ".*", ".*", ".*", ".*", ".*", 
  681.                &num_procs, &proc_list);
  682.  
  683.       g_string_free (query, TRUE);
  684.     }
  685.   else if ( widget == (dbbrowser->blurb_button) )
  686.     {
  687.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  688.                 _("Animated Filter apply (by blurb - please wait)"));
  689.       gimp_procedural_db_query (".*", 
  690.                gtk_entry_get_text( GTK_ENTRY(dbbrowser->search_entry) ),
  691.                ".*", ".*", ".*", ".*", ".*",
  692.                &num_procs, &proc_list);
  693.     }
  694.   else {
  695.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  696.                 _("Animated Filter apply (please wait)"));
  697.       gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", ".*", 
  698.                &num_procs, &proc_list);
  699.   }
  700.  
  701.   i_added = 0;
  702.   for (i = 0; i < num_procs; i++)
  703.   {
  704.     /* the filter constraint_function checks if the
  705.      * PDB-proc has a typical interface to operate on a single drawable.
  706.      * all other PDB-procedures are not listed in the GAP-dbbrowser
  707.      */
  708.     if(0 != (dbbrowser->constraint_func)((char *)proc_list[i]))
  709.     {
  710.         j = 0;
  711.         while((j < i_added) &&
  712.          (strcmp(gtk_clist_get_row_data(GTK_CLIST(dbbrowser->clist), j),
  713.              proc_list[i]) < 0))
  714.         {
  715.            j++;
  716.         }
  717.         
  718.         i_added++;
  719.         label = g_strdup(proc_list[i]);
  720.         if((dbbrowser->codegen_flag != 0) && (gap_debug))
  721.         {
  722.           p_gen_forward_iter_ALT(label);
  723.           p_gen_tab_iter_ALT(label);
  724.           p_gen_code_iter_ALT(label);
  725.         }
  726.         convert_string(label);
  727.         gtk_clist_insert (GTK_CLIST (GTK_CLIST(dbbrowser->clist)), j,
  728.                           &label);
  729.         func_name = g_strdup (proc_list[i]);
  730.  
  731.         gtk_clist_set_row_data_full(GTK_CLIST(dbbrowser->clist), j,
  732.                                     func_name, g_free);
  733.     }
  734.   }
  735.  
  736.   if ( dbbrowser->clist ) {
  737.      ;
  738.   }
  739.   
  740.   g_free( proc_list );
  741.  
  742.   gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  743.             _("Animated Filter apply"));
  744.  
  745.   gtk_clist_thaw(GTK_CLIST(dbbrowser->clist));
  746.  
  747. }
  748.  
  749.  
  750. /* utils ... */
  751.  
  752. static void 
  753. convert_string (char *str)
  754. {
  755.   while (*str)
  756.     {
  757.       if (*str == '_') *str = '-';
  758.       str++;
  759.     }
  760. }
  761.  
  762. static char* 
  763. GParamType2char(GimpPDBArgType t)
  764. {
  765.   switch (t) {
  766.   case GIMP_PDB_INT32: return "INT32";
  767.   case GIMP_PDB_INT16: return "INT16";
  768.   case GIMP_PDB_INT8: return "INT8";
  769.   case GIMP_PDB_FLOAT: return "FLOAT";
  770.   case GIMP_PDB_STRING: return "STRING";
  771.   case GIMP_PDB_INT32ARRAY: return "INT32ARRAY";
  772.   case GIMP_PDB_INT16ARRAY: return "INT16ARRAY";
  773.   case GIMP_PDB_INT8ARRAY: return "INT8ARRAY";
  774.   case GIMP_PDB_FLOATARRAY: return "FLOATARRAY";
  775.   case GIMP_PDB_STRINGARRAY: return "STRINGARRAY";
  776.   case GIMP_PDB_COLOR: return "COLOR";
  777.   case GIMP_PDB_REGION: return "REGION";
  778.   case GIMP_PDB_DISPLAY: return "DISPLAY";
  779.   case GIMP_PDB_IMAGE: return "IMAGE";
  780.   case GIMP_PDB_LAYER: return "LAYER";
  781.   case GIMP_PDB_CHANNEL: return "CHANNEL";
  782.   case GIMP_PDB_DRAWABLE: return "DRAWABLE";
  783.   case GIMP_PDB_SELECTION: return "SELECTION";
  784.   case GIMP_PDB_BOUNDARY: return "BOUNDARY";
  785.   case GIMP_PDB_PATH: return "PATH";
  786.   case GIMP_PDB_PARASITE: return "PARASITE";
  787.   case GIMP_PDB_STATUS: return "STATUS";
  788.   case GIMP_PDB_END: return "END";
  789.   default: return "UNKNOWN?";
  790.   }
  791. }
  792.