ex2.pp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. program ex2;
  2. {$mode objfpc}
  3. uses
  4. gdk,glib,gtk;
  5. procedure destroy(widget : pGtkWidget ; data: pgpointer ); cdecl;
  6. begin
  7. gtk_main_quit();
  8. end;
  9. procedure menu(widget : pGtkWidget ; data: pgpointer ); cdecl;
  10. Var
  11. TheLabel : PgtkWidget;
  12. LabelText : Pchar;
  13. S : AnsiString;
  14. begin
  15. TheLabel := g_list_nth_data(gtk_container_children(GTK_CONTAINER(Widget)),0);
  16. gtk_label_get(gtk_Label(theLabel),@LabelText);
  17. S := 'Chosen menu : ' + Strpas(Labeltext);
  18. gtk_label_set_text(GTK_LABEL(data),pchar(S));
  19. end;
  20. Function AddMenuToMenuBar (MenuBar : PGtkMenuBar;
  21. ShortCuts : PGtkAccelGroup;
  22. Caption : AnsiString;
  23. CallBack : TgtkSignalFunc;
  24. CallBackdata : Pointer;
  25. AlignRight : Boolean;
  26. Var MenuItem : PgtkMenuItem
  27. ) : PGtkMenu;
  28. Var
  29. Key : guint;
  30. TheLabel : PGtkLabel;
  31. begin
  32. MenuItem:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
  33. If AlignRight Then
  34. gtk_menu_item_right_justify(MenuItem);
  35. TheLabel:=GTK_LABEL(GTK_BIN(MenuItem)^.child);
  36. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  37. If Key<>0 then
  38. gtk_widget_add_accelerator(PGtkWidget(MenuItem),'activate_item',
  39. Shortcuts,Key,
  40. GDK_MOD1_MASK,GTK_ACCEL_LOCKED);
  41. Result:=PGtkMenu(gtk_menu_new);
  42. If CallBack<>Nil then
  43. gtk_signal_connect(PGtkObject(result),'activate',
  44. CallBack,CallBackdata);
  45. gtk_widget_show(PgtkWidget(MenuItem));
  46. gtk_menu_item_set_submenu(MenuItem, PgtkWidget(Result));
  47. gtk_menu_bar_append(MenuBar,PgtkWidget(MenuItem));
  48. end;
  49. Function AddItemToMenu (Menu : PGtkMenu;
  50. ShortCuts : PGtkAccelGroup;
  51. Caption : AnsiString;
  52. ShortCut : AnsiString;
  53. CallBack : TgtkSignalFunc;
  54. CallBackdata : Pointer
  55. ) : PGtkMenuItem;
  56. Var
  57. Key,Modifiers : guint;
  58. LocalAccelGroup : PGtkAccelGroup;
  59. TheLabel : PGtkLabel;
  60. begin
  61. Result:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
  62. TheLabel:=GTK_LABEL(GTK_BIN(Result)^.child);
  63. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  64. If Key<>0 then
  65. begin
  66. LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
  67. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  68. LocalAccelGroup,Key,
  69. 0,TGtkAccelFlags(0));
  70. end;
  71. gtk_menu_append(Menu,pgtkWidget(result));
  72. If (ShortCut<>'') and (ShortCuts<>Nil) then
  73. begin
  74. gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
  75. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  76. ShortCuts,Key,
  77. modifiers, GTK_ACCEL_VISIBLE);
  78. end;
  79. If CallBack<>Nil then
  80. gtk_signal_connect(PGtkObject(result),'activate',
  81. CallBack,CallBackdata);
  82. gtk_widget_show(PgtkWidget(result));
  83. end;
  84. Function AddSeparatorToMenu(Menu : PgtkMenu) : PgtkMenuItem;
  85. begin
  86. Result:=pgtkmenuitem(gtk_menu_item_new());
  87. gtk_menu_append(Menu,pgtkWidget(result));
  88. gtk_widget_show(PgtkWidget(result));
  89. end;
  90. var
  91. Window : PGtkWidget;
  92. WinBox : PGtkWidget;
  93. MenuBar : PGtkMenuBar;
  94. FileMenu : PGtkMenu;
  95. TempMenuItem : PgtkMenuItem;
  96. DisplayLabel : PgtkWidget;
  97. HelpMenu : PgtkMenu;
  98. Accel : PGtkAccelGroup;
  99. begin
  100. gtk_init (@argc, @argv);
  101. window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
  102. gtk_window_set_title (GTK_WINDOW(Window),'Menu made manually');
  103. gtk_widget_set_usize (Window, 300, 200);
  104. gtk_signal_connect (PGTKOBJECT (window), 'destroy',
  105. GTK_SIGNAL_FUNC (@destroy), NULL);
  106. accel:=gtk_accel_group_new;
  107. gtk_window_add_accel_group(GTK_Window(Window),accel);
  108. WinBox := gtk_vbox_new(False,0);
  109. gtk_widget_show(WinBox);
  110. Gtk_container_add(GTK_CONTAINER(Window),WinBox);
  111. MenuBar := PgtkMenuBar(gtk_menu_bar_new);
  112. gtk_widget_show(PgtkWidget(MenuBar));
  113. Gtk_box_pack_start(GTK_BOX(Winbox),PgtkWidget(MenuBar),False,False,2);
  114. DisplayLabel := gtk_label_new('Chosen menu : (none)');
  115. gtk_widget_show(DisplayLabeL);
  116. Gtk_box_pack_start(GTK_BOX(WinBox),DisplayLabel,TRUE,TRUE,10);
  117. FileMenu:=AddMenuToMenuBar(MenuBar,accel,'_File',Nil,Nil,False,TempMenuItem);
  118. AddItemToMenu(FileMenu,accel,'_New','<control>N',TgtkSignalFunc(@menu),DisplayLabel);
  119. AddItemToMenu(FileMenu,accel,'_Open','<control>O',TgtkSignalFunc(@menu),DisplayLabel);
  120. AddItemToMenu(FileMenu,accel,'_Save','<control>S',TgtkSignalFunc(@menu),DisplayLabel);
  121. AddSeparatorToMenu(PGtkMenu(FileMenu));
  122. AddItemToMenu(FileMenu,accel,'_Quit','<control>Q',TgtkSignalFunc(@destroy),Nil);
  123. HelpMenu:=AddMenuToMenuBar(MenuBar,Accel,'_Help',Nil,Nil,True,TempMenuItem);
  124. AddItemToMenu(HelpMenu,accel,'_Contents','F1',TgtkSignalFunc(@menu),DisplayLabel);
  125. AddItemToMenu(HelpMenu,accel,'_About','<alt>A',TgtkSignalFunc(@menu),DisplayLabel);
  126. gtk_widget_show (window);
  127. gtk_main ();
  128. end.