----------------------------------------------------------------------- -- GtkAda - Ada95 binding for Gtk+/Gnome -- -- -- -- Copyright (C) 2000-2002 -- -- ACT-Europe -- -- -- -- This library is free software; you can redistribute it and/or -- -- modify it under the terms of the GNU General Public -- -- License as published by the Free Software Foundation; either -- -- version 2 of the License, or (at your option) any later version. -- -- -- -- This library is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- -- General Public License for more details. -- -- -- -- You should have received a copy of the GNU General Public -- -- License along with this library; if not, write to the -- -- Free Software Foundation, Inc., 59 Temple Place - Suite 330, -- -- Boston, MA 02111-1307, USA. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----------------------------------------------------------------------- -- -- This module lets you easily create menus and toolbars for your -- applications. You basically define a hierarchy of arrays of UI_Info -- structures, and you later call the provided functions to create menu bars -- or tool bars. -- with Glib; use Glib; with Gdk.Types; use Gdk.Types; with Gtk.Accel_Group; use Gtk.Accel_Group; with Gtk.Menu_Shell; use Gtk.Menu_Shell; with Gtk.Status_Bar; use Gtk.Status_Bar; with Gtk.Toolbar; use Gtk.Toolbar; with Gtk.Widget; use Gtk.Widget; with Gtkada.Types; use Gtkada.Types; with Gtkada.Intl; use Gtkada.Intl; with System; use System; with Gnome.App; use Gnome.App; package Gnome.App_Helper is type UI_Info_Configurable_Types is (Configurable_Item_New, Configurable_Item_Open, Configurable_Item_Save, Configurable_Item_Save_As, Configurable_Item_Revert, Configurable_Item_Print, Configurable_Item_Print_Setup, Configurable_Item_Close, Configurable_Item_Exit, Configurable_Item_Cut, Configurable_Item_Copy, Configurable_Item_Paste, Configurable_Item_Clear, Configurable_Item_Undo, Configurable_Item_Redo, Configurable_Item_Find, Configurable_Item_Find_Again, Configurable_Item_Replace, Configurable_Item_Properties, Configurable_Item_Preferences, Configurable_Item_About, Configurable_Item_Select_All, Configurable_Item_New_Window, Configurable_Item_Close_Window, Configurable_Item_New_Game, Configurable_Item_Pause_Game, Configurable_Item_Restart_Game, Configurable_Item_Undo_Move, Configurable_Item_Redo_Move, Configurable_Item_Hint, Configurable_Item_Scores, Configurable_Item_End_Game); for UI_Info_Configurable_Types'Size use Gint'Size; type UI_Pixmap_Type is (Pixmap_None, -- No pixmap specified Pixmap_Stock, -- Use a stock pixmap (Gnome.Stock) Pixmap_Data, -- Use a pixmap from inline xpm data Pixmap_Filename -- Use a pixmap from the specified filename ); for UI_Pixmap_Type'Size use Gint'Size; -- These values identify the type of pixmap used in an item type UI_Info is private; type UI_Info_Array is array (Natural range <>) of UI_Info; -- This is the structure that defines an item in a menu bar or toolbar. The -- idea is to create an array of such structures with the information -- needed to create menus or toolbars. The most convenient way to create -- such a structure is to use the UI_Info_* functions provided below. type UI_Info_Array_Access is access UI_Info_Array; type Generic_Callback is access procedure (Widget : access Gtk_Widget_Record'Class); function UI_New_Item (Label : String; Hint : String := ""; Callback : Generic_Callback := null; Pixmap_Type : UI_Pixmap_Type := Pixmap_None; Pixmap_Info : String := ""; Accelerator_Key : Gdk_Key_Type := 0; Ac_Mods : Gdk_Modifier_Type := 0) return UI_Info; -- Return a normal item, or radio item if it is inside a radioitems group. -- Label: String to use in the label -- Hint: The status bar message -- Callback : Function to call when the item is activated -- Pixmap_Type: Type of pixmap for the item -- Pixmap_Info: -- - For Pixmap_Stock, the stock icon name. -- - For Pixmap_Data, the inline xpm data ??? -- - For Pixmap_Filename, the filename string. -- Accelerator_Key: Accelerator key -- Ac_Mods: Mask of modifier keys for the accelerator function UI_New_Subtree (Label : String; Info : UI_Info_Array_Access; Pixmap_Type : UI_Pixmap_Type := Pixmap_None; Pixmap_Info : String := ""; Accelerator_Key : Gdk_Key_Type := 0; Ac_Mods : Gdk_Modifier_Type := 0) return UI_Info; -- Item that defines a subtree/submenu -- function UI_New_Toggle_Item -- Toggle (check box) item -- function UI_New_Radio_Items -- Radio item group -- function UI_New_Help -- Create a list of help topics, used in the Help menu -- function UI_New_Item_Configurable -- A configurable menu item. -- function UI_New_Subtree_Stock -- Item that defines a subtree/submenu, same as UI_Subtree, -- but the texts should be looked up in the gnome-libs catalog -- Handy UI_Info shortcuts UI_Info_End : constant UI_Info; -- Used to terminate an array of Gnome_UI_Info structures UI_Info_Separator : constant UI_Info; -- Insert a separator line (on a menu) or a blank space (on a toolbar) function UI_Info_Item (Label : String; Tooltip : String; Callback : Generic_Callback; Xpm_Data : Chars_Ptr_Array) return UI_Info; -- Insert an item with an inline xpm icon function UI_Info_Item_Stock (Label : String; Tooltip : String; Callback : Generic_Callback; Stock_Id : String) return UI_Info; -- Insert an item with a stock icon function UI_Info_Item_None (Label : String; Tooltip : String; Callback : Generic_Callback) return UI_Info; -- Insert an item with no icon function UI_Info_Toggleitem (Label : String; Tooltip : String; Callback : Generic_Callback; Xpm_Data : Chars_Ptr_Array) return UI_Info; -- Insert a toggle item (check box) with an inline xpm icon function UI_Info_Help (App_Name : String) return UI_Info; -- Insert all the help topics based on the application's id function UI_Info_Subtree (Label : String; Tree : UI_Info_Array_Access) return UI_Info; -- Insert a subtree (submenu) function UI_Info_Subtree_Hint (Label : String; Hint : String; Tree : UI_Info_Array_Access) return UI_Info; -- Insert a subtree with a hint function UI_Info_Subtree_Stock (Label : String; Tree : UI_Info_Array_Access; Stock_Id : String) return UI_Info; -- Insert a subtree (submenu) with a stock icon -- function UI_Info_Radiolist (List : Gtk_Radio_Item_Array) return UI_Info; -- (UI_Radioitems, null, null, List, null, null, 0, null, 0, 0, Null); -- Insert a list of radio items -- ??? Not bound for now function UI_Info_Radioitem (Label : String; Tooltip : String; Callback : Generic_Callback; Xpm_Data : Chars_Ptr_Array) return UI_Info; -- Insert a radio item with an inline xpm icon -- Stock menu item macros for some common menu items. Please see -- gnome-libs/devel-docs/suggestions.txt about GNOME menu standards. -- The 'File' menu -- Note: New item requires you to specify what is new, so you need -- to specify the document type, so you need to supply the label -- as well (it should start with "_New ") function UI_Info_Menu_New_Item (Label : String; Tooltip : String; Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_New_Subtree (Tree : UI_Info_Array_Access) return UI_Info; -- If you have more than one new type, use this tree function UI_Info_Menu_Open_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Save_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Save_As_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Revert_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Print_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Print_Setup_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Close_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Exit_Item (Callback : Generic_Callback) return UI_Info; -- The "Edit" menu function UI_Info_Menu_Cut_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Copy_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Paste_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Select_All_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Clear_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Undo_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Redo_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Find_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Find_Again_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Replace_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Properties_Item (Callback : Generic_Callback) return UI_Info; -- The Settings menu function UI_Info_Menu_Preferences_Item (Callback : Generic_Callback) return UI_Info; -- The Windows menu function UI_Info_Menu_New_Window_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Close_Window_Item (Callback : Generic_Callback) return UI_Info; -- And the "Help" menu function UI_Info_Menu_About_Item (Callback : Generic_Callback) return UI_Info; -- The "Game" menu function UI_Info_Menu_New_Game_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Pause_Game_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Restart_Game_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Undo_Move_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Redo_Move_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Hint_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_Scores_Item (Callback : Generic_Callback) return UI_Info; function UI_Info_Menu_End_Game_Item (Callback : Generic_Callback) return UI_Info; function Helper_Gettext (Str : String) return String; -- function D_(x) dgettext (PACKAGE, x) -- function L_(x) helper_gettext(x) -- Some standard menus function UI_Info_Menu_File_Tree (Tree : UI_Info_Array_Access) return UI_Info; function UI_Info_Menu_Edit_Tree (Tree : UI_Info_Array_Access) return UI_Info; function UI_Info_Menu_View_Tree (Tree : UI_Info_Array_Access) return UI_Info; function UI_Info_Menu_Settings_Tree (Tree : UI_Info_Array_Access) return UI_Info; function UI_Info_Menu_Files_Tree (Tree : UI_Info_Array_Access) return UI_Info; function UI_Info_Menu_Windows_Tree (Tree : UI_Info_Array_Access) return UI_Info; function UI_Info_Menu_Help_Tree (Tree : UI_Info_Array_Access) return UI_Info; function UI_Info_Menu_Game_Tree (Tree : UI_Info_Array_Access) return UI_Info; -- These are strings to be used for paths when working with the menus -- stuff Menu_File_String : constant String := -"_File" & ASCII.NUL; Menu_File_Path : constant String := -"_File/"; Menu_Edit_String : constant String := -"_Edit" & ASCII.NUL; Menu_Edit_Path : constant String := -"_Edit/"; Menu_View_String : constant String := -"_View" & ASCII.NUL; Menu_View_Path : constant String := -"_View/"; Menu_Settings_String : constant String := -"_Settings" & ASCII.NUL; Menu_Settings_Path : constant String := -"_Settings/"; Menu_New_String : constant String := -"_New" & ASCII.NUL; Menu_New_Path : constant String := -"_New/"; Menu_Files_String : constant String := -"Fi_les" & ASCII.NUL; Menu_Files_Path : constant String := -"Fi_les/"; Menu_Windows_String : constant String := -"_Windows" & ASCII.NUL; Menu_Windows_Path : constant String := -"_Windows/"; procedure Gnome_Accelerators_Sync; -- Flush the accelerator definitions into the application specific -- configuration file ~/.gnome/accels/. procedure Fill_Menu (Menu_Shell : access Gtk_Menu_Shell_Record'Class; Info : UI_Info_Array_Access; Accel_Group : Gtk_Accel_Group := null; Uline_Accels : Boolean := False; Pos : Gint := 0; Object : Gtk_Widget := null); -- Fill the specified menu shell with items created from the specified -- info, inserting them from the item no. pos on. -- The accel group will be used as the accel group for all newly created -- sub menus and serves as the global accel group for all menu item -- hotkeys. If it is passed as null, global hotkeys will be disabled. -- The Uline_Accels argument determines whether underline accelerators -- will be featured from the menu item labels. -- Object, if not null, will be passed to the callbacks as the emitter -- (similarly to what is done in Object_Connect). procedure Create_Menus (App : access Gnome_App_Record'Class; Info : UI_Info_Array_Access); -- Construct a menu bar and attach it to the specified application window procedure Fill_Toolbar (Toolbar : access Gtk_Toolbar_Record'Class; Info : UI_Info_Array_Access; Accel_Group : Gtk_Accel_Group := null); -- Fill the specified toolbar with buttons created from the specified info. -- If Accel_Group is not null, then the items' accelerator keys are put -- into it. procedure Create_Toolbar (App : access Gnome_App_Record'Class; Info : UI_Info_Array_Access); -- Construct a toolbar and attach it to the specified application window function Find_Menu_Pos (Parent : access Gtk_Widget_Record'Class; Path : String; Pos : Gint) return Gtk_Widget; -- Find menu item described by path (see below for details) starting in the -- Gtk_Menu_Shell top and return its parent Gtk_Menu_Shell and the position -- after this item in pos: -- Gtk.Menu_Shell.Insert (P, W, Pos) would then insert widget w in -- Gtk_Menu_Shell P right after the menu item described by path. -- The path argument should be in the form "File/.../.../Something". -- "" will insert the item as the first one in the menubar -- "File/" will insert it as the first one in the File menu -- "File/Settings" will insert it after the Setting item in the File menu -- use of "File/" should be obvious. However this stops after -- the first separator. procedure Remove_Menus (App : access Gnome_App_Record'Class; Path : String; Items : Gint); -- Remove num items from the existing app's menu structure begining with -- item described by path procedure Remove_Menu_Range (App : access Gnome_App_Record'Class; Path : String; Start : Gint; Items : Gint); -- Same as the above, except it removes the specified number of items -- from the existing app's menu structure begining with item described by -- path, plus the number specified by start - very useful for adding and -- removing Recent document items in the File menu. procedure Insert_Menus (App : access Gnome_App_Record'Class; Path : String; Menu_Info : UI_Info_Array_Access); -- what does it do ??? -- procedure Install_Appbar_Menu_Hints -- (Appbar : Gnome_App_Bar; -- Info : UI_Info_Array_Access); -- Activate the menu item hints, displaying in the given appbar. -- This can't be automatic since we can't reliably find the -- appbar. -- Really? Why can't it be automatic? procedure Install_Statusbar_Menu_Hints (Bar : Gtk_Status_Bar; Info : UI_Info_Array_Access); procedure Install_Menu_Hints (App : Gnome_App; Info : UI_Info_Array_Access); private type UI_Info_Type is (UI_Endofinfo, -- No more items, use it at the end of an array UI_Item, -- Normal item, or radio item if it is inside a radioitems group UI_Toggleitem, -- Toggle (check box) item UI_Radioitems, -- Radio item group UI_Subtree, -- Item that defines a subtree/submenu UI_Separator, -- Separator line (menus) or blank space (toolbars) UI_Help, -- Create a list of help topics, used in the Help menu UI_Builder_Data, -- Specifies the builder data for the following entries -- One should be careful when using -- Create_*_[Custom|Interp|With_Data] functions with -- UI_Info arrays containing UI_Builder_Data items since -- their UI_Builder_Data structures completely override the ones -- generated or supplied by the above functions. UI_Item_Configurable, -- A configurable menu item. UI_Subtree_Stock -- Item that defines a subtree/submenu, same as UI_Subtree, -- but the texts should be looked up in the gnome-libs catalog ); for UI_Info_Type'Size use Gint'Size; -- These values identify the item type that a particular UI_Info -- structure specifies type Data_Type_Record is record Func : Generic_Callback; -- User's callback Object : Gtk_Widget := null; -- Slot Object for Object_Connect end record; type Data_Type_Access is access all Data_Type_Record; pragma Convention (C, Data_Type_Access); -- Data passed to the C handler type UI_Info is record Item_Type : UI_Info_Type; -- Type of item Label : Chars_Ptr := Null_Ptr; -- String to use in the label Hint : Chars_Ptr := Null_Ptr; -- For toolbar items, the tooltip. For menu items, the status bar -- message Moreinfo : System.Address := System.Null_Address; -- For an item, toggleitem, or radioitem, this is a pointer to the -- function to call when the item is activated. -- For a subtree, a pointer to another array of UI_Info -- structures. -- For a radioitem lead entry, a pointer to an array of -- UI_Info structures for the radio item group. -- For a help item, specifies the help node to load -- (i.e. the application's identifier) or null for the main program's -- name. -- For builder data, points to the UI_Builder_Data structure for -- the following items User_Data : Data_Type_Access := null; -- Data pointer to pass to callbacks. Unused_Data : System.Address := System.Null_Address; -- Reserved for future expansion, should be Null Pixmap_Type : UI_Pixmap_Type := Pixmap_None; -- Type of pixmap for the item Pixmap_Info : System.Address := System.Null_Address; -- Pointer to the pixmap information: -- For Pixmap_Stock, a pointer to the stock icon name. -- For Pixmap_Data, a pointer to the inline xpm data. -- For Pixmap_Filename, a pointer to the filename string. Accelerator_Key : Gint := 0; -- Accelerator key/UI_Info_Configurable_Types, or 0 for none Ac_Mods : Gdk_Modifier_Type := 0; -- Mask of modifier keys for the accelerator Widget : System.Address := System.Null_Address; -- Filled in by Gnome.App.Create*, you can use this to tweak the widgets -- once they have been created end record; pragma Convention (C, UI_Info); UI_Info_End : constant UI_Info := (UI_Endofinfo, Null_Ptr, Null_Ptr, Null_Address, null, Null_Address, Pixmap_None, Null_Address, 0, 0, Null_Address); UI_Info_Separator : constant UI_Info := (UI_Separator, Null_Ptr, Null_Ptr, Null_Address, null, Null_Address, Pixmap_None, Null_Address, 0, 0, Null_Address); pragma Import (C, Gnome_Accelerators_Sync, "gnome_accelerators_sync"); end Gnome.App_Helper;