menus.pp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. Unit menus;
  2. {$mode objfpc}
  3. Interface
  4. Uses Gtk,Gdk,Glib;
  5. Function AddMenuToMenuBar (MenuBar : PGtkMenuBar;
  6. ShortCuts : PGtkAccelGroup;
  7. Caption : AnsiString;
  8. CallBack : TgtkSignalFunc;
  9. CallBackdata : Pointer;
  10. AlignRight : Boolean;
  11. Var MenuItem : PgtkMenuItem
  12. ) : PGtkMenu;
  13. Function AddItemToMenu (Menu : PGtkMenu;
  14. ShortCuts : PGtkAccelGroup;
  15. Caption : AnsiString;
  16. ShortCut : AnsiString;
  17. CallBack : TgtkSignalFunc;
  18. CallBackdata : Pointer
  19. ) : PGtkMenuItem;
  20. Function AddCheckItemToMenu (Menu : PGtkMenu;
  21. ShortCuts : PGtkAccelGroup;
  22. Caption : AnsiString;
  23. ShortCut : AnsiString;
  24. CallBack : TgtkSignalFunc;
  25. CallBackdata : Pointer
  26. ) : PGtkCheckMenuItem;
  27. Function AddImageItemToMenu (Menu : PGtkMenu;
  28. ShortCuts : PGtkAccelGroup;
  29. Caption : AnsiString;
  30. ShortCut : AnsiString;
  31. Bitmap : AnsiString;
  32. CallBack : TgtkSignalFunc;
  33. CallBackdata : Pointer
  34. ) : PGtkMenuItem;
  35. Function AddSeparatorToMenu(Menu : PgtkMenu) : PgtkMenuItem;
  36. Implementation
  37. Function AddMenuToMenuBar (MenuBar : PGtkMenuBar;
  38. ShortCuts : PGtkAccelGroup;
  39. Caption : AnsiString;
  40. CallBack : TgtkSignalFunc;
  41. CallBackdata : Pointer;
  42. AlignRight : Boolean;
  43. Var MenuItem : PgtkMenuItem
  44. ) : PGtkMenu;
  45. Var
  46. Key : guint;
  47. TheLabel : PGtkLabel;
  48. begin
  49. MenuItem:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
  50. If AlignRight Then
  51. gtk_menu_item_right_justify(MenuItem);
  52. TheLabel:=GTK_LABEL(GTK_BIN(MenuItem)^.child);
  53. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  54. If Key<>0 then
  55. gtk_widget_add_accelerator(PGtkWidget(MenuItem),'activate_item',
  56. Shortcuts,Key,
  57. GDK_MOD1_MASK,GTK_ACCEL_LOCKED);
  58. Result:=PGtkMenu(gtk_menu_new);
  59. If CallBack<>Nil then
  60. gtk_signal_connect(PGtkObject(result),'activate',
  61. CallBack,CallBackdata);
  62. gtk_widget_show(PgtkWidget(MenuItem));
  63. gtk_menu_item_set_submenu(MenuItem, PgtkWidget(Result));
  64. gtk_menu_bar_append(MenuBar,PgtkWidget(MenuItem));
  65. end;
  66. Function AddItemToMenu (Menu : PGtkMenu;
  67. ShortCuts : PGtkAccelGroup;
  68. Caption : AnsiString;
  69. ShortCut : AnsiString;
  70. CallBack : TgtkSignalFunc;
  71. CallBackdata : Pointer
  72. ) : PGtkMenuItem;
  73. Var
  74. Key,Modifiers : guint;
  75. LocalAccelGroup : PGtkAccelGroup;
  76. TheLabel : PGtkLabel;
  77. begin
  78. Result:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
  79. TheLabel:=GTK_LABEL(GTK_BIN(Result)^.child);
  80. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  81. If Key<>0 then
  82. begin
  83. { $ifndef win32}
  84. LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
  85. { $endif}
  86. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  87. LocalAccelGroup,Key,
  88. 0,TGtkAccelFlags(0));
  89. end;
  90. gtk_menu_append(Menu,pgtkWidget(result));
  91. If (ShortCut<>'') and (ShortCuts<>Nil) then
  92. begin
  93. gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
  94. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  95. ShortCuts,Key,
  96. modifiers, GTK_ACCEL_VISIBLE);
  97. end;
  98. If CallBack<>Nil then
  99. gtk_signal_connect(PGtkObject(result),'activate',
  100. CallBack,CallBackdata);
  101. gtk_widget_show(PgtkWidget(result));
  102. end;
  103. Function AddCheckItemToMenu (Menu : PGtkMenu;
  104. ShortCuts : PGtkAccelGroup;
  105. Caption : AnsiString;
  106. ShortCut : AnsiString;
  107. CallBack : TgtkSignalFunc;
  108. CallBackdata : Pointer
  109. ) : PGtkCheckMenuItem;
  110. Var
  111. Key,Modifiers : guint;
  112. LocalAccelGroup : PGtkAccelGroup;
  113. TheLabel : PGtkLabel;
  114. begin
  115. Result:=pgtkcheckmenuitem(gtk_check_menu_item_new_with_label(PChar(Caption)));
  116. gtk_check_menu_item_set_show_toggle(Result,True);
  117. gtk_menu_append(Menu,pgtkWidget(result));
  118. If (ShortCut<>'') and (ShortCuts<>Nil) then
  119. begin
  120. gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
  121. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  122. ShortCuts,Key,
  123. modifiers, GTK_ACCEL_VISIBLE);
  124. end;
  125. If CallBack<>Nil then
  126. gtk_signal_connect(PGtkObject(result),'toggled',
  127. CallBack,CallBackdata);
  128. gtk_widget_show(PgtkWidget(result));
  129. end;
  130. Function AddImageItemToMenu (Menu : PGtkMenu;
  131. ShortCuts : PGtkAccelGroup;
  132. Caption : AnsiString;
  133. ShortCut : AnsiString;
  134. Bitmap : AnsiString;
  135. CallBack : TgtkSignalFunc;
  136. CallBackdata : Pointer
  137. ) : PGtkMenuItem;
  138. Var
  139. Key,Modifiers : guint;
  140. LocalAccelGroup : PGtkAccelGroup;
  141. TheLabel : PGtkLabel;
  142. Image : PGtkPixmap;
  143. hbox : PGtkHBox;
  144. pixmap : PGdkPixmap;
  145. BitMapdata : PGdkBitmap;
  146. begin
  147. Result:=pgtkmenuitem(gtk_menu_item_new);
  148. hbox:=PGtkHBox(gtk_hbox_new(false,0));
  149. gtk_container_add(pgtkcontainer(result),pgtkWidget(hbox));
  150. pixmap:=gdk_pixmap_create_from_xpm(Nil,@BitmapData,Nil,pchar(BitMap));
  151. Image := PgtkPixMap(gtk_pixmap_new(Pixmap,BitmapData));
  152. gtk_box_pack_start(PGtkBox(hbox),pgtkWidget(image),false,false,0);
  153. TheLabel:=PgtkLabel(gtk_label_new(''));
  154. gtk_box_pack_start(PGtkBox(hbox),pgtkWidget(TheLabel),True,True,0);
  155. Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
  156. If Key<>0 then
  157. begin
  158. { $ifndef win32}
  159. LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
  160. { $endif}
  161. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  162. LocalAccelGroup,Key,
  163. 0,TGtkAccelFlags(0));
  164. end;
  165. gtk_menu_append(Menu,pgtkWidget(result));
  166. If (ShortCut<>'') and (ShortCuts<>Nil) then
  167. begin
  168. gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
  169. gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
  170. ShortCuts,Key,
  171. modifiers, GTK_ACCEL_VISIBLE);
  172. end;
  173. If CallBack<>Nil then
  174. gtk_signal_connect(PGtkObject(result),'activate',
  175. CallBack,CallBackdata);
  176. gtk_widget_show_all(PgtkWidget(result));
  177. end;
  178. Function AddSeparatorToMenu(Menu : PgtkMenu) : PgtkMenuItem;
  179. begin
  180. Result:=pgtkmenuitem(gtk_menu_item_new());
  181. gtk_menu_append(Menu,pgtkWidget(result));
  182. gtk_widget_show(PgtkWidget(result));
  183. end;
  184. end.