PHP-GTK est une récente extension de PHP visant à démontrer son adéquation au développement d'interfaces utilisateur non-Web, grâce au toolkit multi-plateformes GTK++.
L'une des structures visuelles les plus intéressantes de GTK++ pour le développement d'applications de gestion est l'arborescence, utilisable au clavier comme à la souris.
Un exemple de son utilisation est fourni dans la documentation standard PHP, mais utilise un code de remplissage statique et peu compréhensible. L'exemple proposé ici démontre comment charger l'arborescence d'un CTree de GTK++ en PHP-GTK à partir d'un fichier XML plus intuitif.
2006-10-08 Attention: cet article utilise les objets de PHP-GTK 1. Le GtkCTree, en particulier, est "deprecated" dans PHP-GTK 2: il est encore utilisable, mais son remplacement par GtkTreeView
avec un stockage de données GtkTreeStore
est recommandé. Plus d'exemples sur le site PHP-GTK Community.
Le code PHP-GTK de chargement du GtkCTree depuis XML
Cet exemple utilise les fonctions standard XML de PHP, bâties sur Expat, sans construire de DOM, inutile pour ce type de manipulation en un seul parcours de l'arbre du document.
<? dl('php_gtk.' . (strstr(PHP_OS, 'WIN') ? 'dll' : 'so')); //----------------------------------------------- function createMainWindow () { $window = &new GtkWindow() ; $window->set_title ('The GTK Class Hierarchy'); $window->set_position (GTK_WIN_POS_CENTER); $window->set_default_size (300, (gdk::screen_height()-30)); $window->connect_object ('destroy', array('gtk', 'main_quit')); return ($window) ; } //----------------------------------------------- function createScrolledWindow (&$window) { $scrolledwindow = &new GtkScrolledWindow(); $scrolledwindow->set_policy (GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); $window->add ($scrolledwindow); return $scrolledwindow ; } //----------------------------------------------- function createCTree (&$scrolledwindow) { $ctree = &new GtkCTree(1, 0) ; $ctree->set_line_style (GTK_CTREE_LINES_SOLID); $scrolledwindow->add ($ctree); return $ctree ; } //----------------------------------------------- function createWidgets () { global $ctree ; $mw = createMainWindow () ; $sw = createScrolledWindow ($mw) ; $ctree = createCTree ($sw) ; parse ($ctree) ; $ctree->sort_recursive () ; $ctree->show (); return $mw ; } //----------------------------------------------- function elStart ($parser, $name, $attrs) { global $treestack, $ctree ; $ar = array () ; $cap = array ($name) ; $node = $ctree->insert_node ( $treestack[count($treestack)-1], $ar[], $cap, 5, null, null, null, null, false, true) ; array_push ($treestack, $node) ; } //----------------------------------------------- function elEnd ($parser, $name) { global $treestack ; array_pop ($treestack) ; } //----------------------------------------------- function parse (&$ctree) { global $treestack ; $treestack = Array() ; $file = "widgets.xml"; $xml_parser = xml_parser_create () ; xml_set_element_handler ($xml_parser, "elStart", "elEnd") ; xml_parser_set_option ($xml_parser, XML_OPTION_CASE_FOLDING, 0) ; if (!($fp = fopen($file, "r"))) die("could not open XML input: " . $file); while ($data = fread($fp, 4096)) if (!xml_parse ($xml_parser, $data, feof($fp))) die(sprintf("erreur XML : %s à la ligne %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); xml_parser_free ($xml_parser) ; } //========================================================================================= $mw = createWidgets () ; $mw->show_all(); gtk::main(); ?>
Le fichier XML des composants GTK
La structure est simple: seuls les éléments purs sont utilisés, et leur hiérarchie définit celle du CTree. Le fichier d'exemple ci-dessous correspond à la liste de composants GTK++, telle qu'elle est vue par PHP-GTK.
<Object> <Widget> <Misc> <Label><AccelLabel/><TipsQuery/></Label> <Arrow/> <Image/> <Pixmap/> </Misc> <Container> <Bin> <Alignment/> <Frame><AspectFrame/></Frame> <Button> <ToggleButton> <CheckButton><RadioButton/></CheckButton> </ToggleButton> <OptionMenu/> </Button> <Item> <ListItem/> <MenuItem> <CheckMenuItem><RadioMenuItem/></CheckMenuItem> <TearOffMenuItem/> </MenuItem> <TreeItem/> </Item> <Window> <ColorSelectionDialog/> <Dialog><InputDialog/></Dialog> <FileSelection/> <FontSelectionDialog/> <Plug/> </Window> <EventBox/> <HandleBox/> <ScrolledWindow/> <Viewport/> <Invisible/> </Bin> <Box> <ButtonBox><HButtonBox/><VButtonBox/></ButtonBox> <HBox><Combo/><StatusBar/></HBox> <VBox><ColorSelection/><GammaCurve/></VBox> </Box> <CList><CTree/></CList> <Fixed/> <Notebook><FontSelection/></Notebook> <Paned><HPaned/><VPaned/></Paned> <Layout/> <List/> <MenuShell><MenuBar/><Menu/></MenuShell> <Packer/> <Socket/> <Table/> <Toolbar/> <Tree/> </Container> <Calendar/> <DrawingArea><Curve/></DrawingArea> <Editable> <Entry><SpinButton/></Entry> <Text/> </Editable> <Ruler><HRuler/><VRuler/></Ruler> <Range> <Scale><HScale/><VScale/></Scale> <Scrollbar><HScrollbar/><VScrollbar/></Scrollbar> </Range> <Separator><HSeparator/><VSeparator/></Separator> <Preview/> <Progress><ProgressBar/></Progress> </Widget> <Data> <Adjustment/> <Tooltips/> </Data> <ItemFactory/> </Object>
Titre du document: | Charger un GtkCTree depuis un document XML en PHP-GTK |
---|---|
Document ID: | 200340321101 |
Date de Création: | 03/04/2003 |
Date MAJ: | 03/04/2003 |
Classe de produits: | Développement / PHP / GTK |
Constructeur / Editeur | Communauté PHP |
Produit et version | PHP 4.3 |
PHP-GTK |
AVERTISSEMENT
L'origine de cette information peut être interne ou
externe à Riff News (l'éditeur) et s'applique à des
produits de tiers. L'éditeur prend tous les moyens
raisonnables pour vérifier la validité des
informations fournies. Néanmoins, ce document n'a qu'un
but d'information, et l'éditeur ne conseille pas
l'application de cette information à une situation
quelle qu'elle soit, même s'il en a été averti.
Toutes les marques référencées dans ce document sont la propriété de leurs titulaires respectifs: merci de vous reporter aux produits concernés pour une information complète sur les marques citées. |