/* * evolution-wizard.c * * Copyright (C) 2001 Ximian, Inc. * * Authors: Iain Holmes */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include "evolution-wizard.h" #include "Evolution.h" struct _EvolutionWizardPrivate { EvolutionWizardGetControlFn get_fn; BonoboEventSource *event_source; void *closure; int page_count; }; enum { NEXT, PREPARE, BACK, FINISH, CANCEL, HELP, LAST_SIGNAL }; #define PARENT_TYPE BONOBO_X_OBJECT_TYPE static GtkObjectClass *parent_class; static guint32 signals[LAST_SIGNAL] = { 0 }; static CORBA_long impl_GNOME_Evolution_Wizard__get_pageCount (PortableServer_Servant servant, CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionWizard *wizard; EvolutionWizardPrivate *priv; bonobo_object = bonobo_object_from_servant (servant); wizard = EVOLUTION_WIZARD (bonobo_object); priv = wizard->priv; return priv->page_count; } static Bonobo_Control impl_GNOME_Evolution_Wizard_getControl (PortableServer_Servant servant, CORBA_long pagenumber, CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionWizard *wizard; EvolutionWizardPrivate *priv; BonoboControl *control; bonobo_object = bonobo_object_from_servant (servant); wizard = EVOLUTION_WIZARD (bonobo_object); priv = wizard->priv; if (pagenumber < 0 || pagenumber >= priv->page_count) { CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Wizard_NoPage, NULL); return CORBA_OBJECT_NIL; } control = priv->get_fn (wizard, pagenumber, priv->closure); if (control == NULL) return CORBA_OBJECT_NIL; return (Bonobo_Control) CORBA_Object_duplicate (BONOBO_OBJREF (control), ev); } static void impl_GNOME_Evolution_Wizard_notifyAction (PortableServer_Servant servant, CORBA_long pagenumber, GNOME_Evolution_Wizard_Action action, CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionWizard *wizard; EvolutionWizardPrivate *priv; bonobo_object = bonobo_object_from_servant (servant); wizard = EVOLUTION_WIZARD (bonobo_object); priv = wizard->priv; if (pagenumber < 0 || pagenumber >= priv->page_count) { CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Wizard_NoPage, NULL); return; } switch (action) { case GNOME_Evolution_Wizard_NEXT: gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[NEXT], pagenumber); break; case GNOME_Evolution_Wizard_PREPARE: gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[PREPARE], pagenumber); break; case GNOME_Evolution_Wizard_BACK: gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[BACK], pagenumber); break; case GNOME_Evolution_Wizard_FINISH: gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[FINISH], pagenumber); break; case GNOME_Evolution_Wizard_CANCEL: gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[CANCEL], pagenumber); break; case GNOME_Evolution_Wizard_HELP: gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[HELP], pagenumber); break; default: break; } } static void evolution_wizard_destroy (GtkObject *object) { EvolutionWizard *wizard; wizard = EVOLUTION_WIZARD (object); if (wizard->priv == NULL) { return; } g_free (wizard->priv); wizard->priv = NULL; parent_class->destroy (object); } static void evolution_wizard_class_init (EvolutionWizardClass *klass) { GtkObjectClass *object_class; POA_GNOME_Evolution_Wizard__epv *epv = &klass->epv; object_class = GTK_OBJECT_CLASS (klass); object_class->destroy = evolution_wizard_destroy; signals[NEXT] = gtk_signal_new ("next", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (EvolutionWizardClass, next), gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); signals[PREPARE] = gtk_signal_new ("prepare", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (EvolutionWizardClass, prepare), gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); signals[BACK] = gtk_signal_new ("back", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (EvolutionWizardClass, back), gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); signals[FINISH] = gtk_signal_new ("finish", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (EvolutionWizardClass, finish), gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); signals[CANCEL] = gtk_signal_new ("cancel", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (EvolutionWizardClass, cancel), gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); signals[HELP] = gtk_signal_new ("help", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (EvolutionWizardClass, help), gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); parent_class = gtk_type_class (PARENT_TYPE); epv->_get_pageCount = impl_GNOME_Evolution_Wizard__get_pageCount; epv->getControl = impl_GNOME_Evolution_Wizard_getControl; epv->notifyAction = impl_GNOME_Evolution_Wizard_notifyAction; } static void evolution_wizard_init (EvolutionWizard *wizard) { wizard->priv = g_new0 (EvolutionWizardPrivate, 1); } BONOBO_X_TYPE_FUNC_FULL (EvolutionWizard, GNOME_Evolution_Wizard, PARENT_TYPE, evolution_wizard); EvolutionWizard * evolution_wizard_construct (EvolutionWizard *wizard, BonoboEventSource *event_source, EvolutionWizardGetControlFn get_fn, int num_pages, void *closure) { EvolutionWizardPrivate *priv; g_return_val_if_fail (BONOBO_IS_EVENT_SOURCE (event_source), NULL); g_return_val_if_fail (IS_EVOLUTION_WIZARD (wizard), NULL); priv = wizard->priv; priv->get_fn = get_fn; priv->page_count = num_pages; priv->closure = closure; priv->event_source = event_source; bonobo_object_add_interface (BONOBO_OBJECT (wizard), BONOBO_OBJECT (event_source)); return wizard; } EvolutionWizard * evolution_wizard_new_full (EvolutionWizardGetControlFn get_fn, int num_pages, BonoboEventSource *event_source, void *closure) { EvolutionWizard *wizard; g_return_val_if_fail (num_pages > 0, NULL); g_return_val_if_fail (BONOBO_IS_EVENT_SOURCE (event_source), NULL); wizard = gtk_type_new (evolution_wizard_get_type ()); return evolution_wizard_construct (wizard, event_source, get_fn, num_pages, closure); } EvolutionWizard * evolution_wizard_new (EvolutionWizardGetControlFn get_fn, int num_pages, void *closure) { BonoboEventSource *event_source; g_return_val_if_fail (num_pages > 0, NULL); event_source = bonobo_event_source_new (); return evolution_wizard_new_full (get_fn, num_pages, event_source, closure); } void evolution_wizard_set_buttons_sensitive (EvolutionWizard *wizard, gboolean back_sensitive, gboolean next_sensitive, gboolean cancel_sensitive, CORBA_Environment *opt_ev) { EvolutionWizardPrivate *priv; CORBA_Environment ev; CORBA_any any; CORBA_short s; g_return_if_fail (IS_EVOLUTION_WIZARD (wizard)); priv = wizard->priv; if (opt_ev == NULL) { CORBA_exception_init (&ev); } else { ev = *opt_ev; } s = back_sensitive << 2 | next_sensitive << 1 | cancel_sensitive; any._type = (CORBA_TypeCode) TC_short; any._value = &s; bonobo_event_source_notify_listeners (priv->event_source, EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE, &any, &ev); if (opt_ev == NULL && BONOBO_EX (&ev)) { g_warning ("ERROR(%s): %s", __FUNCTION__, CORBA_exception_id (&ev)); } if (opt_ev == NULL) { CORBA_exception_free (&ev); } } void evolution_wizard_set_show_finish (EvolutionWizard *wizard, gboolean show_finish, CORBA_Environment *opt_ev) { EvolutionWizardPrivate *priv; CORBA_Environment ev; CORBA_any any; CORBA_boolean b; g_return_if_fail (IS_EVOLUTION_WIZARD (wizard)); priv = wizard->priv; if (opt_ev == NULL) { CORBA_exception_init (&ev); } else { ev = *opt_ev; } b = show_finish; any._type = (CORBA_TypeCode) TC_boolean; any._value = &b; bonobo_event_source_notify_listeners (priv->event_source, EVOLUTION_WIZARD_SET_SHOW_FINISH, &any, &ev); if (opt_ev == NULL && BONOBO_EX (&ev)) { g_warning ("ERROR(%s): %s", __FUNCTION__, CORBA_exception_id (&ev)); } if (opt_ev == NULL) { CORBA_exception_free (&ev); } } void evolution_wizard_set_page (EvolutionWizard *wizard, int page_number, CORBA_Environment *opt_ev) { EvolutionWizardPrivate *priv; CORBA_Environment ev; CORBA_any any; CORBA_short s; g_return_if_fail (IS_EVOLUTION_WIZARD (wizard)); priv = wizard->priv; g_return_if_fail (page_number >= 0 && page_number < priv->page_count); if (opt_ev == NULL) { CORBA_exception_init (&ev); } else { ev = *opt_ev; } s = page_number; any._type = (CORBA_TypeCode) TC_short; any._value = &s; bonobo_event_source_notify_listeners (priv->event_source, EVOLUTION_WIZARD_SET_PAGE, &any, &ev); if (opt_ev == NULL && BONOBO_EX (&ev)) { g_warning ("ERROR(%s): %s", __FUNCTION__, CORBA_exception_id (&ev)); } if (opt_ev == NULL) { CORBA_exception_free (&ev); } } BonoboEventSource * evolution_wizard_get_event_source (EvolutionWizard *wizard) { g_return_val_if_fail (IS_EVOLUTION_WIZARD (wizard), NULL); return wizard->priv->event_source; } ='#n167'>167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* evolution-shell-view.c
 *
 * Copyright (C) 2000  Ximian, Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 *
 * Author: Ettore Perazzoli
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <gtk/gtksignal.h>

