/src/wrappers/gtk/examples/gtk-demo/tree_store.e

http://github.com/tybor/Liberty · Specman e · 477 lines · 21 code · 76 blank · 380 comment · 2 complexity · 83313924ebf166c5dad91a33da685367 MD5 · raw file

  1. indexing
  2. description: "."
  3. copyright: "[
  4. Copyright (C) 2006 Paolo Redaelli, GTK+ team
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public License
  7. as published by the Free Software Foundation; either version 2.1 of
  8. the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with this library; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  16. 02110-1301 USA
  17. ]"
  18. class TREE_STORE
  19. creation make
  20. feature -- Creation
  21. -- /* Tree View/Tree Store
  22. -- *
  23. -- * The GtkTreeStore is used to store data in tree form, to be
  24. -- * used later on by a GtkTreeView to display it. This demo builds
  25. -- * a simple GtkTreeStore and displays it. If you're new to the
  26. -- * GtkTreeView widgets and associates, look into the GtkListStore
  27. -- * example first.
  28. -- *
  29. -- */
  30. -- #include <gtk/gtk.h>
  31. -- static GtkWidget *window = NULL;
  32. -- /* TreeItem structure */
  33. -- typedef struct _TreeItem TreeItem;
  34. -- struct _TreeItem
  35. -- {
  36. -- const gchar *label;
  37. -- gboolean alex;
  38. -- gboolean havoc;
  39. -- gboolean tim;
  40. -- gboolean owen;
  41. -- gboolean dave;
  42. -- gboolean world_holiday; /* shared by the European hackers */
  43. -- TreeItem *children;
  44. -- };
  45. -- /* columns */
  46. -- enum
  47. -- {
  48. -- HOLIDAY_NAME_COLUMN = 0,
  49. -- ALEX_COLUMN,
  50. -- HAVOC_COLUMN,
  51. -- TIM_COLUMN,
  52. -- OWEN_COLUMN,
  53. -- DAVE_COLUMN,
  54. -- VISIBLE_COLUMN,
  55. -- WORLD_COLUMN,
  56. -- NUM_COLUMNS
  57. -- };
  58. -- /* tree data */
  59. -- static TreeItem january[] =
  60. -- {
  61. -- {"New Years Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  62. -- {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  63. -- {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  64. -- { NULL }
  65. -- };
  66. -- static TreeItem february[] =
  67. -- {
  68. -- { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  69. -- { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  70. -- { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, NULL },
  71. -- { NULL }
  72. -- };
  73. -- static TreeItem march[] =
  74. -- {
  75. -- { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  76. -- { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  77. -- { NULL }
  78. -- };
  79. -- static TreeItem april[] =
  80. -- {
  81. -- { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  82. -- { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  83. -- { "Earth Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  84. -- { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  85. -- { NULL }
  86. -- };
  87. -- static TreeItem may[] =
  88. -- {
  89. -- { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  90. -- { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  91. -- { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  92. -- { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  93. -- { "Memorial Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  94. -- { NULL }
  95. -- };
  96. -- static TreeItem june[] =
  97. -- {
  98. -- { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  99. -- { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  100. -- { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  101. -- { NULL }
  102. -- };
  103. -- static TreeItem july[] =
  104. -- {
  105. -- { "Parents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  106. -- { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  107. -- { NULL }
  108. -- };
  109. -- static TreeItem august[] =
  110. -- {
  111. -- { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  112. -- { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  113. -- { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  114. -- { NULL }
  115. -- };
  116. -- static TreeItem september[] =
  117. -- {
  118. -- { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  119. -- { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  120. -- { "Labor Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  121. -- { NULL }
  122. -- };
  123. -- static TreeItem october[] =
  124. -- {
  125. -- { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  126. -- { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  127. -- { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  128. -- { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  129. -- { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  130. -- { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  131. -- { "Halloween", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  132. -- { NULL }
  133. -- };
  134. -- static TreeItem november[] =
  135. -- {
  136. -- { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  137. -- { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  138. -- { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  139. -- { NULL }
  140. -- };
  141. -- static TreeItem december[] =
  142. -- {
  143. -- { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  144. -- { "Christmas", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  145. -- { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  146. -- { NULL }
  147. -- };
  148. -- static TreeItem toplevel[] =
  149. -- {
  150. -- {"January", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, january},
  151. -- {"February", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, february},
  152. -- {"March", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, march},
  153. -- {"April", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, april},
  154. -- {"May", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, may},
  155. -- {"June", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, june},
  156. -- {"July", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, july},
  157. -- {"August", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, august},
  158. -- {"September", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, september},
  159. -- {"October", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, october},
  160. -- {"November", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, november},
  161. -- {"December", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, december},
  162. -- {NULL}
  163. -- };
  164. -- static GtkTreeModel *
  165. -- create_model (void)
  166. -- {
  167. -- GtkTreeStore *model;
  168. -- GtkTreeIter iter;
  169. -- TreeItem *month = toplevel;
  170. -- /* create tree store */
  171. -- model = gtk_tree_store_new (NUM_COLUMNS,
  172. -- G_TYPE_STRING,
  173. -- G_TYPE_BOOLEAN,
  174. -- G_TYPE_BOOLEAN,
  175. -- G_TYPE_BOOLEAN,
  176. -- G_TYPE_BOOLEAN,
  177. -- G_TYPE_BOOLEAN,
  178. -- G_TYPE_BOOLEAN,
  179. -- G_TYPE_BOOLEAN);
  180. -- /* add data to the tree store */
  181. -- while (month->label)
  182. -- {
  183. -- TreeItem *holiday = month->children;
  184. -- gtk_tree_store_append (model, &iter, NULL);
  185. -- gtk_tree_store_set (model, &iter,
  186. -- HOLIDAY_NAME_COLUMN, month->label,
  187. -- ALEX_COLUMN, FALSE,
  188. -- HAVOC_COLUMN, FALSE,
  189. -- TIM_COLUMN, FALSE,
  190. -- OWEN_COLUMN, FALSE,
  191. -- DAVE_COLUMN, FALSE,
  192. -- VISIBLE_COLUMN, FALSE,
  193. -- WORLD_COLUMN, FALSE,
  194. -- -1);
  195. -- /* add children */
  196. -- while (holiday->label)
  197. -- {
  198. -- GtkTreeIter child_iter;
  199. -- gtk_tree_store_append (model, &child_iter, &iter);
  200. -- gtk_tree_store_set (model, &child_iter,
  201. -- HOLIDAY_NAME_COLUMN, holiday->label,
  202. -- ALEX_COLUMN, holiday->alex,
  203. -- HAVOC_COLUMN, holiday->havoc,
  204. -- TIM_COLUMN, holiday->tim,
  205. -- OWEN_COLUMN, holiday->owen,
  206. -- DAVE_COLUMN, holiday->dave,
  207. -- VISIBLE_COLUMN, TRUE,
  208. -- WORLD_COLUMN, holiday->world_holiday,
  209. -- -1);
  210. -- holiday++;
  211. -- }
  212. -- month++;
  213. -- }
  214. -- return GTK_TREE_MODEL (model);
  215. -- }
  216. -- static void
  217. -- item_toggled (GtkCellRendererToggle *cell,
  218. -- gchar *path_str,
  219. -- gpointer data)
  220. -- {
  221. -- GtkTreeModel *model = (GtkTreeModel *)data;
  222. -- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
  223. -- GtkTreeIter iter;
  224. -- gboolean toggle_item;
  225. -- gint *column;
  226. -- column = g_object_get_data (G_OBJECT (cell), "column");
  227. -- /* get toggled iter */
  228. -- gtk_tree_model_get_iter (model, &iter, path);
  229. -- gtk_tree_model_get (model, &iter, column, &toggle_item, -1);
  230. -- /* do something with the value */
  231. -- toggle_item ^= 1;
  232. -- /* set new value */
  233. -- gtk_tree_store_set (GTK_TREE_STORE (model), &iter, column,
  234. -- toggle_item, -1);
  235. -- /* clean up */
  236. -- gtk_tree_path_free (path);
  237. -- }
  238. -- static void
  239. -- add_columns (GtkTreeView *treeview)
  240. -- {
  241. -- gint col_offset;
  242. -- GtkCellRenderer *renderer;
  243. -- GtkTreeViewColumn *column;
  244. -- GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  245. -- /* column for holiday names */
  246. -- renderer = gtk_cell_renderer_text_new ();
  247. -- g_object_set (renderer, "xalign", 0.0, NULL);
  248. -- col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  249. -- -1, "Holiday",
  250. -- renderer, "text",
  251. -- HOLIDAY_NAME_COLUMN,
  252. -- NULL);
  253. -- column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  254. -- gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  255. -- /* alex column */
  256. -- renderer = gtk_cell_renderer_toggle_new ();
  257. -- g_object_set (renderer, "xalign", 0.0, NULL);
  258. -- g_object_set_data (G_OBJECT (renderer), "column", (gint *)ALEX_COLUMN);
  259. -- g_signal_connect (renderer, "toggled", G_CALLBACK (item_toggled), model);
  260. -- col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  261. -- -1, "Alex",
  262. -- renderer,
  263. -- "active",
  264. -- ALEX_COLUMN,
  265. -- "visible",
  266. -- VISIBLE_COLUMN,
  267. -- "activatable",
  268. -- WORLD_COLUMN, NULL);
  269. -- column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  270. -- gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  271. -- GTK_TREE_VIEW_COLUMN_FIXED);
  272. -- gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  273. -- gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  274. -- /* havoc column */
  275. -- renderer = gtk_cell_renderer_toggle_new ();
  276. -- g_object_set (renderer, "xalign", 0.0, NULL);
  277. -- g_object_set_data (G_OBJECT (renderer), "column", (gint *)HAVOC_COLUMN);
  278. -- g_signal_connect (renderer, "toggled", G_CALLBACK (item_toggled), model);
  279. -- col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  280. -- -1, "Havoc",
  281. -- renderer,
  282. -- "active",
  283. -- HAVOC_COLUMN,
  284. -- "visible",
  285. -- VISIBLE_COLUMN,
  286. -- NULL);
  287. -- column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  288. -- gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  289. -- GTK_TREE_VIEW_COLUMN_FIXED);
  290. -- gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  291. -- gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  292. -- /* tim column */
  293. -- renderer = gtk_cell_renderer_toggle_new ();
  294. -- g_object_set (renderer, "xalign", 0.0, NULL);
  295. -- g_object_set_data (G_OBJECT (renderer), "column", (gint *)TIM_COLUMN);
  296. -- g_signal_connect (renderer, "toggled", G_CALLBACK (item_toggled), model);
  297. -- col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  298. -- -1, "Tim",
  299. -- renderer,
  300. -- "active",
  301. -- TIM_COLUMN,
  302. -- "visible",
  303. -- VISIBLE_COLUMN,
  304. -- "activatable",
  305. -- WORLD_COLUMN, NULL);
  306. -- column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  307. -- gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  308. -- GTK_TREE_VIEW_COLUMN_FIXED);
  309. -- gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  310. -- gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  311. -- /* owen column */
  312. -- renderer = gtk_cell_renderer_toggle_new ();
  313. -- g_object_set (renderer, "xalign", 0.0, NULL);
  314. -- g_object_set_data (G_OBJECT (renderer), "column", (gint *)OWEN_COLUMN);
  315. -- g_signal_connect (renderer, "toggled", G_CALLBACK (item_toggled), model);
  316. -- col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  317. -- -1, "Owen",
  318. -- renderer,
  319. -- "active",
  320. -- OWEN_COLUMN,
  321. -- "visible",
  322. -- VISIBLE_COLUMN,
  323. -- NULL);
  324. -- column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  325. -- gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  326. -- GTK_TREE_VIEW_COLUMN_FIXED);
  327. -- gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  328. -- gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  329. -- /* dave column */
  330. -- renderer = gtk_cell_renderer_toggle_new ();
  331. -- g_object_set (renderer, "xalign", 0.0, NULL);
  332. -- g_object_set_data (G_OBJECT (renderer), "column", (gint *)DAVE_COLUMN);
  333. -- g_signal_connect (renderer, "toggled", G_CALLBACK (item_toggled), model);
  334. -- col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  335. -- -1, "Dave",
  336. -- renderer,
  337. -- "active",
  338. -- DAVE_COLUMN,
  339. -- "visible",
  340. -- VISIBLE_COLUMN,
  341. -- NULL);
  342. -- column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  343. -- gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  344. -- GTK_TREE_VIEW_COLUMN_FIXED);
  345. -- gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  346. -- gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  347. -- }
  348. -- GtkWidget *
  349. -- do_tree_store (GtkWidget *do_widget)
  350. -- {
  351. -- if (!window)
  352. -- {
  353. -- GtkWidget *vbox;
  354. -- GtkWidget *sw;
  355. -- GtkWidget *treeview;
  356. -- GtkTreeModel *model;
  357. -- /* create window, etc */
  358. -- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  359. -- gtk_window_set_screen (GTK_WINDOW (window),
  360. -- gtk_widget_get_screen (do_widget));
  361. -- gtk_window_set_title (GTK_WINDOW (window), "Card planning sheet");
  362. -- g_signal_connect (window, "destroy",
  363. -- G_CALLBACK (gtk_widget_destroyed), &window);
  364. -- vbox = gtk_vbox_new (FALSE, 8);
  365. -- gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
  366. -- gtk_container_add (GTK_CONTAINER (window), vbox);
  367. -- gtk_box_pack_start (GTK_BOX (vbox),
  368. -- gtk_label_new ("Jonathan's Holiday Card Planning Sheet"),
  369. -- FALSE, FALSE, 0);
  370. -- sw = gtk_scrolled_window_new (NULL, NULL);
  371. -- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
  372. -- GTK_SHADOW_ETCHED_IN);
  373. -- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
  374. -- GTK_POLICY_AUTOMATIC,
  375. -- GTK_POLICY_AUTOMATIC);
  376. -- gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
  377. -- /* create model */
  378. -- model = create_model ();
  379. -- /* create tree view */
  380. -- treeview = gtk_tree_view_new_with_model (model);
  381. -- g_object_unref (model);
  382. -- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
  383. -- gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
  384. -- GTK_SELECTION_MULTIPLE);
  385. -- add_columns (GTK_TREE_VIEW (treeview));
  386. -- gtk_container_add (GTK_CONTAINER (sw), treeview);
  387. -- /* expand all rows after the treeview widget has been realized */
  388. -- g_signal_connect (treeview, "realize",
  389. -- G_CALLBACK (gtk_tree_view_expand_all), NULL);
  390. -- gtk_window_set_default_size (GTK_WINDOW (window), 650, 400);
  391. -- }
  392. -- if (!GTK_WIDGET_VISIBLE (window))
  393. -- gtk_widget_show_all (window);
  394. -- else
  395. -- {
  396. -- gtk_widget_destroy (window);
  397. -- window = NULL;
  398. -- }
  399. -- return window;
  400. -- }
  401. end