item_factory.inc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. (* Item Factory
  2. *
  3. * The GtkItemFactory object allows the easy creation of menus
  4. * from an array of descriptions of menu items.
  5. *)
  6. var
  7. if_window : PGtkWidget;
  8. procedure gtk_ifactory_cb (callback_data : gpointer;
  9. callback_action : guint;
  10. widget : PGTkWidget); cdecl;
  11. begin
  12. g_message ('ItemFactory: activated "%s"',
  13. [gtk_item_factory_path_from_widget (widget) ]);
  14. end;
  15. const
  16. if_menu_items : array [1..19] of TGtkItemFactoryEntry = (
  17. ( path: '/_File'; accelerator: NULL; callback: nil;
  18. callback_action: 0; item_type : '<Branch>'; extra_data: NULL),
  19. ( path: '/File/tearoff1'; accelerator: NULL; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  20. callback_action: 0; item_type : '<Tearoff>'; extra_data: NULL),
  21. ( path: '/File/_New'; accelerator: '<control>N'; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  22. callback_action: 0; item_type : NULL; extra_data: NULL),
  23. ( path: '/File/_Open'; accelerator: '<control>O'; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  24. callback_action: 0; item_type : NULL; extra_data: NULL),
  25. ( path: '/File/_Save'; accelerator: '<control>S'; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  26. callback_action: 0; item_type : NULL; extra_data: NULL),
  27. ( path: '/File/Save _As'; accelerator: NULL; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  28. callback_action: 0; item_type : NULL; extra_data: NULL),
  29. ( path: '/File/sep1'; accelerator: NULL; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  30. callback_action: 0; item_type : '<Separator>'; extra_data: NULL),
  31. ( path: '/File/_Quit'; accelerator: '<control>Q'; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  32. callback_action: 0; item_type : NULL; extra_data: NULL),
  33. ( path: '/_Preferences'; accelerator: NULL ; callback: nil;
  34. callback_action: 0; item_type : '<Branch>'; extra_data: NULL),
  35. ( path: '/Preferences/_Color'; accelerator: NULL ; callback: nil;
  36. callback_action: 0; item_type : '<Branch>'; extra_data: NULL),
  37. ( path: '/Preferences/Color/_Red'; accelerator: NULL ; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  38. callback_action: 0; item_type : '<RadioItem>'; extra_data: NULL),
  39. ( path: '/Preferences/Color/_Green'; accelerator: NULL ; callback:TGtkItemfactoryCallback(@gtk_ifactory_cb);
  40. callback_action: 0; item_type : '/Preferences/Color/Red'; extra_data: NULL),
  41. ( path: '/Preferences/Color/_Blue'; accelerator: NULL ; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  42. callback_action: 0; item_type : '/Preferences/Color/Red'; extra_data: NULL),
  43. ( path: '/Preferences/_Shape'; accelerator: NULL ; callback: nil;
  44. callback_action: 0; item_type : '<Branch>'; extra_data: NULL),
  45. ( path: '/Preferences/Shape/_Square'; accelerator: NULL ; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  46. callback_action: 0; item_type : '<RadioItem>'; extra_data: NULL),
  47. ( path: '/Preferences/Shape/_Rectangle'; accelerator: NULL ; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  48. callback_action: 0; item_type : '/Preferences/Shape/Square'; extra_data: NULL),
  49. ( path: '/Preferences/Shape/_Oval'; accelerator: NULL ; callback: TGtkItemfactoryCallback(@gtk_ifactory_cb);
  50. callback_action: 0; item_type : '/Preferences/Shape/Rectangle'; extra_data: NULL),
  51. (* If you wanted this to be right justified you would use "<LastBranch>", not "<Branch>".
  52. * Right justified help menu items are generally considered a bad idea now days.
  53. *)
  54. ( path: '/_Help'; accelerator: NULL ; callback: nil;
  55. callback_action: 0; item_type : '<Branch>'; extra_data: NULL),
  56. ( path: '/Help/_About'; accelerator: NULL ; callback: nil;
  57. callback_action: 0; item_type : NULL; extra_data: NULL)
  58. );
  59. const
  60. nmenu_items = sizeof (if_menu_items) div sizeof (if_menu_items[1]);
  61. function do_item_factory : PGtkWidget;
  62. var
  63. box1,
  64. box2,
  65. separator,
  66. thelabel,
  67. button : PGtkWidget;
  68. accel_group : PGtkAccelGroup;
  69. item_factory : PGtkItemFactory;
  70. begin
  71. if if_window = NULL then
  72. begin
  73. if_window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
  74. g_signal_connect (if_window, 'destroy',
  75. G_CALLBACK (@gtk_widget_destroyed), @if_window);
  76. g_signal_connect (if_window, 'delete-event',
  77. G_CALLBACK (@gtk_true), NULL);
  78. accel_group := gtk_accel_group_new ();
  79. item_factory := gtk_item_factory_new (GTK_TYPE_MENU_BAR, '<main>', accel_group);
  80. g_object_set_data_full (G_OBJECT (if_window), '<main>',
  81. item_factory, @g_object_unref);
  82. gtk_window_add_accel_group (GTK_WINDOW (if_window), accel_group);
  83. gtk_window_set_title (GTK_WINDOW (if_window), 'Item Factory');
  84. gtk_container_set_border_width (GTK_CONTAINER (if_window), 0);
  85. gtk_item_factory_create_items (item_factory, nmenu_items, @if_menu_items[1], NULL);
  86. (* preselect /Preferences/Shape/Oval over the other radios
  87. *)
  88. gtk_check_menu_item_set_active
  89. (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
  90. '/Preferences/Shape/Oval')),
  91. TRUE);
  92. box1 := gtk_vbox_new (FALSE, 0);
  93. gtk_container_add (GTK_CONTAINER (if_window), box1);
  94. gtk_box_pack_start (GTK_BOX (box1),
  95. gtk_item_factory_get_widget (item_factory, '<main>'),
  96. FALSE, FALSE, 0);
  97. thelabel := gtk_label_new ('Type'#13#10'<alt>'#13#10'to start');
  98. gtk_widget_set_size_request (thelabel, 200, 200);
  99. gtk_misc_set_alignment (GTK_MISC (thelabel), 0.5, 0.5);
  100. gtk_box_pack_start (GTK_BOX (box1), thelabel, TRUE, TRUE, 0);
  101. separator := gtk_hseparator_new ();
  102. gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
  103. box2 := gtk_vbox_new (FALSE, 10);
  104. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  105. gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
  106. button := gtk_button_new_with_label ('close');
  107. g_signal_connect_swapped (button, 'clicked',
  108. G_CALLBACK (@gtk_widget_destroy), if_window);
  109. gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  110. GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  111. gtk_widget_grab_default (button);
  112. gtk_widget_show_all (if_window);
  113. end else
  114. begin
  115. gtk_widget_destroy (if_window);
  116. if_window := NULL;
  117. end;
  118. do_item_factory := if_window;
  119. end;