📄 gtkctree.c
字号:
widget_class->drag_begin = gtk_ctree_drag_begin; widget_class->drag_motion = gtk_ctree_drag_motion; widget_class->drag_data_received = gtk_ctree_drag_data_received; clist_class->select_row = real_select_row; clist_class->unselect_row = real_unselect_row; clist_class->row_move = real_row_move; clist_class->undo_selection = real_undo_selection; clist_class->resync_selection = resync_selection; clist_class->selection_find = selection_find; clist_class->click_column = NULL; clist_class->draw_row = draw_row; clist_class->draw_drag_highlight = draw_drag_highlight; clist_class->clear = real_clear; clist_class->select_all = real_select_all; clist_class->unselect_all = real_unselect_all; clist_class->fake_unselect_all = fake_unselect_all; clist_class->insert_row = real_insert_row; clist_class->remove_row = real_remove_row; clist_class->sort_list = real_sort_list; clist_class->set_cell_contents = set_cell_contents; clist_class->cell_size_request = cell_size_request; klass->tree_select_row = real_tree_select; klass->tree_unselect_row = real_tree_unselect; klass->tree_expand = real_tree_expand; klass->tree_collapse = real_tree_collapse; klass->tree_move = real_tree_move; klass->change_focus_row_expansion = change_focus_row_expansion; binding_set = gtk_binding_set_by_class (klass); gtk_binding_entry_add_signal (binding_set, '+', GDK_SHIFT_MASK, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_EXPAND); gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, 0, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_EXPAND); gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, GDK_CONTROL_MASK, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_EXPAND_RECURSIVE); gtk_binding_entry_add_signal (binding_set, '-', 0, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_COLLAPSE); gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, 0, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_COLLAPSE); gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, GDK_CONTROL_MASK, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE); gtk_binding_entry_add_signal (binding_set, '=', 0, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_TOGGLE); gtk_binding_entry_add_signal (binding_set, GDK_KP_Multiply, 0, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_TOGGLE); gtk_binding_entry_add_signal (binding_set, GDK_KP_Multiply, GDK_CONTROL_MASK, "change_focus_row_expansion", 1, GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE);}static voidgtk_ctree_set_arg (GtkObject *object, GtkArg *arg, guint arg_id){ GtkCTree *ctree; ctree = GTK_CTREE (object); switch (arg_id) { case ARG_N_COLUMNS: /* construct-only arg, only set when !GTK_CONSTRUCTED */ if (ctree->tree_column) gtk_ctree_construct (ctree, MAX (1, GTK_VALUE_UINT (*arg)), ctree->tree_column, NULL); else GTK_CLIST (ctree)->columns = MAX (1, GTK_VALUE_UINT (*arg)); break; case ARG_TREE_COLUMN: /* construct-only arg, only set when !GTK_CONSTRUCTED */ if (GTK_CLIST (ctree)->columns) gtk_ctree_construct (ctree, GTK_CLIST (ctree)->columns, MAX (1, GTK_VALUE_UINT (*arg)), NULL); else ctree->tree_column = MAX (1, GTK_VALUE_UINT (*arg)); break; case ARG_INDENT: gtk_ctree_set_indent (ctree, GTK_VALUE_UINT (*arg)); break; case ARG_SPACING: gtk_ctree_set_spacing (ctree, GTK_VALUE_UINT (*arg)); break; case ARG_SHOW_STUB: gtk_ctree_set_show_stub (ctree, GTK_VALUE_BOOL (*arg)); break; case ARG_LINE_STYLE: gtk_ctree_set_line_style (ctree, GTK_VALUE_ENUM (*arg)); break; case ARG_EXPANDER_STYLE: gtk_ctree_set_expander_style (ctree, GTK_VALUE_ENUM (*arg)); break; default: break; }}static voidgtk_ctree_get_arg (GtkObject *object, GtkArg *arg, guint arg_id){ GtkCTree *ctree; ctree = GTK_CTREE (object); switch (arg_id) { case ARG_N_COLUMNS: GTK_VALUE_UINT (*arg) = GTK_CLIST (ctree)->columns; break; case ARG_TREE_COLUMN: GTK_VALUE_UINT (*arg) = ctree->tree_column; break; case ARG_INDENT: GTK_VALUE_UINT (*arg) = ctree->tree_indent; break; case ARG_SPACING: GTK_VALUE_UINT (*arg) = ctree->tree_spacing; break; case ARG_SHOW_STUB: GTK_VALUE_BOOL (*arg) = ctree->show_stub; break; case ARG_LINE_STYLE: GTK_VALUE_ENUM (*arg) = ctree->line_style; break; case ARG_EXPANDER_STYLE: GTK_VALUE_ENUM (*arg) = ctree->expander_style; break; default: arg->type = GTK_TYPE_INVALID; break; }}static voidgtk_ctree_init (GtkCTree *ctree){ GtkCList *clist; GTK_CLIST_SET_FLAG (ctree, CLIST_DRAW_DRAG_RECT); GTK_CLIST_SET_FLAG (ctree, CLIST_DRAW_DRAG_LINE); clist = GTK_CLIST (ctree); ctree->tree_indent = 20; ctree->tree_spacing = 5; ctree->tree_column = 0; ctree->line_style = GTK_CTREE_LINES_SOLID; ctree->expander_style = GTK_CTREE_EXPANDER_SQUARE; ctree->drag_compare = NULL; ctree->show_stub = TRUE; clist->button_actions[0] |= GTK_BUTTON_EXPANDS;}static voidctree_attach_styles (GtkCTree *ctree, GtkCTreeNode *node, gpointer data){ GtkCList *clist; gint i; clist = GTK_CLIST (ctree); if (GTK_CTREE_ROW (node)->row.style) GTK_CTREE_ROW (node)->row.style = gtk_style_attach (GTK_CTREE_ROW (node)->row.style, clist->clist_window); if (GTK_CTREE_ROW (node)->row.fg_set || GTK_CTREE_ROW (node)->row.bg_set) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (ctree)); if (GTK_CTREE_ROW (node)->row.fg_set) gdk_color_alloc (colormap, &(GTK_CTREE_ROW (node)->row.foreground)); if (GTK_CTREE_ROW (node)->row.bg_set) gdk_color_alloc (colormap, &(GTK_CTREE_ROW (node)->row.background)); } for (i = 0; i < clist->columns; i++) if (GTK_CTREE_ROW (node)->row.cell[i].style) GTK_CTREE_ROW (node)->row.cell[i].style = gtk_style_attach (GTK_CTREE_ROW (node)->row.cell[i].style, clist->clist_window);}static voidctree_detach_styles (GtkCTree *ctree, GtkCTreeNode *node, gpointer data){ GtkCList *clist; gint i; clist = GTK_CLIST (ctree); if (GTK_CTREE_ROW (node)->row.style) gtk_style_detach (GTK_CTREE_ROW (node)->row.style); for (i = 0; i < clist->columns; i++) if (GTK_CTREE_ROW (node)->row.cell[i].style) gtk_style_detach (GTK_CTREE_ROW (node)->row.cell[i].style);}static voidgtk_ctree_realize (GtkWidget *widget){ GtkCTree *ctree; GtkCList *clist; GdkGCValues values; GtkCTreeNode *node; GtkCTreeNode *child; gint i; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_CTREE (widget)); GTK_WIDGET_CLASS (parent_class)->realize (widget); ctree = GTK_CTREE (widget); clist = GTK_CLIST (widget); node = GTK_CTREE_NODE (clist->row_list); for (i = 0; i < clist->rows; i++) { if (GTK_CTREE_ROW (node)->children && !GTK_CTREE_ROW (node)->expanded) for (child = GTK_CTREE_ROW (node)->children; child; child = GTK_CTREE_ROW (child)->sibling) gtk_ctree_pre_recursive (ctree, child, ctree_attach_styles, NULL); node = GTK_CTREE_NODE_NEXT (node); } values.foreground = widget->style->fg[GTK_STATE_NORMAL]; values.background = widget->style->base[GTK_STATE_NORMAL]; values.subwindow_mode = GDK_INCLUDE_INFERIORS; values.line_style = GDK_LINE_SOLID; ctree->lines_gc = gdk_gc_new_with_values (GTK_CLIST(widget)->clist_window, &values, GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_SUBWINDOW | GDK_GC_LINE_STYLE); if (ctree->line_style == GTK_CTREE_LINES_DOTTED) { gdk_gc_set_line_attributes (ctree->lines_gc, 1, GDK_LINE_ON_OFF_DASH, None, None); gdk_gc_set_dashes (ctree->lines_gc, 0, "\1\1", 2); }}static voidgtk_ctree_unrealize (GtkWidget *widget){ GtkCTree *ctree; GtkCList *clist; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_CTREE (widget)); GTK_WIDGET_CLASS (parent_class)->unrealize (widget); ctree = GTK_CTREE (widget); clist = GTK_CLIST (widget); if (GTK_WIDGET_REALIZED (widget)) { GtkCTreeNode *node; GtkCTreeNode *child; gint i; node = GTK_CTREE_NODE (clist->row_list); for (i = 0; i < clist->rows; i++) { if (GTK_CTREE_ROW (node)->children && !GTK_CTREE_ROW (node)->expanded) for (child = GTK_CTREE_ROW (node)->children; child; child = GTK_CTREE_ROW (child)->sibling) gtk_ctree_pre_recursive(ctree, child, ctree_detach_styles, NULL); node = GTK_CTREE_NODE_NEXT (node); } } gdk_gc_destroy (ctree->lines_gc);}static gintgtk_ctree_button_press (GtkWidget *widget, GdkEventButton *event){ GtkCTree *ctree; GtkCList *clist; gint button_actions; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_CTREE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); ctree = GTK_CTREE (widget); clist = GTK_CLIST (widget); button_actions = clist->button_actions[event->button - 1]; if (button_actions == GTK_BUTTON_IGNORED) return FALSE; if (event->window == clist->clist_window) { GtkCTreeNode *work; gint x; gint y; gint row; gint column; x = event->x; y = event->y; if (!gtk_clist_get_selection_info (clist, x, y, &row, &column)) return FALSE; work = GTK_CTREE_NODE (g_list_nth (clist->row_list, row)); if (button_actions & GTK_BUTTON_EXPANDS && (GTK_CTREE_ROW (work)->children && !GTK_CTREE_ROW (work)->is_leaf && (event->type == GDK_2BUTTON_PRESS || ctree_is_hot_spot (ctree, work, row, x, y)))) { if (GTK_CTREE_ROW (work)->expanded) gtk_ctree_collapse (ctree, work); else gtk_ctree_expand (ctree, work); return FALSE; } } return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);}static voiddraw_drag_highlight (GtkCList *clist, GtkCListRow *dest_row, gint dest_row_number, GtkCListDragPos drag_pos){ GtkCTree *ctree; GdkPoint points[4]; gint level; gint i; gint y = 0; g_return_if_fail (clist != NULL); g_return_if_fail (GTK_IS_CTREE (clist)); ctree = GTK_CTREE (clist); level = ((GtkCTreeRow *)(dest_row))->level; y = ROW_TOP_YPIXEL (clist, dest_row_number) - 1; switch (drag_pos) { case GTK_CLIST_DRAG_NONE: break; case GTK_CLIST_DRAG_AFTER: y += clist->row_height + 1; case GTK_CLIST_DRAG_BEFORE: if (clist->column[ctree->tree_column].visible) switch (clist->column[ctree->tree_column].justification) { case GTK_JUSTIFY_CENTER: case GTK_JUSTIFY_FILL: case GTK_JUSTIFY_LEFT: if (ctree->tree_column > 0) gdk_draw_line (clist->clist_window, clist->xor_gc, COLUMN_LEFT_XPIXEL(clist, 0), y, COLUMN_LEFT_XPIXEL(clist, ctree->tree_column - 1)+ clist->column[ctree->tree_column - 1].area.width, y); gdk_draw_line (clist->clist_window, clist->xor_gc, COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + ctree->tree_indent * level - (ctree->tree_indent - PM_SIZE) / 2, y, GTK_WIDGET (ctree)->allocation.width, y); break; case GTK_JUSTIFY_RIGHT: if (ctree->tree_column < clist->columns - 1) gdk_draw_line (clist->clist_window, clist->xor_gc, COLUMN_LEFT_XPIXEL(clist, ctree->tree_column + 1), y, COLUMN_LEFT_XPIXEL(clist, clist->columns - 1) + clist->column[clist->columns - 1].area.width, y); gdk_draw_line (clist->clist_window, clist->xor_gc, 0, y, COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + clist->column[ctree->tree_column].area.width - ctree->tree_indent * level + (ctree->tree_indent - PM_SIZE) / 2, y); break; } else gdk_draw_line (clist->clist_window, clist->xor_gc, 0, y, clist->clist_window_width, y); break; case GTK_CLIST_DRAG_INTO: y = ROW_TOP_YPIXEL (clist, dest_row_number) + clist->row_height; if (clist->column[ctree->tree_column].visible) switch (clist->column[ctree->tree_column].justification) { case GTK_JUSTIFY_CENTER: case GTK_JUSTIFY_FILL: case GTK_JUSTIFY_LEFT: points[0].x = COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + ctree->tree_indent * level - (ctree->tree_indent - PM_SIZE) / 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -