[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.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

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

Message par Pierre-Yves Samyn »

Ce sujet fait suite au fil : http://user.services.openoffice.org/fr/ ... 21#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
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

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

Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

[Basic] Contrôle TreeView non modal

Message par Piaf »

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+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64