From 4994722e587f048267b4d18a32fd13cf16c49b04 Mon Sep 17 00:00:00 2001 From: Elliot Lee Date: Tue, 21 Dec 1999 20:01:42 +0000 Subject: [PATCH] Add request_progress_change notification 1999-12-21 Elliot Lee * idl/nautilus.idl, libnautilus/ntl-view-client.[ch], src/ntl-window*.[ch], src/ntl-view-frame-svr.c: Add request_progress_change notification * src/ntl-view-*: Fix/finish various mjs changes: Do the component type abstraction properly, lose ntl-view-frame-svr.h, add ntl-view-private.h, add various component type implementations. * src/ntl-view-frame-svr.h: Add 'extern' so everyone doesn't get their own vepv variable. --- ChangeLog-20000414 | 7 + idl/nautilus.idl | 7 + libnautilus-extensions/ntl-view-client.c | 28 ++ libnautilus-extensions/ntl-view-client.h | 2 + libnautilus-private/ntl-view-client.c | 28 ++ libnautilus-private/ntl-view-client.h | 2 + libnautilus/nautilus-view-frame.c | 28 ++ libnautilus/nautilus-view-frame.h | 2 + libnautilus/nautilus-view.c | 28 ++ libnautilus/nautilus-view.h | 2 + libnautilus/ntl-view-client.c | 28 ++ libnautilus/ntl-view-client.h | 2 + libnautilus/ntl-view-frame.c | 28 ++ libnautilus/ntl-view-frame.h | 2 + src/Makefile.am | 59 +-- src/nautilus-navigation-window.c | 26 +- src/nautilus-navigation-window.h | 7 +- src/nautilus-object-window.c | 26 +- src/nautilus-object-window.h | 7 +- src/nautilus-spatial-window.c | 26 +- src/nautilus-spatial-window.h | 7 +- src/nautilus-view-frame-bonobo-control.c | 64 +++ src/nautilus-view-frame-bonobo-embeddable.c | 79 ++++ src/nautilus-view-frame-corba.c | 73 +-- src/nautilus-view-frame-nautilus-view.c | 136 ++++++ src/nautilus-view-frame-private.h | 54 +++ src/nautilus-view-frame.c | 472 +++++--------------- src/nautilus-view-frame.h | 27 +- src/nautilus-window-manage-views.c | 25 ++ src/nautilus-window-manage-views.h | 3 + src/nautilus-window-private.h | 3 + src/nautilus-window.c | 26 +- src/nautilus-window.h | 7 +- src/nautilus.h | 1 - src/ntl-content-view.c | 6 - src/ntl-content-view.h | 1 - src/ntl-meta-view.c | 52 +-- src/ntl-view-bonobo-control.c | 64 +++ src/ntl-view-bonobo-subdoc.c | 79 ++++ src/ntl-view-frame-svr.c | 73 +-- src/ntl-view-frame-svr.h | 44 -- src/ntl-view-nautilus.c | 136 ++++++ src/ntl-view-private.h | 54 +++ src/ntl-view.c | 472 +++++--------------- src/ntl-view.h | 27 +- src/ntl-window-msgs.c | 25 ++ src/ntl-window-msgs.h | 3 + src/ntl-window-private.h | 3 + src/ntl-window.c | 26 +- src/ntl-window.h | 7 +- 50 files changed, 1395 insertions(+), 999 deletions(-) create mode 100644 src/nautilus-view-frame-bonobo-control.c create mode 100644 src/nautilus-view-frame-bonobo-embeddable.c create mode 100644 src/nautilus-view-frame-nautilus-view.c create mode 100644 src/nautilus-view-frame-private.h create mode 100644 src/ntl-view-bonobo-control.c create mode 100644 src/ntl-view-bonobo-subdoc.c delete mode 100644 src/ntl-view-frame-svr.h create mode 100644 src/ntl-view-nautilus.c create mode 100644 src/ntl-view-private.h diff --git a/ChangeLog-20000414 b/ChangeLog-20000414 index 22cb644c2..61c473a85 100644 --- a/ChangeLog-20000414 +++ b/ChangeLog-20000414 @@ -1,4 +1,11 @@ 1999-12-21 Elliot Lee + + * idl/nautilus.idl, libnautilus/ntl-view-client.[ch], src/ntl-window*.[ch], src/ntl-view-frame-svr.c: + Add request_progress_change notification + + * src/ntl-view-*: Fix/finish various mjs changes: Do the component type abstraction properly, + lose ntl-view-frame-svr.h, add ntl-view-private.h, add various component type implementations. + * src/ntl-view-frame-svr.h: Add 'extern' so everyone doesn't get their own vepv variable. diff --git a/idl/nautilus.idl b/idl/nautilus.idl index 671c8cdef..b2d453452 100644 --- a/idl/nautilus.idl +++ b/idl/nautilus.idl @@ -30,6 +30,12 @@ module Nautilus { string status_string; }; + enum ProgressType { PROGRESS_DONE_OK, PROGRESS_DONE_ERROR, PROGRESS_UNDERWAY }; + struct ProgressRequestInfo { + ProgressType type; + double amount; + }; + interface View : ::GNOME::Unknown { void save_state(in string config_path); void load_state(in string config_path); @@ -53,6 +59,7 @@ module Nautilus { oneway void request_status_change(in StatusRequestInfo statinfo); oneway void request_location_change(in NavigationRequestInfo navinfo); oneway void request_selection_change(in SelectionRequestInfo selinfo); + oneway void request_progress_change(in ProgressRequestInfo proginfo); }; interface MetaViewFrame : ViewFrame { diff --git a/libnautilus-extensions/ntl-view-client.c b/libnautilus-extensions/ntl-view-client.c index f9827c27f..17d3eed24 100644 --- a/libnautilus-extensions/ntl-view-client.c +++ b/libnautilus-extensions/ntl-view-client.c @@ -403,6 +403,34 @@ nautilus_view_client_request_status_change (NautilusViewClient *view, CORBA_exception_free(&ev); } +void +nautilus_view_client_request_progress_change(NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc) +{ + CORBA_Environment ev; + + g_return_if_fail (view != NULL); + g_return_if_fail (NAUTILUS_IS_VIEW_CLIENT (view)); + + CORBA_exception_init(&ev); + if(CORBA_Object_is_nil(view->view_frame, &ev)) + view->view_frame = GNOME_Unknown_query_interface(gnome_control_get_control_frame(GNOME_CONTROL(view->control)), + "IDL:Nautilus/ViewFrame:1.0", &ev); + if(ev._major != CORBA_NO_EXCEPTION) + view->view_frame = CORBA_OBJECT_NIL; + if(CORBA_Object_is_nil(view->view_frame, &ev)) + return; + + Nautilus_ViewFrame_request_progress_change(view->view_frame, loc, &ev); + if(ev._major != CORBA_NO_EXCEPTION) + { + CORBA_Object_release(view->view_frame, &ev); + view->view_frame = CORBA_OBJECT_NIL; + } + + CORBA_exception_free(&ev); +} + static void nautilus_view_client_size_request (GtkWidget *widget, GtkRequisition *requisition) diff --git a/libnautilus-extensions/ntl-view-client.h b/libnautilus-extensions/ntl-view-client.h index e2f668077..89afd006a 100644 --- a/libnautilus-extensions/ntl-view-client.h +++ b/libnautilus-extensions/ntl-view-client.h @@ -78,6 +78,8 @@ void nautilus_view_client_request_selection_change (NautilusViewClient Nautilus_SelectionRequestInfo *loc); void nautilus_view_client_request_status_change (NautilusViewClient *view, Nautilus_StatusRequestInfo *loc); +void nautilus_view_client_request_progress_change (NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc); GnomeObject *nautilus_view_client_get_gnome_object (NautilusViewClient *view); #ifdef __cplusplus diff --git a/libnautilus-private/ntl-view-client.c b/libnautilus-private/ntl-view-client.c index f9827c27f..17d3eed24 100644 --- a/libnautilus-private/ntl-view-client.c +++ b/libnautilus-private/ntl-view-client.c @@ -403,6 +403,34 @@ nautilus_view_client_request_status_change (NautilusViewClient *view, CORBA_exception_free(&ev); } +void +nautilus_view_client_request_progress_change(NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc) +{ + CORBA_Environment ev; + + g_return_if_fail (view != NULL); + g_return_if_fail (NAUTILUS_IS_VIEW_CLIENT (view)); + + CORBA_exception_init(&ev); + if(CORBA_Object_is_nil(view->view_frame, &ev)) + view->view_frame = GNOME_Unknown_query_interface(gnome_control_get_control_frame(GNOME_CONTROL(view->control)), + "IDL:Nautilus/ViewFrame:1.0", &ev); + if(ev._major != CORBA_NO_EXCEPTION) + view->view_frame = CORBA_OBJECT_NIL; + if(CORBA_Object_is_nil(view->view_frame, &ev)) + return; + + Nautilus_ViewFrame_request_progress_change(view->view_frame, loc, &ev); + if(ev._major != CORBA_NO_EXCEPTION) + { + CORBA_Object_release(view->view_frame, &ev); + view->view_frame = CORBA_OBJECT_NIL; + } + + CORBA_exception_free(&ev); +} + static void nautilus_view_client_size_request (GtkWidget *widget, GtkRequisition *requisition) diff --git a/libnautilus-private/ntl-view-client.h b/libnautilus-private/ntl-view-client.h index e2f668077..89afd006a 100644 --- a/libnautilus-private/ntl-view-client.h +++ b/libnautilus-private/ntl-view-client.h @@ -78,6 +78,8 @@ void nautilus_view_client_request_selection_change (NautilusViewClient Nautilus_SelectionRequestInfo *loc); void nautilus_view_client_request_status_change (NautilusViewClient *view, Nautilus_StatusRequestInfo *loc); +void nautilus_view_client_request_progress_change (NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc); GnomeObject *nautilus_view_client_get_gnome_object (NautilusViewClient *view); #ifdef __cplusplus diff --git a/libnautilus/nautilus-view-frame.c b/libnautilus/nautilus-view-frame.c index f9827c27f..17d3eed24 100644 --- a/libnautilus/nautilus-view-frame.c +++ b/libnautilus/nautilus-view-frame.c @@ -403,6 +403,34 @@ nautilus_view_client_request_status_change (NautilusViewClient *view, CORBA_exception_free(&ev); } +void +nautilus_view_client_request_progress_change(NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc) +{ + CORBA_Environment ev; + + g_return_if_fail (view != NULL); + g_return_if_fail (NAUTILUS_IS_VIEW_CLIENT (view)); + + CORBA_exception_init(&ev); + if(CORBA_Object_is_nil(view->view_frame, &ev)) + view->view_frame = GNOME_Unknown_query_interface(gnome_control_get_control_frame(GNOME_CONTROL(view->control)), + "IDL:Nautilus/ViewFrame:1.0", &ev); + if(ev._major != CORBA_NO_EXCEPTION) + view->view_frame = CORBA_OBJECT_NIL; + if(CORBA_Object_is_nil(view->view_frame, &ev)) + return; + + Nautilus_ViewFrame_request_progress_change(view->view_frame, loc, &ev); + if(ev._major != CORBA_NO_EXCEPTION) + { + CORBA_Object_release(view->view_frame, &ev); + view->view_frame = CORBA_OBJECT_NIL; + } + + CORBA_exception_free(&ev); +} + static void nautilus_view_client_size_request (GtkWidget *widget, GtkRequisition *requisition) diff --git a/libnautilus/nautilus-view-frame.h b/libnautilus/nautilus-view-frame.h index e2f668077..89afd006a 100644 --- a/libnautilus/nautilus-view-frame.h +++ b/libnautilus/nautilus-view-frame.h @@ -78,6 +78,8 @@ void nautilus_view_client_request_selection_change (NautilusViewClient Nautilus_SelectionRequestInfo *loc); void nautilus_view_client_request_status_change (NautilusViewClient *view, Nautilus_StatusRequestInfo *loc); +void nautilus_view_client_request_progress_change (NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc); GnomeObject *nautilus_view_client_get_gnome_object (NautilusViewClient *view); #ifdef __cplusplus diff --git a/libnautilus/nautilus-view.c b/libnautilus/nautilus-view.c index f9827c27f..17d3eed24 100644 --- a/libnautilus/nautilus-view.c +++ b/libnautilus/nautilus-view.c @@ -403,6 +403,34 @@ nautilus_view_client_request_status_change (NautilusViewClient *view, CORBA_exception_free(&ev); } +void +nautilus_view_client_request_progress_change(NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc) +{ + CORBA_Environment ev; + + g_return_if_fail (view != NULL); + g_return_if_fail (NAUTILUS_IS_VIEW_CLIENT (view)); + + CORBA_exception_init(&ev); + if(CORBA_Object_is_nil(view->view_frame, &ev)) + view->view_frame = GNOME_Unknown_query_interface(gnome_control_get_control_frame(GNOME_CONTROL(view->control)), + "IDL:Nautilus/ViewFrame:1.0", &ev); + if(ev._major != CORBA_NO_EXCEPTION) + view->view_frame = CORBA_OBJECT_NIL; + if(CORBA_Object_is_nil(view->view_frame, &ev)) + return; + + Nautilus_ViewFrame_request_progress_change(view->view_frame, loc, &ev); + if(ev._major != CORBA_NO_EXCEPTION) + { + CORBA_Object_release(view->view_frame, &ev); + view->view_frame = CORBA_OBJECT_NIL; + } + + CORBA_exception_free(&ev); +} + static void nautilus_view_client_size_request (GtkWidget *widget, GtkRequisition *requisition) diff --git a/libnautilus/nautilus-view.h b/libnautilus/nautilus-view.h index e2f668077..89afd006a 100644 --- a/libnautilus/nautilus-view.h +++ b/libnautilus/nautilus-view.h @@ -78,6 +78,8 @@ void nautilus_view_client_request_selection_change (NautilusViewClient Nautilus_SelectionRequestInfo *loc); void nautilus_view_client_request_status_change (NautilusViewClient *view, Nautilus_StatusRequestInfo *loc); +void nautilus_view_client_request_progress_change (NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc); GnomeObject *nautilus_view_client_get_gnome_object (NautilusViewClient *view); #ifdef __cplusplus diff --git a/libnautilus/ntl-view-client.c b/libnautilus/ntl-view-client.c index f9827c27f..17d3eed24 100644 --- a/libnautilus/ntl-view-client.c +++ b/libnautilus/ntl-view-client.c @@ -403,6 +403,34 @@ nautilus_view_client_request_status_change (NautilusViewClient *view, CORBA_exception_free(&ev); } +void +nautilus_view_client_request_progress_change(NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc) +{ + CORBA_Environment ev; + + g_return_if_fail (view != NULL); + g_return_if_fail (NAUTILUS_IS_VIEW_CLIENT (view)); + + CORBA_exception_init(&ev); + if(CORBA_Object_is_nil(view->view_frame, &ev)) + view->view_frame = GNOME_Unknown_query_interface(gnome_control_get_control_frame(GNOME_CONTROL(view->control)), + "IDL:Nautilus/ViewFrame:1.0", &ev); + if(ev._major != CORBA_NO_EXCEPTION) + view->view_frame = CORBA_OBJECT_NIL; + if(CORBA_Object_is_nil(view->view_frame, &ev)) + return; + + Nautilus_ViewFrame_request_progress_change(view->view_frame, loc, &ev); + if(ev._major != CORBA_NO_EXCEPTION) + { + CORBA_Object_release(view->view_frame, &ev); + view->view_frame = CORBA_OBJECT_NIL; + } + + CORBA_exception_free(&ev); +} + static void nautilus_view_client_size_request (GtkWidget *widget, GtkRequisition *requisition) diff --git a/libnautilus/ntl-view-client.h b/libnautilus/ntl-view-client.h index e2f668077..89afd006a 100644 --- a/libnautilus/ntl-view-client.h +++ b/libnautilus/ntl-view-client.h @@ -78,6 +78,8 @@ void nautilus_view_client_request_selection_change (NautilusViewClient Nautilus_SelectionRequestInfo *loc); void nautilus_view_client_request_status_change (NautilusViewClient *view, Nautilus_StatusRequestInfo *loc); +void nautilus_view_client_request_progress_change (NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc); GnomeObject *nautilus_view_client_get_gnome_object (NautilusViewClient *view); #ifdef __cplusplus diff --git a/libnautilus/ntl-view-frame.c b/libnautilus/ntl-view-frame.c index f9827c27f..17d3eed24 100644 --- a/libnautilus/ntl-view-frame.c +++ b/libnautilus/ntl-view-frame.c @@ -403,6 +403,34 @@ nautilus_view_client_request_status_change (NautilusViewClient *view, CORBA_exception_free(&ev); } +void +nautilus_view_client_request_progress_change(NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc) +{ + CORBA_Environment ev; + + g_return_if_fail (view != NULL); + g_return_if_fail (NAUTILUS_IS_VIEW_CLIENT (view)); + + CORBA_exception_init(&ev); + if(CORBA_Object_is_nil(view->view_frame, &ev)) + view->view_frame = GNOME_Unknown_query_interface(gnome_control_get_control_frame(GNOME_CONTROL(view->control)), + "IDL:Nautilus/ViewFrame:1.0", &ev); + if(ev._major != CORBA_NO_EXCEPTION) + view->view_frame = CORBA_OBJECT_NIL; + if(CORBA_Object_is_nil(view->view_frame, &ev)) + return; + + Nautilus_ViewFrame_request_progress_change(view->view_frame, loc, &ev); + if(ev._major != CORBA_NO_EXCEPTION) + { + CORBA_Object_release(view->view_frame, &ev); + view->view_frame = CORBA_OBJECT_NIL; + } + + CORBA_exception_free(&ev); +} + static void nautilus_view_client_size_request (GtkWidget *widget, GtkRequisition *requisition) diff --git a/libnautilus/ntl-view-frame.h b/libnautilus/ntl-view-frame.h index e2f668077..89afd006a 100644 --- a/libnautilus/ntl-view-frame.h +++ b/libnautilus/ntl-view-frame.h @@ -78,6 +78,8 @@ void nautilus_view_client_request_selection_change (NautilusViewClient Nautilus_SelectionRequestInfo *loc); void nautilus_view_client_request_status_change (NautilusViewClient *view, Nautilus_StatusRequestInfo *loc); +void nautilus_view_client_request_progress_change (NautilusViewClient *view, + Nautilus_ProgressRequestInfo *loc); GnomeObject *nautilus_view_client_get_gnome_object (NautilusViewClient *view); #ifdef __cplusplus diff --git a/src/Makefile.am b/src/Makefile.am index 83f034948..e6e8ed69c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,36 +18,39 @@ LDADD= file-manager/libntl-file-manager.la \ $(VFS_LIBS) nautilus_SOURCES= \ - nautilus-bookmark.h \ - nautilus-bookmark.c \ - nautilus-bookmarklist.h \ - nautilus-bookmarklist.c \ + nautilus-bookmark.h \ + nautilus-bookmark.c \ + nautilus-bookmarklist.h \ + nautilus-bookmarklist.c \ nautilus-bookmarks-menu.h \ nautilus-bookmarks-menu.c \ - ntl-app.h \ - ntl-app.c \ - ntl-content-view.h \ - ntl-content-view.c \ - ntl-main.c \ - ntl-meta-view.h \ - ntl-meta-view.c \ - ntl-miniicon.h \ - ntl-miniicon.c \ - ntl-types.h \ - ntl-uri-map.h \ - ntl-uri-map.c \ - ntl-view.h \ - ntl-view.c \ - ntl-view-frame-svr.h \ - ntl-view-frame-svr.c \ - ntl-window.h \ - ntl-window.c \ - ntl-window-msgs.c \ - ntl-window-msgs.h \ - ntl-window-private.h \ - ntl-window-state.h \ - ntl-window-state.c \ - explorer-location-bar.h \ + ntl-app.h \ + ntl-app.c \ + ntl-content-view.h \ + ntl-content-view.c \ + ntl-main.c \ + ntl-meta-view.h \ + ntl-meta-view.c \ + ntl-miniicon.h \ + ntl-miniicon.c \ + ntl-types.h \ + ntl-uri-map.h \ + ntl-uri-map.c \ + ntl-view.h \ + ntl-view.c \ + ntl-view-bonobo-control.c \ + ntl-view-bonobo-subdoc.c \ + ntl-view-frame-svr.c \ + ntl-view-nautilus.c \ + ntl-view-private.h \ + ntl-window.h \ + ntl-window.c \ + ntl-window-msgs.c \ + ntl-window-msgs.h \ + ntl-window-private.h \ + ntl-window-state.h \ + ntl-window-state.c \ + explorer-location-bar.h \ explorer-location-bar.c goaddir=$(sysconfdir)/CORBA/servers diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index b1dbe2fa0..83fafde27 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -35,7 +35,6 @@ static void nautilus_window_realize (GtkWidget *widget); -static int window_count = 0; static GnomeAppClass *parent_class = NULL; /* Stuff for handling the CORBA interface */ @@ -322,6 +321,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->request_location_change = nautilus_window_real_request_location_change; klass->request_selection_change = nautilus_window_real_request_selection_change; klass->request_status_change = nautilus_window_real_request_status_change; + klass->request_progress_change = nautilus_window_real_request_progress_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -342,6 +342,12 @@ nautilus_window_class_init (NautilusWindowClass *klass) GTK_SIGNAL_OFFSET (NautilusWindowClass, request_status_change), gtk_marshal_NONE__BOXED_OBJECT, GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); + klass->window_signals[i++] = gtk_signal_new("request_progress_change", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (NautilusWindowClass, request_progress_change), + gtk_marshal_NONE__BOXED_OBJECT, + GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); gtk_object_class_add_signals (object_class, klass->window_signals, i); gtk_object_add_arg_type ("NautilusWindow::app_id", @@ -357,6 +363,11 @@ nautilus_window_class_init (NautilusWindowClass *klass) widget_class->realize = nautilus_window_realize; } +static void +nautilus_window_init (NautilusWindow *window) +{ +} + static gboolean nautilus_window_clear_status(NautilusWindow *window) { @@ -597,14 +608,9 @@ nautilus_window_get_arg (GtkObject *object, } } -static void -nautilus_window_init (NautilusWindow *window) -{ - window_count++; -} - static void nautilus_window_destroy (NautilusWindow *window) { + NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass); g_slist_free(window->meta_views); CORBA_free(window->ni); CORBA_free(window->si); @@ -616,10 +622,8 @@ static void nautilus_window_destroy (NautilusWindow *window) if(window->statusbar_clear_id) g_source_remove(window->statusbar_clear_id); - if(--window_count <= 0) - { - gtk_main_quit(); - } + if(GTK_OBJECT_CLASS(klass->parent_class)->destroy) + GTK_OBJECT_CLASS(klass->parent_class)->destroy(GTK_OBJECT(window)); } GtkWidget * diff --git a/src/nautilus-navigation-window.h b/src/nautilus-navigation-window.h index 097b9973e..0bc2a70b7 100644 --- a/src/nautilus-navigation-window.h +++ b/src/nautilus-navigation-window.h @@ -53,8 +53,11 @@ typedef struct { void (* request_status_change) (NautilusWindow *window, Nautilus_StatusRequestInfo *loc, NautilusView *requesting_view); + void (* request_progress_change) (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view); - guint window_signals[3]; + guint window_signals[4]; } NautilusWindowClass; struct _NautilusWindow { @@ -97,6 +100,4 @@ void nautilus_window_allow_up (NautilusWindow *window, gboolean allow); void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); - - #endif diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c index b1dbe2fa0..83fafde27 100644 --- a/src/nautilus-object-window.c +++ b/src/nautilus-object-window.c @@ -35,7 +35,6 @@ static void nautilus_window_realize (GtkWidget *widget); -static int window_count = 0; static GnomeAppClass *parent_class = NULL; /* Stuff for handling the CORBA interface */ @@ -322,6 +321,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->request_location_change = nautilus_window_real_request_location_change; klass->request_selection_change = nautilus_window_real_request_selection_change; klass->request_status_change = nautilus_window_real_request_status_change; + klass->request_progress_change = nautilus_window_real_request_progress_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -342,6 +342,12 @@ nautilus_window_class_init (NautilusWindowClass *klass) GTK_SIGNAL_OFFSET (NautilusWindowClass, request_status_change), gtk_marshal_NONE__BOXED_OBJECT, GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); + klass->window_signals[i++] = gtk_signal_new("request_progress_change", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (NautilusWindowClass, request_progress_change), + gtk_marshal_NONE__BOXED_OBJECT, + GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); gtk_object_class_add_signals (object_class, klass->window_signals, i); gtk_object_add_arg_type ("NautilusWindow::app_id", @@ -357,6 +363,11 @@ nautilus_window_class_init (NautilusWindowClass *klass) widget_class->realize = nautilus_window_realize; } +static void +nautilus_window_init (NautilusWindow *window) +{ +} + static gboolean nautilus_window_clear_status(NautilusWindow *window) { @@ -597,14 +608,9 @@ nautilus_window_get_arg (GtkObject *object, } } -static void -nautilus_window_init (NautilusWindow *window) -{ - window_count++; -} - static void nautilus_window_destroy (NautilusWindow *window) { + NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass); g_slist_free(window->meta_views); CORBA_free(window->ni); CORBA_free(window->si); @@ -616,10 +622,8 @@ static void nautilus_window_destroy (NautilusWindow *window) if(window->statusbar_clear_id) g_source_remove(window->statusbar_clear_id); - if(--window_count <= 0) - { - gtk_main_quit(); - } + if(GTK_OBJECT_CLASS(klass->parent_class)->destroy) + GTK_OBJECT_CLASS(klass->parent_class)->destroy(GTK_OBJECT(window)); } GtkWidget * diff --git a/src/nautilus-object-window.h b/src/nautilus-object-window.h index 097b9973e..0bc2a70b7 100644 --- a/src/nautilus-object-window.h +++ b/src/nautilus-object-window.h @@ -53,8 +53,11 @@ typedef struct { void (* request_status_change) (NautilusWindow *window, Nautilus_StatusRequestInfo *loc, NautilusView *requesting_view); + void (* request_progress_change) (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view); - guint window_signals[3]; + guint window_signals[4]; } NautilusWindowClass; struct _NautilusWindow { @@ -97,6 +100,4 @@ void nautilus_window_allow_up (NautilusWindow *window, gboolean allow); void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); - - #endif diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c index b1dbe2fa0..83fafde27 100644 --- a/src/nautilus-spatial-window.c +++ b/src/nautilus-spatial-window.c @@ -35,7 +35,6 @@ static void nautilus_window_realize (GtkWidget *widget); -static int window_count = 0; static GnomeAppClass *parent_class = NULL; /* Stuff for handling the CORBA interface */ @@ -322,6 +321,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->request_location_change = nautilus_window_real_request_location_change; klass->request_selection_change = nautilus_window_real_request_selection_change; klass->request_status_change = nautilus_window_real_request_status_change; + klass->request_progress_change = nautilus_window_real_request_progress_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -342,6 +342,12 @@ nautilus_window_class_init (NautilusWindowClass *klass) GTK_SIGNAL_OFFSET (NautilusWindowClass, request_status_change), gtk_marshal_NONE__BOXED_OBJECT, GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); + klass->window_signals[i++] = gtk_signal_new("request_progress_change", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (NautilusWindowClass, request_progress_change), + gtk_marshal_NONE__BOXED_OBJECT, + GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); gtk_object_class_add_signals (object_class, klass->window_signals, i); gtk_object_add_arg_type ("NautilusWindow::app_id", @@ -357,6 +363,11 @@ nautilus_window_class_init (NautilusWindowClass *klass) widget_class->realize = nautilus_window_realize; } +static void +nautilus_window_init (NautilusWindow *window) +{ +} + static gboolean nautilus_window_clear_status(NautilusWindow *window) { @@ -597,14 +608,9 @@ nautilus_window_get_arg (GtkObject *object, } } -static void -nautilus_window_init (NautilusWindow *window) -{ - window_count++; -} - static void nautilus_window_destroy (NautilusWindow *window) { + NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass); g_slist_free(window->meta_views); CORBA_free(window->ni); CORBA_free(window->si); @@ -616,10 +622,8 @@ static void nautilus_window_destroy (NautilusWindow *window) if(window->statusbar_clear_id) g_source_remove(window->statusbar_clear_id); - if(--window_count <= 0) - { - gtk_main_quit(); - } + if(GTK_OBJECT_CLASS(klass->parent_class)->destroy) + GTK_OBJECT_CLASS(klass->parent_class)->destroy(GTK_OBJECT(window)); } GtkWidget * diff --git a/src/nautilus-spatial-window.h b/src/nautilus-spatial-window.h index 097b9973e..0bc2a70b7 100644 --- a/src/nautilus-spatial-window.h +++ b/src/nautilus-spatial-window.h @@ -53,8 +53,11 @@ typedef struct { void (* request_status_change) (NautilusWindow *window, Nautilus_StatusRequestInfo *loc, NautilusView *requesting_view); + void (* request_progress_change) (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view); - guint window_signals[3]; + guint window_signals[4]; } NautilusWindowClass; struct _NautilusWindow { @@ -97,6 +100,4 @@ void nautilus_window_allow_up (NautilusWindow *window, gboolean allow); void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); - - #endif diff --git a/src/nautilus-view-frame-bonobo-control.c b/src/nautilus-view-frame-bonobo-control.c new file mode 100644 index 000000000..9743db074 --- /dev/null +++ b/src/nautilus-view-frame-bonobo-control.c @@ -0,0 +1,64 @@ +#include + +#include "nautilus.h" +#include "ntl-view-private.h" + +typedef struct { + GnomeObject *control_frame; +} BonoboControlInfo; + +static void +destroy_bonobo_control_view(NautilusView *view, CORBA_Environment *ev) +{ + BonoboControlInfo *bci = view->component_data; + g_free(bci); +} + +static void +nautilus_view_activate_uri(GnomeControlFrame *frame, const char *uri, gboolean relative, NautilusView *view) +{ + Nautilus_NavigationRequestInfo nri; + g_assert(!relative); + + memset(&nri, 0, sizeof(nri)); + nri.requested_uri = (char *)uri; + nautilus_view_request_location_change(view, &nri); +} + +static gboolean +bonobo_control_try_load_client(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev) +{ + BonoboControlInfo *bci; + + view->component_data = bci = g_new0(BonoboControlInfo, 1); + + bci->control_frame = GNOME_OBJECT(gnome_control_frame_new()); + gnome_object_add_interface(GNOME_OBJECT(bci->control_frame), view->view_frame); + + gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(bci->control_frame), obj); + + view->client_widget = gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(bci->control_frame)); + + gtk_signal_connect(GTK_OBJECT(bci->control_frame), + "activate_uri", GTK_SIGNAL_FUNC(nautilus_view_activate_uri), view); + + return TRUE; +} + +static char * +bonobo_control_get_label(NautilusView *view, CORBA_Environment *ev) +{ + return g_strdup_printf(_("Control %p"), view); +} + +NautilusViewComponentType bonobo_control_component_type = { + "IDL:GNOME/Control:1.0", + &bonobo_control_try_load_client, /* try_load */ + &destroy_bonobo_control_view, /* destroy */ + NULL, /* show_properties */ + NULL, /* save_state */ + NULL, /* load_state */ + NULL, /* notify_location_change */ + NULL, /* notify_selection_change */ + &bonobo_control_get_label /* get_label */ +}; diff --git a/src/nautilus-view-frame-bonobo-embeddable.c b/src/nautilus-view-frame-bonobo-embeddable.c new file mode 100644 index 000000000..47d44b79f --- /dev/null +++ b/src/nautilus-view-frame-bonobo-embeddable.c @@ -0,0 +1,79 @@ +#include + +#include "nautilus.h" +#include "ntl-view-private.h" + +typedef struct { + GnomeObject *container, *client_site, *view_frame; +} BonoboSubdocInfo; + +static void +destroy_bonobo_subdoc_view(NautilusView *view, CORBA_Environment *ev) +{ + BonoboSubdocInfo *bsi = view->component_data; + + g_free(bsi); +} + +static void +bonobo_subdoc_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *real_nav_ctx, CORBA_Environment *ev) +{ + GNOME_PersistFile persist; + persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistFile:1.0", + NULL); + if(!CORBA_Object_is_nil(persist, ev)) + { + GNOME_PersistFile_load(persist, real_nav_ctx->actual_uri, ev); + GNOME_Unknown_unref(persist, ev); + CORBA_Object_release(persist, ev); + } + else if((persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistStream:1.0", + NULL)) + && !CORBA_Object_is_nil(persist, ev)) + { + GnomeStream *stream; + + stream = gnome_stream_fs_open(real_nav_ctx->actual_uri, GNOME_Storage_READ); + GNOME_PersistStream_load (persist, + (GNOME_Stream) gnome_object_corba_objref (GNOME_OBJECT (stream)), + ev); + GNOME_Unknown_unref(persist, ev); + CORBA_Object_release(persist, ev); + } +} + +static gboolean +bonobo_subdoc_try_load_client(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev) +{ + BonoboSubdocInfo *bsi; + + view->component_data = bsi = g_new0(BonoboSubdocInfo, 1); + + bsi->container = GNOME_OBJECT(gnome_container_new()); + gnome_object_add_interface(GNOME_OBJECT(bsi->container), view->view_frame); + + bsi->client_site = + GNOME_OBJECT(gnome_client_site_new(GNOME_CONTAINER(bsi->container))); + gnome_client_site_bind_embeddable(GNOME_CLIENT_SITE(bsi->client_site), view->client_object); + gnome_container_add(GNOME_CONTAINER(bsi->container), bsi->client_site); + + bsi->view_frame = GNOME_OBJECT(gnome_client_site_new_view(GNOME_CLIENT_SITE(bsi->client_site))); + + g_assert(bsi->view_frame); + + view->client_widget = gnome_view_frame_get_wrapper(GNOME_VIEW_FRAME(bsi->view_frame)); + + return TRUE; +} + +NautilusViewComponentType bonobo_subdoc_component_type = { + "IDL:GNOME/Embeddable:1.0", + &bonobo_subdoc_try_load_client, /* try_load */ + &destroy_bonobo_subdoc_view, /* destroy */ + NULL, /* show_properties */ + NULL, /* save_state */ + NULL, /* load_state */ + bonobo_subdoc_notify_location_change, /* notify_location_change */ + NULL, /* notify_selection_change */ + NULL, /* get_label */ +}; diff --git a/src/nautilus-view-frame-corba.c b/src/nautilus-view-frame-corba.c index 2457720eb..fb5784709 100644 --- a/src/nautilus-view-frame-corba.c +++ b/src/nautilus-view-frame-corba.c @@ -26,6 +26,7 @@ representing a data view frame. */ #include "nautilus.h" +#include "ntl-view-private.h" typedef struct { POA_Nautilus_ViewFrame servant; @@ -50,20 +51,10 @@ static void impl_Nautilus_ViewFrame_request_status_change(impl_POA_Nautilus_ViewFrame * servant, Nautilus_StatusRequestInfo * statinfo, CORBA_Environment * ev); - -static void -nautilus_view_request_location_change(NautilusView *view, - Nautilus_NavigationRequestInfo *loc); - static void -nautilus_view_request_selection_change (NautilusView *view, - Nautilus_SelectionRequestInfo *loc); - -static void -nautilus_view_request_status_change (NautilusView *view, - Nautilus_StatusRequestInfo *loc); - - +impl_Nautilus_ViewFrame_request_progress_change(impl_POA_Nautilus_ViewFrame * servant, + Nautilus_ProgressRequestInfo * proginfo, + CORBA_Environment * ev); POA_Nautilus_ViewFrame__epv impl_Nautilus_ViewFrame_epv = { @@ -71,7 +62,8 @@ POA_Nautilus_ViewFrame__epv impl_Nautilus_ViewFrame_epv = (void(*))&impl_Nautilus_ViewFrame__get_main_window, (void(*))&impl_Nautilus_ViewFrame_request_status_change, (void(*))&impl_Nautilus_ViewFrame_request_location_change, - (void(*))&impl_Nautilus_ViewFrame_request_selection_change + (void(*))&impl_Nautilus_ViewFrame_request_selection_change, + (void(*))&impl_Nautilus_ViewFrame_request_progress_change }; static PortableServer_ServantBase__epv base_epv = { NULL, NULL, NULL }; @@ -142,14 +134,7 @@ impl_Nautilus_ViewFrame_request_location_change(impl_POA_Nautilus_ViewFrame * se Nautilus_NavigationRequestInfo * navinfo, CORBA_Environment * ev) { - NautilusView *view; - - view = servant->view; - g_return_if_fail (view != NULL); - g_return_if_fail (NAUTILUS_IS_VIEW (view)); - g_return_if_fail (NAUTILUS_VIEW (view)->main_window != NULL); - - nautilus_window_request_location_change(NAUTILUS_WINDOW(view->main_window), navinfo, GTK_WIDGET(view)); + nautilus_view_request_location_change(servant->view, navinfo); } static void @@ -157,9 +142,8 @@ impl_Nautilus_ViewFrame_request_selection_change(impl_POA_Nautilus_ViewFrame * s Nautilus_SelectionRequestInfo * selinfo, CORBA_Environment * ev) { - nautilus_window_request_selection_change(NAUTILUS_WINDOW(servant->view->main_window), - selinfo, - GTK_WIDGET(servant->view)); + nautilus_view_request_selection_change(servant->view, + selinfo); } static void @@ -167,8 +151,41 @@ impl_Nautilus_ViewFrame_request_status_change(impl_POA_Nautilus_ViewFrame * serv Nautilus_StatusRequestInfo * statinfo, CORBA_Environment * ev) { - nautilus_window_request_status_change(NAUTILUS_WINDOW(servant->view->main_window), - statinfo, - GTK_WIDGET(servant->view)); + nautilus_view_request_status_change(servant->view, statinfo); +} + +static void +impl_Nautilus_ViewFrame_request_progress_change(impl_POA_Nautilus_ViewFrame * servant, + Nautilus_ProgressRequestInfo * proginfo, + CORBA_Environment * ev) +{ + nautilus_view_request_progress_change(servant->view, proginfo); +} + +void +nautilus_view_request_location_change(NautilusView *view, + Nautilus_NavigationRequestInfo *loc) +{ + nautilus_window_request_location_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); } +void +nautilus_view_request_selection_change (NautilusView *view, + Nautilus_SelectionRequestInfo *loc) +{ + nautilus_window_request_selection_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); +} + +void +nautilus_view_request_status_change (NautilusView *view, + Nautilus_StatusRequestInfo *loc) +{ + nautilus_window_request_status_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); +} + +void +nautilus_view_request_progress_change(NautilusView *view, + Nautilus_ProgressRequestInfo *loc) +{ + nautilus_window_request_progress_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); +} diff --git a/src/nautilus-view-frame-nautilus-view.c b/src/nautilus-view-frame-nautilus-view.c new file mode 100644 index 000000000..455754e1f --- /dev/null +++ b/src/nautilus-view-frame-nautilus-view.c @@ -0,0 +1,136 @@ +#include + +#include "nautilus.h" +#include "ntl-view-private.h" + +typedef struct { + GnomeObject *control_frame; + CORBA_Object view_client; +} NautilusViewInfo; + +static gboolean +nautilus_view_try_load_client(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev) +{ + GNOME_Control control; + NautilusViewInfo *nvi; + + nvi = view->component_data = g_new0(NautilusViewInfo, 1); + + control = GNOME_Unknown_query_interface(obj, "IDL:GNOME/Control:1.0", ev); + if(ev->_major != CORBA_NO_EXCEPTION) + control = CORBA_OBJECT_NIL; + + if(CORBA_Object_is_nil(control, ev)) + goto out; + + nvi->view_client = CORBA_Object_duplicate(obj, ev); + GNOME_Unknown_ref(nvi->view_client, ev); + + nvi->control_frame = GNOME_OBJECT(gnome_control_frame_new()); + gnome_object_add_interface(GNOME_OBJECT(nvi->control_frame), view->view_frame); + + gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(nvi->control_frame), control); + view->client_widget = gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(nvi->control_frame)); + + GNOME_Unknown_unref(control, ev); + CORBA_Object_release(control, ev); + + return TRUE; + + out: + g_free(nvi); + + return FALSE; +} + +static void +destroy_nautilus_view(NautilusView *view, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + CORBA_Object_release(nvi->view_client, ev); + + g_free(nvi); +} + +static void +nv_show_properties(NautilusView *view, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_show_properties(nvi->view_client, ev); +} + +static void +nv_save_state(NautilusView *view, const char *config_path, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_save_state(nvi->view_client, config_path, ev); +} + +static void +nv_load_state(NautilusView *view, const char *config_path, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_load_state(nvi->view_client, config_path, ev); +} + +static void +nv_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *nav_ctx, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_notify_location_change(nvi->view_client, nav_ctx, ev); +} + +static void +nv_notify_selection_change(NautilusView *view, Nautilus_SelectionInfo *nav_ctx, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_notify_selection_change(nvi->view_client, nav_ctx, ev); +} + +static char * +nv_get_label(NautilusView *view, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + GnomePropertyBagClient *bc; + GNOME_Property prop; + char *retval = NULL; + CORBA_any *anyval; + GnomeControlFrame *control_frame; + + control_frame = GNOME_CONTROL_FRAME(nvi->control_frame); + bc = gnome_control_frame_get_control_property_bag(control_frame); + g_return_val_if_fail(bc, NULL); + + prop = gnome_property_bag_client_get_property(bc, "label"); + + if(CORBA_Object_is_nil(prop, ev)) + return NULL; + + anyval = GNOME_Property_get_value(prop, ev); + if(ev->_major == CORBA_NO_EXCEPTION && CORBA_TypeCode_equal(anyval->_type, TC_string, ev)) + { + retval = g_strdup(*(CORBA_char **)anyval->_value); + + CORBA_free(anyval); + } + + return retval; +} + +NautilusViewComponentType nautilus_view_component_type = { + "IDL:Nautilus/View:1.0", + &nautilus_view_try_load_client, /* try_load */ + &destroy_nautilus_view, /* destroy */ + &nv_show_properties, /* show_properties */ + &nv_save_state, /* save_state */ + &nv_load_state, /* load_state */ + &nv_notify_location_change, /* notify_location_change */ + &nv_notify_selection_change, /* notify_selection_change */ + &nv_get_label /* get_label */ +}; diff --git a/src/nautilus-view-frame-private.h b/src/nautilus-view-frame-private.h new file mode 100644 index 000000000..4d85a6e0b --- /dev/null +++ b/src/nautilus-view-frame-private.h @@ -0,0 +1,54 @@ +/* + * Nautilus + * + * Copyright (C) 1999 Red Hat, Inc. + * + * This library 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 library 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 library; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Elliot Lee + * + */ +/* ntl-view-private.h: Internals of the view proxy that are shared between different implementation files */ +#ifndef NTL_VIEW_PRIVATE_H +#define NTL_VIEW_PRIVATE_H 1 + +#include "nautilus.h" + +extern POA_Nautilus_ViewFrame__vepv impl_Nautilus_ViewFrame_vepv; +GnomeObject *impl_Nautilus_ViewFrame__create(NautilusView *view, CORBA_Environment * ev); + +void nautilus_view_request_location_change(NautilusView *view, + Nautilus_NavigationRequestInfo *loc); +void nautilus_view_request_selection_change(NautilusView *view, + Nautilus_SelectionRequestInfo *loc); +void nautilus_view_request_status_change(NautilusView *view, + Nautilus_StatusRequestInfo *loc); +void nautilus_view_request_progress_change(NautilusView *view, + Nautilus_ProgressRequestInfo *loc); + +struct _NautilusViewComponentType { + const char *primary_repoid; + gboolean (* try_load)(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev); + void (* destroy) (NautilusView *view, CORBA_Environment *ev); + void (* show_properties)(NautilusView *view, CORBA_Environment *ev); + void (* save_state)(NautilusView *view, const char *config_path, CORBA_Environment *ev); + void (* load_state)(NautilusView *view, const char *config_path, CORBA_Environment *ev); + void (* notify_location_change)(NautilusView *view, Nautilus_NavigationInfo *nav_ctx, CORBA_Environment *ev); + void (* notify_selection_change)(NautilusView *view, Nautilus_SelectionInfo *nav_ctx, CORBA_Environment *ev); + + char * (* get_label)(NautilusView *view, CORBA_Environment *ev); +}; + +#endif diff --git a/src/nautilus-view-frame.c b/src/nautilus-view-frame.c index 180b8dc5a..aa611366f 100644 --- a/src/nautilus-view-frame.c +++ b/src/nautilus-view-frame.c @@ -29,6 +29,7 @@ #include #include #include "nautilus.h" +#include "ntl-view-private.h" enum { NOTIFY_LOCATION_CHANGE, @@ -42,18 +43,19 @@ enum { static void nautilus_view_init (NautilusView *view); +static void nautilus_view_destroy (GtkObject *view); static void nautilus_view_constructed(NautilusView *view); static void nautilus_view_class_init (NautilusViewClass *klass); static void nautilus_view_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); + GtkArg *arg, + guint arg_id); static void nautilus_view_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); + GtkArg *arg, + guint arg_id); static void nautilus_view_size_request (GtkWidget *widget, GtkRequisition *requisition); static void nautilus_view_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); + GtkAllocation *allocation); static void nautilus_view_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *nav_context); static void nautilus_view_notify_selection_change(NautilusView *view, @@ -65,24 +67,24 @@ static void nautilus_view_show_properties(NautilusView *view); GtkType nautilus_view_get_type (void) { - static GtkType view_type = 0; - - if (!view_type) { - const GtkTypeInfo view_info = { - "NautilusView", - sizeof (NautilusView), - sizeof (NautilusViewClass), - (GtkClassInitFunc) nautilus_view_class_init, - (GtkObjectInitFunc) nautilus_view_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - view_type = gtk_type_unique (gtk_bin_get_type(), &view_info); - } + static GtkType view_type = 0; + + if (!view_type) { + const GtkTypeInfo view_info = { + "NautilusView", + sizeof (NautilusView), + sizeof (NautilusViewClass), + (GtkClassInitFunc) nautilus_view_class_init, + (GtkObjectInitFunc) nautilus_view_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + view_type = gtk_type_unique (gtk_bin_get_type(), &view_info); + } - return view_type; + return view_type; } #if 0 @@ -97,13 +99,13 @@ gtk_marshal_NONE__BOXED_OBJECT_BOXED (GtkObject * object, gpointer func_data, GtkArg * args) { - GtkSignal_NONE__BOXED_OBJECT_BOXED rfunc; - rfunc = (GtkSignal_NONE__BOXED_OBJECT_BOXED) func; - (*rfunc) (object, - GTK_VALUE_BOXED (args[0]), - GTK_VALUE_OBJECT (args[1]), - GTK_VALUE_BOXED (args[2]), - func_data); + GtkSignal_NONE__BOXED_OBJECT_BOXED rfunc; + rfunc = (GtkSignal_NONE__BOXED_OBJECT_BOXED) func; + (*rfunc) (object, + GTK_VALUE_BOXED (args[0]), + GTK_VALUE_OBJECT (args[1]), + GTK_VALUE_BOXED (args[2]), + func_data); } #endif @@ -115,6 +117,7 @@ nautilus_view_class_init (NautilusViewClass *klass) int i; object_class = (GtkObjectClass*) klass; + object_class->destroy = nautilus_view_destroy; object_class->set_arg = nautilus_view_set_arg; object_class->get_arg = nautilus_view_get_arg; @@ -169,7 +172,7 @@ nautilus_view_class_init (NautilusViewClass *klass) gtk_object_add_arg_type ("NautilusView::main_window", GTK_TYPE_OBJECT, - GTK_ARG_READWRITE|GTK_ARG_CONSTRUCT, + GTK_ARG_READWRITE, ARG_MAIN_WINDOW); klass->num_construct_args++; } @@ -206,7 +209,43 @@ static void nautilus_view_init (NautilusView *view) { GTK_WIDGET_SET_FLAGS (view, GTK_NO_WINDOW); - view->type = NV_NONE; +} + +static void +nautilus_view_destroy_client(NautilusView *view) +{ + if(!view->component_class) + return; + + g_free(view->iid); view->iid = NULL; + + gnome_object_destroy(GNOME_OBJECT(view->client_object)); view->client_object = NULL; + + gtk_container_remove(GTK_CONTAINER(view), view->client_widget); view->client_widget = NULL; + + if(view->component_class->destroy) + { + CORBA_Environment ev; + CORBA_exception_init(&ev); + view->component_class->destroy(view, &ev); + CORBA_exception_free(&ev); + } + + gnome_object_destroy(view->view_frame); view->view_frame = NULL; + + view->component_class = NULL; + view->component_data = NULL; +} + +static void +nautilus_view_destroy(GtkObject *view) +{ + NautilusViewClass *klass = NAUTILUS_VIEW_CLASS(view->klass); + + nautilus_view_destroy_client(NAUTILUS_VIEW(view)); + + if(GTK_OBJECT_CLASS(klass->parent_class)->destroy) + GTK_OBJECT_CLASS(klass->parent_class)->destroy(view); } static void @@ -267,179 +306,28 @@ nautilus_view_size_allocate (GtkWidget *widget, gtk_widget_size_allocate (bin->child, &child_allocation); } -static void -nautilus_view_activate_uri(GnomeControlFrame *frame, const char *uri, gboolean relative, NautilusView *view) -{ - Nautilus_NavigationRequestInfo nri; - g_assert(!relative); - - memset(&nri, 0, sizeof(nri)); - nri.requested_uri = (char *)uri; - nautilus_window_request_location_change(NAUTILUS_WINDOW(view->main_window), &nri, GTK_WIDGET(view)); -} - -static void -destroy_nautilus_view(NautilusView *view) -{ - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - CORBA_Object_release(view->u.nautilus_view_info.view_client, &ev); - gnome_object_destroy(view->u.nautilus_view_info.control_frame); -} - -static void -destroy_bonobo_subdoc_view(NautilusView *view) -{ - gnome_object_destroy(view->u.bonobo_subdoc_info.container); -} - -static void -destroy_bonobo_control_view(NautilusView *view) -{ - gnome_object_destroy(view->u.bonobo_control_info.control_frame); -} - - -static gboolean -bonobo_control_try_load_client(NautilusView *view, CORBA_Object obj) -{ - GNOME_Control control; - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - control = (GNOME_Control) obj; - - view->u.nautilus_view_info.control_frame = GNOME_OBJECT(gnome_control_frame_new()); - gnome_object_add_interface(GNOME_OBJECT(view->u.bonobo_control_info.control_frame), view->view_frame); - - gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(view->u.bonobo_control_info.control_frame), - control); - GNOME_Unknown_unref(control, &ev); - view->client_widget = - gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(view->u.bonobo_control_info.control_frame)); - - view->type = NV_BONOBO_CONTROL; - gtk_signal_connect(GTK_OBJECT(view->u.bonobo_control_info.control_frame), - "activate_uri", GTK_SIGNAL_FUNC(nautilus_view_activate_uri), view); - - CORBA_exception_free(&ev); - - return TRUE; -} - - -static gboolean -bonobo_subdoc_try_load_client(NautilusView *view, CORBA_Object obj) -{ - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - view->type = NV_BONOBO_SUBDOC; - - view->u.bonobo_subdoc_info.container = GNOME_OBJECT(gnome_container_new()); - gnome_object_add_interface(GNOME_OBJECT(view->u.bonobo_subdoc_info.container), view->view_frame); - - view->u.bonobo_subdoc_info.client_site = - GNOME_OBJECT(gnome_client_site_new(GNOME_CONTAINER(view->u.bonobo_subdoc_info.container))); - gnome_client_site_bind_embeddable(GNOME_CLIENT_SITE(view->u.bonobo_subdoc_info.client_site), - view->client_object); - gnome_container_add(GNOME_CONTAINER(view->u.bonobo_subdoc_info.container), view->u.bonobo_subdoc_info.client_site); - view->u.bonobo_subdoc_info.view_frame = - GNOME_OBJECT(gnome_client_site_new_view(GNOME_CLIENT_SITE(view->u.bonobo_subdoc_info.client_site))); - if(!view->u.bonobo_subdoc_info.view_frame) - { - gnome_object_destroy(GNOME_OBJECT(view->client_object)); - gnome_object_destroy(view->u.bonobo_subdoc_info.container); - gnome_object_destroy(view->u.bonobo_subdoc_info.client_site); - GNOME_Unknown_unref(obj, &ev); - CORBA_Object_release(obj, &ev); - gnome_object_destroy(view->view_frame); - view->type = NV_NONE; - return FALSE; - } - - view->client_widget = gnome_view_frame_get_wrapper(GNOME_VIEW_FRAME(view->u.bonobo_subdoc_info.view_frame)); - - CORBA_exception_free(&ev); - - return TRUE; -} - - -static gboolean -nautilus_view_try_load_client(NautilusView *view, CORBA_Object obj) -{ - GNOME_Control control; - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - view->u.nautilus_view_info.view_client = obj; - - view->type = NV_NAUTILUS_VIEW; - control = - GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), "IDL:GNOME/Control:1.0", &ev); - if(ev._major != CORBA_NO_EXCEPTION) - control = CORBA_OBJECT_NIL; - - if(CORBA_Object_is_nil(control, &ev)) - { - gnome_object_unref(GNOME_OBJECT(view->client_object)); - GNOME_Unknown_unref(view->u.nautilus_view_info.view_client, &ev); - CORBA_Object_release(view->u.nautilus_view_info.view_client, &ev); - gnome_object_destroy(view->view_frame); - view->type = NV_NONE; - return FALSE; - } - - view->u.nautilus_view_info.control_frame = GNOME_OBJECT(gnome_control_frame_new()); - gnome_object_add_interface(GNOME_OBJECT(view->u.nautilus_view_info.control_frame), view->view_frame); - - gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(view->u.nautilus_view_info.control_frame), control); - GNOME_Unknown_unref(control, &ev); - view->client_widget = gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(view->u.nautilus_view_info.control_frame)); - - CORBA_exception_free(&ev); - - return TRUE; -} +extern NautilusViewComponentType nautilus_view_component_type; /* ntl-view-nautilus.c */ +extern NautilusViewComponentType bonobo_subdoc_component_type; /* ntl-view-bonobo-subdoc.c */ +extern NautilusViewComponentType bonobo_control_component_type; /* ntl-view-bonobo-control.c */ gboolean /* returns TRUE if successful */ nautilus_view_load_client(NautilusView *view, const char *iid) { CORBA_Object obj; CORBA_Environment ev; + int i; + NautilusViewComponentType *component_types[] = { + &nautilus_view_component_type, + &bonobo_subdoc_component_type, + &bonobo_control_component_type, + NULL + }; g_return_val_if_fail(iid, FALSE); CORBA_exception_init(&ev); - if(view->type != NV_NONE) - { - g_free(view->iid); view->iid = NULL; - gtk_container_remove(GTK_CONTAINER(view), view->client_widget); view->client_widget = NULL; - - switch(view->type) - { - case NV_NAUTILUS_VIEW: - destroy_nautilus_view(view); - break; - case NV_BONOBO_SUBDOC: - destroy_bonobo_subdoc_view(view); - break; - case NV_BONOBO_CONTROL: - destroy_bonobo_control_view(view); - break; - default: - break; - } - view->type = NV_NONE; - gnome_object_destroy(GNOME_OBJECT(view->client_object)); view->client_object = NULL; - } + nautilus_view_destroy_client(view); view->client_object = gnome_object_activate(iid, 0); if(!view->client_object) @@ -449,59 +337,29 @@ nautilus_view_load_client(NautilusView *view, const char *iid) /* Now figure out which type of embedded object it is: */ - /* Is it a Nautilus View? */ - obj = GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), - "IDL:Nautilus/View:1.0", &ev); - if(ev._major != CORBA_NO_EXCEPTION) - obj = CORBA_OBJECT_NIL; - - if(!CORBA_Object_is_nil(obj, &ev)) - { - if (!nautilus_view_try_load_client(view, obj)) - { - return FALSE; - } - } - else + for(i = 0; component_types[i] && !view->component_class; i++) { - /* Is it a Bonobo Embeddable? */ - obj = - GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), - "IDL:GNOME/Embeddable:1.0", &ev); - + obj = GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), + component_types[i]->primary_repoid, &ev); if(ev._major != CORBA_NO_EXCEPTION) obj = CORBA_OBJECT_NIL; - if(!CORBA_Object_is_nil(obj, &ev)) - { - if (!bonobo_subdoc_try_load_client(view, obj)) - { - g_warning("We don't know how to embed implementation %s", iid); - return FALSE; - } - } - else - { - /* Is it a Bonobo Control? */ - obj = - GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), - "IDL:GNOME/Control:1.0", &ev); - if(ev._major != CORBA_NO_EXCEPTION) - obj= CORBA_OBJECT_NIL; - - if(!CORBA_Object_is_nil(obj, &ev)) - { - if (!bonobo_control_try_load_client(view, obj)) { - return FALSE; - } else { - gnome_object_destroy(GNOME_OBJECT(view->client_object)); - gnome_object_destroy(view->view_frame); - view->type = NV_NONE; - return FALSE; - } - - } - } + if(CORBA_Object_is_nil(obj, &ev)) + continue; + + if(component_types[i]->try_load(view, obj, &ev)) + view->component_class = component_types[i]; + + GNOME_Unknown_unref(obj, &ev); + CORBA_Object_release(obj, &ev); + } + + if (!view->component_class) + { + /* Nothing matched */ + nautilus_view_destroy_client(view); + + return FALSE; } view->iid = g_strdup(iid); @@ -513,57 +371,12 @@ nautilus_view_load_client(NautilusView *view, const char *iid) return TRUE; } -static void -nautilus_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *real_nav_ctx) -{ - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - Nautilus_View_notify_location_change(view->u.nautilus_view_info.view_client, real_nav_ctx, &ev); - - CORBA_exception_free(&ev); -} - -static void -bonobo_subdoc_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *real_nav_ctx) -{ - GNOME_PersistFile persist; - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistFile:1.0", - NULL); - if(!CORBA_Object_is_nil(persist, &ev)) - { - GNOME_PersistFile_load(persist, real_nav_ctx->actual_uri, &ev); - GNOME_Unknown_unref(persist, &ev); - CORBA_Object_release(persist, &ev); - } - else if((persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistStream:1.0", - NULL)) - && !CORBA_Object_is_nil(persist, &ev)) - { - GnomeStream *stream; - - stream = gnome_stream_fs_open(real_nav_ctx->actual_uri, GNOME_Storage_READ); - GNOME_PersistStream_load (persist, - (GNOME_Stream) gnome_object_corba_objref (GNOME_OBJECT (stream)), - &ev); - GNOME_Unknown_unref(persist, &ev); - CORBA_Object_release(persist, &ev); - } - - CORBA_exception_free(&ev); -} - - static void nautilus_view_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *nav_context) { Nautilus_NavigationInfo real_nav_ctx; + CORBA_Environment ev; real_nav_ctx = *nav_context; g_assert(real_nav_ctx.requested_uri); @@ -575,19 +388,10 @@ nautilus_view_notify_location_change(NautilusView *view, if(!real_nav_ctx.actual_referring_uri) real_nav_ctx.actual_referring_uri = real_nav_ctx.referring_uri; DEFAULT_STRING(referring_content_type); - switch(view->type) - { - case NV_NAUTILUS_VIEW: - nautilus_notify_location_change(view, &real_nav_ctx); - break; - case NV_BONOBO_SUBDOC: - bonobo_subdoc_notify_location_change(view, &real_nav_ctx); - break; - default: - g_warning("Unhandled view type %d", view->type); - break; - } - + CORBA_exception_init(&ev); + if(view->component_class->notify_location_change) + view->component_class->notify_location_change(view, &real_nav_ctx, &ev); + CORBA_exception_free(&ev); } static void @@ -597,9 +401,8 @@ nautilus_view_notify_selection_change(NautilusView *view, CORBA_Environment ev; CORBA_exception_init(&ev); - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - - Nautilus_View_notify_selection_change(view->u.nautilus_view_info.view_client, nav_context, &ev); + if(view->component_class->notify_selection_change) + view->component_class->notify_selection_change(view, nav_context, &ev); CORBA_exception_free(&ev); } @@ -609,11 +412,10 @@ nautilus_view_load_state(NautilusView *view, const char *config_path) { CORBA_Environment ev; - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - CORBA_exception_init(&ev); - Nautilus_View_load_state(view->u.nautilus_view_info.view_client, (char *)config_path, &ev); + if(view->component_class->load_state) + view->component_class->load_state(view, config_path, &ev); CORBA_exception_free(&ev); } @@ -623,11 +425,10 @@ nautilus_view_save_state(NautilusView *view, const char *config_path) { CORBA_Environment ev; - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - CORBA_exception_init(&ev); - Nautilus_View_save_state(view->u.nautilus_view_info.view_client, (char *)config_path, &ev); + if(view->component_class->save_state) + view->component_class->save_state(view, config_path, &ev); CORBA_exception_free(&ev); } @@ -638,9 +439,8 @@ nautilus_view_show_properties(NautilusView *view) CORBA_Environment ev; CORBA_exception_init(&ev); - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - - Nautilus_View_show_properties(view->u.nautilus_view_info.view_client, &ev); + if(view->component_class->show_properties) + view->component_class->show_properties(view, &ev); CORBA_exception_free(&ev); } @@ -654,51 +454,7 @@ nautilus_view_get_iid(NautilusView *view) CORBA_Object nautilus_view_get_client_objref(NautilusView *view) { - if(view->type == NV_NAUTILUS_VIEW) - return view->u.nautilus_view_info.view_client; - else - return CORBA_OBJECT_NIL; -} - -static GnomeObject * -nautilus_get_control_frame(NautilusView *view) -{ - return view->u.nautilus_view_info.control_frame; -} - -static GnomeObject * -bonobo_control_get_control_frame(NautilusView *view) -{ - return view->u.bonobo_control_info.control_frame; -} - -static GnomeObject * -bonobo_subdoc_get_control_frame(NautilusView *view) -{ - return view->u.bonobo_subdoc_info.view_frame; -} - - -GnomeObject * -nautilus_view_get_control_frame(NautilusView *view) -{ - switch(view->type) - { - case NV_NAUTILUS_VIEW: - return nautilus_get_control_frame(view); - break; - case NV_BONOBO_CONTROL: - return bonobo_control_get_control_frame(view); - break; - case NV_BONOBO_SUBDOC: - return bonobo_subdoc_get_control_frame(view); - break; - default: - g_warning("Can't get the control frame for this type of view (%d)", view->type); - break; - } - - return NULL; + return gnome_object_corba_objref(GNOME_OBJECT(view->client_object)); } CORBA_Object diff --git a/src/nautilus-view-frame.h b/src/nautilus-view-frame.h index 2c2afd1b3..04b199922 100644 --- a/src/nautilus-view-frame.h +++ b/src/nautilus-view-frame.h @@ -59,7 +59,8 @@ struct _NautilusViewClass void (*save_state) (NautilusView *view, const char *config_path); void (*show_properties) (NautilusView *view); - void (*view_constructed) (NautilusView *view); /* Not a signal. Work-around for Gtk+'s lack of a 'constructed' operation */ + /* Not a signal. Work-around for Gtk+'s lack of a 'constructed' operation */ + void (*view_constructed) (NautilusView *view); GtkBinClass *parent_class; guint view_signals[6]; @@ -68,6 +69,8 @@ struct _NautilusViewClass gpointer servant_init_func, servant_destroy_func, vepv; }; +typedef struct _NautilusViewComponentType NautilusViewComponentType; + struct _NautilusView { GtkBin parent; @@ -76,30 +79,15 @@ struct _NautilusView char *iid; - enum { NV_NONE, NV_NAUTILUS_VIEW, NV_BONOBO_SUBDOC, NV_BONOBO_CONTROL } type; - - union { - struct { - CORBA_Object view_client; - GnomeObject *control_frame; - - } nautilus_view_info; - struct { - GnomeObject *container, *client_site, *view_frame; - - } bonobo_subdoc_info; - struct { - GnomeObject *control_frame; - - } bonobo_control_info; - } u; - GnomeObjectClient *client_object; GtkWidget *client_widget; GnomeObject *view_frame; guint construct_arg_count; + + NautilusViewComponentType *component_class; + gpointer component_data; }; GtkType nautilus_view_get_type (void); @@ -117,5 +105,4 @@ void nautilus_view_construct_arg_set(NautilusView *view); } #endif /* __cplusplus */ - #endif /* __NAUTILUS_VIEW_H__ */ diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c index 81869df4b..42a33c9f5 100644 --- a/src/nautilus-window-manage-views.c +++ b/src/nautilus-window-manage-views.c @@ -80,6 +80,20 @@ nautilus_window_request_location_change(NautilusWindow *window, gtk_signal_emit(obj, klass->window_signals[0], loc, requesting_view); } +void +nautilus_window_request_progress_change(NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + GtkWidget *requesting_view) +{ + NautilusWindowClass *klass; + GtkObject *obj; + + obj = GTK_OBJECT(window); + + klass = NAUTILUS_WINDOW_CLASS(obj->klass); + gtk_signal_emit(obj, klass->window_signals[3], loc, requesting_view); +} + static void nautilus_window_change_location_internal(NautilusWindow *window, NautilusNavigationInfo *loci, gboolean is_back) { @@ -339,3 +353,14 @@ nautilus_window_real_request_location_change (NautilusWindow *window, { nautilus_window_change_location(window, loc, requesting_view, FALSE); } + +void +nautilus_window_real_request_progress_change (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view) +{ + if(requesting_view != window->content_view) + return; /* Only pay attention to progress information from the main view, for now */ + + g_message("Progress is %f", loc->amount); +} diff --git a/src/nautilus-window-manage-views.h b/src/nautilus-window-manage-views.h index 8bc1afb6d..4bfe835aa 100644 --- a/src/nautilus-window-manage-views.h +++ b/src/nautilus-window-manage-views.h @@ -12,5 +12,8 @@ void nautilus_window_request_selection_change(NautilusWindow *window, void nautilus_window_request_status_change(NautilusWindow *window, Nautilus_StatusRequestInfo *loc, GtkWidget *requesting_view); +void nautilus_window_request_progress_change(NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + GtkWidget *requesting_view); #endif diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h index bd6909ed5..f371101bb 100644 --- a/src/nautilus-window-private.h +++ b/src/nautilus-window-private.h @@ -15,6 +15,9 @@ void nautilus_window_real_request_status_change(NautilusWindow *window, void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, NautilusView *requesting_view); +void nautilus_window_real_request_progress_change (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view); void nautilus_window_set_status(NautilusWindow *window, const char *txt); void nautilus_window_change_location(NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, diff --git a/src/nautilus-window.c b/src/nautilus-window.c index b1dbe2fa0..83fafde27 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -35,7 +35,6 @@ static void nautilus_window_realize (GtkWidget *widget); -static int window_count = 0; static GnomeAppClass *parent_class = NULL; /* Stuff for handling the CORBA interface */ @@ -322,6 +321,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->request_location_change = nautilus_window_real_request_location_change; klass->request_selection_change = nautilus_window_real_request_selection_change; klass->request_status_change = nautilus_window_real_request_status_change; + klass->request_progress_change = nautilus_window_real_request_progress_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -342,6 +342,12 @@ nautilus_window_class_init (NautilusWindowClass *klass) GTK_SIGNAL_OFFSET (NautilusWindowClass, request_status_change), gtk_marshal_NONE__BOXED_OBJECT, GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); + klass->window_signals[i++] = gtk_signal_new("request_progress_change", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (NautilusWindowClass, request_progress_change), + gtk_marshal_NONE__BOXED_OBJECT, + GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); gtk_object_class_add_signals (object_class, klass->window_signals, i); gtk_object_add_arg_type ("NautilusWindow::app_id", @@ -357,6 +363,11 @@ nautilus_window_class_init (NautilusWindowClass *klass) widget_class->realize = nautilus_window_realize; } +static void +nautilus_window_init (NautilusWindow *window) +{ +} + static gboolean nautilus_window_clear_status(NautilusWindow *window) { @@ -597,14 +608,9 @@ nautilus_window_get_arg (GtkObject *object, } } -static void -nautilus_window_init (NautilusWindow *window) -{ - window_count++; -} - static void nautilus_window_destroy (NautilusWindow *window) { + NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass); g_slist_free(window->meta_views); CORBA_free(window->ni); CORBA_free(window->si); @@ -616,10 +622,8 @@ static void nautilus_window_destroy (NautilusWindow *window) if(window->statusbar_clear_id) g_source_remove(window->statusbar_clear_id); - if(--window_count <= 0) - { - gtk_main_quit(); - } + if(GTK_OBJECT_CLASS(klass->parent_class)->destroy) + GTK_OBJECT_CLASS(klass->parent_class)->destroy(GTK_OBJECT(window)); } GtkWidget * diff --git a/src/nautilus-window.h b/src/nautilus-window.h index 097b9973e..0bc2a70b7 100644 --- a/src/nautilus-window.h +++ b/src/nautilus-window.h @@ -53,8 +53,11 @@ typedef struct { void (* request_status_change) (NautilusWindow *window, Nautilus_StatusRequestInfo *loc, NautilusView *requesting_view); + void (* request_progress_change) (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view); - guint window_signals[3]; + guint window_signals[4]; } NautilusWindowClass; struct _NautilusWindow { @@ -97,6 +100,4 @@ void nautilus_window_allow_up (NautilusWindow *window, gboolean allow); void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); - - #endif diff --git a/src/nautilus.h b/src/nautilus.h index 326cce4e4..fda8e734d 100644 --- a/src/nautilus.h +++ b/src/nautilus.h @@ -12,7 +12,6 @@ #include "ntl-window-state.h" #include "ntl-window-msgs.h" #include "ntl-view.h" -#include "ntl-view-frame-svr.h" #include "ntl-meta-view.h" #include "ntl-content-view.h" #include "ntl-uri-map.h" diff --git a/src/ntl-content-view.c b/src/ntl-content-view.c index f78985253..ad1a864e3 100644 --- a/src/ntl-content-view.c +++ b/src/ntl-content-view.c @@ -89,9 +89,3 @@ static void nautilus_content_view_init (NautilusContentView *view) { } - -NautilusContentView * -nautilus_content_view_new(void) -{ - return NAUTILUS_CONTENT_VIEW (gtk_type_new (nautilus_content_view_get_type())); -} diff --git a/src/ntl-content-view.h b/src/ntl-content-view.h index efeecf328..65848da1c 100644 --- a/src/ntl-content-view.h +++ b/src/ntl-content-view.h @@ -46,6 +46,5 @@ typedef struct { } NautilusContentView; GtkType nautilus_content_view_get_type(void); -NautilusContentView *nautilus_content_view_new(void); #endif diff --git a/src/ntl-meta-view.c b/src/ntl-meta-view.c index 0c6202257..7d31d2788 100644 --- a/src/ntl-meta-view.c +++ b/src/ntl-meta-view.c @@ -16,7 +16,7 @@ * General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this library; if not, write to the Free Software + * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Author: Elliot Lee @@ -24,7 +24,8 @@ */ /* ntl-meta-view.c: Implementation of the object representing a meta/navigation view. */ -#include "ntl-meta-view.h" +#include "nautilus.h" +#include "ntl-view-private.h" #include static PortableServer_ServantBase__epv base_epv = { NULL, NULL, NULL }; @@ -75,13 +76,15 @@ nautilus_meta_view_class_init (NautilusMetaViewClass *klass) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; + NautilusViewClass *view_class; object_class = (GtkObjectClass*) klass; widget_class = (GtkWidgetClass*) klass; + view_class = (NautilusViewClass*) klass; klass->parent_class = gtk_type_class (gtk_type_parent (object_class->type)); - NAUTILUS_VIEW_CLASS(klass)->servant_init_func = POA_Nautilus_MetaViewFrame__init; - NAUTILUS_VIEW_CLASS(klass)->servant_destroy_func = POA_Nautilus_MetaViewFrame__fini; - NAUTILUS_VIEW_CLASS(klass)->vepv = &impl_Nautilus_MetaViewFrame_vepv; + view_class->servant_init_func = POA_Nautilus_MetaViewFrame__init; + view_class->servant_destroy_func = POA_Nautilus_MetaViewFrame__fini; + view_class->vepv = &impl_Nautilus_MetaViewFrame_vepv; } static void @@ -89,47 +92,22 @@ nautilus_meta_view_init (NautilusMetaView *view) { } -NautilusMetaView * -nautilus_meta_view_new(void) -{ - return NAUTILUS_META_VIEW (gtk_type_new (nautilus_meta_view_get_type())); -} - const char * nautilus_meta_view_get_label(NautilusMetaView *nview) { NautilusView *view = NAUTILUS_VIEW(nview); - GnomePropertyBagClient *bc; - GNOME_Property prop; - CORBA_Environment ev; char *retval = NULL; - CORBA_any *anyval; - GnomeControlFrame *control_frame; - - g_return_val_if_fail(view->type != NV_NONE, NULL); - - control_frame = GNOME_CONTROL_FRAME(nautilus_view_get_control_frame(view)); - bc = gnome_control_frame_get_control_property_bag(control_frame); - g_return_val_if_fail(bc, NULL); - prop = gnome_property_bag_client_get_property(bc, "label"); - CORBA_exception_init(&ev); - - if(CORBA_Object_is_nil(prop, &ev)) - goto out; - - anyval = GNOME_Property_get_value(prop, &ev); - if(ev._major != CORBA_NO_EXCEPTION) - goto out; + if(view->component_class->get_label) + { + CORBA_Environment ev; - if(!CORBA_TypeCode_equal(anyval->_type, TC_string, &ev)) - goto out; + CORBA_exception_init(&ev); - retval = g_strdup(*(CORBA_char **)anyval->_value); + retval = view->component_class->get_label(view, &ev); - CORBA_free(anyval); + CORBA_exception_free(&ev); + } - out: - CORBA_exception_free(&ev); return retval; } diff --git a/src/ntl-view-bonobo-control.c b/src/ntl-view-bonobo-control.c new file mode 100644 index 000000000..9743db074 --- /dev/null +++ b/src/ntl-view-bonobo-control.c @@ -0,0 +1,64 @@ +#include + +#include "nautilus.h" +#include "ntl-view-private.h" + +typedef struct { + GnomeObject *control_frame; +} BonoboControlInfo; + +static void +destroy_bonobo_control_view(NautilusView *view, CORBA_Environment *ev) +{ + BonoboControlInfo *bci = view->component_data; + g_free(bci); +} + +static void +nautilus_view_activate_uri(GnomeControlFrame *frame, const char *uri, gboolean relative, NautilusView *view) +{ + Nautilus_NavigationRequestInfo nri; + g_assert(!relative); + + memset(&nri, 0, sizeof(nri)); + nri.requested_uri = (char *)uri; + nautilus_view_request_location_change(view, &nri); +} + +static gboolean +bonobo_control_try_load_client(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev) +{ + BonoboControlInfo *bci; + + view->component_data = bci = g_new0(BonoboControlInfo, 1); + + bci->control_frame = GNOME_OBJECT(gnome_control_frame_new()); + gnome_object_add_interface(GNOME_OBJECT(bci->control_frame), view->view_frame); + + gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(bci->control_frame), obj); + + view->client_widget = gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(bci->control_frame)); + + gtk_signal_connect(GTK_OBJECT(bci->control_frame), + "activate_uri", GTK_SIGNAL_FUNC(nautilus_view_activate_uri), view); + + return TRUE; +} + +static char * +bonobo_control_get_label(NautilusView *view, CORBA_Environment *ev) +{ + return g_strdup_printf(_("Control %p"), view); +} + +NautilusViewComponentType bonobo_control_component_type = { + "IDL:GNOME/Control:1.0", + &bonobo_control_try_load_client, /* try_load */ + &destroy_bonobo_control_view, /* destroy */ + NULL, /* show_properties */ + NULL, /* save_state */ + NULL, /* load_state */ + NULL, /* notify_location_change */ + NULL, /* notify_selection_change */ + &bonobo_control_get_label /* get_label */ +}; diff --git a/src/ntl-view-bonobo-subdoc.c b/src/ntl-view-bonobo-subdoc.c new file mode 100644 index 000000000..47d44b79f --- /dev/null +++ b/src/ntl-view-bonobo-subdoc.c @@ -0,0 +1,79 @@ +#include + +#include "nautilus.h" +#include "ntl-view-private.h" + +typedef struct { + GnomeObject *container, *client_site, *view_frame; +} BonoboSubdocInfo; + +static void +destroy_bonobo_subdoc_view(NautilusView *view, CORBA_Environment *ev) +{ + BonoboSubdocInfo *bsi = view->component_data; + + g_free(bsi); +} + +static void +bonobo_subdoc_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *real_nav_ctx, CORBA_Environment *ev) +{ + GNOME_PersistFile persist; + persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistFile:1.0", + NULL); + if(!CORBA_Object_is_nil(persist, ev)) + { + GNOME_PersistFile_load(persist, real_nav_ctx->actual_uri, ev); + GNOME_Unknown_unref(persist, ev); + CORBA_Object_release(persist, ev); + } + else if((persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistStream:1.0", + NULL)) + && !CORBA_Object_is_nil(persist, ev)) + { + GnomeStream *stream; + + stream = gnome_stream_fs_open(real_nav_ctx->actual_uri, GNOME_Storage_READ); + GNOME_PersistStream_load (persist, + (GNOME_Stream) gnome_object_corba_objref (GNOME_OBJECT (stream)), + ev); + GNOME_Unknown_unref(persist, ev); + CORBA_Object_release(persist, ev); + } +} + +static gboolean +bonobo_subdoc_try_load_client(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev) +{ + BonoboSubdocInfo *bsi; + + view->component_data = bsi = g_new0(BonoboSubdocInfo, 1); + + bsi->container = GNOME_OBJECT(gnome_container_new()); + gnome_object_add_interface(GNOME_OBJECT(bsi->container), view->view_frame); + + bsi->client_site = + GNOME_OBJECT(gnome_client_site_new(GNOME_CONTAINER(bsi->container))); + gnome_client_site_bind_embeddable(GNOME_CLIENT_SITE(bsi->client_site), view->client_object); + gnome_container_add(GNOME_CONTAINER(bsi->container), bsi->client_site); + + bsi->view_frame = GNOME_OBJECT(gnome_client_site_new_view(GNOME_CLIENT_SITE(bsi->client_site))); + + g_assert(bsi->view_frame); + + view->client_widget = gnome_view_frame_get_wrapper(GNOME_VIEW_FRAME(bsi->view_frame)); + + return TRUE; +} + +NautilusViewComponentType bonobo_subdoc_component_type = { + "IDL:GNOME/Embeddable:1.0", + &bonobo_subdoc_try_load_client, /* try_load */ + &destroy_bonobo_subdoc_view, /* destroy */ + NULL, /* show_properties */ + NULL, /* save_state */ + NULL, /* load_state */ + bonobo_subdoc_notify_location_change, /* notify_location_change */ + NULL, /* notify_selection_change */ + NULL, /* get_label */ +}; diff --git a/src/ntl-view-frame-svr.c b/src/ntl-view-frame-svr.c index 2457720eb..fb5784709 100644 --- a/src/ntl-view-frame-svr.c +++ b/src/ntl-view-frame-svr.c @@ -26,6 +26,7 @@ representing a data view frame. */ #include "nautilus.h" +#include "ntl-view-private.h" typedef struct { POA_Nautilus_ViewFrame servant; @@ -50,20 +51,10 @@ static void impl_Nautilus_ViewFrame_request_status_change(impl_POA_Nautilus_ViewFrame * servant, Nautilus_StatusRequestInfo * statinfo, CORBA_Environment * ev); - -static void -nautilus_view_request_location_change(NautilusView *view, - Nautilus_NavigationRequestInfo *loc); - static void -nautilus_view_request_selection_change (NautilusView *view, - Nautilus_SelectionRequestInfo *loc); - -static void -nautilus_view_request_status_change (NautilusView *view, - Nautilus_StatusRequestInfo *loc); - - +impl_Nautilus_ViewFrame_request_progress_change(impl_POA_Nautilus_ViewFrame * servant, + Nautilus_ProgressRequestInfo * proginfo, + CORBA_Environment * ev); POA_Nautilus_ViewFrame__epv impl_Nautilus_ViewFrame_epv = { @@ -71,7 +62,8 @@ POA_Nautilus_ViewFrame__epv impl_Nautilus_ViewFrame_epv = (void(*))&impl_Nautilus_ViewFrame__get_main_window, (void(*))&impl_Nautilus_ViewFrame_request_status_change, (void(*))&impl_Nautilus_ViewFrame_request_location_change, - (void(*))&impl_Nautilus_ViewFrame_request_selection_change + (void(*))&impl_Nautilus_ViewFrame_request_selection_change, + (void(*))&impl_Nautilus_ViewFrame_request_progress_change }; static PortableServer_ServantBase__epv base_epv = { NULL, NULL, NULL }; @@ -142,14 +134,7 @@ impl_Nautilus_ViewFrame_request_location_change(impl_POA_Nautilus_ViewFrame * se Nautilus_NavigationRequestInfo * navinfo, CORBA_Environment * ev) { - NautilusView *view; - - view = servant->view; - g_return_if_fail (view != NULL); - g_return_if_fail (NAUTILUS_IS_VIEW (view)); - g_return_if_fail (NAUTILUS_VIEW (view)->main_window != NULL); - - nautilus_window_request_location_change(NAUTILUS_WINDOW(view->main_window), navinfo, GTK_WIDGET(view)); + nautilus_view_request_location_change(servant->view, navinfo); } static void @@ -157,9 +142,8 @@ impl_Nautilus_ViewFrame_request_selection_change(impl_POA_Nautilus_ViewFrame * s Nautilus_SelectionRequestInfo * selinfo, CORBA_Environment * ev) { - nautilus_window_request_selection_change(NAUTILUS_WINDOW(servant->view->main_window), - selinfo, - GTK_WIDGET(servant->view)); + nautilus_view_request_selection_change(servant->view, + selinfo); } static void @@ -167,8 +151,41 @@ impl_Nautilus_ViewFrame_request_status_change(impl_POA_Nautilus_ViewFrame * serv Nautilus_StatusRequestInfo * statinfo, CORBA_Environment * ev) { - nautilus_window_request_status_change(NAUTILUS_WINDOW(servant->view->main_window), - statinfo, - GTK_WIDGET(servant->view)); + nautilus_view_request_status_change(servant->view, statinfo); +} + +static void +impl_Nautilus_ViewFrame_request_progress_change(impl_POA_Nautilus_ViewFrame * servant, + Nautilus_ProgressRequestInfo * proginfo, + CORBA_Environment * ev) +{ + nautilus_view_request_progress_change(servant->view, proginfo); +} + +void +nautilus_view_request_location_change(NautilusView *view, + Nautilus_NavigationRequestInfo *loc) +{ + nautilus_window_request_location_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); } +void +nautilus_view_request_selection_change (NautilusView *view, + Nautilus_SelectionRequestInfo *loc) +{ + nautilus_window_request_selection_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); +} + +void +nautilus_view_request_status_change (NautilusView *view, + Nautilus_StatusRequestInfo *loc) +{ + nautilus_window_request_status_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); +} + +void +nautilus_view_request_progress_change(NautilusView *view, + Nautilus_ProgressRequestInfo *loc) +{ + nautilus_window_request_progress_change(NAUTILUS_WINDOW(view->main_window), loc, GTK_WIDGET(view)); +} diff --git a/src/ntl-view-frame-svr.h b/src/ntl-view-frame-svr.h deleted file mode 100644 index 38c6c5dee..000000000 --- a/src/ntl-view-frame-svr.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ - -/* - * Nautilus - * - * Copyright (C) 1999 Red Hat, Inc. - * - * This library 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 library 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 library; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Author: Elliot Lee - * - */ -/* ntl-view-frame-svr.h: CORBA server implementation of the object - representing a data view frame. */ - - -#ifndef __NAUTILUS_VIEW_FRAME_SVR_H__ -#define __NAUTILUS_VIEW_FRAME_SVR_H__ - -#include "nautilus.h" - -extern POA_Nautilus_ViewFrame__vepv impl_Nautilus_ViewFrame_vepv; -GnomeObject *impl_Nautilus_ViewFrame__create(NautilusView *view, CORBA_Environment * ev); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __NAUTILUS_VIEW_H__ */ - diff --git a/src/ntl-view-nautilus.c b/src/ntl-view-nautilus.c new file mode 100644 index 000000000..455754e1f --- /dev/null +++ b/src/ntl-view-nautilus.c @@ -0,0 +1,136 @@ +#include + +#include "nautilus.h" +#include "ntl-view-private.h" + +typedef struct { + GnomeObject *control_frame; + CORBA_Object view_client; +} NautilusViewInfo; + +static gboolean +nautilus_view_try_load_client(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev) +{ + GNOME_Control control; + NautilusViewInfo *nvi; + + nvi = view->component_data = g_new0(NautilusViewInfo, 1); + + control = GNOME_Unknown_query_interface(obj, "IDL:GNOME/Control:1.0", ev); + if(ev->_major != CORBA_NO_EXCEPTION) + control = CORBA_OBJECT_NIL; + + if(CORBA_Object_is_nil(control, ev)) + goto out; + + nvi->view_client = CORBA_Object_duplicate(obj, ev); + GNOME_Unknown_ref(nvi->view_client, ev); + + nvi->control_frame = GNOME_OBJECT(gnome_control_frame_new()); + gnome_object_add_interface(GNOME_OBJECT(nvi->control_frame), view->view_frame); + + gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(nvi->control_frame), control); + view->client_widget = gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(nvi->control_frame)); + + GNOME_Unknown_unref(control, ev); + CORBA_Object_release(control, ev); + + return TRUE; + + out: + g_free(nvi); + + return FALSE; +} + +static void +destroy_nautilus_view(NautilusView *view, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + CORBA_Object_release(nvi->view_client, ev); + + g_free(nvi); +} + +static void +nv_show_properties(NautilusView *view, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_show_properties(nvi->view_client, ev); +} + +static void +nv_save_state(NautilusView *view, const char *config_path, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_save_state(nvi->view_client, config_path, ev); +} + +static void +nv_load_state(NautilusView *view, const char *config_path, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_load_state(nvi->view_client, config_path, ev); +} + +static void +nv_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *nav_ctx, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_notify_location_change(nvi->view_client, nav_ctx, ev); +} + +static void +nv_notify_selection_change(NautilusView *view, Nautilus_SelectionInfo *nav_ctx, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + + Nautilus_View_notify_selection_change(nvi->view_client, nav_ctx, ev); +} + +static char * +nv_get_label(NautilusView *view, CORBA_Environment *ev) +{ + NautilusViewInfo *nvi = view->component_data; + GnomePropertyBagClient *bc; + GNOME_Property prop; + char *retval = NULL; + CORBA_any *anyval; + GnomeControlFrame *control_frame; + + control_frame = GNOME_CONTROL_FRAME(nvi->control_frame); + bc = gnome_control_frame_get_control_property_bag(control_frame); + g_return_val_if_fail(bc, NULL); + + prop = gnome_property_bag_client_get_property(bc, "label"); + + if(CORBA_Object_is_nil(prop, ev)) + return NULL; + + anyval = GNOME_Property_get_value(prop, ev); + if(ev->_major == CORBA_NO_EXCEPTION && CORBA_TypeCode_equal(anyval->_type, TC_string, ev)) + { + retval = g_strdup(*(CORBA_char **)anyval->_value); + + CORBA_free(anyval); + } + + return retval; +} + +NautilusViewComponentType nautilus_view_component_type = { + "IDL:Nautilus/View:1.0", + &nautilus_view_try_load_client, /* try_load */ + &destroy_nautilus_view, /* destroy */ + &nv_show_properties, /* show_properties */ + &nv_save_state, /* save_state */ + &nv_load_state, /* load_state */ + &nv_notify_location_change, /* notify_location_change */ + &nv_notify_selection_change, /* notify_selection_change */ + &nv_get_label /* get_label */ +}; diff --git a/src/ntl-view-private.h b/src/ntl-view-private.h new file mode 100644 index 000000000..4d85a6e0b --- /dev/null +++ b/src/ntl-view-private.h @@ -0,0 +1,54 @@ +/* + * Nautilus + * + * Copyright (C) 1999 Red Hat, Inc. + * + * This library 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 library 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 library; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Elliot Lee + * + */ +/* ntl-view-private.h: Internals of the view proxy that are shared between different implementation files */ +#ifndef NTL_VIEW_PRIVATE_H +#define NTL_VIEW_PRIVATE_H 1 + +#include "nautilus.h" + +extern POA_Nautilus_ViewFrame__vepv impl_Nautilus_ViewFrame_vepv; +GnomeObject *impl_Nautilus_ViewFrame__create(NautilusView *view, CORBA_Environment * ev); + +void nautilus_view_request_location_change(NautilusView *view, + Nautilus_NavigationRequestInfo *loc); +void nautilus_view_request_selection_change(NautilusView *view, + Nautilus_SelectionRequestInfo *loc); +void nautilus_view_request_status_change(NautilusView *view, + Nautilus_StatusRequestInfo *loc); +void nautilus_view_request_progress_change(NautilusView *view, + Nautilus_ProgressRequestInfo *loc); + +struct _NautilusViewComponentType { + const char *primary_repoid; + gboolean (* try_load)(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev); + void (* destroy) (NautilusView *view, CORBA_Environment *ev); + void (* show_properties)(NautilusView *view, CORBA_Environment *ev); + void (* save_state)(NautilusView *view, const char *config_path, CORBA_Environment *ev); + void (* load_state)(NautilusView *view, const char *config_path, CORBA_Environment *ev); + void (* notify_location_change)(NautilusView *view, Nautilus_NavigationInfo *nav_ctx, CORBA_Environment *ev); + void (* notify_selection_change)(NautilusView *view, Nautilus_SelectionInfo *nav_ctx, CORBA_Environment *ev); + + char * (* get_label)(NautilusView *view, CORBA_Environment *ev); +}; + +#endif diff --git a/src/ntl-view.c b/src/ntl-view.c index 180b8dc5a..aa611366f 100644 --- a/src/ntl-view.c +++ b/src/ntl-view.c @@ -29,6 +29,7 @@ #include #include #include "nautilus.h" +#include "ntl-view-private.h" enum { NOTIFY_LOCATION_CHANGE, @@ -42,18 +43,19 @@ enum { static void nautilus_view_init (NautilusView *view); +static void nautilus_view_destroy (GtkObject *view); static void nautilus_view_constructed(NautilusView *view); static void nautilus_view_class_init (NautilusViewClass *klass); static void nautilus_view_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); + GtkArg *arg, + guint arg_id); static void nautilus_view_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); + GtkArg *arg, + guint arg_id); static void nautilus_view_size_request (GtkWidget *widget, GtkRequisition *requisition); static void nautilus_view_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); + GtkAllocation *allocation); static void nautilus_view_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *nav_context); static void nautilus_view_notify_selection_change(NautilusView *view, @@ -65,24 +67,24 @@ static void nautilus_view_show_properties(NautilusView *view); GtkType nautilus_view_get_type (void) { - static GtkType view_type = 0; - - if (!view_type) { - const GtkTypeInfo view_info = { - "NautilusView", - sizeof (NautilusView), - sizeof (NautilusViewClass), - (GtkClassInitFunc) nautilus_view_class_init, - (GtkObjectInitFunc) nautilus_view_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - view_type = gtk_type_unique (gtk_bin_get_type(), &view_info); - } + static GtkType view_type = 0; + + if (!view_type) { + const GtkTypeInfo view_info = { + "NautilusView", + sizeof (NautilusView), + sizeof (NautilusViewClass), + (GtkClassInitFunc) nautilus_view_class_init, + (GtkObjectInitFunc) nautilus_view_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + view_type = gtk_type_unique (gtk_bin_get_type(), &view_info); + } - return view_type; + return view_type; } #if 0 @@ -97,13 +99,13 @@ gtk_marshal_NONE__BOXED_OBJECT_BOXED (GtkObject * object, gpointer func_data, GtkArg * args) { - GtkSignal_NONE__BOXED_OBJECT_BOXED rfunc; - rfunc = (GtkSignal_NONE__BOXED_OBJECT_BOXED) func; - (*rfunc) (object, - GTK_VALUE_BOXED (args[0]), - GTK_VALUE_OBJECT (args[1]), - GTK_VALUE_BOXED (args[2]), - func_data); + GtkSignal_NONE__BOXED_OBJECT_BOXED rfunc; + rfunc = (GtkSignal_NONE__BOXED_OBJECT_BOXED) func; + (*rfunc) (object, + GTK_VALUE_BOXED (args[0]), + GTK_VALUE_OBJECT (args[1]), + GTK_VALUE_BOXED (args[2]), + func_data); } #endif @@ -115,6 +117,7 @@ nautilus_view_class_init (NautilusViewClass *klass) int i; object_class = (GtkObjectClass*) klass; + object_class->destroy = nautilus_view_destroy; object_class->set_arg = nautilus_view_set_arg; object_class->get_arg = nautilus_view_get_arg; @@ -169,7 +172,7 @@ nautilus_view_class_init (NautilusViewClass *klass) gtk_object_add_arg_type ("NautilusView::main_window", GTK_TYPE_OBJECT, - GTK_ARG_READWRITE|GTK_ARG_CONSTRUCT, + GTK_ARG_READWRITE, ARG_MAIN_WINDOW); klass->num_construct_args++; } @@ -206,7 +209,43 @@ static void nautilus_view_init (NautilusView *view) { GTK_WIDGET_SET_FLAGS (view, GTK_NO_WINDOW); - view->type = NV_NONE; +} + +static void +nautilus_view_destroy_client(NautilusView *view) +{ + if(!view->component_class) + return; + + g_free(view->iid); view->iid = NULL; + + gnome_object_destroy(GNOME_OBJECT(view->client_object)); view->client_object = NULL; + + gtk_container_remove(GTK_CONTAINER(view), view->client_widget); view->client_widget = NULL; + + if(view->component_class->destroy) + { + CORBA_Environment ev; + CORBA_exception_init(&ev); + view->component_class->destroy(view, &ev); + CORBA_exception_free(&ev); + } + + gnome_object_destroy(view->view_frame); view->view_frame = NULL; + + view->component_class = NULL; + view->component_data = NULL; +} + +static void +nautilus_view_destroy(GtkObject *view) +{ + NautilusViewClass *klass = NAUTILUS_VIEW_CLASS(view->klass); + + nautilus_view_destroy_client(NAUTILUS_VIEW(view)); + + if(GTK_OBJECT_CLASS(klass->parent_class)->destroy) + GTK_OBJECT_CLASS(klass->parent_class)->destroy(view); } static void @@ -267,179 +306,28 @@ nautilus_view_size_allocate (GtkWidget *widget, gtk_widget_size_allocate (bin->child, &child_allocation); } -static void -nautilus_view_activate_uri(GnomeControlFrame *frame, const char *uri, gboolean relative, NautilusView *view) -{ - Nautilus_NavigationRequestInfo nri; - g_assert(!relative); - - memset(&nri, 0, sizeof(nri)); - nri.requested_uri = (char *)uri; - nautilus_window_request_location_change(NAUTILUS_WINDOW(view->main_window), &nri, GTK_WIDGET(view)); -} - -static void -destroy_nautilus_view(NautilusView *view) -{ - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - CORBA_Object_release(view->u.nautilus_view_info.view_client, &ev); - gnome_object_destroy(view->u.nautilus_view_info.control_frame); -} - -static void -destroy_bonobo_subdoc_view(NautilusView *view) -{ - gnome_object_destroy(view->u.bonobo_subdoc_info.container); -} - -static void -destroy_bonobo_control_view(NautilusView *view) -{ - gnome_object_destroy(view->u.bonobo_control_info.control_frame); -} - - -static gboolean -bonobo_control_try_load_client(NautilusView *view, CORBA_Object obj) -{ - GNOME_Control control; - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - control = (GNOME_Control) obj; - - view->u.nautilus_view_info.control_frame = GNOME_OBJECT(gnome_control_frame_new()); - gnome_object_add_interface(GNOME_OBJECT(view->u.bonobo_control_info.control_frame), view->view_frame); - - gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(view->u.bonobo_control_info.control_frame), - control); - GNOME_Unknown_unref(control, &ev); - view->client_widget = - gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(view->u.bonobo_control_info.control_frame)); - - view->type = NV_BONOBO_CONTROL; - gtk_signal_connect(GTK_OBJECT(view->u.bonobo_control_info.control_frame), - "activate_uri", GTK_SIGNAL_FUNC(nautilus_view_activate_uri), view); - - CORBA_exception_free(&ev); - - return TRUE; -} - - -static gboolean -bonobo_subdoc_try_load_client(NautilusView *view, CORBA_Object obj) -{ - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - view->type = NV_BONOBO_SUBDOC; - - view->u.bonobo_subdoc_info.container = GNOME_OBJECT(gnome_container_new()); - gnome_object_add_interface(GNOME_OBJECT(view->u.bonobo_subdoc_info.container), view->view_frame); - - view->u.bonobo_subdoc_info.client_site = - GNOME_OBJECT(gnome_client_site_new(GNOME_CONTAINER(view->u.bonobo_subdoc_info.container))); - gnome_client_site_bind_embeddable(GNOME_CLIENT_SITE(view->u.bonobo_subdoc_info.client_site), - view->client_object); - gnome_container_add(GNOME_CONTAINER(view->u.bonobo_subdoc_info.container), view->u.bonobo_subdoc_info.client_site); - view->u.bonobo_subdoc_info.view_frame = - GNOME_OBJECT(gnome_client_site_new_view(GNOME_CLIENT_SITE(view->u.bonobo_subdoc_info.client_site))); - if(!view->u.bonobo_subdoc_info.view_frame) - { - gnome_object_destroy(GNOME_OBJECT(view->client_object)); - gnome_object_destroy(view->u.bonobo_subdoc_info.container); - gnome_object_destroy(view->u.bonobo_subdoc_info.client_site); - GNOME_Unknown_unref(obj, &ev); - CORBA_Object_release(obj, &ev); - gnome_object_destroy(view->view_frame); - view->type = NV_NONE; - return FALSE; - } - - view->client_widget = gnome_view_frame_get_wrapper(GNOME_VIEW_FRAME(view->u.bonobo_subdoc_info.view_frame)); - - CORBA_exception_free(&ev); - - return TRUE; -} - - -static gboolean -nautilus_view_try_load_client(NautilusView *view, CORBA_Object obj) -{ - GNOME_Control control; - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - view->u.nautilus_view_info.view_client = obj; - - view->type = NV_NAUTILUS_VIEW; - control = - GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), "IDL:GNOME/Control:1.0", &ev); - if(ev._major != CORBA_NO_EXCEPTION) - control = CORBA_OBJECT_NIL; - - if(CORBA_Object_is_nil(control, &ev)) - { - gnome_object_unref(GNOME_OBJECT(view->client_object)); - GNOME_Unknown_unref(view->u.nautilus_view_info.view_client, &ev); - CORBA_Object_release(view->u.nautilus_view_info.view_client, &ev); - gnome_object_destroy(view->view_frame); - view->type = NV_NONE; - return FALSE; - } - - view->u.nautilus_view_info.control_frame = GNOME_OBJECT(gnome_control_frame_new()); - gnome_object_add_interface(GNOME_OBJECT(view->u.nautilus_view_info.control_frame), view->view_frame); - - gnome_control_frame_bind_to_control(GNOME_CONTROL_FRAME(view->u.nautilus_view_info.control_frame), control); - GNOME_Unknown_unref(control, &ev); - view->client_widget = gnome_control_frame_get_widget(GNOME_CONTROL_FRAME(view->u.nautilus_view_info.control_frame)); - - CORBA_exception_free(&ev); - - return TRUE; -} +extern NautilusViewComponentType nautilus_view_component_type; /* ntl-view-nautilus.c */ +extern NautilusViewComponentType bonobo_subdoc_component_type; /* ntl-view-bonobo-subdoc.c */ +extern NautilusViewComponentType bonobo_control_component_type; /* ntl-view-bonobo-control.c */ gboolean /* returns TRUE if successful */ nautilus_view_load_client(NautilusView *view, const char *iid) { CORBA_Object obj; CORBA_Environment ev; + int i; + NautilusViewComponentType *component_types[] = { + &nautilus_view_component_type, + &bonobo_subdoc_component_type, + &bonobo_control_component_type, + NULL + }; g_return_val_if_fail(iid, FALSE); CORBA_exception_init(&ev); - if(view->type != NV_NONE) - { - g_free(view->iid); view->iid = NULL; - gtk_container_remove(GTK_CONTAINER(view), view->client_widget); view->client_widget = NULL; - - switch(view->type) - { - case NV_NAUTILUS_VIEW: - destroy_nautilus_view(view); - break; - case NV_BONOBO_SUBDOC: - destroy_bonobo_subdoc_view(view); - break; - case NV_BONOBO_CONTROL: - destroy_bonobo_control_view(view); - break; - default: - break; - } - view->type = NV_NONE; - gnome_object_destroy(GNOME_OBJECT(view->client_object)); view->client_object = NULL; - } + nautilus_view_destroy_client(view); view->client_object = gnome_object_activate(iid, 0); if(!view->client_object) @@ -449,59 +337,29 @@ nautilus_view_load_client(NautilusView *view, const char *iid) /* Now figure out which type of embedded object it is: */ - /* Is it a Nautilus View? */ - obj = GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), - "IDL:Nautilus/View:1.0", &ev); - if(ev._major != CORBA_NO_EXCEPTION) - obj = CORBA_OBJECT_NIL; - - if(!CORBA_Object_is_nil(obj, &ev)) - { - if (!nautilus_view_try_load_client(view, obj)) - { - return FALSE; - } - } - else + for(i = 0; component_types[i] && !view->component_class; i++) { - /* Is it a Bonobo Embeddable? */ - obj = - GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), - "IDL:GNOME/Embeddable:1.0", &ev); - + obj = GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), + component_types[i]->primary_repoid, &ev); if(ev._major != CORBA_NO_EXCEPTION) obj = CORBA_OBJECT_NIL; - if(!CORBA_Object_is_nil(obj, &ev)) - { - if (!bonobo_subdoc_try_load_client(view, obj)) - { - g_warning("We don't know how to embed implementation %s", iid); - return FALSE; - } - } - else - { - /* Is it a Bonobo Control? */ - obj = - GNOME_Unknown_query_interface(gnome_object_corba_objref(GNOME_OBJECT(view->client_object)), - "IDL:GNOME/Control:1.0", &ev); - if(ev._major != CORBA_NO_EXCEPTION) - obj= CORBA_OBJECT_NIL; - - if(!CORBA_Object_is_nil(obj, &ev)) - { - if (!bonobo_control_try_load_client(view, obj)) { - return FALSE; - } else { - gnome_object_destroy(GNOME_OBJECT(view->client_object)); - gnome_object_destroy(view->view_frame); - view->type = NV_NONE; - return FALSE; - } - - } - } + if(CORBA_Object_is_nil(obj, &ev)) + continue; + + if(component_types[i]->try_load(view, obj, &ev)) + view->component_class = component_types[i]; + + GNOME_Unknown_unref(obj, &ev); + CORBA_Object_release(obj, &ev); + } + + if (!view->component_class) + { + /* Nothing matched */ + nautilus_view_destroy_client(view); + + return FALSE; } view->iid = g_strdup(iid); @@ -513,57 +371,12 @@ nautilus_view_load_client(NautilusView *view, const char *iid) return TRUE; } -static void -nautilus_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *real_nav_ctx) -{ - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - Nautilus_View_notify_location_change(view->u.nautilus_view_info.view_client, real_nav_ctx, &ev); - - CORBA_exception_free(&ev); -} - -static void -bonobo_subdoc_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *real_nav_ctx) -{ - GNOME_PersistFile persist; - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistFile:1.0", - NULL); - if(!CORBA_Object_is_nil(persist, &ev)) - { - GNOME_PersistFile_load(persist, real_nav_ctx->actual_uri, &ev); - GNOME_Unknown_unref(persist, &ev); - CORBA_Object_release(persist, &ev); - } - else if((persist = gnome_object_client_query_interface(view->client_object, "IDL:GNOME/PersistStream:1.0", - NULL)) - && !CORBA_Object_is_nil(persist, &ev)) - { - GnomeStream *stream; - - stream = gnome_stream_fs_open(real_nav_ctx->actual_uri, GNOME_Storage_READ); - GNOME_PersistStream_load (persist, - (GNOME_Stream) gnome_object_corba_objref (GNOME_OBJECT (stream)), - &ev); - GNOME_Unknown_unref(persist, &ev); - CORBA_Object_release(persist, &ev); - } - - CORBA_exception_free(&ev); -} - - static void nautilus_view_notify_location_change(NautilusView *view, Nautilus_NavigationInfo *nav_context) { Nautilus_NavigationInfo real_nav_ctx; + CORBA_Environment ev; real_nav_ctx = *nav_context; g_assert(real_nav_ctx.requested_uri); @@ -575,19 +388,10 @@ nautilus_view_notify_location_change(NautilusView *view, if(!real_nav_ctx.actual_referring_uri) real_nav_ctx.actual_referring_uri = real_nav_ctx.referring_uri; DEFAULT_STRING(referring_content_type); - switch(view->type) - { - case NV_NAUTILUS_VIEW: - nautilus_notify_location_change(view, &real_nav_ctx); - break; - case NV_BONOBO_SUBDOC: - bonobo_subdoc_notify_location_change(view, &real_nav_ctx); - break; - default: - g_warning("Unhandled view type %d", view->type); - break; - } - + CORBA_exception_init(&ev); + if(view->component_class->notify_location_change) + view->component_class->notify_location_change(view, &real_nav_ctx, &ev); + CORBA_exception_free(&ev); } static void @@ -597,9 +401,8 @@ nautilus_view_notify_selection_change(NautilusView *view, CORBA_Environment ev; CORBA_exception_init(&ev); - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - - Nautilus_View_notify_selection_change(view->u.nautilus_view_info.view_client, nav_context, &ev); + if(view->component_class->notify_selection_change) + view->component_class->notify_selection_change(view, nav_context, &ev); CORBA_exception_free(&ev); } @@ -609,11 +412,10 @@ nautilus_view_load_state(NautilusView *view, const char *config_path) { CORBA_Environment ev; - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - CORBA_exception_init(&ev); - Nautilus_View_load_state(view->u.nautilus_view_info.view_client, (char *)config_path, &ev); + if(view->component_class->load_state) + view->component_class->load_state(view, config_path, &ev); CORBA_exception_free(&ev); } @@ -623,11 +425,10 @@ nautilus_view_save_state(NautilusView *view, const char *config_path) { CORBA_Environment ev; - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - CORBA_exception_init(&ev); - Nautilus_View_save_state(view->u.nautilus_view_info.view_client, (char *)config_path, &ev); + if(view->component_class->save_state) + view->component_class->save_state(view, config_path, &ev); CORBA_exception_free(&ev); } @@ -638,9 +439,8 @@ nautilus_view_show_properties(NautilusView *view) CORBA_Environment ev; CORBA_exception_init(&ev); - g_return_if_fail(view->type == NV_NAUTILUS_VIEW); - - Nautilus_View_show_properties(view->u.nautilus_view_info.view_client, &ev); + if(view->component_class->show_properties) + view->component_class->show_properties(view, &ev); CORBA_exception_free(&ev); } @@ -654,51 +454,7 @@ nautilus_view_get_iid(NautilusView *view) CORBA_Object nautilus_view_get_client_objref(NautilusView *view) { - if(view->type == NV_NAUTILUS_VIEW) - return view->u.nautilus_view_info.view_client; - else - return CORBA_OBJECT_NIL; -} - -static GnomeObject * -nautilus_get_control_frame(NautilusView *view) -{ - return view->u.nautilus_view_info.control_frame; -} - -static GnomeObject * -bonobo_control_get_control_frame(NautilusView *view) -{ - return view->u.bonobo_control_info.control_frame; -} - -static GnomeObject * -bonobo_subdoc_get_control_frame(NautilusView *view) -{ - return view->u.bonobo_subdoc_info.view_frame; -} - - -GnomeObject * -nautilus_view_get_control_frame(NautilusView *view) -{ - switch(view->type) - { - case NV_NAUTILUS_VIEW: - return nautilus_get_control_frame(view); - break; - case NV_BONOBO_CONTROL: - return bonobo_control_get_control_frame(view); - break; - case NV_BONOBO_SUBDOC: - return bonobo_subdoc_get_control_frame(view); - break; - default: - g_warning("Can't get the control frame for this type of view (%d)", view->type); - break; - } - - return NULL; + return gnome_object_corba_objref(GNOME_OBJECT(view->client_object)); } CORBA_Object diff --git a/src/ntl-view.h b/src/ntl-view.h index 2c2afd1b3..04b199922 100644 --- a/src/ntl-view.h +++ b/src/ntl-view.h @@ -59,7 +59,8 @@ struct _NautilusViewClass void (*save_state) (NautilusView *view, const char *config_path); void (*show_properties) (NautilusView *view); - void (*view_constructed) (NautilusView *view); /* Not a signal. Work-around for Gtk+'s lack of a 'constructed' operation */ + /* Not a signal. Work-around for Gtk+'s lack of a 'constructed' operation */ + void (*view_constructed) (NautilusView *view); GtkBinClass *parent_class; guint view_signals[6]; @@ -68,6 +69,8 @@ struct _NautilusViewClass gpointer servant_init_func, servant_destroy_func, vepv; }; +typedef struct _NautilusViewComponentType NautilusViewComponentType; + struct _NautilusView { GtkBin parent; @@ -76,30 +79,15 @@ struct _NautilusView char *iid; - enum { NV_NONE, NV_NAUTILUS_VIEW, NV_BONOBO_SUBDOC, NV_BONOBO_CONTROL } type; - - union { - struct { - CORBA_Object view_client; - GnomeObject *control_frame; - - } nautilus_view_info; - struct { - GnomeObject *container, *client_site, *view_frame; - - } bonobo_subdoc_info; - struct { - GnomeObject *control_frame; - - } bonobo_control_info; - } u; - GnomeObjectClient *client_object; GtkWidget *client_widget; GnomeObject *view_frame; guint construct_arg_count; + + NautilusViewComponentType *component_class; + gpointer component_data; }; GtkType nautilus_view_get_type (void); @@ -117,5 +105,4 @@ void nautilus_view_construct_arg_set(NautilusView *view); } #endif /* __cplusplus */ - #endif /* __NAUTILUS_VIEW_H__ */ diff --git a/src/ntl-window-msgs.c b/src/ntl-window-msgs.c index 81869df4b..42a33c9f5 100644 --- a/src/ntl-window-msgs.c +++ b/src/ntl-window-msgs.c @@ -80,6 +80,20 @@ nautilus_window_request_location_change(NautilusWindow *window, gtk_signal_emit(obj, klass->window_signals[0], loc, requesting_view); } +void +nautilus_window_request_progress_change(NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + GtkWidget *requesting_view) +{ + NautilusWindowClass *klass; + GtkObject *obj; + + obj = GTK_OBJECT(window); + + klass = NAUTILUS_WINDOW_CLASS(obj->klass); + gtk_signal_emit(obj, klass->window_signals[3], loc, requesting_view); +} + static void nautilus_window_change_location_internal(NautilusWindow *window, NautilusNavigationInfo *loci, gboolean is_back) { @@ -339,3 +353,14 @@ nautilus_window_real_request_location_change (NautilusWindow *window, { nautilus_window_change_location(window, loc, requesting_view, FALSE); } + +void +nautilus_window_real_request_progress_change (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view) +{ + if(requesting_view != window->content_view) + return; /* Only pay attention to progress information from the main view, for now */ + + g_message("Progress is %f", loc->amount); +} diff --git a/src/ntl-window-msgs.h b/src/ntl-window-msgs.h index 8bc1afb6d..4bfe835aa 100644 --- a/src/ntl-window-msgs.h +++ b/src/ntl-window-msgs.h @@ -12,5 +12,8 @@ void nautilus_window_request_selection_change(NautilusWindow *window, void nautilus_window_request_status_change(NautilusWindow *window, Nautilus_StatusRequestInfo *loc, GtkWidget *requesting_view); +void nautilus_window_request_progress_change(NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + GtkWidget *requesting_view); #endif diff --git a/src/ntl-window-private.h b/src/ntl-window-private.h index bd6909ed5..f371101bb 100644 --- a/src/ntl-window-private.h +++ b/src/ntl-window-private.h @@ -15,6 +15,9 @@ void nautilus_window_real_request_status_change(NautilusWindow *window, void nautilus_window_real_request_location_change (NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, NautilusView *requesting_view); +void nautilus_window_real_request_progress_change (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view); void nautilus_window_set_status(NautilusWindow *window, const char *txt); void nautilus_window_change_location(NautilusWindow *window, Nautilus_NavigationRequestInfo *loc, diff --git a/src/ntl-window.c b/src/ntl-window.c index b1dbe2fa0..83fafde27 100644 --- a/src/ntl-window.c +++ b/src/ntl-window.c @@ -35,7 +35,6 @@ static void nautilus_window_realize (GtkWidget *widget); -static int window_count = 0; static GnomeAppClass *parent_class = NULL; /* Stuff for handling the CORBA interface */ @@ -322,6 +321,7 @@ nautilus_window_class_init (NautilusWindowClass *klass) klass->request_location_change = nautilus_window_real_request_location_change; klass->request_selection_change = nautilus_window_real_request_selection_change; klass->request_status_change = nautilus_window_real_request_status_change; + klass->request_progress_change = nautilus_window_real_request_progress_change; i = 0; klass->window_signals[i++] = gtk_signal_new("request_location_change", @@ -342,6 +342,12 @@ nautilus_window_class_init (NautilusWindowClass *klass) GTK_SIGNAL_OFFSET (NautilusWindowClass, request_status_change), gtk_marshal_NONE__BOXED_OBJECT, GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); + klass->window_signals[i++] = gtk_signal_new("request_progress_change", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (NautilusWindowClass, request_progress_change), + gtk_marshal_NONE__BOXED_OBJECT, + GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_OBJECT); gtk_object_class_add_signals (object_class, klass->window_signals, i); gtk_object_add_arg_type ("NautilusWindow::app_id", @@ -357,6 +363,11 @@ nautilus_window_class_init (NautilusWindowClass *klass) widget_class->realize = nautilus_window_realize; } +static void +nautilus_window_init (NautilusWindow *window) +{ +} + static gboolean nautilus_window_clear_status(NautilusWindow *window) { @@ -597,14 +608,9 @@ nautilus_window_get_arg (GtkObject *object, } } -static void -nautilus_window_init (NautilusWindow *window) -{ - window_count++; -} - static void nautilus_window_destroy (NautilusWindow *window) { + NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass); g_slist_free(window->meta_views); CORBA_free(window->ni); CORBA_free(window->si); @@ -616,10 +622,8 @@ static void nautilus_window_destroy (NautilusWindow *window) if(window->statusbar_clear_id) g_source_remove(window->statusbar_clear_id); - if(--window_count <= 0) - { - gtk_main_quit(); - } + if(GTK_OBJECT_CLASS(klass->parent_class)->destroy) + GTK_OBJECT_CLASS(klass->parent_class)->destroy(GTK_OBJECT(window)); } GtkWidget * diff --git a/src/ntl-window.h b/src/ntl-window.h index 097b9973e..0bc2a70b7 100644 --- a/src/ntl-window.h +++ b/src/ntl-window.h @@ -53,8 +53,11 @@ typedef struct { void (* request_status_change) (NautilusWindow *window, Nautilus_StatusRequestInfo *loc, NautilusView *requesting_view); + void (* request_progress_change) (NautilusWindow *window, + Nautilus_ProgressRequestInfo *loc, + NautilusView *requesting_view); - guint window_signals[3]; + guint window_signals[4]; } NautilusWindowClass; struct _NautilusWindow { @@ -97,6 +100,4 @@ void nautilus_window_allow_up (NautilusWindow *window, gboolean allow); void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); - - #endif -- GitLab