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

📄 gtktreeitem.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 3 页
字号:
/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS * file for a list of people on the GTK+ Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/.  */#include "gtklabel.h"#include "gtktree.h"#include "gtktreeitem.h"#include "gtkeventbox.h"#include "gtkpixmap.h"#include "gtkmain.h"#include "gtksignal.h"#include "tree_plus.xpm"#include "tree_minus.xpm"#define DEFAULT_DELTA 9enum {  COLLAPSE_TREE,  EXPAND_TREE,  LAST_SIGNAL};typedef struct _GtkTreePixmaps GtkTreePixmaps;struct _GtkTreePixmaps {  gint refcount;  GdkColormap *colormap;    GdkPixmap *pixmap_plus;  GdkPixmap *pixmap_minus;  GdkBitmap *mask_plus;  GdkBitmap *mask_minus;};static GList *pixmaps = NULL;static void gtk_tree_item_class_init (GtkTreeItemClass *klass);static void gtk_tree_item_init       (GtkTreeItem      *tree_item);static void gtk_tree_item_realize       (GtkWidget        *widget);static void gtk_tree_item_size_request  (GtkWidget        *widget,					 GtkRequisition   *requisition);static void gtk_tree_item_size_allocate (GtkWidget        *widget,					 GtkAllocation    *allocation);static void gtk_tree_item_draw          (GtkWidget        *widget,					 GdkRectangle     *area);static void gtk_tree_item_draw_focus    (GtkWidget        *widget);static void gtk_tree_item_paint         (GtkWidget        *widget,					 GdkRectangle     *area);static gint gtk_tree_item_button_press  (GtkWidget        *widget,					 GdkEventButton   *event);static gint gtk_tree_item_expose        (GtkWidget        *widget,					 GdkEventExpose   *event);static gint gtk_tree_item_focus_in      (GtkWidget        *widget,					 GdkEventFocus    *event);static gint gtk_tree_item_focus_out     (GtkWidget        *widget,					 GdkEventFocus    *event);static void gtk_tree_item_forall        (GtkContainer    *container,					 gboolean         include_internals,					 GtkCallback      callback,					 gpointer         callback_data);static void gtk_real_tree_item_select   (GtkItem          *item);static void gtk_real_tree_item_deselect (GtkItem          *item);static void gtk_real_tree_item_toggle   (GtkItem          *item);static void gtk_real_tree_item_expand   (GtkTreeItem      *item);static void gtk_real_tree_item_collapse (GtkTreeItem      *item);static void gtk_real_tree_item_expand   (GtkTreeItem      *item);static void gtk_real_tree_item_collapse (GtkTreeItem      *item);static void gtk_tree_item_destroy        (GtkObject *object);static void gtk_tree_item_subtree_button_click (GtkWidget *widget);static void gtk_tree_item_subtree_button_changed_state (GtkWidget *widget);static void gtk_tree_item_map(GtkWidget*);static void gtk_tree_item_unmap(GtkWidget*);static void gtk_tree_item_add_pixmaps    (GtkTreeItem       *tree_item);static void gtk_tree_item_remove_pixmaps (GtkTreeItem       *tree_item);static GtkItemClass *parent_class = NULL;static guint tree_item_signals[LAST_SIGNAL] = { 0 };GtkTypegtk_tree_item_get_type (void){  static GtkType tree_item_type = 0;  if (!tree_item_type)    {      static const GtkTypeInfo tree_item_info =      {	"GtkTreeItem",	sizeof (GtkTreeItem),	sizeof (GtkTreeItemClass),	(GtkClassInitFunc) gtk_tree_item_class_init,	(GtkObjectInitFunc) gtk_tree_item_init,	/* reserved_1 */ NULL,        /* reserved_2 */ NULL,        (GtkClassInitFunc) NULL,      };      tree_item_type = gtk_type_unique (gtk_item_get_type (), &tree_item_info);    }  return tree_item_type;}static voidgtk_tree_item_class_init (GtkTreeItemClass *class){  GtkObjectClass *object_class;  GtkWidgetClass *widget_class;  GtkContainerClass *container_class;  GtkItemClass *item_class;  object_class = (GtkObjectClass*) class;  widget_class = (GtkWidgetClass*) class;  item_class = (GtkItemClass*) class;  container_class = (GtkContainerClass*) class;  parent_class = gtk_type_class (gtk_item_get_type ());    tree_item_signals[EXPAND_TREE] =    gtk_signal_new ("expand",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkTreeItemClass, expand),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  tree_item_signals[COLLAPSE_TREE] =    gtk_signal_new ("collapse",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkTreeItemClass, collapse),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  gtk_object_class_add_signals (object_class, tree_item_signals, LAST_SIGNAL);  object_class->destroy = gtk_tree_item_destroy;  widget_class->realize = gtk_tree_item_realize;  widget_class->size_request = gtk_tree_item_size_request;  widget_class->size_allocate = gtk_tree_item_size_allocate;  widget_class->draw = gtk_tree_item_draw;  widget_class->draw_focus = gtk_tree_item_draw_focus;  widget_class->button_press_event = gtk_tree_item_button_press;  widget_class->expose_event = gtk_tree_item_expose;  widget_class->focus_in_event = gtk_tree_item_focus_in;  widget_class->focus_out_event = gtk_tree_item_focus_out;  widget_class->map = gtk_tree_item_map;  widget_class->unmap = gtk_tree_item_unmap;  container_class->forall = gtk_tree_item_forall;  item_class->select = gtk_real_tree_item_select;  item_class->deselect = gtk_real_tree_item_deselect;  item_class->toggle = gtk_real_tree_item_toggle;  class->expand = gtk_real_tree_item_expand;  class->collapse = gtk_real_tree_item_collapse;}/* callback for event box mouse event */static void gtk_tree_item_subtree_button_click (GtkWidget *widget){  GtkTreeItem* item;    g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_EVENT_BOX (widget));    item = (GtkTreeItem*) gtk_object_get_user_data (GTK_OBJECT (widget));  if (!GTK_WIDGET_IS_SENSITIVE (item))    return;    if (item->expanded)    gtk_tree_item_collapse (item);  else    gtk_tree_item_expand (item);}/* callback for event box state changed */static voidgtk_tree_item_subtree_button_changed_state (GtkWidget *widget){  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_EVENT_BOX (widget));    if (GTK_WIDGET_VISIBLE (widget))    {            if (widget->state == GTK_STATE_NORMAL)	gdk_window_set_background (widget->window, &widget->style->base[widget->state]);      else	gdk_window_set_background (widget->window, &widget->style->bg[widget->state]);            if (GTK_WIDGET_DRAWABLE (widget))	gdk_window_clear_area (widget->window, 0, 0, 			       widget->allocation.width, widget->allocation.height);    }}static voidgtk_tree_item_init (GtkTreeItem *tree_item){  GtkWidget *eventbox, *pixmapwid;    g_return_if_fail (tree_item != NULL);  g_return_if_fail (GTK_IS_TREE_ITEM (tree_item));  tree_item->expanded = FALSE;  tree_item->subtree = NULL;  GTK_WIDGET_SET_FLAGS (tree_item, GTK_CAN_FOCUS);    /* create an event box containing one pixmaps */  eventbox = gtk_event_box_new();  gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK);  gtk_signal_connect(GTK_OBJECT(eventbox), "state_changed",		     (GtkSignalFunc)gtk_tree_item_subtree_button_changed_state, 		     (gpointer)NULL);  gtk_signal_connect(GTK_OBJECT(eventbox), "realize",		     (GtkSignalFunc)gtk_tree_item_subtree_button_changed_state, 		     (gpointer)NULL);  gtk_signal_connect(GTK_OBJECT(eventbox), "button_press_event",		     (GtkSignalFunc)gtk_tree_item_subtree_button_click,		     (gpointer)NULL);  gtk_object_set_user_data(GTK_OBJECT(eventbox), tree_item);  tree_item->pixmaps_box = eventbox;  /* create pixmap for button '+' */  pixmapwid = gtk_type_new (gtk_pixmap_get_type ());  if (!tree_item->expanded)     gtk_container_add (GTK_CONTAINER (eventbox), pixmapwid);  gtk_widget_show (pixmapwid);  tree_item->plus_pix_widget = pixmapwid;  gtk_widget_ref (tree_item->plus_pix_widget);  gtk_object_sink (GTK_OBJECT (tree_item->plus_pix_widget));    /* create pixmap for button '-' */  pixmapwid = gtk_type_new (gtk_pixmap_get_type ());  if (tree_item->expanded)     gtk_container_add (GTK_CONTAINER (eventbox), pixmapwid);  gtk_widget_show (pixmapwid);  tree_item->minus_pix_widget = pixmapwid;  gtk_widget_ref (tree_item->minus_pix_widget);  gtk_object_sink (GTK_OBJECT (tree_item->minus_pix_widget));    gtk_widget_set_parent (eventbox, GTK_WIDGET (tree_item));}GtkWidget*gtk_tree_item_new (void){  GtkWidget *tree_item;  tree_item = GTK_WIDGET (gtk_type_new (gtk_tree_item_get_type ()));  return tree_item;}GtkWidget*gtk_tree_item_new_with_label (gchar *label){  GtkWidget *tree_item;  GtkWidget *label_widget;  tree_item = gtk_tree_item_new ();  label_widget = gtk_label_new (label);  gtk_misc_set_alignment (GTK_MISC (label_widget), 0.0, 0.5);  gtk_container_add (GTK_CONTAINER (tree_item), label_widget);  gtk_widget_show (label_widget);  return tree_item;}voidgtk_tree_item_set_subtree (GtkTreeItem *tree_item,			   GtkWidget   *subtree){  g_return_if_fail (tree_item != NULL);  g_return_if_fail (GTK_IS_TREE_ITEM (tree_item));  g_return_if_fail (subtree != NULL);  g_return_if_fail (GTK_IS_TREE (subtree));  if (tree_item->subtree)    {      g_warning("there is already a subtree for this tree item\n");      return;    }  tree_item->subtree = subtree;   GTK_TREE (subtree)->tree_owner = GTK_WIDGET (tree_item);  /* show subtree button */  if (tree_item->pixmaps_box)    gtk_widget_show (tree_item->pixmaps_box);  if (tree_item->expanded)    gtk_widget_show (subtree);  else    gtk_widget_hide (subtree);  gtk_widget_set_parent (subtree, GTK_WIDGET (tree_item)->parent);  if (GTK_WIDGET_REALIZED (subtree->parent))    gtk_widget_realize (subtree);  if (GTK_WIDGET_VISIBLE (subtree->parent) && GTK_WIDGET_VISIBLE (subtree))    {      if (GTK_WIDGET_MAPPED (subtree->parent))	gtk_widget_map (subtree);      gtk_widget_queue_resize (subtree);    }}voidgtk_tree_item_select (GtkTreeItem *tree_item){  g_return_if_fail (tree_item != NULL);  g_return_if_fail (GTK_IS_TREE_ITEM (tree_item));  gtk_item_select (GTK_ITEM (tree_item));}voidgtk_tree_item_deselect (GtkTreeItem *tree_item){  g_return_if_fail (tree_item != NULL);  g_return_if_fail (GTK_IS_TREE_ITEM (tree_item));  gtk_item_deselect (GTK_ITEM (tree_item));}voidgtk_tree_item_expand (GtkTreeItem *tree_item){  g_return_if_fail (tree_item != NULL);  g_return_if_fail (GTK_IS_TREE_ITEM (tree_item));  gtk_signal_emit (GTK_OBJECT (tree_item), tree_item_signals[EXPAND_TREE], NULL);}voidgtk_tree_item_collapse (GtkTreeItem *tree_item){

⌨️ 快捷键说明

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