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 */