nautilus-view-frame-nautilus-view.c 5.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */

/*
 *  Nautilus
 *
 *  Copyright (C) 1999, 2000 Red Hat, Inc.
 *  Copyright (C) 1999, 2000 Eazel, 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 <sopwith@redhat.com>
 *
 */

27 28 29 30 31 32
#include <config.h>

#include "nautilus.h"
#include "ntl-view-private.h"

typedef struct {
33
  BonoboObject *control_frame;
34 35 36 37 38 39
  CORBA_Object view_client;
} NautilusViewInfo;

static gboolean
nautilus_view_try_load_client(NautilusView *view, CORBA_Object obj, CORBA_Environment *ev)
{
40
  Bonobo_Control control;
41
  NautilusViewInfo *nvi;
42
  Bonobo_UIHandler uih = bonobo_object_corba_objref(BONOBO_OBJECT(nautilus_window_get_uih(NAUTILUS_WINDOW(view->main_window))));
43 44
  nvi = view->component_data = g_new0(NautilusViewInfo, 1);

45
  control = Bonobo_Unknown_query_interface(obj, "IDL:Bonobo/Control:1.0", ev);
46 47 48 49 50 51 52 53
  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);

54
  nvi->control_frame = BONOBO_OBJECT(bonobo_control_frame_new(uih));
55
  bonobo_object_add_interface(BONOBO_OBJECT(nvi->control_frame), view->view_frame);
56

57 58
  bonobo_control_frame_bind_to_control(BONOBO_CONTROL_FRAME(nvi->control_frame), control);
  view->client_widget = bonobo_control_frame_get_widget(BONOBO_CONTROL_FRAME(nvi->control_frame));
59

60
  Bonobo_Unknown_unref(control, ev);
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
  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);
87 88
  if(ev->_major != CORBA_NO_EXCEPTION)
    gtk_object_destroy(GTK_OBJECT(view));
89 90 91 92 93 94 95 96
}

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);
97 98
  if(ev->_major != CORBA_NO_EXCEPTION)
    gtk_object_destroy(GTK_OBJECT(view));
99 100 101 102 103 104 105 106
}

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);
107 108
  if(ev->_major != CORBA_NO_EXCEPTION)
    gtk_object_destroy(GTK_OBJECT(view));
109 110 111 112 113 114 115 116
}

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);
117 118
  if(ev->_major != CORBA_NO_EXCEPTION)
    gtk_object_destroy(GTK_OBJECT(view));
119 120 121 122 123 124 125 126
}

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);
127 128
  if(ev->_major != CORBA_NO_EXCEPTION)
    gtk_object_destroy(GTK_OBJECT(view));
129 130
}

131 132 133 134 135 136
static void
nv_stop_location_change(NautilusView *view, CORBA_Environment *ev)
{
  NautilusViewInfo *nvi = view->component_data;

  Nautilus_View_stop_location_change(nvi->view_client, ev);
137 138
  if(ev->_major != CORBA_NO_EXCEPTION)
    gtk_object_destroy(GTK_OBJECT(view));
139 140
}

141 142 143 144
static char *
nv_get_label(NautilusView *view, CORBA_Environment *ev)
{
  NautilusViewInfo *nvi = view->component_data;
145 146
  BonoboPropertyBagClient *bc;
  Bonobo_Property prop;
147 148
  char *retval = NULL;
  CORBA_any *anyval;
149
  BonoboControlFrame *control_frame;
150

151 152
  control_frame = BONOBO_CONTROL_FRAME(nvi->control_frame);
  bc = bonobo_control_frame_get_control_property_bag(control_frame);
153 154
  g_return_val_if_fail(bc, NULL);

155
  prop = bonobo_property_bag_client_get_property(bc, "label");
156 157 158 159

  if(CORBA_Object_is_nil(prop, ev))
    return NULL;

160
  anyval = Bonobo_Property_get_value(prop, ev);
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
  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 */
180
  &nv_stop_location_change, /* stop_location_change */
181 182
  &nv_get_label /* get_label */
};