#include <gal/util/e-util.h>

#include "evolution-shell-view.h"


#define PARENT_TYPE bonobo_object_get_type ()
static BonoboObjectClass *parent_class = NULL;

struct _EvolutionShellViewPrivate {
    int dummy;
};

enum {
    SET_MESSAGE,
    UNSET_MESSAGE,
    CHANGE_VIEW,
    SET_TITLE,
    SET_FOLDER_BAR_LABEL,
    LAST_SIGNAL
};
static int signals[LAST_SIGNAL] = { 0 };


/* CORBA interface implementation.  */

static POA_GNOME_Evolution_ShellView__vepv ShellView_vepv;

static POA_GNOME_Evolution_ShellView *
create_servant (void)
{
    POA_GNOME_Evolution_ShellView *servant;
    CORBA_Environment ev;

    servant = (POA_GNOME_Evolution_ShellView *) g_new0 (BonoboObjectServant, 1);
    servant->vepv = &ShellView_vepv;
    CORBA_exception_init (&ev);

    POA_GNOME_Evolution_ShellView__init ((PortableServer_Servant) servant, &ev);
    if (ev._major != CORBA_NO_EXCEPTION) {
        g_free (servant);
        CORBA_exception_free (&ev);
        return NULL;
    }

    CORBA_exception_free (&ev);

    return servant;
}

