Пример #1
0
static void
etgl_get_property (GObject *object,
                   guint property_id,
                   GValue *value,
                   GParamSpec *pspec)
{
	ETableGroup *etg = E_TABLE_GROUP (object);
	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);

	switch (property_id) {
	case PROP_FROZEN:
		g_value_set_boolean (value, etg->frozen);
		break;
	case PROP_HEIGHT:
		g_value_set_double (value, etgl->height);
		break;
	case PROP_WIDTH:
		g_value_set_double (value, etgl->width);
		break;
	case PROP_MINIMUM_WIDTH:
		g_value_set_double (value, etgl->minimum_width);
		break;
	case PROP_UNIFORM_ROW_HEIGHT:
		g_value_set_boolean (value, etgl->uniform_row_height);
		break;
	case PROP_IS_EDITING:
		g_value_set_boolean (value, e_table_group_leaf_is_editing (etgl));
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}
/**
 * e_table_group_container_construct
 * @parent: The %GnomeCanvasGroup to create a child of.
 * @etgc: The %ETableGroupContainer.
 * @full_header: The full header of the %ETable.
 * @header: The current header of the %ETable.
 * @model: The %ETableModel of the %ETable.
 * @sort_info: The %ETableSortInfo of the %ETable.
 * @n: Which grouping level this is (Starts at 0 and sends n + 1 to any child %ETableGroups.
 *
 * This routine constructs the new %ETableGroupContainer.
 */
