fpc/docs/gtk4ex/menus.pp
2001-07-10 21:54:31 +00:00

209 lines
7.4 KiB
ObjectPascal

Unit menus;
{$mode objfpc}
Interface
Uses Gtk,Gdk,Glib;
Function AddMenuToMenuBar (MenuBar : PGtkMenuBar;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer;
AlignRight : Boolean;
Var MenuItem : PgtkMenuItem
) : PGtkMenu;
Function AddItemToMenu (Menu : PGtkMenu;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
ShortCut : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer
) : PGtkMenuItem;
Function AddCheckItemToMenu (Menu : PGtkMenu;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
ShortCut : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer
) : PGtkCheckMenuItem;
Function AddImageItemToMenu (Menu : PGtkMenu;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
ShortCut : AnsiString;
Bitmap : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer
) : PGtkMenuItem;
Function AddSeparatorToMenu(Menu : PgtkMenu) : PgtkMenuItem;
Implementation
Function AddMenuToMenuBar (MenuBar : PGtkMenuBar;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer;
AlignRight : Boolean;
Var MenuItem : PgtkMenuItem
) : PGtkMenu;
Var
Key : guint;
TheLabel : PGtkLabel;
begin
MenuItem:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
If AlignRight Then
gtk_menu_item_right_justify(MenuItem);
TheLabel:=GTK_LABEL(GTK_BIN(MenuItem)^.child);
Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
If Key<>0 then
gtk_widget_add_accelerator(PGtkWidget(MenuItem),'activate_item',
Shortcuts,Key,
GDK_MOD1_MASK,GTK_ACCEL_LOCKED);
Result:=PGtkMenu(gtk_menu_new);
If CallBack<>Nil then
gtk_signal_connect(PGtkObject(result),'activate',
CallBack,CallBackdata);
gtk_widget_show(PgtkWidget(MenuItem));
gtk_menu_item_set_submenu(MenuItem, PgtkWidget(Result));
gtk_menu_bar_append(MenuBar,PgtkWidget(MenuItem));
end;
Function AddItemToMenu (Menu : PGtkMenu;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
ShortCut : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer
) : PGtkMenuItem;
Var
Key,Modifiers : guint;
LocalAccelGroup : PGtkAccelGroup;
TheLabel : PGtkLabel;
begin
Result:=pgtkmenuitem(gtk_menu_item_new_with_label(''));
TheLabel:=GTK_LABEL(GTK_BIN(Result)^.child);
Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
If Key<>0 then
begin
{ $ifndef win32}
LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
{ $endif}
gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
LocalAccelGroup,Key,
0,TGtkAccelFlags(0));
end;
gtk_menu_append(Menu,pgtkWidget(result));
If (ShortCut<>'') and (ShortCuts<>Nil) then
begin
gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
ShortCuts,Key,
modifiers, GTK_ACCEL_VISIBLE);
end;
If CallBack<>Nil then
gtk_signal_connect(PGtkObject(result),'activate',
CallBack,CallBackdata);
gtk_widget_show(PgtkWidget(result));
end;
Function AddCheckItemToMenu (Menu : PGtkMenu;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
ShortCut : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer
) : PGtkCheckMenuItem;
Var
Key,Modifiers : guint;
LocalAccelGroup : PGtkAccelGroup;
TheLabel : PGtkLabel;
begin
Result:=pgtkcheckmenuitem(gtk_check_menu_item_new_with_label(PChar(Caption)));
gtk_check_menu_item_set_show_toggle(Result,True);
gtk_menu_append(Menu,pgtkWidget(result));
If (ShortCut<>'') and (ShortCuts<>Nil) then
begin
gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
ShortCuts,Key,
modifiers, GTK_ACCEL_VISIBLE);
end;
If CallBack<>Nil then
gtk_signal_connect(PGtkObject(result),'toggled',
CallBack,CallBackdata);
gtk_widget_show(PgtkWidget(result));
end;
Function AddImageItemToMenu (Menu : PGtkMenu;
ShortCuts : PGtkAccelGroup;
Caption : AnsiString;
ShortCut : AnsiString;
Bitmap : AnsiString;
CallBack : TgtkSignalFunc;
CallBackdata : Pointer
) : PGtkMenuItem;
Var
Key,Modifiers : guint;
LocalAccelGroup : PGtkAccelGroup;
TheLabel : PGtkLabel;
Image : PGtkPixmap;
hbox : PGtkHBox;
pixmap : PGdkPixmap;
BitMapdata : PGdkBitmap;
begin
Result:=pgtkmenuitem(gtk_menu_item_new);
hbox:=PGtkHBox(gtk_hbox_new(false,0));
gtk_container_add(pgtkcontainer(result),pgtkWidget(hbox));
pixmap:=gdk_pixmap_create_from_xpm(Nil,@BitmapData,Nil,pchar(BitMap));
Image := PgtkPixMap(gtk_pixmap_new(Pixmap,BitmapData));
gtk_box_pack_start(PGtkBox(hbox),pgtkWidget(image),false,false,0);
TheLabel:=PgtkLabel(gtk_label_new(''));
gtk_box_pack_start(PGtkBox(hbox),pgtkWidget(TheLabel),True,True,0);
Key:=gtk_label_parse_uline(TheLabel,Pchar(Caption));
If Key<>0 then
begin
{ $ifndef win32}
LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
{ $endif}
gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
LocalAccelGroup,Key,
0,TGtkAccelFlags(0));
end;
gtk_menu_append(Menu,pgtkWidget(result));
If (ShortCut<>'') and (ShortCuts<>Nil) then
begin
gtk_accelerator_parse (pchar(ShortCut), @key, @modifiers);
gtk_widget_add_accelerator(PGtkWidget(result),'activate_item',
ShortCuts,Key,
modifiers, GTK_ACCEL_VISIBLE);
end;
If CallBack<>Nil then
gtk_signal_connect(PGtkObject(result),'activate',
CallBack,CallBackdata);
gtk_widget_show_all(PgtkWidget(result));
end;
Function AddSeparatorToMenu(Menu : PgtkMenu) : PgtkMenuItem;
begin
Result:=pgtkmenuitem(gtk_menu_item_new());
gtk_menu_append(Menu,pgtkWidget(result));
gtk_widget_show(PgtkWidget(result));
end;
end.