Include files from the "epan" directory and subdirectories thereof with
[obnox/wireshark/wip.git] / gtk / color_dlg.c
index 3c13c679aa61933b8d2c30a03ff554d5c37013e3..a04416c24c6a990fcd40c299aa3937cc3a6145b9 100644 (file)
@@ -1,12 +1,11 @@
 /* color_dlg.c
  * Definitions for dialog boxes for color filters
  *
- * $Id: color_dlg.c,v 1.4 2000/07/05 02:45:38 guy Exp $
+ * $Id: color_dlg.c,v 1.12 2002/01/21 07:37:41 guy Exp $
  *
  * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
+ * By Gerald Combs <gerald@ethereal.com>
  * Copyright 1998 Gerald Combs
- *
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 #include <string.h>
 
 #include <errno.h>
+
+#ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
+#endif
 
 #include "gtk/main.h"
-#include "packet.h"
+#include <epan/packet.h>
 #include "colors.h"
 #include "color_dlg.h"
 #include "file.h"
-#include "dfilter.h"
+#include <epan/dfilter/dfilter.h>
 #include "simple_dialog.h"
 #include "dlg_utils.h"
 #include "ui_util.h"
-               
+#include "dfilter_expr_dlg.h"
+
+
 static GtkWidget* colorize_dialog_new(colfilter *filter);
 static void add_filter_to_clist(gpointer filter_arg, gpointer clist_arg);
 static void color_filter_up_cb(GtkButton *button, gpointer user_data);
@@ -87,6 +91,14 @@ static gchar *titles[2] = { "Name", "Filter String" };
 #define COLOR_SELECTION_BG     "color_selection_bg"
 #define COLOR_SELECTION_PARENT "color_selection_parent"
 
+static void
+filter_expr_cb(GtkWidget *w, gpointer filter_te)
+{
+
+        dfilter_expr_dlg_new(GTK_WIDGET(filter_te));
+}
+
+
 /* Callback for the "Display:Colorize Display" menu item. */
 void
 color_display_cb(GtkWidget *w, gpointer d)
@@ -108,12 +120,12 @@ colorize_dialog_new (colfilter *filter)
   GtkWidget *vbox1;
   GtkWidget *hbox1;
   GtkWidget *vbox2;
+  GtkWidget *vbox4;
   GtkWidget *color_filter_up;
   GtkWidget *label4;
   GtkWidget *color_filter_down;
   GtkWidget *scrolledwindow1;
   GtkWidget *color_filters;
-  GtkWidget *hbox2;
   GtkWidget *color_new;
   GtkWidget *color_edit;
   GtkWidget *color_delete;
@@ -127,9 +139,8 @@ colorize_dialog_new (colfilter *filter)
   filter->row_selected = -1; /* no row selected */
   tooltips = gtk_tooltips_new ();
 
-  color_win = dlg_window_new ();
+  color_win = dlg_window_new ("Add color to protocols");
   gtk_object_set_data (GTK_OBJECT (color_win), "color_win", color_win);
-  gtk_window_set_title (GTK_WINDOW (color_win), ("Add color to protocols"));
 
   vbox1 = gtk_vbox_new (FALSE, 0);
   gtk_widget_ref (vbox1);
@@ -145,6 +156,7 @@ colorize_dialog_new (colfilter *filter)
   gtk_widget_show (hbox1);
   gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
 
