What's interesting here is we're actually sharing the ECalModel across views. Instead of having the Calendar view listen to GConf for changes to the Task and Memo models, the Calendar view fetches the models directly from the Task and Memo views -- starting the views if it has to, although the shell really takes care of that -- and loads the models into its own taskpad and memopad. We couldn't do that sort of thing before with Bonobo in the way. Big chunks of redundant code should begin falling out shortly. svn path=/branches/kill-bonobo/; revision=36696
970 lines
24 KiB
C
970 lines
24 KiB
C
/*
|
|
* e-shell-view.c
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) version 3.
|
|
*
|
|
* 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with the program; if not, see <http://www.gnu.org/licenses/>
|
|
*
|
|
*
|
|
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
|
|
*
|
|
*/
|
|
|
|
#include "e-shell-view.h"
|
|
|
|
#include <string.h>
|
|
#include <glib/gi18n.h>
|
|
|
|
#include "e-util/e-util.h"
|
|
|
|
#include "e-shell-content.h"
|
|
#include "e-shell-module.h"
|
|
#include "e-shell-sidebar.h"
|
|
#include "e-shell-taskbar.h"
|
|
#include "e-shell-window.h"
|
|
#include "e-shell-window-actions.h"
|
|
|
|
#define E_SHELL_VIEW_GET_PRIVATE(obj) \
|
|
(G_TYPE_INSTANCE_GET_PRIVATE \
|
|
((obj), E_TYPE_SHELL_VIEW, EShellViewPrivate))
|
|
|
|
struct _EShellViewPrivate {
|
|
|
|
gpointer shell_window; /* weak pointer */
|
|
|
|
gchar *title;
|
|
gchar *view_id;
|
|
gint page_num;
|
|
guint merge_id;
|
|
|
|
GtkAction *action;
|
|
GtkSizeGroup *size_group;
|
|
GtkWidget *shell_content;
|
|
GtkWidget *shell_sidebar;
|
|
GtkWidget *shell_taskbar;
|
|
};
|
|
|
|
enum {
|
|
PROP_0,
|
|
PROP_ACTION,
|
|
PROP_PAGE_NUM,
|
|
PROP_TITLE,
|
|
PROP_SHELL_CONTENT,
|
|
PROP_SHELL_SIDEBAR,
|
|
PROP_SHELL_TASKBAR,
|
|
PROP_SHELL_WINDOW,
|
|
PROP_VIEW_ID
|
|
};
|
|
|
|
enum {
|
|
TOGGLED,
|
|
UPDATE_ACTIONS,
|
|
LAST_SIGNAL
|
|
};
|
|
|
|
static gpointer parent_class;
|
|
static gulong signals[LAST_SIGNAL];
|
|
|
|
static void
|
|
shell_view_init_view_collection (EShellViewClass *shell_view_class)
|
|
{
|
|
EShellModule *shell_module;
|
|
const gchar *base_dir;
|
|
const gchar *module_name;
|
|
gchar *system_dir;
|
|
gchar *local_dir;
|
|
|
|
shell_module = E_SHELL_MODULE (shell_view_class->type_module);
|
|
module_name = shell_view_class->type_module->name;
|
|
|
|
base_dir = EVOLUTION_GALVIEWSDIR;
|
|
system_dir = g_build_filename (base_dir, module_name, NULL);
|
|
|
|
base_dir = e_shell_module_get_data_dir (shell_module);
|
|
local_dir = g_build_filename (base_dir, "views", NULL);
|
|
|
|
/* The view collection is never destroyed. */
|
|
shell_view_class->view_collection = gal_view_collection_new ();
|
|
|
|
gal_view_collection_set_title (
|
|
shell_view_class->view_collection,
|
|
shell_view_class->label);
|
|
|
|
gal_view_collection_set_storage_directories (
|
|
shell_view_class->view_collection,
|
|
system_dir, local_dir);
|
|
|
|
g_free (system_dir);
|
|
g_free (local_dir);
|
|
|
|
/* This is all we can do. It's up to the subclasses to
|
|
* add the appropriate factories to the view collection. */
|
|
}
|
|
|
|
static void
|
|
shell_view_emit_toggled (EShellView *shell_view)
|
|
{
|
|
g_signal_emit (shell_view, signals[TOGGLED], 0);
|
|
}
|
|
|
|
static void
|
|
shell_view_set_action (EShellView *shell_view,
|
|
GtkAction *action)
|
|
{
|
|
gchar *label;
|
|
|
|
g_return_if_fail (shell_view->priv->action == NULL);
|
|
|
|
shell_view->priv->action = g_object_ref (action);
|
|
|
|
g_object_get (action, "label", &label, NULL);
|
|
e_shell_view_set_title (shell_view, label);
|
|
g_free (label);
|
|
|
|
g_signal_connect_swapped (
|
|
action, "toggled",
|
|
G_CALLBACK (shell_view_emit_toggled), shell_view);
|
|
}
|
|
|
|
static void
|
|
shell_view_set_shell_window (EShellView *shell_view,
|
|
GtkWidget *shell_window)
|
|
{
|
|
g_return_if_fail (shell_view->priv->shell_window == NULL);
|
|
|
|
shell_view->priv->shell_window = shell_window;
|
|
|
|
g_object_add_weak_pointer (
|
|
G_OBJECT (shell_window),
|
|
&shell_view->priv->shell_window);
|
|
}
|
|
|
|
static void
|
|
shell_view_set_property (GObject *object,
|
|
guint property_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
switch (property_id) {
|
|
case PROP_ACTION:
|
|
shell_view_set_action (
|
|
E_SHELL_VIEW (object),
|
|
g_value_get_object (value));
|
|
return;
|
|
|
|
case PROP_PAGE_NUM:
|
|
e_shell_view_set_page_num (
|
|
E_SHELL_VIEW (object),
|
|
g_value_get_int (value));
|
|
return;
|
|
|
|
case PROP_TITLE:
|
|
e_shell_view_set_title (
|
|
E_SHELL_VIEW (object),
|
|
g_value_get_string (value));
|
|
return;
|
|
|
|
case PROP_SHELL_WINDOW:
|
|
shell_view_set_shell_window (
|
|
E_SHELL_VIEW (object),
|
|
g_value_get_object (value));
|
|
return;
|
|
|
|
case PROP_VIEW_ID:
|
|
e_shell_view_set_view_id (
|
|
E_SHELL_VIEW (object),
|
|
g_value_get_string (value));
|
|
return;
|
|
}
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
}
|
|
|
|
static void
|
|
shell_view_get_property (GObject *object,
|
|
guint property_id,
|
|
GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
switch (property_id) {
|
|
case PROP_ACTION:
|
|
g_value_set_object (
|
|
value, e_shell_view_get_action (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
|
|
case PROP_PAGE_NUM:
|
|
g_value_set_int (
|
|
value, e_shell_view_get_page_num (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
|
|
case PROP_TITLE:
|
|
g_value_set_string (
|
|
value, e_shell_view_get_title (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
|
|
case PROP_SHELL_CONTENT:
|
|
g_value_set_object (
|
|
value, e_shell_view_get_shell_content (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
|
|
case PROP_SHELL_SIDEBAR:
|
|
g_value_set_object (
|
|
value, e_shell_view_get_shell_sidebar (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
|
|
case PROP_SHELL_TASKBAR:
|
|
g_value_set_object (
|
|
value, e_shell_view_get_shell_taskbar (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
|
|
case PROP_SHELL_WINDOW:
|
|
g_value_set_object (
|
|
value, e_shell_view_get_shell_window (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
|
|
case PROP_VIEW_ID:
|
|
g_value_set_string (
|
|
value, e_shell_view_get_view_id (
|
|
E_SHELL_VIEW (object)));
|
|
return;
|
|
}
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
}
|
|
|
|
static void
|
|
shell_view_dispose (GObject *object)
|
|
{
|
|
EShellViewPrivate *priv;
|
|
|
|
priv = E_SHELL_VIEW_GET_PRIVATE (object);
|
|
|
|
if (priv->shell_window != NULL) {
|
|
g_object_remove_weak_pointer (
|
|
G_OBJECT (priv->shell_window), &priv->shell_window);
|
|
priv->shell_window = NULL;
|
|
}
|
|
|
|
if (priv->size_group != NULL) {
|
|
g_object_unref (priv->size_group);
|
|
priv->size_group = NULL;
|
|
}
|
|
|
|
if (priv->shell_content != NULL) {
|
|
g_object_unref (priv->shell_content);
|
|
priv->shell_content = NULL;
|
|
}
|
|
|
|
if (priv->shell_sidebar != NULL) {
|
|
g_object_unref (priv->shell_sidebar);
|
|
priv->shell_sidebar = NULL;
|
|
}
|
|
|
|
if (priv->shell_taskbar != NULL) {
|
|
g_object_unref (priv->shell_taskbar);
|
|
priv->shell_taskbar = NULL;
|
|
}
|
|
|
|
/* Chain up to parent's dispose() method. */
|
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
|
}
|
|
|
|
static void
|
|
shell_view_finalize (GObject *object)
|
|
{
|
|
EShellViewPrivate *priv;
|
|
|
|
priv = E_SHELL_VIEW_GET_PRIVATE (object);
|
|
|
|
g_free (priv->title);
|
|
g_free (priv->view_id);
|
|
|
|
/* Chain up to parent's finalize() method. */
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
}
|
|
|
|
static void
|
|
shell_view_constructed (GObject *object)
|
|
{
|
|
EShellView *shell_view;
|
|
EShellViewClass *class;
|
|
GtkWidget *widget;
|
|
|
|
shell_view = E_SHELL_VIEW (object);
|
|
class = E_SHELL_VIEW_GET_CLASS (object);
|
|
|
|
/* Invoke factory methods. */
|
|
|
|
widget = class->new_shell_content (shell_view);
|
|
shell_view->priv->shell_content = g_object_ref_sink (widget);
|
|
gtk_widget_show (widget);
|
|
|
|
widget = class->new_shell_sidebar (shell_view);
|
|
shell_view->priv->shell_sidebar = g_object_ref_sink (widget);
|
|
gtk_widget_show (widget);
|
|
|
|
widget = class->new_shell_taskbar (shell_view);
|
|
shell_view->priv->shell_taskbar = g_object_ref_sink (widget);
|
|
gtk_widget_show (widget);
|
|
}
|
|
|
|
static void
|
|
shell_view_toggled (EShellView *shell_view)
|
|
{
|
|
EShellViewPrivate *priv = shell_view->priv;
|
|
EShellViewClass *shell_view_class;
|
|
EShellWindow *shell_window;
|
|
GtkUIManager *ui_manager;
|
|
const gchar *basename;
|
|
|
|
shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
|
|
shell_window = e_shell_view_get_shell_window (shell_view);
|
|
ui_manager = e_shell_window_get_ui_manager (shell_window);
|
|
basename = shell_view_class->ui_definition;
|
|
|
|
if (e_shell_view_is_active (shell_view))
|
|
priv->merge_id = e_load_ui_definition (ui_manager, basename);
|
|
else
|
|
gtk_ui_manager_remove_ui (ui_manager, priv->merge_id);
|
|
|
|
gtk_ui_manager_ensure_update (ui_manager);
|
|
}
|
|
|
|
static void
|
|
shell_view_class_init (EShellViewClass *class)
|
|
{
|
|
GObjectClass *object_class;
|
|
|
|
parent_class = g_type_class_peek_parent (class);
|
|
g_type_class_add_private (class, sizeof (EShellViewPrivate));
|
|
|
|
object_class = G_OBJECT_CLASS (class);
|
|
object_class->set_property = shell_view_set_property;
|
|
object_class->get_property = shell_view_get_property;
|
|
object_class->dispose = shell_view_dispose;
|
|
object_class->finalize = shell_view_finalize;
|
|
object_class->constructed = shell_view_constructed;
|
|
|
|
/* Default Factories */
|
|
class->new_shell_content = e_shell_content_new;
|
|
class->new_shell_sidebar = e_shell_sidebar_new;
|
|
class->new_shell_taskbar = e_shell_taskbar_new;
|
|
|
|
class->toggled = shell_view_toggled;
|
|
|
|
/**
|
|
* EShellView:action:
|
|
*
|
|
* The #GtkRadioAction registered with #EShellSwitcher.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_ACTION,
|
|
g_param_spec_object (
|
|
"action",
|
|
_("Switcher Action"),
|
|
_("The switcher action for this shell view"),
|
|
GTK_TYPE_RADIO_ACTION,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY));
|
|
|
|
/**
|
|
* EShellView:page-num
|
|
*
|
|
* The #GtkNotebook page number of the shell view.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_PAGE_NUM,
|
|
g_param_spec_int (
|
|
"page-num",
|
|
_("Page Number"),
|
|
_("The notebook page number of the shell view"),
|
|
-1,
|
|
G_MAXINT,
|
|
-1,
|
|
G_PARAM_READWRITE));
|
|
|
|
/**
|
|
* EShellView:title
|
|
*
|
|
* The title of the shell view. Also serves as the #EShellWindow
|
|
* title when the shell view is active.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_TITLE,
|
|
g_param_spec_string (
|
|
"title",
|
|
_("Title"),
|
|
_("The title of the shell view"),
|
|
NULL,
|
|
G_PARAM_READWRITE));
|
|
|
|
/**
|
|
* EShellView:shell-content
|
|
*
|
|
* The content widget appears in an #EShellWindow<!-- -->'s
|
|
* right pane.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_SHELL_CONTENT,
|
|
g_param_spec_object (
|
|
"shell-content",
|
|
_("Shell Content Widget"),
|
|
_("The content widget appears in "
|
|
"a shell window's right pane"),
|
|
E_TYPE_SHELL_CONTENT,
|
|
G_PARAM_READABLE));
|
|
|
|
/**
|
|
* EShellView:shell-sidebar
|
|
*
|
|
* The sidebar widget appears in an #EShellWindow<!-- -->'s
|
|
* left pane.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_SHELL_SIDEBAR,
|
|
g_param_spec_object (
|
|
"shell-sidebar",
|
|
_("Shell Sidebar Widget"),
|
|
_("The sidebar widget appears in "
|
|
"a shell window's left pane"),
|
|
E_TYPE_SHELL_SIDEBAR,
|
|
G_PARAM_READABLE));
|
|
|
|
/**
|
|
* EShellView:shell-taskbar
|
|
*
|
|
* The taskbar widget appears at the bottom of an #EShellWindow.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_SHELL_TASKBAR,
|
|
g_param_spec_object (
|
|
"shell-taskbar",
|
|
_("Shell Taskbar Widget"),
|
|
_("The taskbar widget appears at "
|
|
"the bottom of a shell window"),
|
|
E_TYPE_SHELL_TASKBAR,
|
|
G_PARAM_READABLE));
|
|
|
|
/**
|
|
* EShellView:shell-window
|
|
*
|
|
* The #EShellWindow to which the shell view belongs.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_SHELL_WINDOW,
|
|
g_param_spec_object (
|
|
"shell-window",
|
|
_("Shell Window"),
|
|
_("The window to which the shell view belongs"),
|
|
E_TYPE_SHELL_WINDOW,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY));
|
|
|
|
/**
|
|
* EShellView:view-id
|
|
*
|
|
* The current #GalView ID.
|
|
**/
|
|
g_object_class_install_property (
|
|
object_class,
|
|
PROP_VIEW_ID,
|
|
g_param_spec_string (
|
|
"view-id",
|
|
_("Current View ID"),
|
|
_("The current GAL view ID"),
|
|
NULL,
|
|
G_PARAM_READWRITE));
|
|
|
|
/**
|
|
* EShellView::toggled
|
|
* @shell_view: the #EShellView which emitted the signal
|
|
*
|
|
* Emitted when @shell_view is activated or deactivated.
|
|
* Use e_shell_view_is_active() to find out which event has
|
|
* occurred. The shell view being deactivated is always
|
|
* notified before the shell view being activated.
|
|
*
|
|
* By default, #EShellView adds the UI definition file
|
|
* given in the <structfield>ui_definition</structfield>
|
|
* field of #EShellViewClass on activation, and removes the
|
|
* UI definition on deactivation.
|
|
**/
|
|
signals[TOGGLED] = g_signal_new (
|
|
"toggled",
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
G_SIGNAL_RUN_FIRST,
|
|
G_STRUCT_OFFSET (EShellViewClass, toggled),
|
|
NULL, NULL,
|
|
g_cclosure_marshal_VOID__VOID,
|
|
G_TYPE_NONE, 0);
|
|
|
|
/**
|
|
* EShellView::update-actions
|
|
* @shell_view: the #EShellView which emitted the signal
|
|
*
|
|
* #EShellView subclasses should override the
|
|
* <structfield>update_actions</structfield> method in
|
|
* #EShellViewClass to update sensitivities, labels, or any
|
|
* other aspect of the #GtkAction<!-- -->s they have registered.
|
|
*
|
|
* Plugins can also connect to this signal to be notified
|
|
* when to update their own #GtkAction<!-- -->s.
|
|
**/
|
|
signals[UPDATE_ACTIONS] = g_signal_new (
|
|
"update-actions",
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
G_SIGNAL_RUN_FIRST,
|
|
G_STRUCT_OFFSET (EShellViewClass, update_actions),
|
|
NULL, NULL,
|
|
g_cclosure_marshal_VOID__VOID,
|
|
G_TYPE_NONE, 0);
|
|
}
|
|
|
|
static void
|
|
shell_view_init (EShellView *shell_view,
|
|
EShellViewClass *shell_view_class)
|
|
{
|
|
GtkSizeGroup *size_group;
|
|
|
|
size_group = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
|
|
|
|
shell_view->priv = E_SHELL_VIEW_GET_PRIVATE (shell_view);
|
|
shell_view->priv->size_group = size_group;
|
|
|
|
if (shell_view_class->view_collection == NULL)
|
|
shell_view_init_view_collection (shell_view_class);
|
|
}
|
|
|
|
GType
|
|
e_shell_view_get_type (void)
|
|
{
|
|
static GType type = 0;
|
|
|
|
if (G_UNLIKELY (type == 0)) {
|
|
const GTypeInfo type_info = {
|
|
sizeof (EShellViewClass),
|
|
(GBaseInitFunc) NULL,
|
|
(GBaseFinalizeFunc) NULL,
|
|
(GClassInitFunc) shell_view_class_init,
|
|
(GClassFinalizeFunc) NULL,
|
|
NULL, /* class_data */
|
|
sizeof (EShellView),
|
|
0, /* n_preallocs */
|
|
(GInstanceInitFunc) shell_view_init,
|
|
NULL /* value_table */
|
|
};
|
|
|
|
type = g_type_register_static (
|
|
G_TYPE_OBJECT, "EShellView",
|
|
&type_info, G_TYPE_FLAG_ABSTRACT);
|
|
}
|
|
|
|
return type;
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_name:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the view name for @shell_view, which is also the name of
|
|
* the corresponding #EShellModule (see the <structfield>name</structfield>
|
|
* field in #EShellModuleInfo).
|
|
*
|
|
* Returns: the view name for @shell_view
|
|
**/
|
|
const gchar *
|
|
e_shell_view_get_name (EShellView *shell_view)
|
|
{
|
|
GtkAction *action;
|
|
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
action = e_shell_view_get_action (shell_view);
|
|
|
|
/* Switcher actions have a secret "view-name" data value.
|
|
* This gets set in e_shell_window_create_switcher_actions(). */
|
|
return g_object_get_data (G_OBJECT (action), "view-name");
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_action:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the switcher action for @shell_view.
|
|
*
|
|
* An #EShellWindow creates a #GtkRadioAction for each registered subclass
|
|
* of #EShellView. This action gets passed to the #EShellSwitcher, which
|
|
* displays a button that proxies the action. The icon at the top of the
|
|
* sidebar also proxies the action. When @shell_view is active, the
|
|
* action's icon becomes the #EShellWindow icon.
|
|
*
|
|
* Returns: the switcher action for @shell_view
|
|
**/
|
|
GtkAction *
|
|
e_shell_view_get_action (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return shell_view->priv->action;
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_title:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the title for @shell_view. When @shell_view is active, the
|
|
* shell view's title becomes the #EShellWindow title.
|
|
*
|
|
* Returns: the title for @shell_view
|
|
**/
|
|
const gchar *
|
|
e_shell_view_get_title (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return shell_view->priv->title;
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_set_title:
|
|
* @shell_view: an #EShellView
|
|
* @title: a title for @shell_view
|
|
*
|
|
* Sets the title for @shell_view. When @shell_view is active, the
|
|
* shell view's title becomes the #EShellWindow title.
|
|
**/
|
|
void
|
|
e_shell_view_set_title (EShellView *shell_view,
|
|
const gchar *title)
|
|
{
|
|
g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
|
|
|
|
if (title == NULL)
|
|
title = E_SHELL_VIEW_GET_CLASS (shell_view)->label;
|
|
|
|
if (g_strcmp0 (shell_view->priv->title, title) == 0)
|
|
return;
|
|
|
|
g_free (shell_view->priv->title);
|
|
shell_view->priv->title = g_strdup (title);
|
|
|
|
g_object_notify (G_OBJECT (shell_view), "title");
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_view_id:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the ID of the currently selected #GalView.
|
|
*
|
|
* #EShellView subclasses are responsible for keeping this property in
|
|
* sync with their #GalViewInstance. #EShellView itself just provides
|
|
* a place to store the view ID, and emits a #GObject::notify signal
|
|
* when the property changes.
|
|
*
|
|
* Returns: the ID of the current #GalView
|
|
**/
|
|
const gchar *
|
|
e_shell_view_get_view_id (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return shell_view->priv->view_id;
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_set_view_id:
|
|
* @shell_view: an #EShellView
|
|
* @view_id: a #GalView ID
|
|
*
|
|
* Selects the #GalView whose ID is equal to @view_id.
|
|
*
|
|
* #EShellView subclasses are responsible for keeping this property in
|
|
* sync with their #GalViewInstance. #EShellView itself just provides
|
|
* a place to store the view ID, and emits a #GObject::notify signal
|
|
* when the property changes.
|
|
**/
|
|
void
|
|
e_shell_view_set_view_id (EShellView *shell_view,
|
|
const gchar *view_id)
|
|
{
|
|
g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
|
|
|
|
if (g_strcmp0 (shell_view->priv->view_id, view_id) == 0)
|
|
return;
|
|
|
|
g_free (shell_view->priv->view_id);
|
|
shell_view->priv->view_id = g_strdup (view_id);
|
|
|
|
g_object_notify (G_OBJECT (shell_view), "view-id");
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_shell_window:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the #EShellWindow to which @shell_view belongs.
|
|
*
|
|
* Returns: the #EShellWindow to which @shell_view belongs
|
|
**/
|
|
EShellWindow *
|
|
e_shell_view_get_shell_window (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return E_SHELL_WINDOW (shell_view->priv->shell_window);
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_shell_module:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the corresponding #EShellModule for @shell_view.
|
|
*
|
|
* Returns: the corresponding #EShellModule for @shell_view
|
|
**/
|
|
EShellModule *
|
|
e_shell_view_get_shell_module (EShellView *shell_view)
|
|
{
|
|
EShellViewClass *shell_view_class;
|
|
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
/* Calling this function during the shell view's instance
|
|
* initialization function will return the wrong result,
|
|
* so watch for that and emit a warning. */
|
|
shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW_CLASS (shell_view_class), NULL);
|
|
|
|
return E_SHELL_MODULE (shell_view_class->type_module);
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_is_active:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns %TRUE if @shell_view is active. That is, if it's currently
|
|
* visible in its #EShellWindow. An #EShellWindow can only display one
|
|
* shell view at a time.
|
|
*
|
|
* Technically this just checks the #GtkToggleAction:active property of
|
|
* the shell view's switcher action. See e_shell_view_get_action().
|
|
*
|
|
* Returns: %TRUE if @shell_view is active
|
|
**/
|
|
gboolean
|
|
e_shell_view_is_active (EShellView *shell_view)
|
|
{
|
|
GtkAction *action;
|
|
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE);
|
|
|
|
action = e_shell_view_get_action (shell_view);
|
|
|
|
return gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_page_num:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* This function is only interesting to #EShellWindow. It returns the
|
|
* #GtkNotebook page number for @shell_view. The rest of the application
|
|
* should have no need for this.
|
|
*
|
|
* Returns: the notebook page number for @shell_view
|
|
**/
|
|
gint
|
|
e_shell_view_get_page_num (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), -1);
|
|
|
|
return shell_view->priv->page_num;
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_set_page_num:
|
|
* @shell_view: an #EShellView
|
|
* @page_num: a notebook page number
|
|
*
|
|
* This function is only interesting to #EShellWindow. It sets the
|
|
* #GtkNotebook page number for @shell_view. The rest of the application
|
|
* must never call this because it could mess up shell view switching.
|
|
**/
|
|
void
|
|
e_shell_view_set_page_num (EShellView *shell_view,
|
|
gint page_num)
|
|
{
|
|
g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
|
|
|
|
shell_view->priv->page_num = page_num;
|
|
|
|
g_object_notify (G_OBJECT (shell_view), "page-num");
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_size_group:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns a #GtkSizeGroup that #EShellContent and #EShellSidebar use
|
|
* to keep the search bar and sidebar banner vertically aligned. The
|
|
* rest of the application should have no need for this.
|
|
*
|
|
* Returns: a #GtkSizeGroup for internal use
|
|
**/
|
|
GtkSizeGroup *
|
|
e_shell_view_get_size_group (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return shell_view->priv->size_group;
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_shell_content:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the #EShellContent instance for @shell_view.
|
|
*
|
|
* By default, #EShellView creates a plain #EShellContent during
|
|
* initialization. But #EShellView subclasses can override the
|
|
* <structfield>new_shell_content</structfield> factory method
|
|
* in #EShellViewClass to create a custom #EShellContent.
|
|
*
|
|
* Returns: the #EShellContent instance for @shell_view
|
|
**/
|
|
EShellContent *
|
|
e_shell_view_get_shell_content (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return E_SHELL_CONTENT (shell_view->priv->shell_content);
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_shell_sidebar:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the #EShellSidebar instance for @shell_view.
|
|
*
|
|
* By default, #EShellView creates a plain #EShellSidebar during
|
|
* initialization. But #EShellView subclasses can override the
|
|
* <structfield>new_shell_sidebar</structfield> factory method
|
|
* in #EShellViewClass to create a custom #EShellSidebar.
|
|
*
|
|
* Returns: the #EShellSidebar instance for @shell_view
|
|
**/
|
|
EShellSidebar *
|
|
e_shell_view_get_shell_sidebar (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return E_SHELL_SIDEBAR (shell_view->priv->shell_sidebar);
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_get_shell_taskbar:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Returns the #EShellTaskbar instance for @shell_view.
|
|
*
|
|
* By default, #EShellView creates a plain #EShellTaskbar during
|
|
* initialization. But #EShellView subclasses can override the
|
|
* <structfield>new_shell_taskbar</structfield> factory method
|
|
* in #EShellViewClass to create a custom #EShellTaskbar.
|
|
*
|
|
* Returns: the #EShellTaskbar instance for @shell_view
|
|
**/
|
|
EShellTaskbar *
|
|
e_shell_view_get_shell_taskbar (EShellView *shell_view)
|
|
{
|
|
g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
|
|
|
|
return E_SHELL_TASKBAR (shell_view->priv->shell_taskbar);
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_update_actions:
|
|
* @shell_view: an #EShellView
|
|
*
|
|
* Emits the #EShellView::update-actions signal.
|
|
*
|
|
* #EShellView subclasses should implement the
|
|
* <structfield>update_actions</structfield> method in #EShellViewClass
|
|
* to update the various #GtkAction<!-- -->s based on the current
|
|
* #EShellSidebar and #EShellContent selections. The
|
|
* #EShellView::update-actions signal is typically emitted just before
|
|
* showing a popup menu or just after the user selects an item in the
|
|
* shell view.
|
|
**/
|
|
void
|
|
e_shell_view_update_actions (EShellView *shell_view)
|
|
{
|
|
g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
|
|
|
|
g_signal_emit (shell_view, signals[UPDATE_ACTIONS], 0);
|
|
}
|
|
|
|
/**
|
|
* e_shell_view_show_popup_menu:
|
|
* @shell_view: an #EShellView
|
|
* @widget_path: path in the UI definition
|
|
* @event: a #GdkEventButton
|
|
*
|
|
* Displays a context-sensitive (or "popup") menu that is described in
|
|
* the UI definition loaded into @shell_view<!-- -->'s user interface
|
|
* manager. The menu will be shown at the current mouse cursor position.
|
|
*
|
|
* The #EShellView::update-actions signal is emitted just prior to
|
|
* showing the menu to give @shell_view and any plugins that extend
|
|
* @shell_view a chance to update the menu's actions.
|
|
**/
|
|
void
|
|
e_shell_view_show_popup_menu (EShellView *shell_view,
|
|
const gchar *widget_path,
|
|
GdkEventButton *event)
|
|
{
|
|
EShellWindow *shell_window;
|
|
GtkWidget *menu;
|
|
|
|
g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
|
|
|
|
e_shell_view_update_actions (shell_view);
|
|
|
|
shell_window = e_shell_view_get_shell_window (shell_view);
|
|
menu = e_shell_window_get_managed_widget (shell_window, widget_path);
|
|
g_return_if_fail (GTK_IS_MENU (menu));
|
|
|
|
if (event != NULL)
|
|
gtk_menu_popup (
|
|
GTK_MENU (menu), NULL, NULL, NULL, NULL,
|
|
event->button, event->time);
|
|
else
|
|
gtk_menu_popup (
|
|
GTK_MENU (menu), NULL, NULL, NULL, NULL,
|
|
0, gtk_get_current_event_time ());
|
|
}
|