// // Classe cArbre : Gestion de la multisélection sur un champ de type arbre // cArbre est une classe PROTÉGÉ m_sNomArbre est une chaîne // Nom de l'arbre que l'on va gérer m_bMultiSélectionAutorisée est un booléen // MultiSélection ou non ? m_TabElementsSélectionnés est un tableau de 0 entiers // Tableau des indices des éléments sélectionnés m_nNombreElémentsSélectionnés est un entier // Nombre d'éléments sélectionnés (Correspond au dimension(m_TabElementsSélectionnés) m_TabElementsTreeview est un tableau de 0 chaîne // Tableau contenant les éléments de l'arbre PRIVÉ m_bErreurDétectée est un booléen // Une erreur est survenue m_sErreurInfo est une chaîne // Dernière erreur rencontrée m_nCouleurSélection est un entier // Couleur du bandeau de sélection m_nCouleurPolice est un entier // Couleur de la police d'un élément sélectionné m_nCouleurFondDéfaut est un entier // Couleur de fond de l'arbre m_nCouleurPoliceDéfaut est un entier // Couleur de la police par défaut m_nDernierIndiceSélectionné est un entier // Indice du dernier élément sélectionné m_bForceSélection est un booléen // Doit-on forcer la sélection ? FIN PROCEDURE Constructeur(sNomCompletArbre,bMultiSélection = Faux) sNomRéduitArbre est une chaîne // nom réduit du champ arbre // RAZ des erreurs :_VideErreur() // Vérification de l'existence du champ SI ChampExiste(snomcompletarbre) = Faux ALORS :_SetErreur(ChaîneConstruit("Le champ <%1> n'existe pas." , sNomCompletArbre)) RENVOYER Faux FIN // Vérification du type du champ SI {snomcompletarbre,indChamp}..Type <> typTreeView ALORS :_SetErreur(ChaîneConstruit("Le champ <%1> n'est pas un champ de type arbre." , sNomCompletArbre)) RENVOYER Faux FIN // Active ou non la multi sélection :SetSélectionMultiple(bMultiSélection) // Sauvegarde des options de l'arbre :m_sNomArbre = sNomCompletArbre :m_nCouleurFondDéfaut = {:m_sNomArbre,indChamp}..CouleurFond :m_nCouleurPoliceDéfaut = {:m_sNomArbre,indChamp}..Couleur // On met les couleurs par défaut :SetCouleurs() // Récupération du nom réduit de l'arbre pour pouvoir poser les évenements dessus sNomRéduitArbre = ExtraitChaîne(sNomCompletArbre , 1 , "." , DepuisFin) // On pose un évènement sur le bouton gauche enfoncé pour effectuer les sélections Evénement(":__SélectionneEvt" , sNomRéduitArbre , WM_LBUTTONDOWN) RENVOYER Vrai PROCEDURE Destructeur() // Syntaxe : //_SetErreur () // // Paramètres : // sMessageErreur : message d'erreur // Valeur de retour : // Aucune PROCEDURE PRIVÉE _SetErreur(sMessageErreur) :m_sErreurInfo = sMessageErreur :m_bErreurDétectée = Vrai // Syntaxe : //_VideErreur () // // Paramètres : // Aucun // Valeur de retour : // Aucune PROCEDURE PRIVÉE _VideErreur() :m_sErreurInfo = "" :m_bErreurDétectée = Faux // Syntaxe : //[ = ] ArbreSelectPlus () // // Paramètres : // sNoeud : noeud à sélectionner dans l'arbre // Valeur de retour : // booléen : VRAI si la sélection est effective, FAUX autrement PROCEDURE ArbreSelectPlus(sNoeud) nIndiceTableau est un entier nIndiceTableauSélection est un entier // RAZ des erreurs :_VideErreur() // Recherche du noeud dans le tableau des éléments nIndiceTableau = TableauCherche(:m_TabElementsTreeview , tcLinéaire , snoeud) // Si le noeud n'est pas trouvé, on sort SI nIndiceTableau <= 0 ALORS :_SetErreur("Impossible de trouver le noeud à sélectionner") RENVOYER Faux FIN // Si la multisélection n'est pas autorisée et que l'on ne doit pas forcer la sélection SI :m_bMultiSélectionAutorisée = Faux _ET_ :m_bForceSélection = Faux ALORS // On enlève la sélection précédente :_EnlèveSélection() FIN // Si la sélection ne doit pas être forcée et que la touche control n'est pas enfoncée SI :m_bForceSélection = Faux _ET_ ToucheEnfoncée(teControl , Vrai) = Faux ALORS // Pas de multisélection // On enlève la sélection courante :_EnlèveSélection() FIN // Gestion de la multisélection avec la touche SHIFT SI ToucheEnfoncée(teShift,Vrai) = Vrai ET :m_bMultiSélectionAutorisée ALORS // On sélectionne entre deux :__SélectionneEntreDeux(nIndiceTableau) // La sélection est faite, on renvoie VRAI RENVOYER Vrai SINON // Recherche de l'élément en cours dans le tableau des éléments sélectionnés // S'il est déjà sélectionné, on le désélectionne, sinon, on le sélectionne nIndiceTableauSélection = TableauCherche(:m_TabElementsSélectionnés , tcLinéaire , nIndiceTableau) SI nIndiceTableauSélection > 0 ALORS // On l'a trouvé // On le désélectionne :_EnlèveSélection(nindicetableausélection) SINON nIndiceArbre est un entier // Récupération de l'indice de l'arbre correspondant au noeud que l'on doit sélectionner nIndiceArbre = :__GetIndiceAffiché(nIndiceTableau) // Mise à jour de la couleur de fond et de la couleur de la police {:m_sNomArbre,indChamp}[nIndiceArbre]..CouleurFond = :m_nCouleurSélection {:m_sNomArbre,indChamp}[nIndiceArbre]..Couleur = :m_nCouleurPolice // Sauvegarde de l'élément sélectionné TableauAjoute(:m_TabElementsSélectionnés , nIndiceTableau) :m_nNombreElémentsSélectionnés++ // Sauvegarde du dernier élément sélectionné :m_nDernierIndiceSélectionné = nindicetableau // On force la sélection de cet élément WL.ArbreSelectPlus(:m_sNomArbre , {:m_sNomArbre,indChamp}[nIndiceArbre]) // On exécute le traitement de sélection utilisateur ExécuteTraitement(:m_sNomArbre , trtSélection) FIN FIN // La sélection est faite, on renvoie VRAI RENVOYER Vrai // Syntaxe : //_EnlèveSélection ( []) // // Paramètres : // nIndiceSélectionné (valeur par défaut=-1) : indice de l'élément sélectionné dans le tableau des éléments sélectionnés // Valeur de retour : // Aucune PROCEDURE PRIVÉE _EnlèveSélection(nIndiceSélectionné = -1) i est un entier // Un indice à déselectionné est passé en paramètre SI nIndiceSélectionné <> -1 ALORS // Supprime l'élément demandé {:m_sNomArbre,indChamp}[:__GetIndiceAffiché(:m_TabElementsSélectionnés[nIndiceSélectionné])]..CouleurFond = :m_nCouleurFondDéfaut {:m_sNomArbre,indChamp}[:__GetIndiceAffiché(:m_TabElementsSélectionnés[nIndiceSélectionné])]..Couleur = :m_nCouleurPoliceDéfaut TableauSupprime(:m_TabElementsSélectionnés,nIndiceSélectionné) :m_nNombreElémentsSélectionnés-- SINON // Aucun indice passé en paramètre // Déselectionne tous les éléments sélectionnés POUR i = 1 A :m_nNombreElémentsSélectionnés // Commence par enlever les couleurs de fond et changer la couleur de la police {:m_sNomArbre,indChamp}[:__GetIndiceAffiché(:m_TabElementsSélectionnés[i])]..CouleurFond = :m_nCouleurFondDéfaut {:m_sNomArbre,indChamp}[:__GetIndiceAffiché(:m_TabElementsSélectionnés[i])]..Couleur = :m_nCouleurPoliceDéfaut FIN // Supprime tout le tableau des élements sélectionnés TableauSupprimeTout(:m_TabElementsSélectionnés) // Remet le nombre d'éléments sélectionnés à 0 :m_nNombreElémentsSélectionnés = 0 FIN // Résumé : Positionne les couleurs de l'arbre de fond, de police, de sélection et de police lors d'une sélection // Syntaxe : //SetCouleurs ( [ [, [, [, ]]]]) // // Paramètres : // nCouleurFond (valeur par défaut=16777215) : couleur de fond de l'arbre // nCouleurPolice (valeur par défaut=0) : couleur de la police par défaut // nCouleurSélection (valeur par défaut=8388608) : couleur de sélection d'un élément dans l'arbre // nCouleurPoliceSélection (valeur par défaut=16777215) : couleur de la police d'un élément sélectionné // Valeur de retour : // Aucune PROCEDURE SetCouleurs(nCouleurFond = iBlanc, nCouleurPolice = iNoir,nCouleurSélection = iBleuFoncé,nCouleurPoliceSélection = iBlanc ) :m_nCouleurFondDéfaut = ncouleurfond :m_nCouleurPoliceDéfaut = nCouleurPolice :m_nCouleurSélection = nCouleurSélection :m_nCouleurPolice = nCouleurPoliceSélection // Résumé : Appelée suite à l'évenement Clic Gauche sur l'arbre : sélectionne les noeuds/feuilles cliqués, enroule ou déroule les noeuds // Syntaxe : //[ = ] __SélectionneEvt (, , ) // // Méthode appelée par l'évenement de sélection sur l'arbre // // // Paramètres : // nMessage : numéro du message // wParam : premier paramètre // lParam : second paramètre // Valeur de retour : // booléen : VRAI // PROCEDURE PRIVÉE __SélectionneEvt(nMessage, wParam, lParam) sNomBranche est une chaîne nPosX est un entier = SourisPosX() nPosY est un entier = SourisPosY() nZone est un entier = WL.ArbreInfoXY(:m_sNomArbre , aiZone , nposx , nposy) // Selon la zone de cliquage SELON nzone // La sélection n'est effectuée que si le clic est sur le libellé, le bouton ou sur l'image CAS aizLibellé,aizBouton,aizImage // Vérification de l'état de l'arbre SI {:m_sNomArbre , indChamp}..Etat <> Actif ALORS RENVOYER Vrai FIN // Récupération de la branche sélectionnée snomBranche = WL.ArbreInfoXY(:m_sNomArbre, aiNomBranche , nposx , nposy) // Si c'est un clic sur le bouton, SI nzone = aizBouton ALORS // Selon l'état précédent, on enroule ou on déroule la branche SI WL.ArbreEtat(:m_sNomArbre , snomBranche) = aEnroule ALORS WL.ArbreDéroule(:m_sNomArbre , snomBranche) SINON WL.ArbreEnroule(:m_sNomArbre , snomBranche) FIN FIN // Sélectionne le noeud :ArbreSelectPlus(snombranche) AUTRE CAS // Ne rien faire FIN RENVOYER Vrai // Résumé : Sélectionne tous les noeuds/feuilles compris entre les deux derniers clics // Syntaxe : //__SélectionneEntreDeux () // // Paramètres : // nIndiceTableau : indice du tableau de la dernière sélection // Valeur de retour : // Aucune PROCEDURE PRIVÉE __SélectionneEntreDeux(nIndiceTableau) i est un entier nIndiceTableauSélection est un entier // Sélectionne entre le dernier indice sélectionné et l'indice passé en paramètre // On fait bien attention à ne pas dépasser les bornes de l'arbre (min : 1, et max : dimension(:m_TabElementsTreeview)) POUR i = Max(Min(nIndiceTableau , :m_nDernierIndiceSélectionné) , 1) A Min(Max(nIndiceTableau , :m_nDernierIndiceSélectionné) , Dimension(:m_TabElementsTreeview)) // Recherche de l'élément en cours dans le tableau des éléments sélectionnés // S'il est déjà sélectionné, on le désélectionne, sinon, on le sélectionne nIndiceTableauSélection = TableauCherche(:m_TabElementsSélectionnés , tcLinéaire , i) SI nIndiceTableauSélection > 0 _ET_ i <> :m_nDernierIndiceSélectionné ALORS // On l'a trouvé // On le désélectionne :_EnlèveSélection(nindicetableausélection) SINON {:m_sNomArbre,indChamp}[i]..CouleurFond = :m_nCouleurSélection {:m_sNomArbre,indChamp}[i]..Couleur = :m_nCouleurPolice // Sauvegarde de l'élément sélectionné TableauAjoute(:m_TabElementsSélectionnés , i) :m_nNombreElémentsSélectionnés++ FIN FIN // Résumé : Renvoie le nombre de noeuds/feuilles sélectionnés // Syntaxe : //[ = ] ArbreSelectOccurrence () // // Paramètres : // Aucun // Valeur de retour : // entier : nombre d'éléments sélectionnés PROCEDURE ArbreSelectOccurrence() RENVOYER :m_nNombreElémentsSélectionnés // Résumé : Renvoie le ième noeud sélectionné // Syntaxe : //[ = ] ArbreSelect ( []) // // Paramètres : // nIndiceSélection (valeur par défaut=-1) : indice de l'élément dans le tableau des éléments sélectionnés (dans le cas d'une multisélection // Valeur de retour : // Type indéterminé : noeud correspondant à cet indice de sélection, FAUX si l'indice de sélection est incorrecte PROCEDURE ArbreSelect(nIndiceSélection=-1) // RAZ de l'erreur :_VideErreur() // Si en mode Multisélection SI :m_bMultiSélectionAutorisée ALORS // Vérification de l'indice de sélection SI PAS (1 <= nIndiceSélection <= :m_nNombreElémentsSélectionnés) ALORS :_SetErreur(ChaîneConstruit("L'indice de sélection doit être compris entre 1 et %1" , :m_nNombreElémentsSélectionnés)) RENVOYER Faux FIN // Renvoie le noeud sélectionné de l'indice spécifié RENVOYER :m_TabElementsTreeview[:m_TabElementsSélectionnés[nIndiceSélection]] SINON // Si en mode Monosélection // Renvoie LE noeud sélectionné RENVOYER :m_TabElementsTreeview[:m_TabElementsSélectionnés[1]] FIN // Résumé : Récupère l'indice d'un élément du champ arbre d'après son indice dans le tableau // Syntaxe : //[ = ] __GetIndiceAffiché () // // Paramètres : // nIndiceTableau : indice de l'élément dans le tableau des éléments // Valeur de retour : // entier : position de ce noeu/de cette feuille dans le champ arbre PROCEDURE PRIVÉE __GetIndiceAffiché(nIndiceTableau) i est un entier // On parcours les éléments de l'arbre pour trouver celui qui correspond au noeud passé en paramètre POUR i = 1 A {:m_sNomArbre,indChamp}..Occurrence SI {:m_sNomArbre,indChamp}[i] = :m_TabElementsTreeview[nIndiceTableau] ALORS RENVOYER i FIN FIN RENVOYER i // Résumé : Force ou non la sélection multiple // Syntaxe : //SetForceSélectionMultiple ( []) // // Paramètres : // bForceSélection (valeur par défaut=1) : VRAI si la sélection multiple doit être forcée, FAUX autrement // Valeur de retour : // Aucune PROCEDURE SetForceSélectionMultiple(bForceSélection = Vrai) :m_bForceSélection = bForceSélection // Résumé : Active ou non la sélection multiple // Syntaxe : //SetSélectionMultiple ( []) // // Paramètres : // bActiveSélection (valeur par défaut=1) : VRAI si la sélection multiple doit être activée, FAUX autrement // Valeur de retour : // Aucune PROCEDURE SetSélectionMultiple(bActiveSélection = Vrai) sNoeud est une chaîne // Noeud sur lequel le dernier clic a eu lieu // Si la multisélection était activé, et qu'elle ne doit plus l'être SI :m_bMultiSélectionAutorisée = Vrai ET bActiveSélection = Faux ALORS // Conserve le noeud (son chemin) sur lequel le dernier clic a eu lieu SI 1 <= :m_nDernierIndiceSélectionné <= Dimension(:m_TabElementsTreeview) ALORS sNoeud = :m_TabElementsTreeview[:m_nDernierIndiceSélectionné] // Désélectionne tous les noeuds de l'arbre :_EnlèveSélection() // Resélectionne le dernier noeud sur lequel un clic a eu lieu SI snoeud <> "" ALORS :ArbreSelectPlus(snoeud) FIN // Positionne la multisélection ou non :m_bMultiSélectionAutorisée = bActiveSélection // Résumé : renvoie le positionnement de la sélection multiple // Syntaxe : //[ = ] GetSelectionMultiple () // // Paramètres : // Aucun // Valeur de retour : // booléen : VRAI si la sélection multiple est activé, FAUX autrement PROCEDURE GetSelectionMultiple() RENVOYER :m_bMultiSélectionAutorisée // Résumé : Ajoute un noeud à l'arbre // Syntaxe : //[ = ] ArbreAjoute ( [, [, [, [, [, [, ]]]]]]) // // Paramètres : // sNoeud : Noeud à ajouter à l'arbre ("Noeud"+tab+"SousNoeud"+tab+"Feuille") // bTrie (valeur par défaut=1) : VRAI si l'arbre doit être trié à la suite de l'ajout, FAUX autrement // sImageEnroulée (valeur par défaut=7) : Chemin de l'image enroulée ou aDéfaut ou Null // sImageDéroulée (valeur par défaut=7) : Chemin de l'image déroulée ou aDéfaut ou Null // nIdentifiant (valeur par défaut=0) : Identifiant du noeud / de la feuille // nModeAjoute (valeur par défaut=0) : Mode d'ajout aAccepteDoublon, aPremier, aDernier, aTriAlpha // sTexteBulle : Texte de la bulle // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreAjoute(sNoeud , bTrie = Vrai , sImageEnroulée = aDéfaut , sImageDéroulée = aDéfaut , nIdentifiant = 0 , nModeAjoute = aTriAlpha , sTexteBulle = "") // Si le noeud n'existe pas SI ArbreTypeElément(:m_sNomArbre , snoeud) = aErreur ALORS // Ajoute l'élément dans l'arbre SI WL.ArbreAjoute(:m_sNomArbre , snoeud , sImageEnroulée , sImageDéroulée , nIdentifiant , nModeAjoute , sTexteBulle) = Faux ALORS RENVOYER Faux SINON // Si le noeud existe déjà (crée par l'ajout d'un noeud fils/d'une feuille fille) // Modifie le noeud pour prendre en compte les images, l'identifiant et la bulle SI ArbreModifie(:m_sNomArbre , snoeud , Null , sImageEnroulée , sImageDéroulée , nIdentifiant , sTexteBulle) = Faux ALORS RENVOYER Faux FIN // Ajout de l'élément dans le tableau TableauAjoute(:m_TabElementsTreeview , snoeud) // Doit-on le trier ? SI btrie ALORS // Trie l'arbre :ArbreTrie() FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Sélectionne toutes les lignes // Syntaxe : //ArbreSelectTout ( []) // // Paramètres : // bSelection (valeur par défaut=1) : VRAI si on doit tout sélectionner, FAUX si on doit tout désélectionner // Valeur de retour : // Aucune PROCEDURE ArbreSelectTout(bSelection = Vrai) i est un entier nIndiceTableauSélection est un entier // Si tous les éléments doivent être sélectionnés SI bSelection ALORS // Contrôle que la multisélection est bien autorisée SI :m_bMultiSélectionAutorisée = Faux ALORS RETOUR // Vide la tableau TableauSupprimeTout(:m_TabElementsSélectionnés) // Positionne à 0 le nombre d'éléments sélectionnés :m_nNombreElémentsSélectionnés = 0 // Pour tous les éléments du tableau POUR i = 1 A Dimension(:m_TabElementsTreeview) // Recherche de l'élément en cours dans le tableau des éléments sélectionnés // S'il est déjà sélectionné, on ne fait rien, sinon, on le sélectionne nIndiceTableauSélection = TableauCherche(:m_TabElementsSélectionnés , tcLinéaire , i) SI nIndiceTableauSélection > 0 _ET_ i <> :m_nDernierIndiceSélectionné ALORS // On l'a trouvé ,on ne fait rien SINON // Positionne la couleur de fond et de police du noeud comme étant sélectionné {:m_sNomArbre,indChamp}[i]..CouleurFond = :m_nCouleurSélection {:m_sNomArbre,indChamp}[i]..Couleur = :m_nCouleurPolice // Sauvegarde de l'élément sélectionné TableauAjoute(:m_TabElementsSélectionnés , i) :m_nNombreElémentsSélectionnés++ FIN FIN SINON // Si tous les éléments doivent être désélectionnés :_EnlèveSélection() FIN // Résumé : Supprime tout noeud/toute feuille de l'arbre // Syntaxe : //[ = ] ArbreSupprimeTout () // // Paramètres : // Aucun // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreSupprimeTout() // Vide le champ arbre SI WL.ArbreSupprimeTout(:m_sNomArbre) = Faux ALORS RENVOYER Faux // Vide les tableaux TableauSupprimeTout(:m_TabElementsTreeview) // Tableau des éléments de l'arbre TableauSupprimeTout(:m_TabElementsSélectionnés) // Tableau des indices des éléments sélectionnés // Réinitialisation :m_nNombreElémentsSélectionnés = 0 // traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Trie l'arbre // Syntaxe : //[ = ] ArbreTrie () // // Paramètres : // Aucun // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreTrie() tabElementSelectionne est un tableau de 0 chaîne // chaine contenant les chemins des noeuds sélectionnées nIndice est un entier sNoeud est une chaîne // Pour chaque indice présent dans le tableau des éléments sélectionnés POUR TOUT ELEMENT nindice DE :m_TabElementsSélectionnés // Ajoute le chemin du noeud sélectionné dans le tableau TableauAjoute(tabElementSelectionne , :m_TabElementsTreeview[nIndice]) FIN // Trie l'arbre SI WL.ArbreTrie(:m_sNomArbre) = Faux ALORS RENVOYER Faux // Trie le tableau des éléments // le tableau des éléments sélectionnées ne sera plus valide, puisque les indices ont changés TableauTrie(:m_TabElementsTreeview,ttCroissant) // Vide le tableau des indices des noeuds sélectionnés TableauSupprimeTout(:m_TabElementsSélectionnés) // Re parcours le tableau nouvellement trié pour récupérer les indices des éléments sélectionnés POUR TOUT ELEMENT snoeud DE tabElementSelectionne // Récupère l'indice de ce noeud dans le tableau des éléments de l'arbre nindice = TableauCherche(:m_TabElementsTreeview , tcDichotomique , snoeud) SI nindice <> -1 ALORS // Ajoute l'indice de ce noeud dans le tableau des indices d'éléments sélectionnés TableauAjoute(:m_TabElementsSélectionnés , nIndice) FIN FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Supprime un noeud et ses fils // Syntaxe : //[ = ] ArbreSupprime () // // Paramètres : // sNoeud : chemin du noeud à supprimer // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreSupprime(sNoeud) // Supprime le noeud du champ arbre SI WL.ArbreSupprime(:m_sNomArbre , snoeud) = Faux ALORS RENVOYER Faux // Il faut supprimer tous les noeuds correspondants dans le tableau j,i est un entier = 1 // Parcours le tableau des éléments de l'arbre TANTQUE i <= Dimension(:m_TabElementsTreeview) //Si l'arborescence du noeud est présente dans l'élément, il s'agit : // du noeud lui même ("Noeud1"+tab+"Noeud2") // d'un des fils du noeud ("Noeud1"+tab+"Noeud2"+tab+"Feuille1") SI Position(:m_TabElementsTreeview[i] , snoeud) <> 0 ALORS // Si l'élément était sélectionné (son indice est présent dans le tableau des éléments sélectionnés) nIndiceSelect est un entier = TableauCherche(:m_TabElementsSélectionnés,tcLinéaire,i) SI nindiceselect <> -1 ALORS // Supprime l'indice du tableau TableauSupprime(:m_TabElementsSélectionnés,nindiceselect) // Décrémente le nombre de noeuds sélectionnés :m_nNombreElémentsSélectionnés-- FIN // Supprime cet élément TableauSupprime(:m_TabElementsTreeview , i) // Dans le tableau des éléments sélectionnés, les indices supérieurs à l'indice i en cours ne sont plus corrects (du fait de la suppression),il faut les décrémenter // Pour chaque indice d'un élément sélectionné POUR j=1 A Dimension(:m_TabElementsSélectionnés) // Si cet indice est supérieur à l'indice de l'élément en cours SI :m_TabElementsSélectionnés[j] > i ALORS // Décrémente l'indice :m_TabElementsSélectionnés[j]-- FIN FIN SINON // Si ce noeud n'est pas trouvé // Avance dans le tableau i++ FIN FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Insère un noeud dans l'arbre // Syntaxe : //[ = ] ArbreInsère (, [, [, [, [, [, ]]]]]) // // Paramètres : // sNoeudFrere : Noeud frère de l'arbre ("Noeud"+tab+"SousNoeud"+tab+"Feuille") // sFeuille : Feuille à insérée ("Feuille2") // sImageEnroulée (valeur par défaut=7) : Chemin de l'image enroulée ou aDéfaut ou Null // sImageDéroulée (valeur par défaut=7) : Chemin de l'image déroulée ou aDéfaut ou Null // nIdentifiant (valeur par défaut=0) : Identifiant du noeud / de la feuille // nModeAjoute (valeur par défaut=6) : Mode d'ajout aApres ou aAvant // sTexteBulle : Texte de la bulle // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreInsère(sNoeudFrere , sFeuille , sImageEnroulée = aDéfaut , sImageDéroulée = aDéfaut , nIdentifiant = 0 , nModeAjoute = aAprès , sTexteBulle = "") sCheminFeuille est une chaîne // Chemin complet de la nouvelle feuille nIndice est un entier // Ajoute l'élément dans l'arbre SI WL.ArbreInsère(:m_sNomArbre , snoeudfrere , sFeuille , sImageEnroulée , sImageDéroulée , nIdentifiant , nModeAjoute , sTexteBulle) = Faux ALORS RENVOYER Faux // Insère le noeud dans le tableau // Il faut retrouver la position du noeud frère référence nIndiceFrere est un entier = TableauCherche(:m_TabElementsTreeview , tcLinéaire , sNoeudFrere) SI nIndiceFrere <> -1 ALORS // Il faut construire l'arborescence de la feuille à ajouter pour le tableau nIndice = Position(snoeudfrere,TAB,0,DepuisFin) sCheminFeuille = snoeudfrere[[ 1 A nindice]] +sfeuille // Selon le mode d'ajout SELON nModeAjoute // Après le noeud frère CAS aAprès TableauInsère(:m_TabElementsTreeview , nIndiceFrere+1 , sCheminFeuille) // Avant le noeud frère CAS aAvant TableauInsère(:m_TabElementsTreeview , nIndiceFrere , sCheminFeuille) FIN FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Modifie un noeud de l'arbre // Syntaxe : //[ = ] ArbreModifie ( [, [, [, [, [, ]]]]]) // // Paramètres : // sBranche : Noeud à modifier à l'arbre ("Noeud"+tab+"SousNoeud"+tab+"Feuille") // sNouveauLibelle : Nouveau libellé de ce noeud // sImageEnroulée : Chemin de l'image enroulée ou aDéfaut ou Null // sImageDéroulée : Chemin de l'image déroulée ou aDéfaut ou Null // nIdentifiant : Identifiant du noeud / de la feuille // sTexteBulle : Texte de la bulle // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreModifie(sBranche, sNouveauLibelle = Null , sImageEnroulée = Null , sImageDéroulée = Null , nIdentifiant = Null , sTexteBulle = "") sNouveauChemin est une chaîne // Modifie l'élément dans l'arbre SI WL.ArbreModifie(:m_sNomArbre , sBranche , sNouveauLibelle , sImageEnroulée , sImageDéroulée , nIdentifiant , sTexteBulle) = Faux ALORS RENVOYER Faux // Modifie le noeud dans le tableau // Il faut retrouver la position nIndiceElement est un entier = TableauCherche(:m_TabElementsTreeview , tcLinéaire , sBranche) SI nIndiceElement <> -1 ALORS // Si un nouveau libellé est spécifié SI sNouveauLibelle <> Null ALORS // Il faut construire l'arborescence de la feuille à ajouter pour le tableau nIndice est un entier = Position(sBranche,TAB,0,DepuisFin) sNouveauChemin = sBranche[[ 1 A nindice]] +sNouveauLibelle // Change le chemin du noeud de l'élément :m_TabElementsTreeview[nindiceelement] = sNouveauChemin FIN FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : supprime les fils de l'élément (sans supprimer l'élément lui-même) // Syntaxe : //[ = ] ArbreSupprimeFils () // // Paramètres : // sNoeud : chemin du noeud pour lequel on souhaite supprimer les fils // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreSupprimeFils(sNoeud) sCheminElement est une chaîne j,i sont des entiers // Supprime les fils de l'élément dans l'arbre SI WL.ArbreSupprimeFils(:m_sNomArbre , snoeud) = Faux ALORS RENVOYER Faux i=1 // Parcours le tableau des éléments de l'arbre TANTQUE i <= Dimension(:m_TabElementsTreeview) //Si l'arborescence du noeud est présente dans l'élément, il s'agit : // du noeud lui même ("Noeud1"+tab+"Noeud2") => teste apres le _et_ pour éviter de le supprimer (ne supprime que les fils) // d'un des fils du noeud ("Noeud1"+tab+"Noeud2"+tab+"Feuille1") SI Position(:m_TabElementsTreeview[i] , snoeud) <> 0 _ET_ :m_TabElementsTreeview[i] <> snoeud ALORS // Si l'élément était sélectionné (son indice est présent dans le tableau des éléments sélectionnés) nIndiceSelect est un entier = TableauCherche(:m_TabElementsSélectionnés,tcLinéaire,i) SI nindiceselect <> -1 ALORS // Supprime l'indice du tableau des indices TableauSupprime(:m_TabElementsSélectionnés,nindiceselect) // Décrémente le nombre de noeuds sélectionnés :m_nNombreElémentsSélectionnés-- FIN // Supprime cet élément TableauSupprime(:m_TabElementsTreeview , i) // Dans le tableau des éléments sélectionnés, les indices supérieurs à l'indice i en cours ne sont plus corrects (du fait de la suppression),il faut les décrémenter // Pour chaque indice d'un élément sélectionné POUR j=1 A Dimension(:m_TabElementsSélectionnés) // Si cet indice est supérieur à l'indice de l'élément en cours SI :m_TabElementsSélectionnés[j] > i ALORS // Décrémente l'indice :m_TabElementsSélectionnés[j]-- FIN FIN SINON // Si ce noeud n'est pas trouvé // Avance dans le tableau i++ FIN FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Déplace un élément (feuille ou noeud) dans un champ Arbre (toutes les branches issues de cet élément sont également déplacées) // Syntaxe : //[ = ] ArbreDeplaceElément (, ) // // Paramètres : // sElementSource : élément à déplacer // sElementDestination : noeud où déplacer cet élément // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreDeplaceElément(sElementSource , sElementDestination) bRetour est un booléen nPosition est un entier sElement est une chaîne // élément parcouru sNouveauChemin est une chaîne // nouveau chemin pour l'élément source et ses fils // Déplace le noeud dans l'arbre SI WL.ArbreDéplaceElément( :m_sNomArbre , sElementSource , sElementDestination) = Faux ALORS RENVOYER Faux // Positionne le nouveau chemin de l'élément que l'on déplace nPosition = Position(sElementSource,TAB,0,DepuisFin) sNouveauChemin = sElementDestination+TAB+selementsource[[nposition+1 A Taille(selementsource)]] // Pour chaque élément POUR TOUT ELEMENT sElement DE :m_TabElementsTreeview // Si le chemin du noeud à déplacer est trouvé dans le chemin de cet élément, il s'agit d'un fils ou de l'élément lui-même SI Position(sElement , selementsource) <> 0 ALORS // Remplace l'ancien chemin de l'élément par le nouveau chemin selement = Remplace(selement , selementsource , snouveauchemin) FIN FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Copie un élément (feuille ou noeud) dans un champ Arbre (toutes les branches issues de cet élément sont également copiées) // Syntaxe : //[ = ] ArbreCopieElément (, ) // // Paramètres : // sElementSource : élément à copier // sElementDestination : noeud où copier cet élément // Valeur de retour : // booléen : VRAI si le traitement a réussi, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreCopieElément(sElementSource , sElementDestination) nPosition est un entier sElement est une chaîne // élément parcouru sNouveauChemin est une chaîne // nouveau chemin pour l'élément source et ses fils sNouvelElement est une chaîne // nouvel élément (copie d'un ancien élément) tabElement est un tableau de 0 chaînes // on ne copie pas un noeud dans un noeud fils SI Position(sElementDestination , sElementSource) <> 0 ALORS FIN // Déplace le noeud dans l'arbre SI WL.ArbreCopieElément( :m_sNomArbre , sElementSource , sElementDestination) = Faux ALORS RENVOYER Faux // Positionne le nouveau chemin de l'élément que l'on copie nPosition = Position(sElementSource,TAB,0,DepuisFin) // le nouveau chemin correspond au chemin de destination + le dernier noeud spécifié dans le chemin de l'élément source sNouveauChemin = sElementDestination + TAB + selementsource[[nposition+1 A Taille(selementsource)]] // Pour chaque élément noeud de l'arbre POUR TOUT ELEMENT sElement DE :m_TabElementsTreeview // Si le chemin du noeud à copier est trouvé dans le chemin de cet élément, il s'agit d'un fils ou de l'élément lui-même SI Position(sElement , selementsource) <> 0 ALORS // Création du nouvel élément sNouvelElement = Remplace(selement , selementsource , snouveauchemin) // Ajoute le nouvel élément dans le tableau TableauAjoute(tabElement , snouvelelement) FIN FIN // Pour chaque nouvel élément POUR TOUT ELEMENT selement DE tabelement // Ajout de l'élément dans l'arbre :ArbreAjoute(selement , Vrai) FIN // Traitement effectué, renvoie VRAI RENVOYER Vrai // Résumé : Déroule un noeud de l'arbre // Syntaxe : //[ = ] ArbreDéroule () // // Paramètres : // sNoeud : noeud à dérouler // Valeur de retour : // booléen : VRAI si traitement effectué, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreDéroule(sNoeud) RENVOYER WL.ArbreDéroule(:m_sNomArbre , snoeud) // Résumé : Déroule tout l'arbre // Syntaxe : //[ = ] ArbreDérouleTout ( []) // // Paramètres : // sNoeud : noeud à partir duquel tout dérouler // Valeur de retour : // booléen : // Aucune // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreDérouleTout(sNoeud="") // Si un noeud est précisé SI snoeud <> "" ALORS RENVOYER WL.ArbreDérouleTout(:m_sNomArbre, snoeud) SINON RENVOYER WL.ArbreDérouleTout(:m_sNomArbre) FIN // Résumé : Enroule un noeud de l'arbre // Syntaxe : //[ = ] ArbreEnroule () // // Paramètres : // sNoeud : noeud à enrouler // Valeur de retour : // booléen : VRAI si traitement effectué, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX PROCEDURE ArbreEnroule(sNoeud) RENVOYER WL.ArbreEnroule(:m_sNomArbre , snoeud) // Résumé : Enroule l'ensemble des noeuds de l'arbre // Syntaxe : //[ = ] ArbreEnrouleTout ( []) // // Paramètres : // sNoeud : noeud à partir duquel tout enroulé // Valeur de retour : // booléen : VRAI si traitement effectué, FAUX autrement // Traitement automatique des erreurs : RENVOYER FAUX // PROCEDURE ArbreEnrouleTout(sNoeud="") SI snoeud <> "" ALORS RENVOYER WL.ArbreEnrouleTout(:m_sNomArbre , snoeud) SINON RENVOYER WL.ArbreEnrouleTout(:m_sNomArbre) FIN // Résumé : renvoie l'état d'un noeud de l'arbre // Syntaxe : //[ = ] ArbreEtat () // // Paramètres : // sNoeud : noeud dont on souhaite connaitre l'état // Valeur de retour : // entier : etat du noeud : aEnroule, aDeroule, aErreur PROCEDURE ArbreEtat(sNoeud) RENVOYER WL.ArbreEtat(:m_sNomArbre , snoeud) // Résumé : renvoie le type d'un élément passé en paramètre // Syntaxe : //[ = ] ArbreTypeElément () // // Paramètres : // sNoeud : noeud dont on souhaite connaitre le type // Valeur de retour : // entier : type de l'élément : aErreur, aFeuille, aNoeud PROCEDURE ArbreTypeElément(sNoeud) RENVOYER WL.ArbreTypeElément(:m_sNomArbre , snoeud) // Résumé : récupère l'identifiant du noeud d'un arbre // Syntaxe : //[ = ] ArbreRécupèreIdentifiant () // // Paramètres : // sNoeud : noeud dont on souhaite récupérer l'identifiant // Valeur de retour : // chaîne : identifiant du noeud // Traitement automatique des erreurs : RENVOYER "" PROCEDURE ArbreRécupèreIdentifiant(sNoeud) RENVOYER WL.ArbreRécupèreIdentifiant(:m_sNomArbre , sNoeud) // Résumé : récupère les fils d'un noeud // Syntaxe : //[ = ] ArbreRécupèreFils (, ) // // Paramètres : // sNoeud : noeud dont on souhaite récupérer les fils // nFils : indique le fils voulu : aPremier ou aSuivant // Valeur de retour : // Type indéterminé : nom du fils trouvé ou chaine vide "" // Traitement automatique des erreurs : RENVOYER "" PROCEDURE ArbreRécupèreFils(sNoeud , nFils) RENVOYER WL.ArbreRécupèreFils(:m_sNomArbre , snoeud , nfils) // Résumé : Affiche un champ Arbre àpartir d'un élément (noeud ou feuille) spécifié // Syntaxe : //[ = ] ArbrePosition () // // Paramètres : // Aucun // Valeur de retour : // chaîne : Chemin complet du premier élément affiché dans le champ PROCEDURE ArbrePosition() RENVOYER WL.ArbrePosition(:m_sNomArbre) // Résumé :Renvoie le nombre d'éléments présents dans l'arbre ou dans une branche. // Syntaxe : //[ = ] ArbreOccurence ( [ [, ]]) // // Paramètres : // sNoeud : Chemin complet du noeud à partir duquel le calcul doit être réalisé // nNiveau (valeur par défaut=0) : Niveau des éléments à prendre en compte dans le calcul : aTout ou aUnNiveau // Valeur de retour : // Type indéterminé : Nombre d'occurence // Traitement automatique des erreurs : RENVOYER -1 // PROCEDURE ArbreOccurence(sNoeud =Null, nNiveau=aTout) RENVOYER WL.ArbreOccurrence(:m_sNomArbre , sNoeud , nNiveau) // Résumé : Liste les "fils" d'un noeud et les éléments "fils" de ces "fils // Syntaxe : //[ = ] ArbreListeFils (, [, ]) // // Paramètres : // sNoeud : noeud sur lequel on souhaite lister les fils // sNomProcedure : nom de la procédure appelée pour chaque fils // nParametre (valeur par défaut=0) : paramètre optionnel // Valeur de retour : // Type indéterminé : Nombre d'éléments listés PROCEDURE ArbreListeFils(sNoeud , sNomProcedure, nParametre=0 ) RENVOYER WL.ArbreListeFils(:m_sNomArbre , snoeud , snomprocedure , nParametre) // Résumé : Renvoie l'élément d'un arbre se trouvant à une position donnée. // Syntaxe : //[ = ] ArbreInfoXY (, , ) // // Paramètres : // TypeInformation : type d'information souhaité (cf l'aide en ligne de ArbreInfoXY du W-langage) // nPosX : coordonnée X à analyser // nPosY : coordonnée Y à analyser // Valeur de retour : // variant : information demandée (cf l'aide en ligne de ArbreInfoXY du W-langage) PROCEDURE ArbreInfoXY(TypeInformation , nPosX, nPosY) RENVOYER WL.ArbreInfoXY(:m_sNomArbre , TypeInformation , nPosX , nPosY) // Résumé : Renvoie la dernière erreur s'il en existe une // Syntaxe : //[ = ] GetErreur () // // Paramètres : // Aucun // Valeur de retour : // chaîne : texte de l'erreur PROCEDURE GetErreur() RENVOYER :m_sErreurInfo // Résumé : permet de construire le chemin des éléments en différenciant les doublons // Syntaxe : //[ = ] ArbreId () // // Paramètres : // sIdentifiant : identifiant de l'élément // Valeur de retour : // chaîne : chaîne de controle PROCEDURE ArbreId(sIdentifiant) RENVOYER WL.ArbreID(sidentifiant)