Charger un GtkCTree depuis XML en PHP-GTK

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.

 

Get started with Drupal 7

Marques les plus citées

toutes les marques

acheter sur OSInet

Accès direct

Recherche

Blog développeurs

Le mot du jour

DAT

Direct Access Transport

in | |

Association visant à standardiser l'API des bibliothèques VIPL, dite DAPL. Voir VIA, Infiniband. 

Syndiquer le contenu

Dernières définitions

Chrome - Chromium - digitaalisen kuilun - ghetto sharding - HTTP - MongoDB - PNaCl - QUIC - Skia - SPDY

Un mot au hasard

EDXL : Emergency Data Exchange Language  

Alertes CERTA