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

📄 gtktree.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 3 页
字号:
  g_return_if_fail (GTK_IS_TREE (object));    tree = GTK_TREE (object);    children = tree->children;  while (children)    {      child = children->data;      children = children->next;            gtk_widget_ref (child);      gtk_widget_unparent (child);      gtk_widget_destroy (child);      gtk_widget_unref (child);    }    g_list_free (tree->children);  tree->children = NULL;    if (tree->root_tree == tree)    {      GList *node;      for (node = tree->selection; node; node = node->next)	gtk_widget_unref ((GtkWidget *)node->data);      g_list_free (tree->selection);      tree->selection = NULL;    }    if (GTK_OBJECT_CLASS (parent_class)->destroy)    (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);}static voidgtk_tree_draw (GtkWidget    *widget,	       GdkRectangle *area){  GtkTree *tree;  GtkWidget *subtree;  GtkWidget *child;  GdkRectangle child_area;  GList *children;      g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TREE (widget));  g_return_if_fail (area != NULL);    if (GTK_WIDGET_DRAWABLE (widget))    {      tree = GTK_TREE (widget);            children = tree->children;      while (children)	{	  child = children->data;	  children = children->next;	  	  if (gtk_widget_intersect (child, area, &child_area))	    gtk_widget_draw (child, &child_area);	  	  if((subtree = GTK_TREE_ITEM(child)->subtree) &&	     GTK_WIDGET_VISIBLE(subtree) &&	     gtk_widget_intersect (subtree, area, &child_area))	    gtk_widget_draw (subtree, &child_area);	}    }  }static gintgtk_tree_expose (GtkWidget      *widget,		 GdkEventExpose *event){  GtkTree *tree;  GtkWidget *child;  GdkEventExpose child_event;  GList *children;      g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_TREE (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);    if (GTK_WIDGET_DRAWABLE (widget))    {      tree = GTK_TREE (widget);            child_event = *event;            children = tree->children;      while (children)	{	  child = children->data;	  children = children->next;	  	  if (GTK_WIDGET_NO_WINDOW (child) &&	      gtk_widget_intersect (child, &event->area, &child_event.area))	    gtk_widget_event (child, (GdkEvent*) &child_event);	}    }      return FALSE;}static voidgtk_tree_forall (GtkContainer *container,		 gboolean      include_internals,		 GtkCallback   callback,		 gpointer      callback_data){  GtkTree *tree;  GtkWidget *child;  GList *children;      g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_TREE (container));  g_return_if_fail (callback != NULL);    tree = GTK_TREE (container);  children = tree->children;    while (children)    {      child = children->data;      children = children->next;            (* callback) (child, callback_data);    }}static voidgtk_tree_map (GtkWidget *widget){  GtkTree *tree;  GtkWidget *child;  GList *children;      g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TREE (widget));    GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);  tree = GTK_TREE (widget);    if(GTK_IS_TREE(widget->parent))     {      /* set root tree for this tree */      tree->root_tree = GTK_TREE(widget->parent)->root_tree;            tree->level = GTK_TREE(GTK_WIDGET(tree)->parent)->level+1;      tree->indent_value = GTK_TREE(GTK_WIDGET(tree)->parent)->indent_value;      tree->current_indent = GTK_TREE(GTK_WIDGET(tree)->parent)->current_indent + 	tree->indent_value;      tree->view_mode = GTK_TREE(GTK_WIDGET(tree)->parent)->view_mode;      tree->view_line = GTK_TREE(GTK_WIDGET(tree)->parent)->view_line;    }   else    tree->root_tree = tree;    children = tree->children;  while (children)    {      child = children->data;      children = children->next;            if (GTK_WIDGET_VISIBLE (child) &&	  !GTK_WIDGET_MAPPED (child))	gtk_widget_map (child);            if (GTK_TREE_ITEM (child)->subtree)	{	  child = GTK_WIDGET (GTK_TREE_ITEM (child)->subtree);	  	  if (GTK_WIDGET_VISIBLE (child) && !GTK_WIDGET_MAPPED (child))	    gtk_widget_map (child);	}    }  gdk_window_show (widget->window);}static gintgtk_tree_motion_notify (GtkWidget      *widget,			GdkEventMotion *event){  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_TREE (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  #ifdef TREE_DEBUG  g_message("gtk_tree_motion_notify\n");#endif /* TREE_DEBUG */    return FALSE;}static voidgtk_tree_realize (GtkWidget *widget){  GdkWindowAttr attributes;  gint attributes_mask;      g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TREE (widget));    GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);    attributes.window_type = GDK_WINDOW_CHILD;  attributes.x = widget->allocation.x;  attributes.y = widget->allocation.y;  attributes.width = widget->allocation.width;  attributes.height = widget->allocation.height;  attributes.wclass = GDK_INPUT_OUTPUT;  attributes.visual = gtk_widget_get_visual (widget);  attributes.colormap = gtk_widget_get_colormap (widget);  attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;    widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);  gdk_window_set_user_data (widget->window, widget);    widget->style = gtk_style_attach (widget->style, widget->window);  gdk_window_set_background (widget->window, 			     &widget->style->base[GTK_STATE_NORMAL]);}voidgtk_tree_remove_item (GtkTree      *container,		      GtkWidget    *widget){  GList *item_list;    g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_TREE (container));  g_return_if_fail (widget != NULL);  g_return_if_fail (container == GTK_TREE (widget->parent));    item_list = g_list_append (NULL, widget);    gtk_tree_remove_items (GTK_TREE (container), item_list);    g_list_free (item_list);}/* used by gtk_tree_remove_items to make the function independant of   order in list of items to remove.   Sort item bu depth in tree */static gint gtk_tree_sort_item_by_depth(GtkWidget* a, GtkWidget* b){  if((GTK_TREE(a->parent)->level) < (GTK_TREE(b->parent)->level))    return 1;  if((GTK_TREE(a->parent)->level) > (GTK_TREE(b->parent)->level))    return -1;    return 0;}voidgtk_tree_remove_items (GtkTree *tree,		       GList   *items){  GtkWidget *widget;  GList *selected_widgets;  GList *tmp_list;  GList *sorted_list;  GtkTree *real_tree;  GtkTree *root_tree;    g_return_if_fail (tree != NULL);  g_return_if_fail (GTK_IS_TREE (tree));  #ifdef TREE_DEBUG  g_message("+ gtk_tree_remove_items [ tree %#x items list %#x ]\n", (int)tree, (int)items);#endif /* TREE_DEBUG */    /* We may not yet be mapped, so we actively have to find our   * root tree   */  if (tree->root_tree)    root_tree = tree->root_tree;  else    {      GtkWidget *tmp = GTK_WIDGET (tree);      while (tmp->parent && GTK_IS_TREE (tmp->parent))	tmp = tmp->parent;            root_tree = GTK_TREE (tmp);    }    tmp_list = items;  selected_widgets = NULL;  sorted_list = NULL;  widget = NULL;  #ifdef TREE_DEBUG  g_message("* sort list by depth\n");#endif /* TREE_DEBUG */    while (tmp_list)    {      #ifdef TREE_DEBUG      g_message ("* item [%#x] depth [%d]\n", 		 (int)tmp_list->data,		 (int)GTK_TREE(GTK_WIDGET(tmp_list->data)->parent)->level);#endif /* TREE_DEBUG */            sorted_list = g_list_insert_sorted(sorted_list,					 tmp_list->data,					 (GCompareFunc)gtk_tree_sort_item_by_depth);      tmp_list = g_list_next(tmp_list);    }  #ifdef TREE_DEBUG  /* print sorted list */  g_message("* sorted list result\n");  tmp_list = sorted_list;  while(tmp_list)    {      g_message("* item [%#x] depth [%d]\n", 		(int)tmp_list->data,		(int)GTK_TREE(GTK_WIDGET(tmp_list->data)->parent)->level);      tmp_list = g_list_next(tmp_list);    }#endif /* TREE_DEBUG */  #ifdef TREE_DEBUG  g_message("* scan sorted list\n");#endif /* TREE_DEBUG */    tmp_list = sorted_list;  while (tmp_list)    {      widget = tmp_list->data;      tmp_list = tmp_list->next;      #ifdef TREE_DEBUG      g_message("* item [%#x] subtree [%#x]\n", 		(int)widget, (int)GTK_TREE_ITEM_SUBTREE(widget));#endif /* TREE_DEBUG */            /* get real owner of this widget */      real_tree = GTK_TREE(widget->parent);#ifdef TREE_DEBUG      g_message("* subtree having this widget [%#x]\n", (int)real_tree);#endif /* TREE_DEBUG */                  if (widget->state == GTK_STATE_SELECTED)	{	  selected_widgets = g_list_prepend (selected_widgets, widget);#ifdef TREE_DEBUG	  g_message("* selected widget - adding it in selected list [%#x]\n",		    (int)selected_widgets);#endif /* TREE_DEBUG */	}            /* remove this item from its real parent */#ifdef TREE_DEBUG      g_message("* remove widget from its owner tree\n");#endif /* TREE_DEBUG */      real_tree->children = g_list_remove (real_tree->children, widget);            /* remove subtree associate at this item if it exist */            if(GTK_TREE_ITEM(widget)->subtree) 	{#ifdef TREE_DEBUG	  g_message("* remove subtree associate at this item [%#x]\n",		    (int) GTK_TREE_ITEM(widget)->subtree);#endif /* TREE_DEBUG */	  if (GTK_WIDGET_MAPPED (GTK_TREE_ITEM(widget)->subtree))	    gtk_widget_unmap (GTK_TREE_ITEM(widget)->subtree);	  	  gtk_widget_unparent (GTK_TREE_ITEM(widget)->subtree);	  GTK_TREE_ITEM(widget)->subtree = NULL;	}            /* really remove widget for this item */#ifdef TREE_DEBUG      g_message("* unmap and unparent widget [%#x]\n", (int)widget);#endif /* TREE_DEBUG */      if (GTK_WIDGET_MAPPED (widget))	gtk_widget_unmap (widget);            gtk_widget_unparent (widget);            /* delete subtree if there is no children in it */      if(real_tree->children == NULL && 	 real_tree != root_tree)	{#ifdef TREE_DEBUG	  g_message("* owner tree don't have children ... destroy it\n");#endif /* TREE_DEBUG */	  gtk_tree_item_remove_subtree(GTK_TREE_ITEM(real_tree->tree_owner));	}      #ifdef TREE_DEBUG      g_message("* next item in list\n");#endif /* TREE_DEBUG */    }    if (selected_widgets)    {#ifdef TREE_DEBUG      g_message("* scan selected item list\n");#endif /* TREE_DEBUG */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -