* Pidgin is the legal property of its developers, whose names are too numerous * to list here. Please refer to the COPYRIGHT file distributed with this * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA /* This is taken largely from GtkCellRenderer[Text|Pixbuf|Toggle] by * Jonathon Blandford <jrb@redhat.com> for RedHat, Inc. #include "gtkcellrendererexpander.h" struct _PidginCellRendererExpander { static void pidgin_cell_renderer_expander_get_property (GObject *object, static void pidgin_cell_renderer_expander_set_property (GObject *object, static void pidgin_cell_renderer_expander_init (PidginCellRendererExpander *cellexpander); static void pidgin_cell_renderer_expander_class_init (PidginCellRendererExpanderClass *class); static void pidgin_cell_renderer_expander_get_size (GtkCellRenderer *cell, const GdkRectangle *cell_area, static void pidgin_cell_renderer_expander_render (GtkCellRenderer *cell, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags); static gboolean pidgin_cell_renderer_expander_activate (GtkCellRenderer *r, const GdkRectangle *cell, GtkCellRendererState flags); static void pidgin_cell_renderer_expander_finalize (GObject *gobject); /* static guint expander_cell_renderer_signals [LAST_SIGNAL]; */ G_DEFINE_TYPE(PidginCellRendererExpander, pidgin_cell_renderer_expander, static void pidgin_cell_renderer_expander_init (PidginCellRendererExpander *cellexpander) g_object_set(G_OBJECT(cellexpander), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); gtk_cell_renderer_set_padding(GTK_CELL_RENDERER(cellexpander), 0, 2); static void pidgin_cell_renderer_expander_class_init (PidginCellRendererExpanderClass *class) GObjectClass *object_class = G_OBJECT_CLASS(class); GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(class); object_class->finalize = pidgin_cell_renderer_expander_finalize; object_class->get_property = pidgin_cell_renderer_expander_get_property; object_class->set_property = pidgin_cell_renderer_expander_set_property; cell_class->get_size = pidgin_cell_renderer_expander_get_size; cell_class->render = pidgin_cell_renderer_expander_render; cell_class->activate = pidgin_cell_renderer_expander_activate; g_object_class_install_property (object_class, g_param_spec_boolean ("expander-visible", "True if the renderer should draw an expander", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); static void pidgin_cell_renderer_expander_finalize (GObject *object) PidginCellRendererExpander *cellexpander = PIDGIN_CELL_RENDERER_EXPANDER(object); G_OBJECT_CLASS(pidgin_cell_renderer_expander_parent_class)->finalize(object); static void pidgin_cell_renderer_expander_get_property (GObject *object, PidginCellRendererExpander *cellexpander = PIDGIN_CELL_RENDERER_EXPANDER(object); g_value_set_boolean(value, cellexpander->is_expander); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, psec); static void pidgin_cell_renderer_expander_set_property (GObject *object, PidginCellRendererExpander *cellexpander = PIDGIN_CELL_RENDERER_EXPANDER (object); cellexpander->is_expander = g_value_get_boolean(value); G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); GtkCellRenderer *pidgin_cell_renderer_expander_new(void) return g_object_new(PIDGIN_TYPE_CELL_RENDERER_EXPANDER, NULL); pidgin_cell_renderer_expander_get_size (GtkCellRenderer *cell, const GdkRectangle *cell_area, gtk_widget_style_get(widget, "expander-size", &expander_size, NULL); gtk_cell_renderer_get_padding(cell, &xpad, &ypad); gtk_cell_renderer_get_alignment(cell, &xalign, &yalign); calc_width = (gint) xpad * 2 + expander_size; calc_height = (gint) ypad * 2 + expander_size; *x_offset = xalign * (cell_area->width - calc_width); *x_offset = MAX (*x_offset, 0); *y_offset = yalign * (cell_area->height - calc_height); *y_offset = MAX (*y_offset, 0); pidgin_cell_renderer_expander_render(GtkCellRenderer *cell, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) PidginCellRendererExpander *cellexpander = (PidginCellRendererExpander *) cell; GtkAllocation allocation; GtkStyleContext *context; if (!cellexpander->is_expander) gtk_cell_renderer_get_padding(cell, &xpad, &ypad); g_object_get(G_OBJECT(cell), "is-expanded", &is_expanded, NULL); width = cell_area->width; height = cell_area->height; if (!gtk_widget_get_sensitive(widget)) state = GTK_STATE_FLAG_INSENSITIVE; else if (flags & GTK_CELL_RENDERER_PRELIT) state = GTK_STATE_FLAG_PRELIGHT; else if (gtk_widget_has_focus(widget) && flags & GTK_CELL_RENDERER_SELECTED) state = GTK_STATE_FLAG_ACTIVE; state = GTK_STATE_FLAG_NORMAL; state |= GTK_STATE_FLAG_CHECKED; state &= ~GTK_STATE_FLAG_CHECKED; context = gtk_widget_get_style_context(widget); gtk_style_context_add_class(context, GTK_STYLE_CLASS_VIEW); gtk_style_context_add_class(context, GTK_STYLE_CLASS_EXPANDER); gtk_style_context_set_state(context, state); gtk_render_expander(context, cr, cell_area->x + xpad, cell_area->y + ypad, /* only draw the line if the color isn't set - this prevents a bug where the hline appears only under the expander */ g_object_get(cellexpander, "cell-background-set", &set, NULL); gtk_widget_get_allocation(widget, &allocation); gtk_render_line(context, cr, 0, cell_area->y + cell_area->height, allocation.width, cell_area->y + cell_area->height); pidgin_cell_renderer_expander_activate(GtkCellRenderer *r, const GdkRectangle *cell, GtkCellRendererState flags) GtkTreePath *path = gtk_tree_path_new_from_string(p); if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path)) gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path); gtk_tree_view_expand_row(GTK_TREE_VIEW(widget),path,FALSE); gtk_tree_path_free(path);