+  /* vbox2 holds the Up and Down Buttons and label */
   vbox2 = gtk_vbox_new (TRUE, 0);
   gtk_widget_ref (vbox2);
   gtk_object_set_data_full (GTK_OBJECT (color_win), "vbox2", vbox2,
@@ -176,7 +188,9 @@ colorize_dialog_new (colfilter *filter)
   gtk_widget_show (color_filter_down);
   gtk_box_pack_start (GTK_BOX (vbox2), color_filter_down, FALSE, FALSE, 0);
   gtk_tooltips_set_tip (tooltips, color_filter_down, ("Move filter lower in list"), NULL);
+  /* End vbox2 */
 
+  /* create the list of filters */
   scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
   gtk_widget_ref (scrolledwindow1);
   gtk_object_set_data_full (GTK_OBJECT (color_win), "scrolledwindow1", scrolledwindow1,
@@ -186,12 +200,6 @@ colorize_dialog_new (colfilter *filter)
 
   color_filters = gtk_clist_new_with_titles(2, titles);
 
-#if 0
-  /* I don't seem to need this, but just in case, I'll if0 it */
-  gtk_object_set_data_full (GTK_OBJECT (color_win), "color_filters",
-                            color_filters,
-                            (GtkDestroyNotify) gtk_widget_unref);
-#endif
   g_slist_foreach(filter_list, add_filter_to_clist, color_filters);
 
   gtk_widget_show (color_filters);
@@ -200,22 +208,26 @@ colorize_dialog_new (colfilter *filter)
   gtk_clist_set_column_width (GTK_CLIST (color_filters), 0, 80);
   gtk_clist_set_column_width (GTK_CLIST (color_filters), 1, 80);
   gtk_clist_column_titles_show (GTK_CLIST (color_filters));
+  /* end list of filters */
 
-  hbox2 = gtk_hbox_new (FALSE, 0);
-  gtk_widget_ref (hbox2);
-  gtk_object_set_data_full (GTK_OBJECT (color_win), "hbox2", hbox2,
+  /* vbox4 is first button column */
+  vbox4 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (vbox4);
+  gtk_object_set_data_full (GTK_OBJECT (color_win), "vbox4", vbox4,
                             (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (hbox2);
-  gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, FALSE, 5);
-  gtk_widget_set_usize (hbox2, -2, 40);
+  gtk_widget_show (vbox4);
+  gtk_box_pack_start (GTK_BOX (hbox1), vbox4, TRUE, FALSE, 5);
+#if 0
+  gtk_widget_set_usize (vbox4, -2, 30);
+#endif
 
   color_new = gtk_button_new_with_label (("New"));
   gtk_widget_ref (color_new);
   gtk_object_set_data_full (GTK_OBJECT (color_win), "color_new", color_new,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (color_new);
-  gtk_box_pack_start (GTK_BOX (hbox2), color_new, TRUE, FALSE, 5);
-  gtk_widget_set_usize (color_new, 50, 30);
+  gtk_box_pack_start (GTK_BOX (vbox4), color_new, FALSE, FALSE, 5);
+  gtk_widget_set_usize (color_new, 50, 20);
   gtk_tooltips_set_tip (tooltips, color_new, ("Create a new colorization filter after selected filter"), NULL);
 
   color_edit = gtk_button_new_with_label (("Edit"));
@@ -223,8 +235,8 @@ colorize_dialog_new (colfilter *filter)
   gtk_object_set_data_full (GTK_OBJECT (color_win), "color_edit", color_edit,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (color_edit);
-  gtk_widget_set_usize(color_edit, 50, 30);
-  gtk_box_pack_start (GTK_BOX (hbox2), color_edit, TRUE, FALSE, 5);
+  gtk_widget_set_usize(color_edit, 50, 20);
+  gtk_box_pack_start (GTK_BOX (vbox4), color_edit, FALSE, FALSE, 5);
   gtk_tooltips_set_tip (tooltips, color_edit, ("Change color of selected filter"), NULL);
   gtk_widget_set_sensitive (color_edit,
       (filter->num_of_filters != 0));
@@ -234,8 +246,8 @@ colorize_dialog_new (colfilter *filter)
   gtk_object_set_data_full (GTK_OBJECT (color_win), "color_delete", color_delete,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (color_delete);
-  gtk_box_pack_start (GTK_BOX (hbox2), color_delete, TRUE, FALSE, 5);
-  gtk_widget_set_usize (color_delete, 50, 30);
+  gtk_box_pack_start (GTK_BOX (vbox4), color_delete, FALSE, FALSE, 5);
+  gtk_widget_set_usize (color_delete, 50, 20);
   gtk_tooltips_set_tip (tooltips, color_delete, ("Delete selected colorization filter"), NULL);
 
   color_save = gtk_button_new_with_label (("Save"));
@@ -243,17 +255,18 @@ colorize_dialog_new (colfilter *filter)
   gtk_object_set_data_full (GTK_OBJECT (color_win), "color_save", color_save,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (color_save);
-  gtk_box_pack_start (GTK_BOX (hbox2), color_save, TRUE, FALSE, 5);
-  gtk_widget_set_usize (color_save, 50, 30);
+  gtk_box_pack_start (GTK_BOX (vbox4), color_save, FALSE, FALSE, 5);
+  gtk_widget_set_usize (color_save, 50, 20);
   gtk_tooltips_set_tip (tooltips, color_save, ("Save all filters to disk"), NULL);
 
+  /* hbox3 is bottom button row */
   hbox3 = gtk_hbox_new (FALSE, 0);
   gtk_widget_ref (hbox3);
   gtk_object_set_data_full (GTK_OBJECT (color_win), "hbox3", hbox3,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (hbox3);
   gtk_box_pack_start (GTK_BOX (vbox1), hbox3, TRUE, FALSE, 5);
-  gtk_widget_set_usize (hbox3, 177, 40);
+  gtk_widget_set_usize (hbox3, 177, 30);
 
   color_ok = gtk_button_new_with_label (("OK"));
   gtk_widget_ref (color_ok);
@@ -261,7 +274,7 @@ colorize_dialog_new (colfilter *filter)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (color_ok);
   gtk_box_pack_start (GTK_BOX (hbox3), color_ok, TRUE, FALSE, 0);
-  gtk_widget_set_usize (color_ok, 50, 30);
+  gtk_widget_set_usize (color_ok, 50, 20);
   gtk_tooltips_set_tip (tooltips, color_ok, ("Accept filter list; apply changes"), NULL);
 
   color_apply = gtk_button_new_with_label (("Apply"));
@@ -270,7 +283,7 @@ colorize_dialog_new (colfilter *filter)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (color_apply);
   gtk_box_pack_start (GTK_BOX (hbox3), color_apply, TRUE, FALSE, 0);
-  gtk_widget_set_usize (color_apply, 50, 30);
+  gtk_widget_set_usize (color_apply, 50, 20);
   gtk_tooltips_set_tip (tooltips, color_apply, ("Apply filters in list"), NULL);
 
   color_cancel = gtk_button_new_with_label (("Cancel"));
@@ -279,7 +292,7 @@ colorize_dialog_new (colfilter *filter)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (color_cancel);
   gtk_box_pack_start (GTK_BOX (hbox3), color_cancel, TRUE, FALSE, 0);
-  gtk_widget_set_usize (color_cancel, 50, 30);
+  gtk_widget_set_usize (color_cancel, 50, 20);
   gtk_tooltips_set_tip (tooltips, color_cancel, ("No more filter changes; don't apply"), NULL);
 
   gtk_signal_connect (GTK_OBJECT (color_win), "destroy",
@@ -334,6 +347,8 @@ colorize_dialog_new (colfilter *filter)
   gtk_object_set_data (GTK_OBJECT (color_win), "tooltips", tooltips);
   gtk_widget_show (color_win);
 
+  dlg_set_cancel(color_win, color_cancel);
+
   return color_win;
 }
 
@@ -428,8 +443,9 @@ remember_selected_row                 (GtkCList        *clist,
 }
 
 /* Called when the dialog box is being destroyed; destroy any edit
-   dialogs opened from this dialog, and null out the pointer to this
-   dialog. */
+ * dialogs opened from this dialog, and null out the pointer to this
+ * dialog.
+ jjj*/
 static void
 color_destroy_cb                       (GtkButton       *button,
                                         gpointer         user_data)
@@ -565,7 +581,7 @@ color_save_cb                          (GtkButton       *button,
   colfilter *filter = (colfilter *)user_data;
 
   if (!write_filters(filter))
-       simple_dialog(ESD_TYPE_WARN, NULL, "Could not open filter file: %s",
+       simple_dialog(ESD_TYPE_CRIT, NULL, "Could not open filter file: %s",
            strerror(errno));
 
 }
@@ -614,6 +630,7 @@ edit_color_filter_dialog_new (colfilter *filter,
   GtkWidget *hbox6;
   GtkWidget *color_filter_name;
   GtkWidget *hbox7;
+  GtkWidget *add_expression_bt;
   GtkWidget *color_filter_text;
   GtkWidget *hbox5;
   GtkWidget *colorize_filter_fg;
@@ -634,9 +651,8 @@ edit_color_filter_dialog_new (colfilter *filter,
 
   tooltips = gtk_tooltips_new ();
 
-  edit_dialog = dlg_window_new ();
+  edit_dialog = dlg_window_new ("Edit color filter");
   gtk_object_set_data (GTK_OBJECT (edit_dialog), "edit_dialog", edit_dialog);
-  gtk_window_set_title (GTK_WINDOW (edit_dialog), ("Edit color filter"));
   colorf->edit_dialog = edit_dialog;
 
   vbox3 = gtk_vbox_new (FALSE, 0);
@@ -694,6 +710,8 @@ edit_color_filter_dialog_new (colfilter *filter,
   gtk_object_set_data_full (GTK_OBJECT (edit_dialog), "*colorize_filter_text", *colorize_filter_text,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_entry_set_text(GTK_ENTRY(*colorize_filter_text), colorf->filter_text);
+
+
 #if 0
   style = gtk_style_copy(gtk_widget_get_style(*colorize_filter_text));
   style->base[GTK_STATE_NORMAL] = colorf->bg_color;
@@ -704,6 +722,14 @@ edit_color_filter_dialog_new (colfilter *filter,
   gtk_box_pack_start (GTK_BOX (hbox7), *colorize_filter_text, TRUE, TRUE, 0);
   gtk_tooltips_set_tip (tooltips, *colorize_filter_text, ("This is the editable text of the filter"), NULL);
 
+  /* Create the "Add Expression..." button, to pop up a dialog
+  for constructing filter comparison expressions. */
+  add_expression_bt = gtk_button_new_with_label("Add Expression...");
+  gtk_signal_connect(GTK_OBJECT(add_expression_bt), "clicked",
+      GTK_SIGNAL_FUNC(filter_expr_cb), *colorize_filter_text);
+  gtk_box_pack_start (GTK_BOX(hbox7), add_expression_bt, FALSE, FALSE, 3);
+  gtk_widget_show(add_expression_bt);
+
   hbox5 = gtk_hbox_new (FALSE, 0);
   gtk_widget_ref (hbox5);
   gtk_object_set_data_full (GTK_OBJECT (edit_dialog), "hbox5", hbox5,
@@ -734,13 +760,13 @@ edit_color_filter_dialog_new (colfilter *filter,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (hbox4);
   gtk_box_pack_start (GTK_BOX (vbox3), hbox4, TRUE, FALSE, 5);
-  gtk_widget_set_usize (hbox4, -2, 40);
+  gtk_widget_set_usize (hbox4, -2, 30);
 
   edit_color_filter_ok = gtk_button_new_with_label (("OK"));
   gtk_widget_ref (edit_color_filter_ok);
   gtk_object_set_data_full (GTK_OBJECT (edit_dialog), "edit_color_filter_ok", edit_color_filter_ok,
                             (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_set_usize (edit_color_filter_ok, 50, 30);
+  gtk_widget_set_usize (edit_color_filter_ok, 50, 20);
   gtk_widget_show (edit_color_filter_ok);
   gtk_box_pack_start (GTK_BOX (hbox4), edit_color_filter_ok, TRUE, FALSE, 0);
   gtk_tooltips_set_tip (tooltips, edit_color_filter_ok, ("Accept filter color change"), NULL);
@@ -749,7 +775,7 @@ edit_color_filter_dialog_new (colfilter *filter,
   gtk_widget_ref (edit_color_filter_cancel);
   gtk_object_set_data_full (GTK_OBJECT (edit_dialog), "edit_color_filter_cancel", edit_color_filter_cancel,
                             (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_set_usize (edit_color_filter_cancel, 50, 30);
+  gtk_widget_set_usize (edit_color_filter_cancel, 50, 20);
   gtk_widget_show (edit_color_filter_cancel);
   gtk_box_pack_start (GTK_BOX (hbox4), edit_color_filter_cancel, TRUE, FALSE, 0);
   gtk_tooltips_set_tip (tooltips, edit_color_filter_cancel, ("Reject filter color change"), NULL);
@@ -780,6 +806,9 @@ edit_color_filter_dialog_new (colfilter *filter,
                       edit_dialog);
 
   gtk_object_set_data (GTK_OBJECT (edit_dialog), "tooltips", tooltips);
+
+  dlg_set_cancel(edit_dialog, edit_color_filter_cancel);
+
   gtk_widget_show (edit_dialog);
 }
 
@@ -878,7 +907,7 @@ edit_color_filter_ok_cb                (GtkButton       *button,
   gchar *filter_name;
   gchar *filter_text;
   color_filter_t *colorf;
-  dfilter *compiled_filter;
+  dfilter_t *compiled_filter;
   GtkWidget *color_filters;
 
   dialog = (GtkWidget *)user_data;
@@ -891,15 +920,15 @@ edit_color_filter_ok_cb                (GtkButton       *button,
   filter_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(filt_text_entry)));
 
   if(strchr(filter_name,'@') || strchr(filter_text,'@')){
-       simple_dialog(ESD_TYPE_WARN,NULL, "Filter names and strings must not"
+       simple_dialog(ESD_TYPE_CRIT, NULL, "Filter names and strings must not"
          " use the '@' character. Filter unchanged.");
        g_free(filter_name);
        g_free(filter_text);
        return;
   }
 
-  if(dfilter_compile(filter_text, &compiled_filter) != 0 ){
-       simple_dialog(ESD_TYPE_WARN, NULL, "Filter \"%s\" did not compile correctly.\n"
+  if(!dfilter_compile(filter_text, &compiled_filter)) {
+       simple_dialog(ESD_TYPE_CRIT, NULL, "Filter \"%s\" did not compile correctly.\n"
                " Please try again. Filter unchanged.\n%s\n", filter_name,
                dfilter_error_msg);
   } else {
@@ -921,7 +950,7 @@ edit_color_filter_ok_cb                (GtkButton       *button,
        gtk_clist_set_background(GTK_CLIST(color_filters),
            cfile.colors->row_selected, &new_bg_color);
        if(colorf->c_colorfilter != NULL)
-           dfilter_destroy(colorf->c_colorfilter);
+           dfilter_free(colorf->c_colorfilter);
        colorf->c_colorfilter = compiled_filter;
        /* gtk_clist_set_text frees old text (if any) and allocates new space */
        gtk_clist_set_text(GTK_CLIST(color_filters),
@@ -1073,7 +1102,7 @@ color_sel_ok_cb                        (GtkButton       *button,
   new_color.blue  = (guint16)(new_colors[2]*65535.0);
 
   if ( ! get_color(&new_color) ){
-       simple_dialog(ESD_TYPE_WARN, NULL, "Could not allocate color.  Try again.");
+       simple_dialog(ESD_TYPE_CRIT, NULL, "Could not allocate color.  Try again.");
   } else {
        /* Find the "Edit color filter" dialog box with which this is
           associated. */