Index: configure.in =================================================================== RCS file: /cvs/gnome/gtk+/configure.in,v retrieving revision 1.469.2.3 diff -u -u -r1.469.2.3 configure.in --- configure.in 31 Aug 2005 14:22:33 -0000 1.469.2.3 +++ configure.in 3 Sep 2005 23:47:02 -0000 @@ -346,6 +346,7 @@ [glib-2.0 >= glib_required_version dnl atk >= atk_required_version dnl pango >= pango_required_version dnl + libbeagle-0.0 >= 0.0 dnl cairo >= cairo_required_version]) if test "$os_win32" != yes; then @@ -1440,8 +1441,8 @@ GTK_PACKAGES="atk cairo" GTK_EXTRA_LIBS= GTK_EXTRA_CFLAGS= -GTK_DEP_LIBS="$GDK_EXTRA_LIBS $GTK_DEP_LIBS_FOR_X `$PKG_CONFIG --libs $GDK_PIXBUF_PACKAGES $PANGO_PACKAGES $GTK_PACKAGES_FOR_X $GTK_PACKAGES` $GTK_EXTRA_LIBS $GDK_PIXBUF_EXTRA_LIBS" -GTK_DEP_CFLAGS="`$PKG_CONFIG --cflags gthread-2.0 $GDK_PIXBUF_PACKAGES $GDK_PACKAGES $GTK_PACKAGES` $GDK_PIXBUF_EXTRA_CFLAGS $GDK_EXTRA_CFLAGS $GTK_EXTRA_CFLAGS" +GTK_DEP_LIBS="$GDK_EXTRA_LIBS $GTK_DEP_LIBS_FOR_X `$PKG_CONFIG --libs libbeagle-0.0 $GDK_PIXBUF_PACKAGES $PANGO_PACKAGES $GTK_PACKAGES_FOR_X $GTK_PACKAGES` $GTK_EXTRA_LIBS $GDK_PIXBUF_EXTRA_LIBS" +GTK_DEP_CFLAGS="`$PKG_CONFIG --cflags gthread-2.0 libbeagle-0.0 $GDK_PIXBUF_PACKAGES $GDK_PACKAGES $GTK_PACKAGES` $GDK_PIXBUF_EXTRA_CFLAGS $GDK_EXTRA_CFLAGS $GTK_EXTRA_CFLAGS" if test x"$os_win32" = xyes; then GTK_EXTRA_CFLAGS="$msnative_struct" Index: docs/reference/gdk/tmpl/gdk-unused.sgml =================================================================== RCS file: /cvs/gnome/gtk+/docs/reference/gdk/tmpl/gdk-unused.sgml,v retrieving revision 1.34 diff -u -u -r1.34 gdk-unused.sgml --- docs/reference/gdk/tmpl/gdk-unused.sgml 20 Jun 2005 22:06:11 -0000 1.34 +++ docs/reference/gdk/tmpl/gdk-unused.sgml 3 Sep 2005 23:47:02 -0000 @@ -604,6 +604,14 @@ @display: @sm_client_id: + + + + + +@drawable: +@Returns: + Frees a full font name obtained from gdk_font_full_name_get(). Index: gtk/Makefile.am =================================================================== RCS file: /cvs/gnome/gtk+/gtk/Makefile.am,v retrieving revision 1.276 diff -u -u -r1.276 Makefile.am --- gtk/Makefile.am 1 Aug 2005 19:21:00 -0000 1.276 +++ gtk/Makefile.am 3 Sep 2005 23:47:02 -0000 @@ -319,6 +319,7 @@ gtktreedatalist.h \ gtktreeprivate.h \ gtkwindow-decorate.h \ + gedit-output-window.h \ gtktoggleactionprivate.h # GTK+ C sources to build the library from @@ -522,6 +523,7 @@ gtkwidget.c \ gtkwindow-decorate.c \ gtkwindow.c \ + gedit-output-window.c \ xembed.h if OS_UNIX Index: gtk/gedit-output-window.c =================================================================== RCS file: gtk/gedit-output-window.c diff -N gtk/gedit-output-window.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gtk/gedit-output-window.c 3 Sep 2005 23:47:03 -0000 @@ -0,0 +1,597 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * gedit-output_window.c + * This file is part of gedit + * + * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence + * Copyright (C) 2000, 2002 Chema Celorio, Paolo Maggi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the gedit Team, 1998-2002. See the AUTHORS file for a + * list of people on the gedit Team. + * See the ChangeLog files for a list of changes. + */ + +#include +#include "gdk/gdkkeysyms.h" +#include "gtkalignment.h" +#include "gtkbindings.h" +#include "gtkbutton.h" +#include "gtkcelllayout.h" +#include "gtkcellrendererpixbuf.h" +//#include "gtkcellrendererseptext.h" +#include "gtkcellrenderertext.h" +#include "gtkcheckmenuitem.h" +#include "gtkcombobox.h" +#include "gtkentry.h" +#include "gtkexpander.h" +#include "gtkfilechooserdefault.h" +#include "gtkfilechooserembed.h" +#include "gtkfilechooserentry.h" +#include "gtkfilechooserutils.h" +#include "gtkfilechooser.h" +#include "gtkfilesystemmodel.h" +#include "gtkframe.h" +#include "gtkhbox.h" +#include "gtkhpaned.h" +#include "gtkiconfactory.h" +#include "gtkicontheme.h" +#include "gtkimage.h" +#include "gtkintl.h" +#include "gtklabel.h" +#include "gtkmarshalers.h" +#include "gtkmenuitem.h" +#include "gtkmessagedialog.h" +#include "gtkpathbar.h" +#include "gtkprivate.h" +#include "gtkscrolledwindow.h" +#include "gtksizegroup.h" +#include "gtkstock.h" +#include "gtktable.h" +#include "gtktreednd.h" +#include "gtktreeprivate.h" +#include "gtktreeview.h" +#include "gtktreemodelsort.h" +#include "gtktreeselection.h" +#include "gtktreestore.h" +#include "gtktooltips.h" +#include "gtktypebuiltins.h" +#include "gtkvbox.h" +#include "gtkvseparator.h" +#include "gtkclipboard.h" +#include "gedit-output-window.h" + +struct _GeditOutputWindowPrivate +{ + GtkTooltips *tooltips; + + GtkWidget *close_button; + GtkWidget *copy_button; + GtkWidget *clear_button; + + GtkWidget *treeview; + GtkTreeModel *model; +}; + +enum { + CLOSE_REQUESTED, + SELECTION_CHANGED, + LAST_SIGNAL +}; + +static guint signals [LAST_SIGNAL]; + +enum +{ + COLUMN_LINES, + NUM_COLUMNS +}; + +static void gedit_output_window_class_init (GeditOutputWindowClass *klass); +static void gedit_output_window_init (GeditOutputWindow *output_window); +static void gedit_output_window_finalize (GObject *object); +static void gedit_output_window_destroy (GtkObject *object); + +static GtkHBoxClass *parent_class = NULL; + + +GType +gedit_output_window_get_type (void) +{ + static GType output_window_type = 0; + + if (output_window_type == 0) + { + static const GTypeInfo our_info = + { + sizeof (GeditOutputWindowClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gedit_output_window_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GeditOutputWindow), + 0, /* n_preallocs */ + (GInstanceInitFunc) gedit_output_window_init + }; + + output_window_type = g_type_register_static (GTK_TYPE_HBOX, + "GeditOutputWindow", + &our_info, + 0); + } + + return output_window_type; +} + +static void +gedit_output_window_class_init (GeditOutputWindowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + object_class->finalize = gedit_output_window_finalize; + + GTK_OBJECT_CLASS (klass)->destroy = gedit_output_window_destroy; + + signals[CLOSE_REQUESTED] = + g_signal_new ("close_requested", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GeditOutputWindowClass, close_requested), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[SELECTION_CHANGED] = + g_signal_new ("selection_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GeditOutputWindowClass, selection_changed), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, G_TYPE_STRING); + +} + +static void +gedit_output_window_copy_selection (GeditOutputWindow *ow) +{ + gboolean ret; + GtkTreeIter iter; + GtkTreeSelection *selection; + + GString *string = NULL; + + g_return_if_fail (GEDIT_IS_OUTPUT_WINDOW (ow)); + + selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (ow->priv->treeview)); + + ret = gtk_tree_model_get_iter_first (ow->priv->model, &iter); + + while (ret) + { + if (gtk_tree_selection_iter_is_selected (selection, &iter)) + { + gchar *line; + + gtk_tree_model_get (ow->priv->model, &iter, COLUMN_LINES, &line, -1); + + if (string == NULL) + string = g_string_new (line); + else + string = g_string_append (string, line); + + string = g_string_append_c (string, '\n'); + + g_free (line); + } + + ret = gtk_tree_model_iter_next (ow->priv->model, &iter); + } + + if (string != NULL) + { + gchar *text; + + pango_parse_markup (string->str, string->len, 0, NULL, &text, NULL, NULL); + + gtk_clipboard_set_text (gtk_widget_get_clipboard ( + GTK_WIDGET (ow), GDK_SELECTION_CLIPBOARD), + text, + -1); + + g_free (text); + } + + g_string_free (string, TRUE); +} + +static void +close_clicked_callback (GtkWidget *widget, gpointer user_data) +{ + GeditOutputWindow *ow; + + ow = GEDIT_OUTPUT_WINDOW (user_data); + + g_signal_emit (ow, signals [CLOSE_REQUESTED], 0); +} + +static void +clear_clicked_callback (GtkWidget *widget, gpointer user_data) +{ + GeditOutputWindow *ow; + + ow = GEDIT_OUTPUT_WINDOW (user_data); + + gedit_output_window_clear (ow); +} + +static void +copy_clicked_callback (GtkWidget *widget, gpointer user_data) +{ + GeditOutputWindow *ow; + + ow = GEDIT_OUTPUT_WINDOW (user_data); + + gedit_output_window_copy_selection (ow); +} + +static gboolean +gedit_output_window_key_press_event_cb (GtkTreeView *widget, GdkEventKey *event, + GeditOutputWindow *ow) +{ + if (event->keyval == GDK_Delete) + { + gedit_output_window_clear (ow); + return TRUE; + } + + if (event->keyval == 'c') + { + gedit_output_window_copy_selection (ow); + return TRUE; + } + + return FALSE; +} + +static void +gedit_output_window_treeview_selection_changed (GtkTreeSelection *selection, + GeditOutputWindow *output_window) +{ + gboolean selected; + GtkTreeModel *model; + GtkTreeIter iter; + gchar *line; + + g_return_if_fail (output_window != NULL); + g_return_if_fail (selection != NULL); + + selected = (gtk_tree_selection_count_selected_rows (selection) > 0); + + gtk_widget_set_sensitive (output_window->priv->copy_button, selected); + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gtk_tree_model_get (model, &iter, COLUMN_LINES, &line, -1); + g_signal_emit (output_window, signals [SELECTION_CHANGED], 0, line); + } +} + +static void +gedit_output_window_init (GeditOutputWindow *output_window) +{ + GtkSettings *settings; + gint w, h; + GtkWidget *vbox1; + GtkWidget *image; + GtkWidget *hbox2; + GtkWidget *vseparator; + GtkWidget *vbox2; + GtkWidget *scrolledwindow; + GtkTreeViewColumn *column; + GtkCellRenderer *cell; + GtkTreeSelection *selection; + + GList *focusable_widgets = NULL; + + output_window->priv = g_new0 (GeditOutputWindowPrivate, 1); + + output_window->priv->tooltips = gtk_tooltips_new (); + + g_object_ref (G_OBJECT (output_window->priv->tooltips )); + gtk_object_sink (GTK_OBJECT (output_window->priv->tooltips )); + + settings = gtk_widget_get_settings (GTK_WIDGET (output_window)); + + gtk_icon_size_lookup_for_settings (settings, + GTK_ICON_SIZE_SMALL_TOOLBAR, + &w, &h); + + vbox1 = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2); + + /* Create the close button */ + output_window->priv->close_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (vbox1), output_window->priv->close_button, FALSE, FALSE, 0); + gtk_widget_set_size_request (output_window->priv->close_button, w + 2, h + 2); + + gtk_tooltips_set_tip (output_window->priv->tooltips, + output_window->priv->close_button, + _("Close the output window"), + NULL); + + gtk_button_set_relief (GTK_BUTTON (output_window->priv->close_button), GTK_RELIEF_NONE); + + image = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_container_add (GTK_CONTAINER (output_window->priv->close_button), image); + + g_signal_connect (output_window->priv->close_button, + "clicked", + G_CALLBACK (close_clicked_callback), + output_window); + + /* Create the 3 vertical separators */ + hbox2 = gtk_hbox_new (TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (hbox2), 4); + + vseparator = gtk_vseparator_new (); + gtk_box_pack_start (GTK_BOX (hbox2), vseparator, FALSE, FALSE, 0); + + vseparator = gtk_vseparator_new (); + gtk_box_pack_start (GTK_BOX (hbox2), vseparator, FALSE, FALSE, 0); + + vseparator = gtk_vseparator_new (); + gtk_box_pack_start (GTK_BOX (hbox2), vseparator, FALSE, TRUE, 0); + + /* Create the vbox for the copy and clear buttons */ + vbox2 = gtk_vbox_new (TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0); + + /* Create the copy button */ + output_window->priv->copy_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (vbox2), output_window->priv->copy_button, FALSE, FALSE, 0); + gtk_widget_set_size_request (output_window->priv->copy_button, w + 2, h + 2); + + gtk_tooltips_set_tip (output_window->priv->tooltips, + output_window->priv->copy_button, + _("Copy selected lines"), + NULL); + + gtk_button_set_relief (GTK_BUTTON (output_window->priv->copy_button), GTK_RELIEF_NONE); + + image = gtk_image_new_from_stock ("gtk-copy", GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_container_add (GTK_CONTAINER (output_window->priv->copy_button), image); + + g_signal_connect (output_window->priv->copy_button, + "clicked", + G_CALLBACK (copy_clicked_callback), + output_window); + + /* Create the clear button */ + output_window->priv->clear_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (vbox2), output_window->priv->clear_button, FALSE, FALSE, 0); + gtk_widget_set_size_request (output_window->priv->clear_button, w + 2, h + 2); + + gtk_tooltips_set_tip (output_window->priv->tooltips, + output_window->priv->clear_button, + _("Clear the output window"), + NULL); + + gtk_button_set_relief (GTK_BUTTON (output_window->priv->clear_button), GTK_RELIEF_NONE); + + image = gtk_image_new_from_stock ("gtk-clear", GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_container_add (GTK_CONTAINER (output_window->priv->clear_button), image); + + g_signal_connect (output_window->priv->clear_button, + "clicked", + G_CALLBACK (clear_clicked_callback), + output_window); + + gtk_widget_set_sensitive (output_window->priv->copy_button, FALSE); + gtk_widget_set_sensitive (output_window->priv->clear_button, FALSE); + + /* Create the scrolled window */ + scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), + GTK_SHADOW_ETCHED_IN); + + output_window->priv->treeview = gtk_tree_view_new (); + gtk_container_add (GTK_CONTAINER (scrolledwindow), output_window->priv->treeview); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (output_window->priv->treeview), FALSE); + + + /* List */ + output_window->priv->model = GTK_TREE_MODEL ( + gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING)); + + gtk_tree_view_set_model (GTK_TREE_VIEW (output_window->priv->treeview), + output_window->priv->model); + + /* Add the suggestions column */ + cell = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Output Lines"), cell, + "markup", COLUMN_LINES, NULL); + + gtk_tree_view_append_column (GTK_TREE_VIEW (output_window->priv->treeview), column); + + gtk_tree_view_set_search_column (GTK_TREE_VIEW (output_window->priv->treeview), + COLUMN_LINES); + + selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (output_window->priv->treeview)); + + gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); + + gtk_box_pack_end (GTK_BOX (output_window), scrolledwindow, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (output_window), vbox1, FALSE, FALSE, 0); + + gtk_widget_set_size_request (GTK_WIDGET (output_window), 3 * w, 5 * (h + 2)); + + g_signal_connect (G_OBJECT (output_window->priv->treeview), "key_press_event", + G_CALLBACK (gedit_output_window_key_press_event_cb), output_window); + + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (gedit_output_window_treeview_selection_changed), + output_window); + + focusable_widgets = g_list_append (focusable_widgets, output_window->priv->treeview); + focusable_widgets = g_list_append (focusable_widgets, output_window->priv->close_button); + focusable_widgets = g_list_append (focusable_widgets, output_window->priv->copy_button); + focusable_widgets = g_list_append (focusable_widgets, output_window->priv->clear_button); + + gtk_container_set_focus_chain (GTK_CONTAINER (output_window), focusable_widgets); + + g_list_free (focusable_widgets); + +} + +static void +gedit_output_window_finalize (GObject *object) +{ + GeditOutputWindow *ow; + + ow = GEDIT_OUTPUT_WINDOW (object); + + g_object_unref (ow->priv->tooltips); + + if (ow->priv != NULL) + { + g_free (ow->priv); + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gedit_output_window_destroy (GtkObject *object) +{ + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +GtkWidget * +gedit_output_window_new (void) +{ + return gtk_widget_new (GEDIT_TYPE_OUTPUT_WINDOW, NULL); +} + +void +gedit_output_window_clear (GeditOutputWindow *ow) +{ + g_return_if_fail (GEDIT_IS_OUTPUT_WINDOW (ow)); + + gtk_list_store_clear (GTK_LIST_STORE (ow->priv->model)); + + gtk_widget_set_sensitive (ow->priv->clear_button, FALSE); +} + +void +gedit_output_window_append_line (GeditOutputWindow *ow, const gchar *line, gboolean scroll) +{ + GtkListStore *store; + GtkTreeIter iter; + GtkTreePath *path; + + g_return_if_fail (GEDIT_IS_OUTPUT_WINDOW (ow)); + g_return_if_fail (line != NULL); + + store = GTK_LIST_STORE (ow->priv->model); + g_return_if_fail (store != NULL); + + gtk_list_store_append (store, &iter); + + gtk_list_store_set (store, &iter, COLUMN_LINES, line, -1); + + gtk_widget_set_sensitive (ow->priv->clear_button, TRUE); + + if (!scroll) + return; + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter); + g_return_if_fail (path != NULL); + + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (ow->priv->treeview), + path, + NULL, + TRUE, + 0.0, + 0.0); + + gtk_tree_path_free (path); +} + +void +gedit_output_window_prepend_line (GeditOutputWindow *ow, const gchar *line, gboolean scroll) +{ + GtkListStore *store; + GtkTreeIter iter; + GtkTreePath *path; + + g_return_if_fail (GEDIT_IS_OUTPUT_WINDOW (ow)); + g_return_if_fail (line != NULL); + + store = GTK_LIST_STORE (ow->priv->model); + g_return_if_fail (store != NULL); + + gtk_list_store_prepend (store, &iter); + + gtk_list_store_set (store, &iter, COLUMN_LINES, line, -1); + + gtk_widget_set_sensitive (ow->priv->clear_button, TRUE); + + if (!scroll) + return; + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter); + g_return_if_fail (path != NULL); + + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (ow->priv->treeview), + path, + NULL, + TRUE, + 0.0, + 0.0); + + gtk_tree_path_free (path); + +} + + + +void +gedit_output_window_set_select_multiple (GeditOutputWindow *ow, const GtkSelectionMode type) +{ + GtkTreeSelection *selection; + + g_return_if_fail (GEDIT_IS_OUTPUT_WINDOW (ow)); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ow->priv->treeview)); + gtk_tree_selection_set_mode (selection, type); +} Index: gtk/gedit-output-window.h =================================================================== RCS file: gtk/gedit-output-window.h diff -N gtk/gedit-output-window.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gtk/gedit-output-window.h 3 Sep 2005 23:47:03 -0000 @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * gedit-output-window.h + * This file is part of gedit + * + * Copyright (C) 2002 Paolo Maggi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +/* + * Modified by the gedit Team, 2002. See the AUTHORS file for a + * list of people on the gedit Team. + * See the ChangeLog files for a list of changes. + */ + +#ifndef __GEDIT_OUTPUT_WINDOW_H__ +#define __GEDIT_OUTPUT_WINDOW_H__ + +#include + +#define GEDIT_TYPE_OUTPUT_WINDOW (gedit_output_window_get_type ()) +#define GEDIT_OUTPUT_WINDOW(obj) (GTK_CHECK_CAST ((obj), GEDIT_TYPE_OUTPUT_WINDOW, GeditOutputWindow)) +#define GEDIT_OUTPUT_WINDOW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GEDIT_TYPE_OUTPUT_WINDOW, GeditOutputWindowClass)) +#define GEDIT_IS_OUTPUT_WINDOW(obj) (GTK_CHECK_TYPE ((obj), GEDIT_TYPE_OUTPUT_WINDOW)) +#define GEDIT_IS_OUTPUT_WINDOW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GEDIT_TYPE_OUTPUT_WINDOW)) +#define GEDIT_OUTPUT_WINDOW_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GEDIT_TYPE_OUTPUT_WINDOW, GeditOutputWindowClass)) + + +typedef struct _GeditOutputWindow GeditOutputWindow; +typedef struct _GeditOutputWindowClass GeditOutputWindowClass; + +typedef struct _GeditOutputWindowPrivate GeditOutputWindowPrivate; + +struct _GeditOutputWindow +{ + GtkHBox box; + + GeditOutputWindowPrivate *priv; +}; + +struct _GeditOutputWindowClass +{ + GtkHBoxClass parent_class; + + void (*close_requested) (GeditOutputWindow *ow); + void (*selection_changed) (GeditOutputWindow *ow, gchar *line); +}; + + +GtkType gedit_output_window_get_type (void) G_GNUC_CONST; + +GtkWidget *gedit_output_window_new (void); + +void gedit_output_window_clear (GeditOutputWindow *ow); + +void gedit_output_window_append_line (GeditOutputWindow *ow, + const gchar *line, + gboolean scroll); + +void gedit_output_window_prepend_line (GeditOutputWindow *ow, + const gchar *line, + gboolean scroll); + +void gedit_output_window_set_select_multiple (GeditOutputWindow *ow, + const GtkSelectionMode type); + +#endif /* __GEDIT_OUTPUT_WINDOW_H__ */ + Index: gtk/gtkfilechooserdefault.c =================================================================== RCS file: /cvs/gnome/gtk+/gtk/gtkfilechooserdefault.c,v retrieving revision 1.282.2.1 diff -u -u -r1.282.2.1 gtkfilechooserdefault.c --- gtk/gtkfilechooserdefault.c 2 Sep 2005 13:31:45 -0000 1.282.2.1 +++ gtk/gtkfilechooserdefault.c 3 Sep 2005 23:47:04 -0000 @@ -75,6 +75,8 @@ #include "gtkalias.h" +#include + #include #include #include @@ -83,7 +85,7 @@ /* Profiling stuff */ -#define PROFILE_FILE_CHOOSER +#undef PROFILE_FILE_CHOOSER #ifdef PROFILE_FILE_CHOOSER #ifdef HAVE_UNISTD_H @@ -121,7 +123,7 @@ else str = g_strdup_printf ("MARK: %*c %s %s %s", profile_indent - 1, ' ', func, msg1 ? msg1 : "", msg2 ? msg2 : ""); - access (str, F_OK); + g_print ("%d %s\n", time (NULL), str); g_free (str); if (indent > 0) @@ -139,6 +141,10 @@ +#include "gedit-output-window.h" + +static BeagleClient *client = NULL; + typedef struct _GtkFileChooserDefaultClass GtkFileChooserDefaultClass; #define GTK_FILE_CHOOSER_DEFAULT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_CHOOSER_DEFAULT, GtkFileChooserDefaultClass)) @@ -192,6 +198,8 @@ GtkFileSystemModel *browse_files_model; + GtkWidget *beagle_output; + GtkWidget *filter_combo_hbox; GtkWidget *filter_combo; GtkWidget *preview_box; @@ -264,9 +272,12 @@ #endif }; + + /* Signal IDs */ enum { LOCATION_POPUP, + SEARCH_POPUP, UP_FOLDER, DOWN_FOLDER, HOME_FOLDER, @@ -428,6 +439,10 @@ static void down_folder_handler (GtkFileChooserDefault *impl); static void home_folder_handler (GtkFileChooserDefault *impl); static void update_appearance (GtkFileChooserDefault *impl); +static void search_popup_handler (GtkFileChooserDefault *impl); +static void close_output_window (GtkWidget *widget, gpointer user_data); +static void selected_output_window (GtkWidget *widget, gchar *location, gpointer user_data); + static void set_current_filter (GtkFileChooserDefault *impl, GtkFileFilter *filter); @@ -651,6 +666,15 @@ NULL, NULL, _gtk_marshal_VOID__VOID, G_TYPE_NONE, 0); + signals[SEARCH_POPUP] = + _gtk_binding_signal_new ("search-popup", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (search_popup_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + binding_set = gtk_binding_set_by_class (class); @@ -665,6 +689,11 @@ 1, G_TYPE_STRING, "/"); gtk_binding_entry_add_signal (binding_set, + GDK_s, GDK_CONTROL_MASK, + "search-popup", + 0); + + gtk_binding_entry_add_signal (binding_set, GDK_Up, GDK_MOD1_MASK, "up-folder", 0); @@ -917,6 +946,11 @@ g_object_unref (impl->tooltips); + if (client != NULL) { + g_object_unref (client); + client = NULL; + } + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -3885,7 +3919,7 @@ widget = create_file_list (impl); gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); - /* Preview */ + /* Preview */ impl->preview_box = gtk_vbox_new (FALSE, 12); gtk_box_pack_start (GTK_BOX (hbox), impl->preview_box, FALSE, FALSE, 0); @@ -4065,6 +4099,17 @@ g_object_unref (size_group); + impl->beagle_output = gedit_output_window_new (); + gedit_output_window_set_select_multiple (GEDIT_OUTPUT_WINDOW (impl->beagle_output), + GTK_SELECTION_SINGLE); + gtk_box_pack_start (GTK_BOX (vbox), impl->beagle_output, TRUE, TRUE, 0); + + g_signal_connect (G_OBJECT (impl->beagle_output), "close_requested", + G_CALLBACK (close_output_window), impl); + + g_signal_connect (G_OBJECT (impl->beagle_output), "selection_changed", + G_CALLBACK (selected_output_window), impl); + return vbox; } @@ -7317,6 +7362,281 @@ } gtk_widget_destroy (dialog); +} + +static void +beagle_hits_added_cb (BeagleQuery *query, + BeagleHitsAddedResponse *response, + GeditOutputWindow *output_window) +{ + GSList *hits, *l; + + hits = beagle_hits_added_response_get_hits (response); + + l = hits; + while (l) { + BeagleHit *hit = BEAGLE_HIT (l->data); + + if (strcmp (beagle_hit_get_type (hit), "File") == 0) { + gtk_widget_show_all (GTK_WIDGET (output_window)); + gedit_output_window_prepend_line (output_window, g_strdup (beagle_hit_get_uri (hit) + strlen ("file://")), FALSE); + } + l = l->next; + } + + //g_slist_free (hits); +} +static void +beagle_finished_cb (BeagleQuery *query, + BeagleFinishedResponse *response, + BeagleClient *client) +{ + /* FIXME: Do I need this? Read libbeagle docs! + * g_object_unref (response); + * g_object_unref (query); */ + +} + + +static gboolean +search_from_entry (GtkFileChooserDefault *impl, + GtkWindow *parent, + GtkEntry *entry) +{ + BeagleQuery *query; + + gedit_output_window_clear (GEDIT_OUTPUT_WINDOW (impl->beagle_output)); + + if (client == NULL) { + client = beagle_client_new (NULL); + } + + query = beagle_query_new (); + + beagle_query_add_text (query, gtk_entry_get_text (entry)); + + g_signal_connect (query, "hits-added", + G_CALLBACK (beagle_hits_added_cb), + GEDIT_OUTPUT_WINDOW (impl->beagle_output)); + + g_signal_connect (query, "finished", + G_CALLBACK (beagle_finished_cb), + client); + + + beagle_client_send_request_async (client, BEAGLE_REQUEST (query), + NULL); + + return TRUE; + +} + +static void +search_popup_handler (GtkFileChooserDefault *impl) +{ + GtkWidget *dialog; + GtkWindow *toplevel; + GtkWidget *hbox; + GtkWidget *label; + GtkWidget *entry; + gboolean refocus; + const char *title; + const char *accept_stock; + + /* Create dialog */ + + toplevel = get_toplevel (GTK_WIDGET (impl)); + + if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN) + { + title = _("Search file"); + accept_stock = GTK_STOCK_OPEN; + } + else + { + return; + } + + dialog = gtk_dialog_new_with_buttons (title, + toplevel, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + accept_stock, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_default_size (GTK_WINDOW (dialog), 300, -1); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); + + hbox = gtk_hbox_new (FALSE, 12); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + + label = gtk_label_new_with_mnemonic (_("_Search:")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + + entry = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); + + /* Run */ + + gtk_widget_show_all (dialog); + + refocus = TRUE; + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + if (search_from_entry (impl, GTK_WINDOW (dialog), GTK_ENTRY (entry))) + { + gtk_widget_grab_focus (impl->browse_files_tree_view); + refocus = FALSE; + } + } + + if (refocus) + { + GtkWindow *toplevel; + + toplevel = get_toplevel (GTK_WIDGET (impl)); + if (toplevel && toplevel->focus_widget) + gtk_widget_grab_focus (toplevel->focus_widget); + } + + gtk_widget_destroy (dialog); +} + + +static void +close_output_window (GtkWidget *widget, gpointer user_data) +{ + gedit_output_window_clear (GEDIT_OUTPUT_WINDOW (widget)); + gtk_widget_hide (widget); +} + + +static void +selected_output_window (GtkWidget *widget, gchar *location, gpointer user_data) +{ + char *folder_name; + char *file_name; + GtkFilePath *folder_path; + GtkFileChooserDefault *impl = (GtkFileChooserDefault*) user_data; + + folder_name = g_path_get_dirname (location); + file_name = g_path_get_basename (location); + folder_path = gtk_file_path_new_dup (folder_name); + + if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN && !folder_path) + { + error_message (impl, _("Cannot change to the folder you specified"), _("Invalid path.")); + g_free (folder_name); + g_free (file_name); + g_free (folder_path); + return; + } + + if (file_name[0] == '\0') + { + g_free (folder_name); + g_free (file_name); + g_free (folder_path); + change_folder_and_display_error (impl, folder_path); + return; + } + else + { + GtkFileFolder *folder = NULL; + GtkFilePath *subfolder_path = NULL; + GtkFileInfo *info = NULL; + GError *error; + gboolean result; + + result = FALSE; + + /* If the file part is non-empty, we need to figure out if it refers to a + * folder within folder. We could optimize the case here where the folder + * is already loaded for one of our tree models. + */ + + error = NULL; + folder = gtk_file_system_get_folder (impl->file_system, folder_path, GTK_FILE_INFO_IS_FOLDER, &error); + + if (!folder) + { + error_getting_info_dialog (impl, folder_path, error); + goto out; + } + + error = NULL; + subfolder_path = gtk_file_system_make_path (impl->file_system, folder_path, file_name, &error); + + if (!subfolder_path) + { + char *msg; + char *uri; + + uri = gtk_file_system_path_to_uri (impl->file_system, folder_path); + msg = g_strdup_printf (_("Could not build file name from '%s' and '%s':\n%s"), + uri, file_name, + error->message); + error_message (impl, msg, NULL); + g_free (uri); + g_free (msg); + goto out; + } + + error = NULL; + info = gtk_file_folder_get_info (folder, subfolder_path, &error); + + if (!info) + { + if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE + || impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) + { + if (!change_folder_and_display_error (impl, folder_path)) + goto out; + + gtk_file_chooser_default_set_current_name (GTK_FILE_CHOOSER (impl), file_name); + } + else + error_getting_info_dialog (impl, subfolder_path, error); + + goto out; + } + + if (gtk_file_info_get_is_folder (info)) + result = change_folder_and_display_error (impl, subfolder_path); + else + { + GError *error; + + error = NULL; + result = _gtk_file_chooser_select_path (GTK_FILE_CHOOSER (impl), subfolder_path, &error); + if (!result) + error_dialog (impl, + _("Could not select %s:\n%s"), + subfolder_path, error); + } + + out: + + if (folder) + g_object_unref (folder); + + gtk_file_path_free (subfolder_path); + + if (info) + gtk_file_info_free (info); + + g_free (folder_name); + g_free (file_name); + g_free (folder_path); + return; + } + + g_assert_not_reached (); } /* Handler for the "up-folder" keybinding signal */