static void
impl_ShellView_set_message (PortableServer_Servant servant,
                const CORBA_char *message,
                const CORBA_boolean busy,
                CORBA_Environment *ev)
{
    BonoboObject *bonobo_object;

    bonobo_object = bonobo_object_from_servant (servant);
    gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[SET_MESSAGE], message, busy);
}

static void
impl_ShellView_unset_message (PortableServer_Servant servant,
                  CORBA_Environment *ev)
{
    BonoboObject *bonobo_object;

    bonobo_object = bonobo_object_from_servant (servant);
    gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[UNSET_MESSAGE]);
}

static void
impl_ShellView_change_current_view (PortableServer_Servant servant,
                    const CORBA_char *uri,
                    CORBA_Environment *ev)
{
    BonoboObject *bonobo_object;

    bonobo_object = bonobo_object_from_servant (servant);
    gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[CHANGE_VIEW],
             uri);
}

static void
impl_ShellView_set_title (PortableServer_Servant servant,
              const CORBA_char *title,
              CORBA_Environment *ev)
{
    BonoboObject *bonobo_object;

    bonobo_object = bonobo_object_from_servant (servant);
    gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[SET_TITLE],
             title);
}

static void
impl_ShellView_set_folder_bar_label (PortableServer_Servant servant,
                     const CORBA_char  *text,
                     CORBA_Environment *ev)
{
    BonoboObject *bonobo_object;

    bonobo_object = bonobo_object_from_servant (servant);
    gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[SET_FOLDER_BAR_LABEL],
             text);
}


