All pastes #262393 Raw Edit

mq

public php v1 · immutable
#262393 ·published 2006-11-30 14:02 UTC
rendered paste body
<?php # original source :# http://www.kksou.com/php-gtk2/articles/set-up-menu-and-radio-menu---Part-4---allow-Alt-F-Alt-N.php   // class Menuclass PhpGtkMenu extends GtkVbox{    var $prev_keyval = 0;    var $prev_state = 0;    var $prev_keypress = '';     function __construct($menu_definition, $accel_group) {                 parent::__construct();         $this->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    }}?><?php error_reporting(E_ALL); require_once('PhpGtkMenu.php'); // define menu definition$menu_definition = array(    '_File' => 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();?>