void
e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
				   ETableHeader *full_header,
				   ETableHeader     *header,
				   ETableModel *model, ETableSortInfo *sort_info, int n)
{
	ETableCol *col;
	ETableSortColumn column = e_table_sort_info_grouping_get_nth(sort_info, n);
	GtkStyle *style;

	col = e_table_header_get_column_by_col_idx(full_header, column.column);
	if (col == NULL)
		col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);

	e_table_group_construct (parent, E_TABLE_GROUP (etgc), full_header, header, model);
	etgc->ecol = col;
	g_object_ref (etgc->ecol);
	etgc->sort_info = sort_info;
	g_object_ref (etgc->sort_info);
	etgc->n = n;
	etgc->ascending = column.ascending;

	style = GTK_WIDGET (GNOME_CANVAS_ITEM (etgc)->canvas)->style;
	etgc->font_desc = pango_font_description_copy (style->font_desc);

	etgc->open = TRUE;
}
static void
etgc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
	ETableGroup *etg = E_TABLE_GROUP (object);
	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);

	switch (prop_id) {
	case PROP_FROZEN:
		g_value_set_boolean (value, etg->frozen);
		break;
	case PROP_HEIGHT:
		g_value_set_double (value, etgc->height);
		break;
	case PROP_WIDTH:
		g_value_set_double (value, etgc->width);
		break;
	case PROP_MINIMUM_WIDTH:
		g_value_set_double (value, etgc->minimum_width);
		break;
	case PROP_UNIFORM_ROW_HEIGHT:
		g_value_set_boolean (value, etgc->uniform_row_height);
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
		break;
	}
}
Пример #4
0
static void
etgl_realize (GnomeCanvasItem *item)
{
	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (item);

	if (GNOME_CANVAS_ITEM_CLASS (e_table_group_leaf_parent_class)->realize)
		GNOME_CANVAS_ITEM_CLASS (e_table_group_leaf_parent_class)->realize (item);

	etgl->item = E_TABLE_ITEM (gnome_canvas_item_new (
		GNOME_CANVAS_GROUP (etgl),
		e_table_item_get_type (),
		"ETableHeader", E_TABLE_GROUP (etgl)->header,
		"ETableModel", etgl->ets,
		"alternating_row_colors", etgl->alternating_row_colors,
		"horizontal_draw_grid", etgl->horizontal_draw_grid,
		"vertical_draw_grid", etgl->vertical_draw_grid,
		"drawfocus", etgl->draw_focus,
		"cursor_mode", etgl->cursor_mode,
		"minimum_width", etgl->minimum_width,
		"length_threshold", etgl->length_threshold,
		"selection_model", etgl->selection_model,
		"uniform_row_height", etgl->uniform_row_height,
		NULL));

	etgl->etgl_cursor_change_id = g_signal_connect (
		etgl->item, "cursor_change",
		G_CALLBACK (etgl_cursor_change), etgl);

	etgl->etgl_cursor_activated_id = g_signal_connect (
		etgl->item, "cursor_activated",
		G_CALLBACK (etgl_cursor_activated), etgl);

	etgl->etgl_double_click_id = g_signal_connect (
		etgl->item, "double_click",
		G_CALLBACK (etgl_double_click), etgl);

	etgl->etgl_right_click_id = g_signal_connect (
		etgl->item, "right_click",
		G_CALLBACK (etgl_right_click), etgl);

	etgl->etgl_click_id = g_signal_connect (
		etgl->item, "click",
		G_CALLBACK (etgl_click), etgl);

	etgl->etgl_key_press_id = g_signal_connect (
		etgl->item, "key_press",
		G_CALLBACK (etgl_key_press), etgl);

	etgl->etgl_start_drag_id = g_signal_connect (
		etgl->item, "start_drag",
		G_CALLBACK (etgl_start_drag), etgl);

	etgl->notify_is_editing_id = e_signal_connect_notify (
		etgl->item, "notify::is-editing",
		G_CALLBACK (etgl_item_is_editing_changed_cb), etgl);

	e_canvas_item_request_reflow (item);
}
Пример #5
0
static gboolean
etgl_start_drag (GObject *object,
                 gint model_row,
                 gint model_col,
                 GdkEvent *event,
                 ETableGroupLeaf *etgl)
{
	return e_table_group_start_drag (
		E_TABLE_GROUP (etgl), model_row, model_col, event);
}
Пример #6
0
static void
etgl_double_click (GObject *object,
                   gint model_row,
                   gint model_col,
                   GdkEvent *event,
                   ETableGroupLeaf *etgl)
{
	e_table_group_double_click (
		E_TABLE_GROUP (etgl), model_row, model_col, event);
}
static ETableGroupContainerChildNode *
create_child_node (ETableGroupContainer *etgc, void *val)
{
	ETableGroup *child;
	ETableGroupContainerChildNode *child_node;
	ETableGroup *etg = E_TABLE_GROUP(etgc);

	child_node = g_new (ETableGroupContainerChildNode, 1);
	child_node->rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
						  gnome_canvas_rect_get_type (),
						  "fill_color", "grey70",
						  "outline_color", "grey50",
						  NULL);
	child_node->text = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
						  e_text_get_type (),
						  "anchor", GTK_ANCHOR_SW,
						  "fill_color", "black",
						  "draw_background", FALSE,
						  NULL);
	child = e_table_group_new (GNOME_CANVAS_GROUP (etgc), etg->full_header,
				   etg->header, etg->model, etgc->sort_info, etgc->n + 1);
	gnome_canvas_item_set(GNOME_CANVAS_ITEM(child),
			      "alternating_row_colors", etgc->alternating_row_colors,
			      "horizontal_draw_grid", etgc->horizontal_draw_grid,
			      "vertical_draw_grid", etgc->vertical_draw_grid,
			      "drawfocus", etgc->draw_focus,
			      "cursor_mode", etgc->cursor_mode,
			      "selection_model", etgc->selection_model,
			      "length_threshold", etgc->length_threshold,
			      "uniform_row_height", etgc->uniform_row_height,
			      "minimum_width", etgc->minimum_width - GROUP_INDENT,
			      NULL);

	g_signal_connect (child, "cursor_change",
			  G_CALLBACK (child_cursor_change), etgc);
	g_signal_connect (child, "cursor_activated",
			  G_CALLBACK (child_cursor_activated), etgc);
	g_signal_connect (child, "double_click",
			  G_CALLBACK (child_double_click), etgc);
	g_signal_connect (child, "right_click",
			  G_CALLBACK (child_right_click), etgc);
	g_signal_connect (child, "click",
			  G_CALLBACK (child_click), etgc);
	g_signal_connect (child, "key_press",
			  G_CALLBACK (child_key_press), etgc);
	g_signal_connect (child, "start_drag",
			  G_CALLBACK (child_start_drag), etgc);
	child_node->child = child;
	child_node->key = e_table_model_duplicate_value (etg->model, etgc->ecol->col_idx, val);
	child_node->string = e_table_model_value_to_string (etg->model, etgc->ecol->col_idx, val);
	child_node->count = 0;

	return child_node;
}
static void
e_table_group_container_child_node_free (ETableGroupContainer          *etgc,
					ETableGroupContainerChildNode *child_node)
{
	ETableGroup *etg = E_TABLE_GROUP (etgc);
	ETableGroup *child = child_node->child;

	gtk_object_destroy (GTK_OBJECT (child));
	e_table_model_free_value (etg->model, etgc->ecol->col_idx,
				  child_node->key);
	g_free(child_node->string);
	gtk_object_destroy (GTK_OBJECT (child_node->text));
	gtk_object_destroy (GTK_OBJECT (child_node->rect));
}
/**
 * e_table_group_container_new
 * @parent: The %GnomeCanvasGroup to create a child of.
 * @full_header: The full header of the %ETable.
 * @header: The current header of the %ETable.
 * @model: The %ETableModel of the %ETable.
 * @sort_info: The %ETableSortInfo of the %ETable.
 * @n: Which grouping level this is (Starts at 0 and sends n + 1 to any child %ETableGroups.
 *
 * %ETableGroupContainer is an %ETableGroup which groups by the nth
 * grouping of the %ETableSortInfo.  It creates %ETableGroups as
 * children.
 *
 * Returns: The new %ETableGroupContainer.
 */
