/*
* GNOME Logs - View and search logs
* Copyright (C) 2014, 2015 Red Hat, Inc.
* Copyright (C) 2014 Jonathan Kang
*
* 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 3 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, see .
*/
#include "gl-eventview.h"
#include
#include
#include
#include "gl-categorylist.h"
#include "gl-enums.h"
#include "gl-eventtoolbar.h"
#include "gl-eventviewdetail.h"
#include "gl-eventviewlist.h"
#include "gl-journal.h"
#include "gl-util.h"
enum
{
PROP_0,
PROP_MODE,
N_PROPERTIES
};
struct _GlEventView
{
/*< private >*/
GtkStack parent_instance;
};
typedef struct
{
GtkWidget *events;
GlJournalEntry *entry;
GlUtilClockFormat clock_format;
GlEventViewMode mode;
} GlEventViewPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (GlEventView, gl_event_view, GTK_TYPE_STACK)
static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
static const gchar DESKTOP_SCHEMA[] = "org.gnome.desktop.interface";
static const gchar CLOCK_FORMAT[] = "clock-format";
gchar *
gl_event_view_get_output_logs (GlEventView *view)
{
GlEventViewPrivate *priv;
GlEventViewList *events;
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
return gl_event_view_list_get_output_logs (events);
}
gchar *
gl_event_view_get_boot_time (GlEventView *view,
const gchar *boot_match)
{
GlEventViewPrivate *priv;
GlEventViewList *events;
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
return gl_event_view_list_get_boot_time (events, boot_match);
}
GArray *
gl_event_view_get_boot_ids (GlEventView *view)
{
GlEventViewPrivate *priv;
GlEventViewList *events;
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
return gl_event_view_list_get_boot_ids (events);
}
void
gl_event_view_view_boot (GlEventView *view, const gchar *match)
{
GlEventViewList *events;
GlEventViewPrivate *priv;
g_return_if_fail (GL_EVENT_VIEW (view));
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
gl_event_view_list_view_boot (events, match);
}
void
gl_event_view_show_detail (GlEventView *view)
{
GlEventViewList *events;
GlEventViewPrivate *priv;
g_return_if_fail (GL_EVENT_VIEW (view));
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
priv->entry = gl_event_view_list_get_detail_entry (events);
}
gboolean
gl_event_view_handle_search_event (GlEventView *view,
GAction *action,
GdkEvent *event)
{
GlEventViewPrivate *priv;
GlEventViewList *events;
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
if (gl_event_view_list_handle_search_event (events, action,
event) == GDK_EVENT_STOP)
{
return GDK_EVENT_STOP;
}
return GDK_EVENT_PROPAGATE;
}
void
gl_event_view_set_search_mode (GlEventView *view,
gboolean state)
{
GlEventViewPrivate *priv;
GlEventViewList *events;
g_return_if_fail (GL_EVENT_VIEW (view));
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
gl_event_view_list_set_search_mode (events, state);
}
void
gl_event_view_set_sort_order (GlEventView *view,
GlSortOrder sort_order)
{
GlEventViewPrivate *priv;
GlEventViewList *events;
g_return_if_fail (GL_EVENT_VIEW (view));
priv = gl_event_view_get_instance_private (view);
events = GL_EVENT_VIEW_LIST (priv->events);
gl_event_view_list_set_sort_order (events, sort_order);
}
static void
on_notify_mode (GlEventView *view,
GParamSpec *pspec,
gpointer user_data)
{
GlEventViewPrivate *priv;
GtkStack *stack;
GtkWidget *detail;
priv = gl_event_view_get_instance_private (view);
stack = GTK_STACK (view);
switch (priv->mode)
{
case GL_EVENT_VIEW_MODE_LIST:
{
GtkWidget *child;
child = gtk_stack_get_child_by_name (stack, "detail");
if (child)
{
gtk_container_remove (GTK_CONTAINER (stack), child);
}
gtk_stack_set_visible_child (stack, priv->events);
}
break;
case GL_EVENT_VIEW_MODE_DETAIL:
{
gl_event_view_show_detail (view);
detail = gl_event_view_detail_new (priv->entry,
priv->clock_format);
gtk_widget_show_all (detail);
gtk_stack_add_named (stack, detail, "detail");
gtk_stack_set_visible_child_name (stack, "detail");
}
break;
default:
g_assert_not_reached ();
break;
}
}
static void
gl_event_view_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GlEventView *view = GL_EVENT_VIEW (object);
GlEventViewPrivate *priv = gl_event_view_get_instance_private (view);
switch (prop_id)
{
case PROP_MODE:
g_value_set_enum (value, priv->mode);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gl_event_view_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GlEventView *view = GL_EVENT_VIEW (object);
GlEventViewPrivate *priv = gl_event_view_get_instance_private (view);
switch (prop_id)
{
case PROP_MODE:
priv->mode = g_value_get_enum (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gl_event_view_class_init (GlEventViewClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
gobject_class->get_property = gl_event_view_get_property;
gobject_class->set_property = gl_event_view_set_property;
obj_properties[PROP_MODE] = g_param_spec_enum ("mode", "Mode",
"Event display mode",
GL_TYPE_EVENT_VIEW_MODE,
GL_EVENT_VIEW_MODE_LIST,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, N_PROPERTIES,
obj_properties);
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/Logs/gl-eventview.ui");
gtk_widget_class_bind_template_child_private (widget_class, GlEventView,
events);
}
static void
gl_event_view_init (GlEventView *view)
{
GlEventViewPrivate *priv;
GSettings *settings;
gtk_widget_init_template (GTK_WIDGET (view));
priv = gl_event_view_get_instance_private (view);
/* TODO: Monitor and propagate any GSettings changes. */
settings = g_settings_new (DESKTOP_SCHEMA);
priv->clock_format = g_settings_get_enum (settings, CLOCK_FORMAT);
g_object_unref (settings);
g_signal_connect (view, "notify::mode", G_CALLBACK (on_notify_mode),
NULL);
}
void
gl_event_view_set_mode (GlEventView *view,
GlEventViewMode mode)
{
GlEventViewPrivate *priv;
g_return_if_fail (GL_EVENT_VIEW (view));
priv = gl_event_view_get_instance_private (view);
if (priv->mode != mode)
{
priv->mode = mode;
g_object_notify_by_pspec (G_OBJECT (view),
obj_properties[PROP_MODE]);
}
}
GtkWidget *
gl_event_view_new (void)
{
return g_object_new (GL_TYPE_EVENT_VIEW, NULL);
}