summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Hertzfeld <andy@src.gnome.org>2001-03-26 08:48:32 +0000
committerAndy Hertzfeld <andy@src.gnome.org>2001-03-26 08:48:32 +0000
commitfd7d0eb0264565895ce9335e38dc8c6b7f010e0f (patch)
tree733276943123217e1c3685436b94f2a9d80cbe4b
parentff541f0a3d087125a2c30fcb4697de3f8f2b5fcd (diff)
downloadnautilus-fd7d0eb0264565895ce9335e38dc8c6b7f010e0f.tar.gz
implemented indicator in tab for whether notes are present or not by
implemented indicator in tab for whether notes are present or not by implementing a framework for sidebar views to specify an indicator tab image, using the bonobo property bag interface; not quite finished yet.
-rw-r--r--ChangeLog31
-rw-r--r--components/notes/nautilus-notes.c100
-rw-r--r--libnautilus-extensions/nautilus-canvas-note-item.c2
-rw-r--r--libnautilus-extensions/nautilus-icon-canvas-item.c12
-rw-r--r--libnautilus-private/nautilus-canvas-note-item.c2
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.c12
-rw-r--r--src/nautilus-information-panel.c21
-rw-r--r--src/nautilus-sidebar-tabs.c211
-rw-r--r--src/nautilus-sidebar-tabs.h6
-rw-r--r--src/nautilus-sidebar.c21
-rw-r--r--src/nautilus-view-frame.c18
-rw-r--r--src/nautilus-view-frame.h3
12 files changed, 412 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index 4636bfd15..a83f4f0cf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2001-03-26 Andy Hertzfeld <andy@eazel.com>
+
+ implemented indicator in tab for whether notes are present or not by
+ implementing a framework for sidebar views to specify an indicator
+ tab image, using the bonobo property bag interface; not quite
+ finished yet.
+
+ * components/notes/nautilus-notes.c: (notes_get_indicator_image),
+ (get_bonobo_properties), (set_bonobo_properties),
+ (finish_loading_note), (notes_load_metainfo),
+ (notes_save_metainfo), (do_destroy), (make_notes_view):
+ * libnautilus-extensions/nautilus-canvas-note-item.c:
+ (nautilus_canvas_note_item_render):
+ * libnautilus-extensions/nautilus-icon-canvas-item.c:
+ (create_annotation):
+ * src/nautilus-sidebar-tabs.c: (tab_item_destroy),
+ (draw_one_tab_themed), (draw_or_layout_all_tabs),
+ (nautilus_sidebar_tabs_expose),
+ (nautilus_sidebar_tabs_update_tab_item), (get_tab_item_from_view),
+ (nautilus_sidebar_tabs_update_all_indicators),
+ (nautilus_sidebar_tabs_update_indicator),
+ (tab_indicator_changed_callback),
+ (nautilus_sidebar_tabs_connect_view),
+ (nautilus_sidebar_tabs_add_view):
+ * src/nautilus-sidebar-tabs.h:
+ * src/nautilus-sidebar.c: (view_loaded_callback),
+ (nautilus_sidebar_add_panel):
+ * src/nautilus-view-frame.c: (nautilus_view_frame_get_view),
+ (nautilus_view_frame_get_control):
+ * src/nautilus-view-frame.h:
+
2001-03-23 Andy Hertzfeld <andy@eazel.com>
* components/rss-control/nautilus-rss-control.c:
diff --git a/components/notes/nautilus-notes.c b/components/notes/nautilus-notes.c
index 06564113b..d47823fc6 100644
--- a/components/notes/nautilus-notes.c
+++ b/components/notes/nautilus-notes.c
@@ -56,20 +56,79 @@
typedef struct {
NautilusView *view;
+ BonoboPropertyBag *property_bag;
GtkWidget *note_text_field;
+ gboolean has_text;
char *uri;
NautilusFile *file;
} Notes;
static int notes_object_count = 0;
+/* property bag getting and setting routines */
+enum {
+ TAB_IMAGE,
+} MyArgs;
+
+static char*
+notes_get_indicator_image (Notes *notes)
+{
+ if (notes->has_text) {
+ return g_strdup ("bullet.png");
+ } else {
+ return g_strdup ("empty.png");
+ }
+ return NULL;
+}
+
+static void
+get_bonobo_properties (BonoboPropertyBag *bag,
+ BonoboArg *arg,
+ guint arg_id,
+ CORBA_Environment *ev,
+ gpointer user_data)
+{
+ char *indicator_image;
+ Notes *notes;
+ notes = (Notes*) user_data;
+
+ switch (arg_id) {
+
+ case TAB_IMAGE:
+ {
+ /* if there is a note, return the name of the indicator image,
+ otherwise, return NULL */
+
+ indicator_image = notes_get_indicator_image (notes);
+ BONOBO_ARG_SET_STRING (arg, indicator_image);
+ g_free (indicator_image);
+ break;
+ }
+
+ default:
+ g_warning ("Unhandled arg %d", arg_id);
+ break;
+ }
+}
+
+static void
+set_bonobo_properties (BonoboPropertyBag *bag,
+ const BonoboArg *arg,
+ guint arg_id,
+ CORBA_Environment *ev,
+ gpointer user_data)
+{
+ g_warning ("Cant set note property %d", arg_id);
+}
+
static void
finish_loading_note (NautilusFile *file,
gpointer callback_data)
{
Notes *notes;
int position;
- char *notes_text;
+ char *notes_text, *tab_image;
+ BonoboArg *tab_image_arg;
g_assert (NAUTILUS_IS_FILE (file));
@@ -78,12 +137,31 @@ finish_loading_note (NautilusFile *file,
notes_text = nautilus_file_get_metadata (file, NAUTILUS_METADATA_KEY_ANNOTATION, "");
position = 0;
- gtk_editable_insert_text (GTK_EDITABLE (notes->note_text_field),
+ if (notes_text != NULL && strlen (notes_text) > 0) {
+ gtk_editable_insert_text (GTK_EDITABLE (notes->note_text_field),
notes_text,
strlen (notes_text),
&position);
- g_free (notes_text);
+ g_free (notes_text);
+ notes->has_text = TRUE;
+ } else {
+ notes->has_text = FALSE;
+ }
+
+/* notify listeners if has_text status has changed */
+ tab_image = notes_get_indicator_image (notes);
+
+ g_message ("has text is %d, tab image is %s", notes->has_text, tab_image);
+
+ tab_image_arg = bonobo_arg_new (BONOBO_ARG_STRING);
+ BONOBO_ARG_SET_STRING (tab_image_arg, tab_image);
+
+ bonobo_property_bag_notify_listeners (notes->property_bag, "tab_image", tab_image_arg, NULL);
+
+ bonobo_arg_release (tab_image_arg);
+ g_free (tab_image);
+
/* FIXME bugzilla.eazel.com 4436:
* Undo not working in notes-view.
*/
@@ -106,6 +184,8 @@ notes_load_metainfo (Notes *notes)
gtk_editable_delete_text (GTK_EDITABLE (notes->note_text_field), 0, -1);
+ notes->has_text = FALSE;
+
done_with_file (notes);
notes->file = nautilus_file_get (notes->uri);
if (notes->file == NULL) {
@@ -131,6 +211,7 @@ notes_save_metainfo (Notes *notes)
}
notes_text = gtk_editable_get_chars (GTK_EDITABLE (notes->note_text_field), 0 , -1);
+ notes->has_text = notes_text != NULL;
nautilus_file_set_metadata (notes->file, NAUTILUS_METADATA_KEY_ANNOTATION, NULL, notes_text);
g_free (notes_text);
}
@@ -173,6 +254,10 @@ do_destroy (GtkObject *obj, Notes *notes)
g_free (notes->uri);
g_free (notes);
+ if (notes->property_bag) {
+ bonobo_object_unref (BONOBO_OBJECT (notes->property_bag));
+ }
+
notes_object_count--;
if (notes_object_count <= 0) {
gtk_main_quit();
@@ -216,6 +301,15 @@ make_notes_view (BonoboGenericFactory *Factory, const char *goad_id, gpointer cl
notes->view = nautilus_view_new (vbox);
gtk_signal_connect (GTK_OBJECT (notes->view), "destroy", do_destroy, notes);
+ /* allocate a property bag to reflect the TAB_IMAGE property */
+
+ notes->property_bag = bonobo_property_bag_new (get_bonobo_properties, set_bonobo_properties, notes);
+ bonobo_control_set_properties (nautilus_view_get_bonobo_control (notes->view), notes->property_bag);
+
+ bonobo_property_bag_add (notes->property_bag, "tab_image", TAB_IMAGE, BONOBO_ARG_STRING, NULL,
+ "image indicating that a note is present", 0);
+
+ /* increment the count */
notes_object_count++;
/* handle events */
diff --git a/libnautilus-extensions/nautilus-canvas-note-item.c b/libnautilus-extensions/nautilus-canvas-note-item.c
index b466e0bb7..e03f90802 100644
--- a/libnautilus-extensions/nautilus-canvas-note-item.c
+++ b/libnautilus-extensions/nautilus-canvas-note-item.c
@@ -762,6 +762,8 @@ nautilus_canvas_note_item_render (GnomeCanvasItem *item,
note_item = NAUTILUS_CANVAS_NOTE_ITEM (item);
+ g_message ("in note item render, %f %f %f %f", item->x1, item->y1, item->x2, item->y2);
+
if (note_item->fill_svp != NULL) {
gnome_canvas_render_svp (buf, note_item->fill_svp, note_item->fill_color);
}
diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.c b/libnautilus-extensions/nautilus-icon-canvas-item.c
index 2353e4f1b..c64e3be17 100644
--- a/libnautilus-extensions/nautilus-icon-canvas-item.c
+++ b/libnautilus-extensions/nautilus-icon-canvas-item.c
@@ -1875,12 +1875,16 @@ create_annotation (NautilusIconCanvasItem *icon_item, int emblem_index)
canvas = GNOME_CANVAS_ITEM (icon_item)->canvas;
note_text = nautilus_icon_container_get_note_text (NAUTILUS_ICON_CONTAINER (canvas), icon_item->user_data, emblem_index);
-
+
+ g_message ("creating annotation, text is %s", note_text);
+
icon_item->details->annotation = gnome_canvas_item_new
(gnome_canvas_root (canvas),
nautilus_canvas_note_item_get_type (),
"x1", left,
"y1", top,
+ "x2", left + 100,
+ "y2", top + 100,
"fill_color_rgba", fill_color,
"outline_color_rgba", outline_color,
"note_text", note_text,
@@ -1888,7 +1892,13 @@ create_annotation (NautilusIconCanvasItem *icon_item, int emblem_index)
NULL);
g_free (note_text);
+
+ gnome_canvas_item_show (icon_item->details->annotation);
gnome_canvas_item_raise_to_top (icon_item->details->annotation);
+ gnome_canvas_item_request_update (icon_item->details->annotation);
+
+ gnome_canvas_request_redraw (canvas, icon_item->details->annotation->x1, icon_item->details->annotation->y1, icon_item->details->annotation->x2, icon_item->details->annotation->y2);
+ g_message ("redrawing left %f, top %f, right %f, bottom %f", icon_item->details->annotation->x1, icon_item->details->annotation->y1, icon_item->details->annotation->x2, icon_item->details->annotation->y2);
}
/* remove any annotation that's showing */
diff --git a/libnautilus-private/nautilus-canvas-note-item.c b/libnautilus-private/nautilus-canvas-note-item.c
index b466e0bb7..e03f90802 100644
--- a/libnautilus-private/nautilus-canvas-note-item.c
+++ b/libnautilus-private/nautilus-canvas-note-item.c
@@ -762,6 +762,8 @@ nautilus_canvas_note_item_render (GnomeCanvasItem *item,
note_item = NAUTILUS_CANVAS_NOTE_ITEM (item);
+ g_message ("in note item render, %f %f %f %f", item->x1, item->y1, item->x2, item->y2);
+
if (note_item->fill_svp != NULL) {
gnome_canvas_render_svp (buf, note_item->fill_svp, note_item->fill_color);
}
diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c
index 2353e4f1b..c64e3be17 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.c
+++ b/libnautilus-private/nautilus-icon-canvas-item.c
@@ -1875,12 +1875,16 @@ create_annotation (NautilusIconCanvasItem *icon_item, int emblem_index)
canvas = GNOME_CANVAS_ITEM (icon_item)->canvas;
note_text = nautilus_icon_container_get_note_text (NAUTILUS_ICON_CONTAINER (canvas), icon_item->user_data, emblem_index);
-
+
+ g_message ("creating annotation, text is %s", note_text);
+
icon_item->details->annotation = gnome_canvas_item_new
(gnome_canvas_root (canvas),
nautilus_canvas_note_item_get_type (),
"x1", left,
"y1", top,
+ "x2", left + 100,
+ "y2", top + 100,
"fill_color_rgba", fill_color,
"outline_color_rgba", outline_color,
"note_text", note_text,
@@ -1888,7 +1892,13 @@ create_annotation (NautilusIconCanvasItem *icon_item, int emblem_index)
NULL);
g_free (note_text);
+
+ gnome_canvas_item_show (icon_item->details->annotation);
gnome_canvas_item_raise_to_top (icon_item->details->annotation);
+ gnome_canvas_item_request_update (icon_item->details->annotation);
+
+ gnome_canvas_request_redraw (canvas, icon_item->details->annotation->x1, icon_item->details->annotation->y1, icon_item->details->annotation->x2, icon_item->details->annotation->y2);
+ g_message ("redrawing left %f, top %f, right %f, bottom %f", icon_item->details->annotation->x1, icon_item->details->annotation->y1, icon_item->details->annotation->x2, icon_item->details->annotation->y2);
}
/* remove any annotation that's showing */
diff --git a/src/nautilus-information-panel.c b/src/nautilus-information-panel.c
index 51cf9dc82..c54579b90 100644
--- a/src/nautilus-information-panel.c
+++ b/src/nautilus-information-panel.c
@@ -33,12 +33,14 @@
#include "nautilus-link-set-window.h"
#include "nautilus-sidebar-tabs.h"
#include "nautilus-sidebar-title.h"
+
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gnome-xml/parser.h>
#include <gtk/gtkcheckmenuitem.h>
#include <gtk/gtkdnd.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtknotebook.h>
+#include <gtk/gtksignal.h>
#include <libgnome/gnome-i18n.h>
#include <libgnomeui/gnome-uidefs.h>
#include <libgnomevfs/gnome-vfs-application-registry.h>
@@ -67,6 +69,7 @@
#include <libnautilus-extensions/nautilus-trash-monitor.h>
#include <libnautilus-extensions/nautilus-view-identifier.h>
#include <liboaf/liboaf.h>
+
#include <math.h>
struct NautilusSidebarDetails {
@@ -819,6 +822,15 @@ nautilus_sidebar_drag_data_received (GtkWidget *widget, GdkDragContext *context,
}
}
+static void
+view_loaded_callback (NautilusViewFrame *view_frame, gpointer user_data)
+{
+ NautilusSidebar *sidebar;
+
+ sidebar = NAUTILUS_SIDEBAR (user_data);
+ nautilus_sidebar_tabs_connect_view (sidebar->details->sidebar_tabs, GTK_WIDGET (view_frame));
+}
+
/* add a new panel to the sidebar */
void
nautilus_sidebar_add_panel (NautilusSidebar *sidebar, NautilusViewFrame *panel)
@@ -835,7 +847,9 @@ nautilus_sidebar_add_panel (NautilusSidebar *sidebar, NautilusViewFrame *panel)
label = gtk_label_new (description);
gtk_widget_show (label);
-
+
+ gtk_signal_connect (GTK_OBJECT (panel), "view_loaded", view_loaded_callback, sidebar);
+
gtk_notebook_append_page (GTK_NOTEBOOK (sidebar->details->notebook),
GTK_WIDGET (panel), label);
page_num = gtk_notebook_page_num (GTK_NOTEBOOK (sidebar->details->notebook),
@@ -844,12 +858,12 @@ nautilus_sidebar_add_panel (NautilusSidebar *sidebar, NautilusViewFrame *panel)
/* tell the index tabs about it */
nautilus_sidebar_tabs_add_view (sidebar->details->sidebar_tabs,
_(description), GTK_WIDGET (panel), page_num);
-
- g_free (description);
+ g_free (description);
gtk_widget_show (GTK_WIDGET (panel));
}
+
/* remove the passed-in panel from the sidebar */
void
nautilus_sidebar_remove_panel (NautilusSidebar *sidebar,
@@ -1524,7 +1538,6 @@ background_metadata_changed_callback (NautilusSidebar *sidebar)
}
/* here is the key routine that populates the sidebar with the appropriate information when the uri changes */
-
void
nautilus_sidebar_set_uri (NautilusSidebar *sidebar,
const char* new_uri,
diff --git a/src/nautilus-sidebar-tabs.c b/src/nautilus-sidebar-tabs.c
index 121ef4a4e..6fe14873c 100644
--- a/src/nautilus-sidebar-tabs.c
+++ b/src/nautilus-sidebar-tabs.c
@@ -25,9 +25,15 @@
#include <config.h>
#include "nautilus-sidebar-tabs.h"
+#include <bonobo/bonobo-event-source.h>
+#include <bonobo/bonobo-listener.h>
+#include <bonobo/bonobo-ui-util.h>
+#include <bonobo/bonobo-exception.h>
+
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-util.h>
+#include <libnautilus/nautilus-view.h>
#include <libnautilus-extensions/nautilus-gdk-extensions.h>
#include <libnautilus-extensions/nautilus-gdk-pixbuf-extensions.h>
#include <libnautilus-extensions/nautilus-glib-extensions.h>
@@ -38,6 +44,9 @@
#include <libnautilus-extensions/nautilus-scalable-font.h>
#include <libnautilus-extensions/nautilus-string.h>
#include <libnautilus-extensions/nautilus-theme.h>
+
+#include "nautilus-view-frame.h"
+
#include <math.h>
#include <stdio.h>
#include <string.h>
@@ -72,7 +81,10 @@ typedef struct {
gboolean visible;
gboolean prelit;
char *tab_text;
+ char *indicator_pixbuf_name;
+ GdkPixbuf *indicator_pixbuf;
int notebook_page;
+ Bonobo_EventSource_ListenerId listener_id;
GtkWidget *tab_view;
GdkRectangle tab_rect;
} TabItem;
@@ -311,7 +323,30 @@ nautilus_sidebar_tabs_new (void)
static void
tab_item_destroy (TabItem *item)
{
+ CORBA_Environment ev;
+ Bonobo_PropertyBag property_bag;
+ Bonobo_Control control;
+
g_free (item->tab_text);
+ g_free (item->indicator_pixbuf_name);
+
+ if (item->indicator_pixbuf != NULL) {
+ gdk_pixbuf_unref (item->indicator_pixbuf);
+ }
+
+ if (item->listener_id != 0) {
+ CORBA_exception_init (&ev);
+ control = nautilus_view_frame_get_control (NAUTILUS_VIEW_FRAME (item->tab_view));
+ property_bag = Bonobo_Control_getProperties (control, &ev);
+ if (!BONOBO_EX (&ev) && property_bag != CORBA_OBJECT_NIL) {
+ bonobo_event_source_client_remove_listener
+ (property_bag,
+ item->listener_id,
+ &ev);
+ bonobo_object_release_unref (property_bag, &ev);
+ }
+
+ }
g_free (item);
}
@@ -665,7 +700,7 @@ draw_tab_piece_aa (NautilusSidebarTabs *sidebar_tabs, GdkPixbuf *dest_pixbuf, in
draw the right edge of the tab, as we don't have enough info about the next tab
to do it properly at this time. We draw into an offscreen pixbuf so we can get nice anti-aliased text */
static int
-draw_one_tab_themed (NautilusSidebarTabs *sidebar_tabs, GdkPixbuf *tab_pixbuf,
+draw_one_tab_themed (NautilusSidebarTabs *sidebar_tabs, GdkPixbuf *tab_pixbuf, GdkPixbuf *indicator_pixbuf,
char *tab_name, int x, int y, gboolean prelight_flag,
gboolean first_flag, gboolean prev_invisible, int text_h_offset,
GdkRectangle *tab_rect)
@@ -676,10 +711,11 @@ draw_one_tab_themed (NautilusSidebarTabs *sidebar_tabs, GdkPixbuf *tab_pixbuf,
int current_pos, right_edge_pos;
int text_x_pos, left_width;
int highlight_offset;
- int text_x;
- int text_y;
-
+ int text_x, text_y;
+ int indicator_width, indicator_height;
+
left_width = 0;
+ indicator_width = 0;
widget = GTK_WIDGET (sidebar_tabs);
highlight_offset = prelight_flag && !sidebar_tabs->details->title_mode ? TAB_PRELIGHT_LEFT : 0;
@@ -721,6 +757,22 @@ draw_one_tab_themed (NautilusSidebarTabs *sidebar_tabs, GdkPixbuf *tab_pixbuf,
/* make sure we can at least draw some of it */
if (text_x < gdk_pixbuf_get_width (tab_pixbuf)) {
+
+ if (indicator_pixbuf) {
+ indicator_width = gdk_pixbuf_get_height (indicator_pixbuf);
+ indicator_height = gdk_pixbuf_get_height (indicator_pixbuf);
+
+ gdk_pixbuf_copy_area (indicator_pixbuf,
+ 0, 0,
+ indicator_width, indicator_height,
+ tab_pixbuf,
+ text_x, text_x);
+
+ text_x += gdk_pixbuf_get_width (indicator_pixbuf) + 2;
+ } else {
+ indicator_width = 0;
+ }
+
nautilus_scalable_font_draw_text (sidebar_tabs->details->tab_font, tab_pixbuf,
text_x, text_y,
NULL,
@@ -744,12 +796,12 @@ draw_one_tab_themed (NautilusSidebarTabs *sidebar_tabs, GdkPixbuf *tab_pixbuf,
if (tab_rect) {
tab_rect->x = x;
tab_rect->y = y;
- tab_rect->width = current_pos - x;
+ tab_rect->width = current_pos - x + indicator_width;
tab_rect->height = sidebar_tabs->details->tab_height;
}
/* return the total tab width */
- tab_width = left_width + name_dimensions.width;
+ tab_width = left_width + name_dimensions.width + indicator_width;
return tab_width;
}
@@ -952,7 +1004,7 @@ draw_or_layout_all_tabs (NautilusSidebarTabs *sidebar_tabs, gboolean layout_only
prev_invisible = prev_item && !prev_item->visible;
if (is_themed) {
g_assert (tab_pixbuf != NULL);
- draw_one_tab_themed (sidebar_tabs, tab_pixbuf, this_item->tab_text, x_pos, y_pos,
+ draw_one_tab_themed (sidebar_tabs, tab_pixbuf, this_item->indicator_pixbuf, this_item->tab_text, x_pos, y_pos,
this_item->prelit, first_flag, prev_invisible,
text_h_offset, &this_item->tab_rect);
} else {
@@ -1173,7 +1225,7 @@ nautilus_sidebar_tabs_expose (GtkWidget *widget, GdkEventExpose *event)
tab_height = gdk_pixbuf_get_height (sidebar_tabs->details->tab_piece_images[0]);
pixbuf = allocate_cleared_pixbuf (widget->allocation.width, tab_height);
- tab_width = draw_one_tab_themed (sidebar_tabs, pixbuf, sidebar_tabs->details->title, 0, 0,
+ tab_width = draw_one_tab_themed (sidebar_tabs, pixbuf, NULL, sidebar_tabs->details->title, 0, 0,
sidebar_tabs->details->title_prelit, TRUE, FALSE, text_offset, &sidebar_tabs->details->title_rect);
/* draw the right edge */
draw_tab_piece_aa (sidebar_tabs, pixbuf, tab_width, 0, -1,
@@ -1201,17 +1253,146 @@ nautilus_sidebar_tabs_expose (GtkWidget *widget, GdkEventExpose *event)
draw_or_layout_all_tabs (sidebar_tabs, FALSE);
}
}
-
+
return FALSE;
}
-/* add a new tab entry, return TRUE if we succeed */
+static void
+nautilus_sidebar_tabs_update_tab_item (NautilusSidebarTabs *sidebar_tabs, TabItem *tab_item)
+{
+ CORBA_Environment ev;
+ Bonobo_Control control;
+ Bonobo_PropertyBag property_bag;
+ char *tab_image_name, *image_path;
+
+ /* fetch indicator icon through the bonobo propertybag mechanism */
+ CORBA_exception_init (&ev);
+ control = nautilus_view_frame_get_control (NAUTILUS_VIEW_FRAME (tab_item->tab_view));
+ if (control != NULL) {
+ property_bag = Bonobo_Control_getProperties (control, &ev);
+ if (property_bag != NULL) {
+ tab_image_name = bonobo_property_bag_client_get_value_string (property_bag, "tab_image", &ev);
+ bonobo_object_release_unref (property_bag, &ev);
+ if (nautilus_strcmp (tab_image_name, tab_item->indicator_pixbuf_name) != 0) {
+ g_free (tab_item->indicator_pixbuf_name);
+
+ if (tab_item->indicator_pixbuf != NULL) {
+ gdk_pixbuf_unref (tab_item->indicator_pixbuf);
+ tab_item->indicator_pixbuf = NULL;
+ }
+
+ if (tab_image_name != NULL) {
+ tab_item->indicator_pixbuf_name = g_strdup (tab_image_name);
+ image_path = nautilus_theme_get_image_path (tab_image_name);
+ if (image_path != NULL) {
+ g_message ("fetching image path %s", image_path);
+ tab_item->indicator_pixbuf = gdk_pixbuf_new_from_file (image_path);
+ g_free (image_path);
+ }
+ } else {
+ tab_item->indicator_pixbuf_name = NULL;
+ if (tab_item->indicator_pixbuf != NULL) {
+ gdk_pixbuf_unref (tab_item->indicator_pixbuf);
+ tab_item->indicator_pixbuf = NULL;
+ }
+ }
+
+ recalculate_size (sidebar_tabs);
+ gtk_widget_queue_draw (GTK_WIDGET (sidebar_tabs));
+ }
+ g_free (tab_image_name);
+ }
+ }
+ CORBA_exception_free (&ev);
+
+}
+
+static TabItem *
+get_tab_item_from_view (NautilusSidebarTabs *sidebar_tabs, GtkWidget *view)
+{
+ GList *iterator;
+
+ for (iterator = sidebar_tabs->details->tab_items; iterator != NULL; iterator = iterator->next) {
+ TabItem *tab_item = iterator->data;
+ if (tab_item->tab_view == view) {
+ return tab_item;
+ }
+ }
+ return NULL;
+}
+/* check all of the tabs to see if their indicator pixmaps are ready for updating */
+void
+nautilus_sidebar_tabs_update_all_indicators (NautilusSidebarTabs *sidebar_tabs)
+{
+ GList *iterator;
+
+ for (iterator = sidebar_tabs->details->tab_items; iterator != NULL; iterator = iterator->next) {
+ TabItem *tab_item = iterator->data;
+ nautilus_sidebar_tabs_update_tab_item (sidebar_tabs, tab_item);
+ }
+}
+
+/* check all of the tabs to see if their indicator pixmaps are ready for updating */
+void
+nautilus_sidebar_tabs_update_indicator (NautilusSidebarTabs *sidebar_tabs, GtkWidget *view)
+{
+ GList *iterator;
+
+ for (iterator = sidebar_tabs->details->tab_items; iterator != NULL; iterator = iterator->next) {
+ TabItem *tab_item = iterator->data;
+ if (tab_item->tab_view == view) {
+ nautilus_sidebar_tabs_update_tab_item (sidebar_tabs, tab_item);
+ break;
+ }
+ }
+}
+
+static void
+tab_indicator_changed_callback (BonoboListener *listener,
+ char *event_name,
+ CORBA_any *arg,
+ CORBA_Environment *ev,
+ gpointer callback_data)
+{
+ NautilusSidebarTabs *sidebar_tabs;
+ sidebar_tabs = NAUTILUS_SIDEBAR_TABS (callback_data);
+ nautilus_sidebar_tabs_update_all_indicators (sidebar_tabs);
+}
+
+/* listen for changes on the tab_image property */
+void
+nautilus_sidebar_tabs_connect_view (NautilusSidebarTabs *sidebar_tabs, GtkWidget *view)
+{
+ CORBA_Environment ev;
+ Bonobo_PropertyBag property_bag;
+ TabItem *tab_item;
+
+ tab_item = get_tab_item_from_view (sidebar_tabs, view);
+ if (tab_item == NULL) {
+ return;
+ }
+
+ CORBA_exception_init (&ev);
+ property_bag = Bonobo_Control_getProperties (nautilus_view_frame_get_control (NAUTILUS_VIEW_FRAME (view)), &ev);
+ if (!BONOBO_EX (&ev) && property_bag != CORBA_OBJECT_NIL) {
+ tab_item->listener_id = bonobo_event_source_client_add_listener
+ (property_bag, tab_indicator_changed_callback,
+ "Bonobo/Property:change:tab_image", NULL, sidebar_tabs);
+ bonobo_object_release_unref (property_bag, &ev);
+ }
+ CORBA_exception_free (&ev);
+
+ nautilus_sidebar_tabs_update_indicator (sidebar_tabs, view);
+}
+
+
+/* add a new tab entry, return TRUE if we succeed */
gboolean
nautilus_sidebar_tabs_add_view (NautilusSidebarTabs *sidebar_tabs, const char *name, GtkWidget *new_view, int page_num)
{
TabItem *new_tab_item;
-
+
g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_TABS (sidebar_tabs), FALSE);
g_return_val_if_fail (name != NULL, FALSE);
g_return_val_if_fail (new_view != NULL, FALSE);
@@ -1229,10 +1410,13 @@ nautilus_sidebar_tabs_add_view (NautilusSidebarTabs *sidebar_tabs, const char *n
new_tab_item->prelit = FALSE;
new_tab_item->tab_view = new_view;
new_tab_item->notebook_page = page_num;
-
+ new_tab_item->indicator_pixbuf_name = NULL;
+ new_tab_item->indicator_pixbuf = NULL;
+
/* add it to the list */
sidebar_tabs->details->tab_items = g_list_append (sidebar_tabs->details->tab_items, new_tab_item);
-
+
+ /* bump count, resize if necessary and schedule a redraw */
sidebar_tabs->details->tab_count += 1;
recalculate_size (sidebar_tabs);
gtk_widget_queue_draw (GTK_WIDGET (sidebar_tabs));
@@ -1241,7 +1425,6 @@ nautilus_sidebar_tabs_add_view (NautilusSidebarTabs *sidebar_tabs, const char *n
}
/* return the name of the tab with the passed in index */
-
char*
nautilus_sidebar_tabs_get_title_from_index (NautilusSidebarTabs *sidebar_tabs, int which_tab)
{
diff --git a/src/nautilus-sidebar-tabs.h b/src/nautilus-sidebar-tabs.h
index 89731434b..6e1c3fad9 100644
--- a/src/nautilus-sidebar-tabs.h
+++ b/src/nautilus-sidebar-tabs.h
@@ -62,6 +62,9 @@ char * nautilus_sidebar_tabs_get_title_from_index (NautilusSidebarTabs *sid
int nautilus_sidebar_tabs_hit_test (NautilusSidebarTabs *sidebar_tabs,
int x,
int y);
+void nautilus_sidebar_tabs_connect_view (NautilusSidebarTabs *sidebar_tabs,
+ GtkWidget *view);
+
void nautilus_sidebar_tabs_set_color (NautilusSidebarTabs *sidebar_tabs,
const char *color_spec);
void nautilus_sidebar_tabs_receive_dropped_color (NautilusSidebarTabs *sidebar_tabs,
@@ -82,4 +85,7 @@ void nautilus_sidebar_tabs_set_visible (NautilusSidebarTabs *sid
const char *name,
gboolean is_visible);
+void nautilus_sidebar_tabs_update_all_indicators (NautilusSidebarTabs *sidebar_tabs);
+void nautilus_sidebar_tabs_update_indicator (NautilusSidebarTabs *sidebar_tabs,
+ GtkWidget *widget);
#endif /* NAUTILUS_SIDEBAR_TABS_H */
diff --git a/src/nautilus-sidebar.c b/src/nautilus-sidebar.c
index 51cf9dc82..c54579b90 100644
--- a/src/nautilus-sidebar.c
+++ b/src/nautilus-sidebar.c
@@ -33,12 +33,14 @@
#include "nautilus-link-set-window.h"
#include "nautilus-sidebar-tabs.h"
#include "nautilus-sidebar-title.h"
+
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gnome-xml/parser.h>
#include <gtk/gtkcheckmenuitem.h>
#include <gtk/gtkdnd.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtknotebook.h>
+#include <gtk/gtksignal.h>
#include <libgnome/gnome-i18n.h>
#include <libgnomeui/gnome-uidefs.h>
#include <libgnomevfs/gnome-vfs-application-registry.h>
@@ -67,6 +69,7 @@
#include <libnautilus-extensions/nautilus-trash-monitor.h>
#include <libnautilus-extensions/nautilus-view-identifier.h>
#include <liboaf/liboaf.h>
+
#include <math.h>
struct NautilusSidebarDetails {
@@ -819,6 +822,15 @@ nautilus_sidebar_drag_data_received (GtkWidget *widget, GdkDragContext *context,
}
}
+static void
+view_loaded_callback (NautilusViewFrame *view_frame, gpointer user_data)
+{
+ NautilusSidebar *sidebar;
+
+ sidebar = NAUTILUS_SIDEBAR (user_data);
+ nautilus_sidebar_tabs_connect_view (sidebar->details->sidebar_tabs, GTK_WIDGET (view_frame));
+}
+
/* add a new panel to the sidebar */
void
nautilus_sidebar_add_panel (NautilusSidebar *sidebar, NautilusViewFrame *panel)
@@ -835,7 +847,9 @@ nautilus_sidebar_add_panel (NautilusSidebar *sidebar, NautilusViewFrame *panel)
label = gtk_label_new (description);
gtk_widget_show (label);
-
+
+ gtk_signal_connect (GTK_OBJECT (panel), "view_loaded", view_loaded_callback, sidebar);
+
gtk_notebook_append_page (GTK_NOTEBOOK (sidebar->details->notebook),
GTK_WIDGET (panel), label);
page_num = gtk_notebook_page_num (GTK_NOTEBOOK (sidebar->details->notebook),
@@ -844,12 +858,12 @@ nautilus_sidebar_add_panel (NautilusSidebar *sidebar, NautilusViewFrame *panel)
/* tell the index tabs about it */
nautilus_sidebar_tabs_add_view (sidebar->details->sidebar_tabs,
_(description), GTK_WIDGET (panel), page_num);
-
- g_free (description);
+ g_free (description);
gtk_widget_show (GTK_WIDGET (panel));
}
+
/* remove the passed-in panel from the sidebar */
void
nautilus_sidebar_remove_panel (NautilusSidebar *sidebar,
@@ -1524,7 +1538,6 @@ background_metadata_changed_callback (NautilusSidebar *sidebar)
}
/* here is the key routine that populates the sidebar with the appropriate information when the uri changes */
-
void
nautilus_sidebar_set_uri (NautilusSidebar *sidebar,
const char* new_uri,
diff --git a/src/nautilus-view-frame.c b/src/nautilus-view-frame.c
index 92b9155ad..c2a759c07 100644
--- a/src/nautilus-view-frame.c
+++ b/src/nautilus-view-frame.c
@@ -1294,6 +1294,24 @@ nautilus_view_frame_set_label (NautilusViewFrame *view,
view->details->label = g_strdup (label);
}
+/* return the Nautilus_View CORBA object associated with the view frame */
+Nautilus_View
+nautilus_view_frame_get_view (NautilusViewFrame *view)
+{
+ return view->details->view;
+}
+
+/* return the Bonobo_Control CORBA object associated with the view frame */
+Bonobo_Control
+nautilus_view_frame_get_control (NautilusViewFrame *view)
+{
+ if (view->details->control_frame == NULL) {
+ return NULL;
+ }
+
+ return bonobo_control_frame_get_control (view->details->control_frame);
+}
+
/* Activate the underlying control frame whenever the view is mapped.
* This causes the view to merge its menu items, for example. For
* sidebar panels, it might be a little late to merge them at map
diff --git a/src/nautilus-view-frame.h b/src/nautilus-view-frame.h
index 45ef8328f..cee37a71e 100644
--- a/src/nautilus-view-frame.h
+++ b/src/nautilus-view-frame.h
@@ -122,6 +122,9 @@ double nautilus_view_frame_get_max_zoom_level (NautilusViewFr
gboolean nautilus_view_frame_get_has_min_zoom_level (NautilusViewFrame *view);
gboolean nautilus_view_frame_get_has_max_zoom_level (NautilusViewFrame *view);
gboolean nautilus_view_frame_get_is_continuous (NautilusViewFrame *view);
+Nautilus_View nautilus_view_frame_get_view (NautilusViewFrame *view);
+Bonobo_Control nautilus_view_frame_get_control (NautilusViewFrame *view);
+
GList * nautilus_view_frame_get_preferred_zoom_levels (NautilusViewFrame *view);
void nautilus_view_frame_zoom_in (NautilusViewFrame *view);
void nautilus_view_frame_zoom_out (NautilusViewFrame *view);