ETableGroup *
e_table_group_container_new (GnomeCanvasGroup *parent, ETableHeader *full_header,
			     ETableHeader     *header,
			     ETableModel *model, ETableSortInfo *sort_info, int n)
{
	ETableGroupContainer *etgc;

	g_return_val_if_fail (parent != NULL, NULL);

	etgc = g_object_new (E_TABLE_GROUP_CONTAINER_TYPE, NULL);

	e_table_group_container_construct (parent, etgc, full_header, header,
					   model, sort_info, n);
	return E_TABLE_GROUP (etgc);
}
Пример #10
0
static void
etgl_cursor_activated (GObject *object,
                       gint view_row,
                       ETableGroupLeaf *etgl)
{
	ETableSubset *table_subset;
	gint model_row;

	table_subset = E_TABLE_SUBSET (etgl->ets);
	model_row = e_table_subset_view_to_model_row (table_subset, view_row);

	if (model_row < 0)
		return;

	e_table_group_cursor_activated (E_TABLE_GROUP (etgl), model_row);
}
Пример #11
0
static gboolean
etgl_click (GObject *object,
            gint row,
            gint col,
            GdkEvent *event,
            ETableGroupLeaf *etgl)
{
	ETableSubset *table_subset;
	gint model_row;

	table_subset = E_TABLE_SUBSET (etgl->ets);
	model_row = e_table_subset_view_to_model_row (table_subset, row);

	if (model_row < 0)
		return FALSE;

	return e_table_group_click (
		E_TABLE_GROUP (etgl), model_row, col, event);
}
Пример #12
0
/**
 * e_table_group_leaf_new
 * @parent: The %GnomeCanvasGroup to create a child of.
 * @full_header: The full header of the %ETable.
 * @header: The current header of the %ETable.
 * @model: The %ETableModel of the %ETable.
 * @sort_info: The %ETableSortInfo of the %ETable.
 *
 * %ETableGroupLeaf is an %ETableGroup which simply contains an
 * %ETableItem.
 *
 * Returns: The new %ETableGroupLeaf.
 */
