clist.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /* $Id: clist.c,v 1.4 2001/04/25 14:31:48 kilobug Exp $ */
  2. #include "gtkutil.h"
  3. static void list_click(GtkCList *clist, gint column, GtkSortType *sort)
  4. {
  5. if (sort[0] == column)
  6. sort[column + 1] = !sort[column + 1];
  7. else
  8. sort[0] = column;
  9. gtk_clist_set_sort_type(clist, sort[column + 1]);
  10. gtk_clist_set_sort_column(clist, column);
  11. gtk_clist_sort(clist);
  12. }
  13. GtkWidget *create_clist(int nbcol, int defsort, ...)
  14. {
  15. char **titles;
  16. GtkSortType *sort = NULL;
  17. int i;
  18. va_list va;
  19. int *width;
  20. GtkWidget *l;
  21. if (nbcol <= 0)
  22. return NULL;
  23. titles = g_malloc(nbcol * sizeof(*titles));
  24. va_start(va, defsort);
  25. for (i = 0; i < nbcol; i++)
  26. titles[i] = va_arg(va, char *);
  27. width = g_malloc(nbcol * sizeof(*width));
  28. for (i = 0; i < nbcol; i++)
  29. width[i] = va_arg(va, int);
  30. sort = g_malloc((nbcol + 1) * sizeof(*sort));
  31. for (i = 0; i < nbcol; i++)
  32. sort[i + 1] = va_arg(va, GtkSortType);
  33. sort[0] = defsort;
  34. l = gtk_clist_new_with_titles(nbcol, titles);
  35. g_free(titles);
  36. gtk_clist_set_shadow_type(GTK_CLIST(l), GTK_SHADOW_IN);
  37. gtk_clist_column_titles_active(GTK_CLIST(l));
  38. for (i = 0; i < nbcol; i++)
  39. gtk_clist_set_column_width(GTK_CLIST(l), i, width[i]);
  40. g_free(width);
  41. gtk_clist_set_auto_sort(GTK_CLIST(l), TRUE);
  42. gtk_clist_set_sort_column(GTK_CLIST(l), sort[0]);
  43. gtk_clist_set_sort_type(GTK_CLIST(l), sort[sort[0] + 1]);
  44. gtk_signal_connect(GTK_OBJECT(l), "click-column", list_click, sort);
  45. gtk_signal_connect_after(GTK_OBJECT(l), "destroy", free_callback, sort);
  46. gtk_widget_show(l);
  47. va_end(va);
  48. return l;
  49. }
  50. static const char *clist_comp_get_str(GtkCList *clist, gconstpointer ptr)
  51. {
  52. return ((GtkCListRow *) ptr)->cell[clist->sort_column].u.text;
  53. }
  54. int clist_compare_str(GtkCList *clist, gconstpointer p1, gconstpointer p2)
  55. {
  56. int i;
  57. const char *buf1, *buf2;
  58. buf1 = clist_comp_get_str(clist, p1);
  59. buf2 = clist_comp_get_str(clist, p2);
  60. i = g_strcasecmp(buf1, buf2);
  61. if (i < 0)
  62. i = -42;
  63. if (i > 0)
  64. i = 42;
  65. return i;
  66. }
  67. int clist_compare_float(GtkCList *clist, gconstpointer p1, gconstpointer p2)
  68. {
  69. int i;
  70. const char *buf1, *buf2;
  71. buf1 = clist_comp_get_str(clist, p1);
  72. buf2 = clist_comp_get_str(clist, p2);
  73. i = atoi(buf1) - atoi(buf2);
  74. if (i < 0)
  75. i = -42;
  76. if (i > 0)
  77. i = 42;
  78. return i;
  79. }
  80. void clist_set_tooltips(GtkCList *clist, GtkTooltips *tt, ...)
  81. {
  82. va_list va;
  83. const char *s;
  84. int i;
  85. GtkWidget *wid;
  86. va_start(va, tt);
  87. if ((clist != NULL) && (tt != NULL))
  88. for (i = 0; (s = va_arg(va, const char *)) != NULL; i++)
  89. {
  90. wid = gtk_clist_get_column_widget(clist, i);
  91. gtk_tooltips_set_tip(tt, wid->parent, s, "");
  92. }
  93. va_end(va);
  94. }