fpc/docs/gtk3ex/ex2.pp
2001-03-26 19:45:36 +00:00

146 lines
5.1 KiB
ObjectPascal

program ex2;
{$mode objfpc}
uses
gdk,glib,gtk;
procedure destroy(widget : pGtkWidget ; data: pgpointer ); cdecl;
begin
gtk_main_quit();
end;
procedure menu(widget : pGtkWidget ; data: pgpointer ); cdecl;
Var
TheLabel : PgtkWidget;
LabelText : Pchar;
S : AnsiString;
begin
TheLabel := g_list_nth_data(gtk_container_children(GTK_CONTAINER(Widget)),0);
gtk_label_get(gtk_Label(theLabel),@LabelText);
S := 'Chosen menu : ' + Strpas(Labeltext);
gtk_label_set_text(GTK_LABEL(data),pchar(S));
end;
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
LocalAccelGroup:=gtk_menu_ensure_uline_accel_group(Menu);
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 AddSeparatorToMenu(Menu : PgtkMenu) : PgtkMenuItem;
begin
Result:=pgtkmenuitem(gtk_menu_item_new());
gtk_menu_append(Menu,pgtkWidget(result));
gtk_widget_show(PgtkWidget(result));
end;
var
Window : PGtkWidget;
WinBox : PGtkWidget;
MenuBar : PGtkMenuBar;
FileMenu : PGtkMenu;
TempMenuItem : PgtkMenuItem;
DisplayLabel : PgtkWidget;
HelpMenu : PgtkMenu;
Accel : PGtkAccelGroup;
begin
gtk_init (@argc, @argv);
window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(Window),'Menu made manually');
gtk_widget_set_usize (Window, 300, 200);
gtk_signal_connect (PGTKOBJECT (window), 'destroy',
GTK_SIGNAL_FUNC (@destroy), NULL);
accel:=gtk_accel_group_new;
gtk_window_add_accel_group(GTK_Window(Window),accel);
WinBox := gtk_vbox_new(False,0);
gtk_widget_show(WinBox);
Gtk_container_add(GTK_CONTAINER(Window),WinBox);
MenuBar := PgtkMenuBar(gtk_menu_bar_new);
gtk_widget_show(PgtkWidget(MenuBar));
Gtk_box_pack_start(GTK_BOX(Winbox),PgtkWidget(MenuBar),False,False,2);
DisplayLabel := gtk_label_new('Chosen menu : (none)');
gtk_widget_show(DisplayLabeL);
Gtk_box_pack_start(GTK_BOX(WinBox),DisplayLabel,TRUE,TRUE,10);
FileMenu:=AddMenuToMenuBar(MenuBar,accel,'_File',Nil,Nil,False,TempMenuItem);
AddItemToMenu(FileMenu,accel,'_New','<control>N',TgtkSignalFunc(@menu),DisplayLabel);
AddItemToMenu(FileMenu,accel,'_Open','<control>O',TgtkSignalFunc(@menu),DisplayLabel);
AddItemToMenu(FileMenu,accel,'_Save','<control>S',TgtkSignalFunc(@menu),DisplayLabel);
AddSeparatorToMenu(PGtkMenu(FileMenu));
AddItemToMenu(FileMenu,accel,'_Quit','<control>Q',TgtkSignalFunc(@destroy),Nil);
HelpMenu:=AddMenuToMenuBar(MenuBar,Accel,'_Help',Nil,Nil,True,TempMenuItem);
AddItemToMenu(HelpMenu,accel,'_Contents','F1',TgtkSignalFunc(@menu),DisplayLabel);
AddItemToMenu(HelpMenu,accel,'_About','<alt>A',TgtkSignalFunc(@menu),DisplayLabel);
gtk_widget_show (window);
gtk_main ();
end.