ETableGroup *
e_table_group_leaf_new (GnomeCanvasGroup *parent,
                        ETableHeader *full_header,
                        ETableHeader *header,
                        ETableModel *model,
                        ETableSortInfo *sort_info)
{
	ETableGroupLeaf *etgl;

	g_return_val_if_fail (parent != NULL, NULL);

	etgl = g_object_new (E_TYPE_TABLE_GROUP_LEAF, NULL);

	e_table_group_leaf_construct (
		parent, etgl, full_header,
		header, model, sort_info);

	return E_TABLE_GROUP (etgl);
}
Пример #13
0
static void
e_table_group_leaf_construct (GnomeCanvasGroup *parent,
                              ETableGroupLeaf *etgl,
                              ETableHeader *full_header,
                              ETableHeader *header,
                              ETableModel *model,
                              ETableSortInfo *sort_info)
{
	etgl->is_grouped =
		(e_table_sort_info_grouping_get_count (sort_info) > 0);

	if (etgl->is_grouped)
		etgl->ets = e_table_sorted_variable_new (
			model, full_header, sort_info);
	else
		etgl->ets = e_table_sorted_new (
			model, full_header, sort_info);

	e_table_group_construct (
		parent, E_TABLE_GROUP (etgl), full_header, header, model);
}
Пример #14
0
static void
etgl_set_property (GObject *object,
                   guint property_id,
                   const GValue *value,
                   GParamSpec *pspec)
{
	ETableGroup *etg = E_TABLE_GROUP (object);
	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);

	switch (property_id) {
	case PROP_FROZEN:
		etg->frozen = g_value_get_boolean (value);
		break;
	case PROP_MINIMUM_WIDTH:
	case PROP_WIDTH:
		etgl->minimum_width = g_value_get_double (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"minimum_width", etgl->minimum_width,
				NULL);
		}
		break;
	case PROP_LENGTH_THRESHOLD:
		etgl->length_threshold = g_value_get_int (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"length_threshold", etgl->length_threshold,
				NULL);
		}
		break;
	case PROP_SELECTION_MODEL:
		if (etgl->selection_model)
			g_object_unref (etgl->selection_model);
		etgl->selection_model = E_SELECTION_MODEL (g_value_get_object (value));
		if (etgl->selection_model) {
			g_object_ref (etgl->selection_model);
		}
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"selection_model", etgl->selection_model,
				NULL);
		}
		break;

	case PROP_UNIFORM_ROW_HEIGHT:
		etgl->uniform_row_height = g_value_get_boolean (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"uniform_row_height", etgl->uniform_row_height,
				NULL);
		}
		break;

	case PROP_TABLE_ALTERNATING_ROW_COLORS:
		etgl->alternating_row_colors = g_value_get_boolean (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"alternating_row_colors", etgl->alternating_row_colors,
				NULL);
		}
		break;

	case PROP_TABLE_HORIZONTAL_DRAW_GRID:
		etgl->horizontal_draw_grid = g_value_get_boolean (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"horizontal_draw_grid", etgl->horizontal_draw_grid,
				NULL);
		}
		break;

	case PROP_TABLE_VERTICAL_DRAW_GRID:
		etgl->vertical_draw_grid = g_value_get_boolean (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"vertical_draw_grid", etgl->vertical_draw_grid,
				NULL);
		}
		break;

	case PROP_TABLE_DRAW_FOCUS:
		etgl->draw_focus = g_value_get_boolean (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"drawfocus", etgl->draw_focus,
				NULL);
		}
		break;

	case PROP_CURSOR_MODE:
		etgl->cursor_mode = g_value_get_int (value);
		if (etgl->item) {
			gnome_canvas_item_set (
				GNOME_CANVAS_ITEM (etgl->item),
				"cursor_mode", etgl->cursor_mode,
				NULL);
		}
		break;
	default:
		break;
	}
}
static void
etgc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
	ETableGroup *etg = E_TABLE_GROUP (object);
	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
	GList *list;

	switch (prop_id) {
	case PROP_FROZEN:
		if (g_value_get_boolean (value))
			etg->frozen = TRUE;
		else {
			etg->frozen = FALSE;
			etgc_thaw (etg);
		}
		break;
	case PROP_MINIMUM_WIDTH:
	case PROP_WIDTH:
		etgc->minimum_width = g_value_get_double (value);

		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "minimum_width", etgc->minimum_width - GROUP_INDENT,
				      NULL);
		}
		break;
	case PROP_LENGTH_THRESHOLD:
		etgc->length_threshold = g_value_get_int (value);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "length_threshold", etgc->length_threshold,
				      NULL);
		}
		break;
	case PROP_UNIFORM_ROW_HEIGHT:
		etgc->uniform_row_height = g_value_get_boolean (value);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "uniform_row_height", etgc->uniform_row_height,
				      NULL);
		}
		break;

	case PROP_SELECTION_MODEL:
		if (etgc->selection_model)
			g_object_unref (etgc->selection_model);
		etgc->selection_model = E_SELECTION_MODEL(g_value_get_object (value));
		if (etgc->selection_model)
			g_object_ref (etgc->selection_model);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "selection_model", etgc->selection_model,
				      NULL);
		}
		break;

	case PROP_TABLE_ALTERNATING_ROW_COLORS:
		etgc->alternating_row_colors = g_value_get_boolean (value);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "alternating_row_colors", etgc->alternating_row_colors,
				      NULL);
		}
		break;

	case PROP_TABLE_HORIZONTAL_DRAW_GRID:
		etgc->horizontal_draw_grid = g_value_get_boolean (value);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "horizontal_draw_grid", etgc->horizontal_draw_grid,
				      NULL);
		}
		break;

	case PROP_TABLE_VERTICAL_DRAW_GRID:
		etgc->vertical_draw_grid = g_value_get_boolean (value);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "vertical_draw_grid", etgc->vertical_draw_grid,
				      NULL);
		}
		break;

	case PROP_TABLE_DRAW_FOCUS:
		etgc->draw_focus = g_value_get_boolean (value);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "drawfocus", etgc->draw_focus,
				      NULL);
		}
		break;

	case PROP_CURSOR_MODE:
		etgc->cursor_mode = g_value_get_int (value);
		for (list = etgc->children; list; list = g_list_next (list)) {
			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
			g_object_set (child_node->child,
				      "cursor_mode", etgc->cursor_mode,
				      NULL);
		}
		break;
	default:
		break;
	}
}
static gint
child_start_drag (ETableGroup *etg, int row, int col, GdkEvent *event,
		 ETableGroupContainer *etgc)
{
	return e_table_group_start_drag (E_TABLE_GROUP (etgc), row, col, event);
}
static void
child_double_click (ETableGroup *etg, int row, int col, GdkEvent *event,
		    ETableGroupContainer *etgc)
{
	e_table_group_double_click (E_TABLE_GROUP (etgc), row, col, event);
}
static void
child_cursor_activated (ETableGroup *etg, int row,
		    ETableGroupContainer *etgc)
{
	e_table_group_cursor_activated (E_TABLE_GROUP (etgc), row);
}