ex3.pp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. program ex3;
  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. If Data<>Nil then
  16. begin
  17. TheLabel := g_list_nth_data(gtk_container_children(GTK_CONTAINER(Widget)),0);
  18. gtk_label_get(gtk_Label(theLabel),@LabelText);
  19. S := 'Chosen menu : ' + Strpas(Labeltext);
  20. gtk_label_set_text(GTK_LABEL(data),pchar(S));
  21. end;
  22. end;
  23. Function AddMenuToMenuBar (MenuBar : PGtkMenuBar;
  24. ShortCuts : PGtkAccelGroup;
  25. Caption : AnsiString;
  26. CallBack : TgtkSignalFunc;
  27. CallBackdata : Pointer;
  28. AlignRight : Boolean;
  29. Var MenuItem : PgtkMenuItem
  30. ) : PGtkMenu;
  31. Var
  32. Key : guint;
  33. TheLabel : PGtkLabel;
  34. begin
  35. MenuItem:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
  36. If AlignRight Then
  37. gtk_menu_item_right_justify(MenuItem);
  38. TheLabel:=GTK_LABEL(GTK_BIN(MenuItem)^.child);
  39. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  40. If Key<>0 then
  41. gtk_widget_add_accelerator(PGtkWidget(MenuItem),'activate_item',
  42. Shortcuts,Key,
  43. GDK_MOD1_MASK,GTK_ACCEL_LOCKED);
  44. Result:=PGtkMenu(gtk_menu_new);
  45. If CallBack<>Nil then
  46. gtk_signal_connect(PGtkObject(result),'activate',
  47. CallBack,CallBackdata);
  48. gtk_widget_show(PgtkWidget(MenuItem));
  49. gtk_menu_item_set_submenu(MenuItem, PgtkWidget(Result));
  50. gtk_menu_bar_append(MenuBar,PgtkWidget(MenuItem));
  51. end;
  52. Function AddItemToMenu (Menu : PGtkMenu;
  53. ShortCuts : PGtkAccelGroup;
  54. Caption : AnsiString;
  55. ShortCut : AnsiString;
  56. CallBack : TgtkSignalFunc;
  57. CallBackdata : Pointer
  58. ) : PGtkMenuItem;
  59. Var
  60. Key,Modifiers : guint;
  61. LocalAccelGroup : PGtkAccelGroup;
  62. TheLabel : PGtkLabel;
  63. begin
  64. Result:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
  65. TheLabel:=GTK_LABEL(GTK_BIN(Result)^.child);
  66. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  67. If Key<>0 then
  68. begin
  69. LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
  70. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  71. LocalAccelGroup,Key,
  72. 0,TGtkAccelFlags(0));
  73. end;
  74. gtk_menu_append(Menu,pgtkWidget(result));
  75. If (ShortCut<>'') and (ShortCuts<>Nil) then
  76. begin
  77. gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
  78. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  79. ShortCuts,Key,
  80. modifiers, GTK_ACCEL_VISIBLE);
  81. end;
  82. If CallBack<>Nil then
  83. gtk_signal_connect(PGtkObject(result),'activate',
  84. CallBack,CallBackdata);
  85. gtk_widget_show(PgtkWidget(result));
  86. end;
  87. Function AddImageItemToMenu (Menu : PGtkMenu;
  88. ShortCuts : PGtkAccelGroup;
  89. Caption : AnsiString;
  90. ShortCut : AnsiString;
  91. Bitmap : AnsiString;
  92. CallBack : TgtkSignalFunc;
  93. CallBackdata : Pointer
  94. ) : PGtkMenuItem;
  95. Var
  96. Key,Modifiers : guint;
  97. LocalAccelGroup : PGtkAccelGroup;
  98. TheLabel : PGtkLabel;
  99. Image : PGtkPixmap;
  100. hbox : PGtkHBox;
  101. pixmap : PGdkPixmap;
  102. BitMapdata : PGdkBitmap;
  103. begin
  104. Result:=pgtkmenuitem(gtk_menu_item_new);
  105. hbox:=PGtkHBox(gtk_hbox_new(false,0));
  106. gtk_container_add(pgtkcontainer(result),pgtkWidget(hbox));
  107. pixmap:=gdk_pixmap_create_from_xpm(Nil,@BitmapData,Nil,pchar(BitMap));
  108. Image := PgtkPixMap(gtk_pixmap_new(Pixmap,BitmapData));
  109. gtk_box_pack_start(PGtkBox(hbox),pgtkWidget(image),false,false,0);
  110. TheLabel:=PgtkLabel(gtk_label_new(''));
  111. gtk_box_pack_start(PGtkBox(hbox),pgtkWidget(TheLabel),True,True,0);
  112. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  113. If Key<>0 then
  114. begin
  115. LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
  116. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  117. LocalAccelGroup,Key,
  118. 0,TGtkAccelFlags(0));
  119. end;
  120. gtk_menu_append(Menu,pgtkWidget(result));
  121. If (ShortCut<>'') and (ShortCuts<>Nil) then
  122. begin
  123. gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
  124. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  125. ShortCuts,Key,
  126. modifiers, GTK_ACCEL_VISIBLE);
  127. end;
  128. If CallBack<>Nil then
  129. gtk_signal_connect(PGtkObject(result),'activate',
  130. CallBack,CallBackdata);
  131. gtk_widget_show_all(PgtkWidget(result));
  132. end;
  133. Function AddSeparatorToMenu(Menu : PgtkMenu) : PgtkMenuItem;
  134. begin
  135. Result:=pgtkmenuitem(gtk_menu_item_new());
  136. gtk_menu_append(Menu,pgtkWidget(result));
  137. gtk_widget_show(PgtkWidget(result));
  138. end;
  139. var
  140. Window : PGtkWidget;
  141. WinBox : PGtkWidget;
  142. MenuBar : PGtkMenuBar;
  143. FileMenu : PGtkMenu;
  144. TempMenuItem : PgtkMenuItem;
  145. DisplayLabel : PgtkWidget;
  146. HelpMenu : PgtkMenu;
  147. Accel : PGtkAccelGroup;
  148. begin
  149. gtk_init (@argc, @argv);
  150. window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
  151. gtk_window_set_title (GTK_WINDOW(Window),'Menu made manually');
  152. gtk_widget_set_usize (Window, 300, 200);
  153. gtk_signal_connect (PGTKOBJECT (window), 'destroy',
  154. GTK_SIGNAL_FUNC (@destroy), NULL);
  155. accel:=gtk_accel_group_new;
  156. gtk_window_add_accel_group(GTK_Window(Window),accel);
  157. WinBox := gtk_vbox_new(False,0);
  158. gtk_widget_show(WinBox);
  159. Gtk_container_add(GTK_CONTAINER(Window),WinBox);
  160. MenuBar := PgtkMenuBar(gtk_menu_bar_new);
  161. gtk_widget_show(PgtkWidget(MenuBar));
  162. Gtk_box_pack_start(GTK_BOX(Winbox),PgtkWidget(MenuBar),False,False,2);
  163. DisplayLabel := gtk_label_new('Chosen menu : (none)');
  164. gtk_widget_show(DisplayLabeL);
  165. Gtk_box_pack_start(GTK_BOX(WinBox),DisplayLabel,TRUE,TRUE,10);
  166. FileMenu:=AddMenuToMenuBar(MenuBar,accel,'_File',Nil,Nil,False,TempMenuItem);
  167. AddImageItemToMenu(FileMenu,accel,'_New','<control>N','filenew.xpm',TgtkSignalFunc(@menu),Nil);
  168. AddImageItemToMenu(FileMenu,accel,'_Open','<control>O','fileopen.xpm',TgtkSignalFunc(@menu),Nil);
  169. AddImageItemToMenu(FileMenu,accel,'_Save','<control>S','filesave.xpm',TgtkSignalFunc(@menu),Nil);
  170. AddSeparatorToMenu(PGtkMenu(FileMenu));
  171. AddItemToMenu(FileMenu,accel,'_Quit','<control>Q',TgtkSignalFunc(@destroy),Nil);
  172. HelpMenu:=AddMenuToMenuBar(MenuBar,Accel,'_Help',Nil,Nil,True,TempMenuItem);
  173. AddItemToMenu(HelpMenu,accel,'_Contents','F1',TgtkSignalFunc(@menu),DisplayLabel);
  174. AddItemToMenu(HelpMenu,accel,'_About','<alt>A',TgtkSignalFunc(@menu),DisplayLabel);
  175. gtk_widget_show (window);
  176. gtk_main ();
  177. end.