IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Replis de code (Code-Folding)


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut Replis de code (Code-Folding)
    Bonjour, je suis en train de me faire une IDE PHP perso et je souhaiterais y ajouter la possibilité de replier du code comme JCreator (IDE java) pour ceux qui connaissent mais j'avoue que je ne sait pas par où commencer, et je souhaiterais par le biais de ce post recueillir vos suggestions, idée, etc...
    Pour ceux qui ne voient pas de quoi je parle, voilà une capture de ce que je veux faire.

    Merci d'avance.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Ben, il est évident que tu dois développer toi-même le compo qui édite.
    Ensuite, tu gères dans ce compo une liste des sauts de lignes et ça te permet facilement d'afficher en conséquences.

    Ou alors tu attends patiemment que SynEdit propose cette fonctionnalité
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Citation Envoyé par sjrd
    Ou alors tu attends patiemment que SynEdit propose cette fonctionnalité
    J'aimerais autant essayer de le faire moi même par simple curiosité .
    Mais c'est justement le fait de gérer ce replis qui me bloque, je vois pas comment faire. Je suis curieux de savoir comment c'est géré. Pour l'arbre, je pensais utiliser (dans un premier temps) un TCustomTreeview avec un richedit pour chaque branches mais comment faire pour que la frappe continue sans problèmes.
    Donc en gros, je n'ai aucune idée de la façon de le faire.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Bon, donc tu crées un compo d'édition, qui gère entièrement son affichage/édition.
    Dans ce compo, tu gères une liste de tous les noeuds, avec leurs lignes de départ et d'arrivée, ainsi que l'état (déplié, replié).
    Lors de l'affichage, tu connais le numéro fictif de la première ligne affichée en haut de ton compo (c'est la propriété Value du scroll bar). Avec celui-ci et la liste des noeuds au-dessus, tu peux déterminer quelle est la première ligne réelle à afficher. Ensuite, si tu rencontres des lignes qui sont début de noeuds repliés, tu n'affiches pas les lignes jusqu'à la fin de ce noeud ?

    Est-ce clair ? Sinon demande
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    J'ai compris ton approche sjrd mais c'est justement cette gestion de l'état déplié et replié que je n'arrive pas à saisir, donc dans l'état replié, comment je cache ces lignes? Dois-je les supprimer de l'éditeur en les stockant quelque part ou y'a t'il une autre méthode plus adaptée?
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  6. #6
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Si c'est toi qui gère entièrement l'affichage de ton texte dans ton compo, pourquoi ne pas créer un genre de formatage interne qui t'indique au moyen de balises que telle portion de texte est dépliée ?

    Avant d'afficher tout le texte tu le parses et dès que tu trouves une balise "<plié>" par exemple, tu sautes l'affichage de tout ce qui précède la prochaine balise "</plié>" !
    L'avantage est que quand tu as une balise "<déplié>" ou "<plié>", tu sais où mettre l'image "-" ou "+", et de même dans le cas d'une portion dépliée tu sauras jusqu'où tracer la ligne du bloc grâce à "</déplié>" !

    'zen pensez quoi ?! ^^
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Je pensais comme toi, mis à part que j'aurais plutôt géré une liste à côté du texte avec les noeuds.
    Mais l'idée des balises n'est pas mal non plus, mais alors je ferais plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <region title="Titre de région" state="ployed">Texte de région</region>
    De fait, les balises <region> seront ignorées par le parser HTML et tout sera plus simple. En plus, tu peux indiquer un titre pour ta région (qui sera écrit en lieu et place du texte si la région est repliée).
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    ouep vu comme ça, ça apport beaucoup d'options possibles !!

    Différents paramètres de couleurs qui te permettront d'avoir des options personnalisables :
    couleur du texte, du fond, de la barre etc...
    Mettre un index d'image pour les "+" et "-" qui identifierait un glyph dans une ImageList associée au compo... Pleins de trucs quoi !

    Pas contre pour state j'aurai plutôt mis "collapsed" plutôt que "ployed", mais "plié" c'est encore mieux non ?!
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  9. #9
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Ce serait trop long de refaire la partie gestion de l'affichage, etc... Donc pour l'instant je suis en train de voir si c'est possible de faire ça sous forme de "plugin", j'ai une vague idée en tête assez tordu, je vais voir ce que ça donne et je vous tiens au courant, en tout cas merci de vos constributions.
    Si de nouvelles idées jaillissent, je suis preneur
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  10. #10
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Bon, j'ai réussi à faire quelque chose sous forme de composant.
    J'intercepte les messages du TSynEdit passé en propriété pour gérer l'affichage et masquage du texte en passant par des TStringList, il reste plus qu'a gérer les différents niveaux, etc...
    Seul soucis que je ne pourrait pas gérer c'est que si on utilise la numerotation des lignes, quand on cache le code, la numérotation continue au lieu d'être reportée.
    C'est loin d'être parfait mais c'est deja un bon début .
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  11. #11
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Ouuupppsss .. je vois que les gens s'emballent sur l'affichage, alros que le plus important pour faire le replis est vraiment ailleur. Le pb c que lorsque l'on veu faire le replis il faudra le faire sur les structure de controle du programme (fonction, proc, boucle, ....) or pour le faire il faudra que le composant de saisie soit en mesure de faire une analyse syntaxique du langage (ici php) pour lequel il est destiné. et cela est loin d'etre évident. Une fois que l'editeur est capable d'extraire les structure (en arbre binaire après un parsing par exemple) l'affichage devient un jeux d'enfant puisque l''on peut facilement soit utiliser un TreeView soit un dérivé d'un TMemo .. ou tout autre chose ...
    le prob pour le replis c'est l'analyse syntaxique et l'extraction des structure de controle du programme !!!!!
    Pour info il existent des composants pour delphi qui permettent de faire cela (qui ressemble d'ailleur à SynEdit), c'est un projet open source qui s'est inspiré des widget scintilla pour KDE (QT) pour faire le replis (code Folding) et faire du syntaxe highlghting ... et ils fonctionnent pas mal ...
    vous les trouverez dans le lien
    http://sourceforge.net/projects/delphisci/
    il y a meme une démo ...
    bon courage
    http://www.pocketmt.com GLCD Font Creator home site.

  12. #12
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Merci pour ton intervention, comme je l'ai dit au depart, c'est pour une IDE perso que j'ai deja commençé, je veux rajouter cette fonctionnalité tout en utilisant l'excelent TSynedit. C'est pour ça que je me suis tourné vers une forme "additionnelle". Pour la partie analyse, je la fais moi même à partir de mon composant, pour l'affichage, j'utilise des TStringList pour stocker les lignes en mode replié et je les réinsert dans le Synedit en mode déplié, cette partie est apparement calée, maintenant là où je galère c'est au niveau de la gestion des niveaux et index, car dans une fonction (par exemple) peut se trouver des conditions en IF, des boucles, etc... Et là je cogite depuis un petit moment sans trouver la bonne solution. Voilà ma vision des choses pour le moment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HIERARCHIE
     
    TSynCodeFold (le composant en lui même)
        |
        |
    TSynNodes (une liste des noeuds)
        |
        |
    TSynCodeNode (le noeud qui represente la fonction, condition, etc...)
    Qu'en penses-tu?
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  13. #13
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    et des TSringList contenues dans une TObjectList qui peuvent se référencer les unes aux autres? Je m'explique, suivant un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure Test(...);
    begin
      for i:=0 to 100 do
      begin
        Memo1.Lines.Add('Ya bon Banania');
      end;
    end;
    peut s'organiser comme ça:
    StringList Level1:
    -Ligne1: procedure Test(...);
    -L2: begin
    -L3: -> Pointeur vers la TStringList Level2
    -L4: end;

    StringList Level2:
    -Ligne1:for i:=0 to 100 do
    - L2: begin
    - L3 : Memo1.Lines.Add('Ya bon Banania');
    - L4 : end;

    Lorsque que ton code tombe sur une ligne vide, il teste si Object de cette ligne renvoie bien un pointeur, si oui, il affiche juste la première ligne...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  14. #14
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    C'est justemlent à ça que sert mon TSynNodes (dérivé de TList) mais je m'embrouille dans les niveaux, c'est peut être la nuit blanche qui arrange pas les choses non plus .
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  15. #15
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par lil_jam63
    je m'embrouille dans les niveaux
    C'est à dire?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  16. #16
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Le pb avec votre raisonnement c'est que vous ne voulez pas voir les chose du pt de vue analyse syntaxique des structure composant votre langage. Vous partez tjr du principe que l'utilisateur va ecrire un Begin en dessous de la structure qui l'utilise ...
    Si l'utilisateur ecrit un code du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    procedure Test(...);
    begin
      for i:=0 to 100 do
      begin
        Memo1.Lines.Add('Ya bon Banania');
      end;
    end;
    votre analyse marchera ... mais si décide décrire son code (et qui est parfaitement valable en pascal ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    procedure Test(...);
    begin
      for i:=0 to 100 do   begin
        Memo1.Lines.Add('Ya bon Banania');
    end; end;
    Votre analyse tombe à l'eau ...
    Essayez de voir un peu comment fonctionne l'arbre binaire (syntaxique) qui est construit par les composant scintilla cela vous donnera une idée sur comment on peut extraire la structrure d'un document écrit dans n'importe quel langage ... cela vous facilitera grandement la tache d'affichage par la suite
    http://www.pocketmt.com GLCD Font Creator home site.

  17. #17
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Salut Octal, merci de ton intervention, en fait la partie analyse du code ne me poses pas problème, c'est surtout la gestion de ces niveaux qui me pose problème, exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    +  include ('test.php');
    |  include ('unAutre.php');
    -  include ('encore.php');
     
    +  function test($var) {
    |    $var2 = $var;
    |    $var3 = $_GET['action'];
    +    if ($var2 == $var3) {
    |      $var4 = 10;
    +      for($i=0; $i != $var4 ; $i++) { 
    |        echo "$i\n";
    -      }
    |      echo 'fin du traitement';
    -    }
    -  }
     
    +  function test($var) {
    |    $var2 = $var;
    |    $var3 = $_GET['action'];
    +    if ($var2 == $var3) {
    |      $var4 = 10;
    +      for($i=0; $i != $var4 ; $i++) { 
    |        echo "$i\n";
    -      }
    |      echo 'fin du traitement';
    -    }
    -  }
    Et ce qui me pose problème ce sont les noeud à l'intérieur du noeud principal, quand je referme le noeud principal, les noeuds enfant restent affichés.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  18. #18
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Il faudrait que tu aies une propriété "Parent" pour tes noeuds.

    Comme ça tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If not (Noeud.Parent.State = sCollapsed) and assigned(Noeud.Parent) then
      Noeud.Draw;
    C'est un code un peu "virtuel" mais je pense que tu comprends où je veux en venir !
    (normalement les conditions sont évaluées de la dernière vers la première si je me trompe pas, donc le "if" ne plante pas si Parent = nil)
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  19. #19
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Merci Bestiol, je vois ce que tu veux dire, apres une bonne nuitde sommeil, on y voit plus clair, donc ce passage est maintenant presque reglé, merci de vos interventions à tous.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  20. #20
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Est-ce que tu pourras rendre les sources téléchargeables?
    Parce que ça m'interesse grandement ce que tu es en train de faire... Quitte à le modifier pour qu'il fasse la même chose avec Delphi...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. P-code Code natif On Error Resume Next
    Par Geo2A dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/05/2011, 16h50
  2. Réponses: 0
    Dernier message: 20/07/2009, 12h39
  3. traduire mon code code source en UML
    Par open_source dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 06/11/2007, 11h17
  4. Pb pour modifier un code. Code vérouillé ?
    Par oz80 dans le forum Access
    Réponses: 1
    Dernier message: 03/11/2005, 14h23
  5. [IE 6.0] Plus d'affichage entre les balises [code] [/code]
    Par Trap D dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 20/10/2005, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo