[Basic] Contrôle d'arborescence (TreeView) avec listener

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

[Basic] Contrôle d'arborescence (TreeView) avec listener

Messagepar Pierre-Yves Samyn » 06 Avr 2010 09:50

Ce sujet fait suite au fil : viewtopic.php?p=118821#p118821

Rappel des liens vers la documentation :
http://wiki.services.openoffice.org/wiki/Treecontrol
http://wiki.services.openoffice.org/wik ... ee_Control

Les exemples disponibles me semblent présenter le défaut de ne pas mettre en œuvre un contrôle réellement dynamique en creusant la piste des listeners.

Ci-dessous un exemple simple et rapide allant dans ce sens... Il utilise les données de la base exemple du tutoriel : débuter base à partir d'un exemple.

Le but est la consultation des données sous forme d'arborescence :

Capture-1.png
Consultation des commandes par Date > Nom du client & Référence > Produits commandés > Détail du produit
Capture-1.png (2.19 Kio) Consulté 4444 fois


Il va de soi que l'intérêt fonctionnel est limité... le but est surtout de donner un exemple de mise en œuvre des listeners.

"Remplir" un contrôle de ce type pourrait être très long en fonction du nombre de données. Le principe sera donc de ne "garnir" que les premiers niveaux (ici les dates et références de commandes) et de ne compléter que dynamiquement, lors de la sélection d'une commande par la recherche des produits commandés. On peaufine en gérant le double-clic permettant d'afficher dans la zone de texte les données sélectionnées (je ne suis pas convaincu par l'exemple donné "sur perte de focus" dans la documentation).

Encore une fois, il s'agit ici d'une première exploration rapide des possibilités... :)

Code : Tout sélectionner   AgrandirRéduire
Option Explicit

Private oDlg             as Object
Private PysConnection       as object
Private oTreeDataModel       as Object
Private PysSQL             as string

Sub ArborescenceSimple

Dim PysListenerDblClic    as object
Dim oTreeCtrl          as Object
Dim oTreeModel          as Object
Dim oParent            as Object
Dim oChild            as Object
Dim oEnfant          as Object
Dim oListener          as Object
Dim oElement         as Object
Dim PysReqDates as object, PysDates as object, PysReqCommandes as object, PysCommandes as object

DialogLibraries.loadLibrary("Standard")

oDlg = CreateUnoDialog(DialogLibraries.Standard.SimpleTreeDialog)
oDlg.getControl("lbDescription").setText( "Un TreeView avec Listeners." )
oTreeCtrl = oDlg.getControl("TreeControl")
oTreeModel = oTreeCtrl.Model

oTreeDataModel = createUnoService("com.sun.star.awt.tree.MutableTreeDataModel")
oElement = oTreeDataModel.createNode( "Dates de commande", true )
oTreeDataModel.setRoot(oElement)
oParent = oElement   

PysConnection = ThisDatabaseDocument.DataSource.getConnection("","")

PysSQL = "select distinct DateCommande from Commandes order by DateCommande"
PysReqDates = PysConnection.createStatement()
PysDates = PysReqDates.executeQuery(PysSQL)

while PysDates.next
   oChild = treeAddChildElement( oTreeDataModel, oParent, PysDates.getString(1), true )

   PysSQL = "SELECT Nom || ' ' || Prénom || ', Réf. : ' || RéfCommande AS ""AFF"" FROM Commandes, Clients "
   PysSQL = PysSQL &  "WHERE Commandes.RéfClient = Clients.RéfClient AND Commandes.DateCommande = {D '" & PysDates.getString(1) & "' } "
   PysSQL = PysSQL &  "ORDER BY AFF ASC"
   
   PysReqCommandes = PysConnection.createStatement()
   PysCommandes = PysReqCommandes.executeQuery(PysSQL)
   
   oEnfant = oChild

   while PysCommandes.next      
      oChild = treeAddChildElement( oTreeDataModel, oEnfant, PysCommandes.getString(1), true )
   wend
wend
       
