ex1.pp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. program ex1;
  2. {$mode objfpc}
  3. uses
  4. glib,gtk;
  5. var
  6. Window : PGtkWidget;
  7. WinBox : PGtkWidget;
  8. MenuBar : PGtkWidget;
  9. DisplayLabel : PgtkWidget;
  10. procedure destroy(widget : pGtkWidget ; data: pgpointer ); cdecl;
  11. begin
  12. gtk_main_quit();
  13. end;
  14. procedure menu(Data : GPointer; Action : Guint; Widget : pGtkWidget); cdecl;
  15. Var
  16. TheLabel : PgtkWidget;
  17. LabelText : Pchar;
  18. S : AnsiString;
  19. begin
  20. TheLabel := g_list_nth_data(gtk_container_children(GTK_CONTAINER(Widget)),0);
  21. gtk_label_get(gtk_Label(theLabel),@LabelText);
  22. S := 'Chosen menu : ' + Strpas(Labeltext);
  23. gtk_label_set_text(GTK_LABEL(DisplayLabel),pchar(S));
  24. end;
  25. {
  26. TGtkItemFactoryEntry = record
  27. path : Pgchar;
  28. accelerator : Pgchar;
  29. callback : TGtkItemFactoryCallback;
  30. callback_action : guint;
  31. item_type : Pgchar;
  32. end;
  33. }
  34. Type
  35. FC = TGtkItemFactoryCallback;
  36. Const
  37. NrMenuItems = 21;
  38. TheMenu : Array[1..NrMenuItems] of TGtkItemFactoryEntry = (
  39. (path:'/_File';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<Branch>'),
  40. (path:'/File/_New';Accelerator:'<ctrl>N';Callback:FC(@Menu);Callback_action:1;item_type:Nil),
  41. (path:'/File/_Open';Accelerator:'<control>O';Callback:FC(@Menu);Callback_action:1;item_type:Nil),
  42. (path:'/File/_Save';Accelerator:'<control>S';Callback:FC(@Menu);Callback_action:1;item_type:Nil),
  43. (path:'/File/sep1';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<Separator>'),
  44. (path:'/File/E_xit';Accelerator:'<alt>X';Callback:FC(@destroy);Callback_action:1;item_type:Nil),
  45. (path:'/_Radio';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<Branch>'),
  46. (path:'/Radio/Radio _1';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<RadioItem>'),
  47. (path:'/Radio/Radio _2';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<RadioItem>'),
  48. (path:'/Radio/Radio _3';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<RadioItem>'),
  49. (path:'/_Check';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<Branch>'),
  50. (path:'/Check/Check _1';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<CheckItem>'),
  51. (path:'/Check/Check _2';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<CheckItem>'),
  52. (path:'/Check/Check _3';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<CheckItem>'),
  53. (path:'/_Toggle';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<Branch>'),
  54. (path:'/Toggle/Toggle _1';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<CheckItem>'),
  55. (path:'/Toggle/Toggle _2';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<CheckItem>'),
  56. (path:'/Toggle/Toggle _3';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<CheckItem>'),
  57. (path:'/_Help';Accelerator:Nil;Callback:Nil;Callback_action:1;item_type:'<LastBranch>'),
  58. (path:'/Help/Contents';Accelerator:'F1';Callback:FC(@Menu);Callback_action:1;item_type:Nil),
  59. (path:'/Help/About';Accelerator:'<mod1>A';Callback:FC(@Menu);Callback_action:1;item_type:Nil)
  60. );
  61. Procedure MakeMenu;
  62. Var
  63. Factory : PGtkItemFactory;
  64. Accel : PGtkAccelGroup;
  65. begin
  66. accel:=gtk_accel_group_new;
  67. factory :=gtk_item_factory_new(GTK_MENU_BAR_TYPE,'<main>',accel);
  68. gtk_item_factory_create_items(Factory,NrMenuItems,@TheMenu,Nil);
  69. gtk_window_add_accel_group(GTK_Window(Window),accel);
  70. MenuBar:=gtk_item_factory_get_widget (Factory, '<main>');
  71. end;
  72. begin
  73. gtk_init (@argc, @argv);
  74. window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
  75. gtk_window_set_title (GTK_WINDOW(Window),'Menu using an item factory');
  76. gtk_widget_set_usize (Window, 300, 200);
  77. gtk_signal_connect (PGTKOBJECT (window), 'destroy',
  78. GTK_SIGNAL_FUNC (@destroy), NULL);
  79. WinBox := gtk_vbox_new(False,0);
  80. gtk_widget_show(WinBox);
  81. Gtk_container_add(GTK_CONTAINER(Window),WinBox);
  82. MakeMenu;
  83. gtk_widget_show(MenuBar);
  84. Gtk_box_pack_start(GTK_BOX(Winbox),MenuBar,False,False,2);
  85. DisplayLabel := gtk_label_new('Chosen menu : (none)');
  86. gtk_widget_show(DisplayLabeL);
  87. Gtk_box_pack_start(GTK_BOX(WinBox),DisplayLabel,TRUE,TRUE,10);
  88. gtk_widget_show (window);
  89. gtk_main ();
  90. end.