/* GtkObject methods.  */
static void
destroy (GtkObject *object)
{
    EvolutionShellView *shell_view;
    EvolutionShellViewPrivate *priv;

    shell_view = EVOLUTION_SHELL_VIEW (object);
    priv = shell_view->priv;

    g_free (priv);

    (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}


static void
corba_class_init (void)
{
    POA_GNOME_Evolution_ShellView__vepv *vepv;
    POA_GNOME_Evolution_ShellView__epv *epv;
    PortableServer_ServantBase__epv *base_epv;

    base_epv = g_new0 (PortableServer_ServantBase__epv, 1);
    base_epv->_private    = NULL;
    base_epv->finalize    = NULL;
    base_epv->default_POA = NULL;

    epv = g_new0 (POA_GNOME_Evolution_ShellView__epv, 1);
    epv->setMessage        = impl_ShellView_set_message;
    epv->unsetMessage      = impl_ShellView_unset_message;
    epv->changeCurrentView = impl_ShellView_change_current_view;
    epv->setTitle          = impl_ShellView_set_title;
    epv->setFolderBarLabel = impl_ShellView_set_folder_bar_label;

    vepv = &ShellView_vepv;
    vepv->_base_epv               = base_epv;
    vepv->Bonobo_Unknown_epv      = bonobo_object_get_epv ();
    vepv->GNOME_Evolution_ShellView_epv = epv;
}

static void
class_init (EvolutionShellViewClass *klass)
{
    GtkObjectClass *object_class;

    object_class = GTK_OBJECT_CLASS (klass);
    object_class->destroy = destroy;

    signals[SET_MESSAGE]
        = gtk_signal_new ("set_message",
                  GTK_RUN_FIRST,
                  object_class->type,
                  GTK_SIGNAL_OFFSET (EvolutionShellViewClass, set_message),
                  gtk_marshal_NONE__POINTER_INT,
                  GTK_TYPE_NONE, 2,
                  GTK_TYPE_STRING,
                  GTK_TYPE_BOOL);

    signals[UNSET_MESSAGE]
        = gtk_signal_new ("unset_message",
                  GTK_RUN_FIRST,
                  object_class->type,
                  GTK_SIGNAL_OFFSET (EvolutionShellViewClass, unset_message),
                  gtk_marshal_NONE__NONE,
                  GTK_TYPE_NONE, 0);

    signals[CHANGE_VIEW]
        = gtk_signal_new ("change_current_view",
                  GTK_RUN_FIRST,
                  object_class->type,
                  GTK_SIGNAL_OFFSET (EvolutionShellViewClass, change_current_view),
                  gtk_marshal_NONE__POINTER,
                  GTK_TYPE_NONE, 1,
                  GTK_TYPE_STRING);

    signals[SET_TITLE]
        = gtk_signal_new ("set_title",
                  GTK_RUN_FIRST,
                  object_class->type,
                  GTK_SIGNAL_OFFSET (EvolutionShellViewClass, set_title),
                  gtk_marshal_NONE__POINTER,
                  GTK_TYPE_NONE, 1,
                  GTK_TYPE_STRING);

    signals[SET_FOLDER_BAR_LABEL]
        = gtk_signal_new ("set_folder_bar_label",
                  GTK_RUN_FIRST,
                  object_class->type,
                  GTK_SIGNAL_OFFSET (EvolutionShellViewClass, set_folder_bar_label),
                  gtk_marshal_NONE__POINTER,
                  GTK_TYPE_NONE, 1,
                  GTK_TYPE_STRING);

    gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);

    parent_class = gtk_type_class (bonobo_object_get_type ());

    corba_class_init ();
}

static void
init (EvolutionShellView *shell_view)
{
    EvolutionShellViewPrivate *priv;

    priv = g_new (EvolutionShellViewPrivate, 1);
    priv->dummy = 0;

    shell_view->priv = priv;
}


/**
 * evolution_shell_view_construct:
 * @shell_view: 
 * @corba_object: 
 * 
 * Construct @shell_view with the specified @corba_object.
 **/
void
evolution_shell_view_construct (EvolutionShellView *shell_view,
                GNOME_Evolution_ShellView corba_object)
{
    g_return_if_fail (shell_view != NULL);
    g_return_if_fail (EVOLUTION_IS_SHELL_VIEW (shell_view));

    bonobo_object_construct (BONOBO_OBJECT (shell_view), corba_object);
}

/**
 * evolution_shell_view_new:
 *
 * Create a new EvolutionShellView object.
 * 
 * Return value: The new EvolutionShellView object.
 **/
EvolutionShellView *
evolution_shell_view_new (void)
{
    POA_GNOME_Evolution_ShellView *servant;
    GNOME_Evolution_ShellView corba_object;
    EvolutionShellView *new;

    servant = create_servant ();
    if (servant == NULL)
        return NULL;

    new = gtk_type_new (evolution_shell_view_get_type ());

    corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant);

    evolution_shell_view_construct (new, corba_object);

    return new;
}


E_MAKE_TYPE (evolution_shell_view, "EvolutionShellView", EvolutionShellView, class_init, init, PARENT_TYPE)