⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkctree.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -