menu_definition = $menu_definition; $menubar = new GtkMenuBar(); # $menubar = $this; $this->pack_start($menubar, 0, 0); foreach($menu_definition as $toplevel => $sublevels) { $top_menu = new GtkMenuItem($toplevel); $menubar->append($top_menu); $menu = new GtkMenu(); $top_menu->set_submenu($menu); // let's ask php-gtk to tell us when user press the 2nd Alt key $menu->connect('key-press-event', array(&$this, 'on_menu_keypress'), $toplevel); // note 1 foreach($sublevels as $submenu) { if (strpos("$submenu", '|') === false) { $accel_key = ''; } else { list($submenu, $accel_key) = explode('|', $submenu); } if (is_array($submenu)) { // set up radio menus $i=0; $radio[0] = null; foreach($submenu as $radio_item) { $radio[$i] = new GtkRadioMenuItem($radio[0], $radio_item); # $radio[$i]->connect('toggled', array(&$this, "on_toggle")); $menu->append($radio[$i]); ++$i; } $radio[0]->set_active(1); // select the first item } else { if ($submenu=='---') { $menu->append(new GtkSeparatorMenuItem()); } else { $submenu2 = str_replace('_', '', $submenu); $submenu2 = str_replace(' ', '_', $submenu2); $stock_image_name = 'Gtk::STOCK_'.strtoupper($submenu2); if (defined($stock_image_name)) { $menu_item = new GtkImageMenuItem(constant($stock_image_name)); } else { $menu_item = new GtkMenuItem($submenu); } # if ($accel_key!='') { # $menu_item->add_accelerator("activate", $accel_group, ord($accel_key), Gdk::CONTROL_MASK, 1); # } $menu->append($menu_item); $menu_item->connect('activate', array(&$this, 'on_menu_select')); $this->menuitem[$toplevel][$submenu] = $menu_item; // note 2 } } } } } // process radio menu selection function on_toggle($radio) { $label = $radio->child->get_label(); $active = $radio->get_active(); echo("radio menu selected: $label\n"); } // process menu item selection function on_menu_select($menu_item) { $item = $menu_item->child->get_label(); echo "menu selected: $item\n"; if ($item=='E_xit') Gtk::main_quit(); } // processing of menu keypress function on_menu_keypress($menu, $event, $toplevel) { if (!$event->state & Gdk::MOD1_MASK) return false; // note 3 // get the ascii equivalent of the keypress $keypress = ''; if ($event->keyval<255) { $keypress = chr($event->keyval); // ascii equivalent $keypress = strtolower($keypress); // convert to lowercase } $match = 0; // flag to see if there's a match foreach($this->menu_definition[$toplevel] as $submenu) { if (!preg_match("/.*_([a-zA-Z0-9]).*/", "$submenu", $matches)) continue; // note 4 $key2 = strtolower($matches[1]); // convert to lowercase if ($keypress==$key2) { // check if there's a match if (strpos("$submenu", '|') === false) { $accel_key = ''; } else { list($submenu, $accel_key) = explode('|', $submenu); // remove any accelerator } $menuitem = $this->menuitem[$toplevel][$submenu]; // get the ID $menuitem->activate(); // simulate a click $menu->popdown(); // close the toplevel menu $match = 1; // set the match flag break; } } return $match; // return control back to php-gtk } } ?> array('_New|N', '_Open|O', '_Close|C', '---', '_Save|S', 'Save _As','---', 'E_xit'), '_Edit' => array('Cu_t|X', '_Copy|C', '_Paste|V', '---', 'Select _All|A', '---', '_Undo|Z','_Redo|Y'), '_Test' => array('Test_1|1', 'Test_2|2', 'Test_3|3', '---', array('Selection 1', 'Selection 2', 'Selection 3'), '---', 'Test_4|4') ); $accel_group = new GtkAccelGroup(); $menu = new PhpGtkMenu($menu_definition, $accel_group); $window = new GtkWindow(); $window->set_size_request(400, 150); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox()); $vbox->pack_start($menu, 0, 0); $accel_group = new GtkAccelGroup(); $window->add_accel_group($accel_group); // display title $title = new GtkLabel("Menu and RadioMenuItem - Part 4"); $title->modify_font(new PangoFontDescription("Times New Roman Italic 10")); $title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff")); $vbox->pack_start($title); $vbox->pack_start(new GtkLabel("To choose File New,")); $vbox->pack_start(new GtkLabel("the default php-gtk requires you to choose Alt-F followed by N.")); $vbox->pack_start(new GtkLabel("Now Alt-F Alt-N also works!")); $window->show_all(); Gtk::main(); ?>