Qt: Implement packet comments. Fix packet detail updates.
[metze/wireshark/wip.git] / ui / gtk / edit_packet_comment_dlg.c
1 /* edit_packet_comment_dlg.c
2  * Dialog box for editing or adding packet comments.
3  * Copyright 2012 Anders Broman <anders.broman@ericsson.com>
4  *
5  * $Id$
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 Gerald Combs
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25
26 #include "config.h"
27
28 #include <string.h>
29
30 #include <gtk/gtk.h>
31
32 #include <epan/epan.h>
33 #include <epan/filesystem.h>
34
35 #include "ui/main_statusbar.h"
36 #include "ui/simple_dialog.h"
37
38 #include "ui/gtk/dlg_utils.h"
39 #include "ui/gtk/expert_comp_dlg.h"
40 #include "ui/gtk/gui_utils.h"
41 #include "ui/gtk/help_dlg.h"
42 #include "ui/gtk/main.h"
43 #include "ui/gtk/packet_list.h"
44 #include "ui/gtk/edit_packet_comment_dlg.h"
45 #include "ui/gtk/old-gtk-compat.h"
46 #include "ui/gtk/summary_dlg.h"
47
48 static GtkWidget *edit_or_add_pkt_comment_dlg = NULL;
49 static GtkWidget *edit_or_add_capture_comment_dlg = NULL;
50 static GtkWidget *view_capture_and_pkt_comments_dlg = NULL;
51
52 static void
53 pkt_comment_text_buff_ok_cb(GtkWidget *w _U_, GtkWidget *view)
54 {
55   GtkTextBuffer *buffer;
56   GtkTextIter start_iter;
57   GtkTextIter end_iter;
58   gchar *new_packet_comment;
59
60   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
61   gtk_text_buffer_get_start_iter (buffer, &start_iter);
62   gtk_text_buffer_get_end_iter (buffer, &end_iter);
63
64   new_packet_comment = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE /* whether to include invisible text */);
65
66   /*g_warning("The new comment is '%s'",new_packet_comment);*/
67
68   packet_list_update_packet_comment(new_packet_comment);
69   expert_comp_packet_comment_updated();
70
71   window_destroy(edit_or_add_pkt_comment_dlg);
72
73 }
74
75
76 static void
77 capture_comment_text_buff_ok_cb(GtkWidget *w _U_, GtkWidget *view)
78 {
79   GtkTextBuffer *buffer;
80   GtkTextIter start_iter;
81   GtkTextIter end_iter;
82   gchar *new_capture_comment;
83
84   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
85   gtk_text_buffer_get_start_iter (buffer, &start_iter);
86   gtk_text_buffer_get_end_iter (buffer, &end_iter);
87
88   new_capture_comment = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE /* whether to include invisible text */);
89
90   /*g_warning("The new comment is '%s'",new_capture_comment);*/
91   cf_update_capture_comment(&cfile, new_capture_comment);
92
93   /* Update the main window as appropriate */
94   main_update_for_unsaved_changes(&cfile);
95
96   status_capture_comment_update();
97
98   window_destroy(edit_or_add_capture_comment_dlg);
99
100 }
101
102 static void
103 comment_summary_copy_to_clipboard_cb(GtkWidget *w _U_, GtkWidget *view)
104 {
105   GtkTextBuffer *buffer;
106   GtkTextIter start_iter, end_iter;
107   GtkClipboard *clipboard;
108
109   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
110
111   gtk_text_buffer_get_bounds(buffer, &start_iter, &end_iter);
112
113   gtk_text_buffer_select_range(buffer, &start_iter, &end_iter);
114
115   clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);     /* Get the default clipboard */
116   gtk_text_buffer_copy_clipboard (buffer, clipboard);
117
118   gtk_text_buffer_select_range(buffer, &end_iter, &end_iter);
119
120 }
121
122 void
123 edit_packet_comment_dlg (GtkAction *action _U_, gpointer data _U_)
124 {
125
126   GtkWidget *vbox;
127   GtkWidget *view;
128   GtkWidget *scroll;
129   GtkWidget *bbox;
130   GtkWidget *ok_bt, *cancel_bt, *help_bt;
131   GtkTextBuffer *buffer;
132   const gchar *opt_comment;
133   gchar *buf_str;
134
135   edit_or_add_pkt_comment_dlg = dlg_window_new ("Edit or Add Packet Comments");
136   gtk_widget_set_size_request (edit_or_add_pkt_comment_dlg, 500, 160);
137   gtk_window_set_resizable (GTK_WINDOW (edit_or_add_pkt_comment_dlg), TRUE);
138   gtk_container_set_border_width (GTK_CONTAINER (edit_or_add_pkt_comment_dlg), DLG_OUTER_MARGIN);
139
140   vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
141   gtk_container_add (GTK_CONTAINER (edit_or_add_pkt_comment_dlg), vbox);
142   gtk_widget_show (vbox);
143
144   view = gtk_text_view_new ();
145   gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
146   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
147   gtk_widget_show (view);
148
149   scroll = gtk_scrolled_window_new(NULL, NULL);
150   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
151                   GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
152   gtk_container_add(GTK_CONTAINER(scroll), view);
153   gtk_widget_show(scroll);
154   gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
155
156   /* Get the comment */
157   opt_comment = packet_list_get_packet_comment();
158   /*g_warning("Fetched comment '%s'",opt_comment);*/
159
160   if(opt_comment){
161     buf_str = g_strdup_printf("%s", opt_comment);
162     gtk_text_buffer_set_text (buffer, buf_str, -1);
163     g_free(buf_str);
164   }
165
166   /* Button row. */
167   bbox = dlg_button_row_new (GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
168   gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
169
170   ok_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_OK);
171   g_signal_connect (ok_bt, "clicked", G_CALLBACK(pkt_comment_text_buff_ok_cb), view);
172   gtk_widget_set_sensitive (ok_bt, TRUE);
173
174   cancel_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
175   window_set_cancel_button (edit_or_add_pkt_comment_dlg, cancel_bt, window_cancel_button_cb);
176
177   help_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
178 #if 0
179   g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
180 #endif
181   gtk_widget_set_sensitive (help_bt, FALSE);
182
183   gtk_widget_grab_default (ok_bt);
184   g_signal_connect (edit_or_add_pkt_comment_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
185
186
187   gtk_widget_show (edit_or_add_pkt_comment_dlg);
188 }
189
190 void
191 show_packet_comment_summary_dlg (GtkAction *action _U_, gpointer data _U_)
192 {
193
194   GtkWidget *vbox;
195   GtkWidget *view;
196   GtkWidget *scroll;
197   GtkWidget *bbox;
198   GtkWidget *copy_bt, *cancel_bt, *help_bt;
199   GtkTextBuffer *buffer;
200
201   view_capture_and_pkt_comments_dlg = dlg_window_new ("Comments Summary");
202   gtk_widget_set_size_request (view_capture_and_pkt_comments_dlg, 700, 350);
203   gtk_window_set_resizable (GTK_WINDOW (view_capture_and_pkt_comments_dlg), TRUE);
204   gtk_container_set_border_width (GTK_CONTAINER (view_capture_and_pkt_comments_dlg), DLG_OUTER_MARGIN);
205
206   vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
207   gtk_container_add (GTK_CONTAINER (view_capture_and_pkt_comments_dlg), vbox);
208   gtk_widget_show (vbox);
209
210   view = gtk_text_view_new ();
211   gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
212   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
213   gtk_widget_show (view);
214
215   scroll = gtk_scrolled_window_new(NULL, NULL);
216   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
217                   GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
218   gtk_container_add(GTK_CONTAINER(scroll), view);
219   gtk_widget_show(scroll);
220   gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
221
222   /* Add capture summary information */
223   summary_to_texbuff(buffer);
224
225   /* Add all packet comments */
226   packet_list_return_all_comments(buffer);
227
228   /* Button row. */
229   bbox = dlg_button_row_new (GTK_STOCK_COPY, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
230   gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
231
232   copy_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_COPY);
233   g_signal_connect (copy_bt, "clicked", G_CALLBACK(comment_summary_copy_to_clipboard_cb), view);
234   gtk_widget_set_sensitive (copy_bt, TRUE);
235
236   cancel_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
237   window_set_cancel_button (view_capture_and_pkt_comments_dlg, cancel_bt, window_cancel_button_cb);
238
239   help_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
240 #if 0
241   g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
242 #endif
243   gtk_widget_set_sensitive (help_bt, FALSE);
244
245   gtk_widget_grab_default (copy_bt);
246
247
248   gtk_widget_show (view_capture_and_pkt_comments_dlg);
249 }
250
251 static void
252 edit_capture_comment_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
253 {
254   /* Note that we no longer have an "Edit Capture Comment" dialog box. */
255   edit_or_add_capture_comment_dlg = NULL;
256 }
257
258 void
259 edit_capture_dlg_launch (void)
260 {
261
262   GtkWidget *vbox;
263   GtkWidget *view;
264   GtkWidget *scroll;
265   GtkWidget *bbox;
266   GtkWidget *ok_bt, *cancel_bt, *help_bt;
267   GtkTextBuffer *buffer = NULL;
268   const gchar *comment_str = NULL;
269   gchar *buf_str;
270
271   if (edit_or_add_capture_comment_dlg != NULL) {
272     /* There's already an "Edit Capture Comment" dialog box; reactivate it. */
273     reactivate_window(edit_or_add_capture_comment_dlg);
274     return;
275   }
276
277   edit_or_add_capture_comment_dlg = dlg_window_new ("Edit or Add Capture Comments");
278   gtk_widget_set_size_request (edit_or_add_capture_comment_dlg, 500, 160);
279   gtk_window_set_resizable (GTK_WINDOW (edit_or_add_capture_comment_dlg), TRUE);
280   gtk_container_set_border_width (GTK_CONTAINER (edit_or_add_capture_comment_dlg), DLG_OUTER_MARGIN);
281
282   g_signal_connect(edit_or_add_capture_comment_dlg, "destroy",
283                    G_CALLBACK(edit_capture_comment_destroy_cb), NULL);
284
285   vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
286   gtk_container_add (GTK_CONTAINER (edit_or_add_capture_comment_dlg), vbox);
287   gtk_widget_show (vbox);
288
289   view = gtk_text_view_new ();
290   gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
291   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
292   gtk_widget_show (view);
293
294   scroll = gtk_scrolled_window_new(NULL, NULL);
295   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
296                   GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
297   gtk_container_add(GTK_CONTAINER(scroll), view);
298   gtk_widget_show(scroll);
299   gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
300
301   /* Get the comment */
302   comment_str = cf_read_shb_comment(&cfile);
303   /*g_warning("Fetched comment '%s'",opt_comment);*/
304
305   if(comment_str != NULL){
306     buf_str = g_strdup_printf("%s", comment_str);
307     gtk_text_buffer_set_text (buffer, buf_str, -1);
308     g_free(buf_str);
309   }
310
311   /* Button row. */
312   bbox = dlg_button_row_new (GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
313   gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
314
315   ok_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_OK);
316   g_signal_connect (ok_bt, "clicked", G_CALLBACK(capture_comment_text_buff_ok_cb), view);
317   gtk_widget_set_sensitive (ok_bt, TRUE);
318
319   cancel_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
320   window_set_cancel_button (edit_or_add_capture_comment_dlg, cancel_bt, window_cancel_button_cb);
321
322   help_bt = g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
323 #if 0
324   g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
325 #endif
326   gtk_widget_set_sensitive (help_bt, FALSE);
327
328   gtk_widget_grab_default (ok_bt);
329   g_signal_connect (edit_or_add_capture_comment_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
330
331
332   gtk_widget_show (edit_or_add_capture_comment_dlg);
333
334 }