oTreeModel.DataModel = oTreeDataModel
   
PysListenerDblClic = createUnoListener("MouseStyleListen_", "com.sun.star.awt.XMouseListener")
oTreeCtrl.addMouselistener(PysListenerDblClic)   

oListener = CreateUnoListener("Pys_","com.sun.star.awt.tree.XTreeExpansionListener")
oTreeCtrl.addTreeExpansionListener(oListener)

oDlg.execute()

oTreeCtrl.removeMouselistener(PysListenerDblClic)   
oTreeCtrl.removeTreeExpansionListener(oListener)

oDlg.dispose()

End Sub


rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'treeAddChildElement : Add a child element to a tree item
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function treeAddChildElement (oTreeDataModel as Object, oParent As Object, sChild As String, bIsNotLeaf As Boolean) As Object
   Dim oElement   As Object
   
   oElement = oTreeDataModel.createNode( sChild, bIsNotLeaf )
   oParent.appendChild(oElement)
   
   treeAddChildElement = oElement
End Function
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub Pys_treeExpanding(oEvt)
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dim i as double
dim PysTrav
dim PysReqUneCommande as object, PysUneCommande as object

if not(isnull(oEvt.Node.Parent))  then
   if isnull(oEvt.Node.Parent.Parent) then

      for i = 0 to oEvt.Node.getChildCount - 1
         if oEvt.Node.getChildAt(i).getChildCount = 0 then
            PysTrav = split(oEvt.Node.getChildAt(i).DisplayValue, ":")
         
            PysSQL = "SELECT NomProduit FROM RDétailCommande WHERE RéfCommande = " & PysTrav(1)
            PysReqUneCommande = PysConnection.createStatement()
            PysUneCommande = PysReqUneCommande.executeQuery(PysSQL)
            
            while PysUneCommande.next
               treeAddChildElement( oTreeDataModel, oEvt.Node.getChildAt(i), PysUneCommande.getString(1), false )
            wend
         end if   
      next i
   end if
end if

end sub

Sub Pys_treeExpanded(oEvt)
end sub
Sub Pys_treeCollapsing(oEvt)
end sub
Sub Pys_treeCollapsed(oEvt)
end sub
Sub Pys_requestChildNodes(oEvt)
End Sub
Sub Pys_disposing(oEvt)
End Sub   


rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub mouseStyleListen_mousePressed(oEvt)
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if oEvt.clickCount = 2 then
   oDlg.getControl("lbDescription").setText(oEvt.Source.Selection.DisplayValue)
endif
end sub
sub mouseStyleListen_mouseReleased(oEvt)
end sub
sub mouseStyleListen_mouseEntered(oEvt)
end sub
sub mouseStyleListen_mouseExited(oEvt)
end sub
sub mouseStyleListen_disposing(oEvt)
end sub

Pièces jointes
TreeView.odb
(11.36 Kio) Téléchargé 587 fois
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

[Basic] Contrôle TreeView non modal

Messagepar Piaf » 27 Oct 2014 10:56

Bonjour
Toujours dans le cadre Pourquoi faire simple quand on peut faire compliquer. :lol:
Une proposition de dialogue non modal avec un contrôle TreeView.
L'exemple ne sert qu'à explorer quelques propriétés du contrôle.
Pour tester :
  • Ouvrir le formulaire Menu et cliquer sur le bouton Ouvrir dialogue.
  • Un clic droit sur les nodes permet d'ouvrir le formulaire lié quand il existe.
  • Un double-clic sur les nodes « Encadrement » ou « Élèves » ajoute les données au node.
  • Un clic droit sur un personnel d'encadrement ou un élève permet d'ouvrir le formulaire Population.
  • Dans ce formulaire, si les données sont modifiées, le bouton Actualiser tree permet d'actualiser le contrôle d'arborescence.
A+
Pièces jointes
TreeView.zip
(58.92 Kio) Téléchargé 206 fois
Libre Office Version: 6.1.5 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Piaf
GourOOu
GourOOu
 
Message(s) : 5572
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité