[Java] Enrichir le contrôle d'arborescence

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
DamDam
Fraîchement OOthentifié
Messages : 2
Inscription : 29 mars 2010 07:55

[Java] Enrichir le contrôle d'arborescence

Message par DamDam »

Bonjour

Quelqu'un a-t-il l'expérience de l'implémentation d'un XTreeDataModel ou XTreeNode en java pour enrichir le contrôle d'arborescence d'Open Office ?

En me basant sur l'exemple suivant
http://wiki.services.openoffice.org/wiki/Treecontrol
ou
http://wiki.services.openoffice.org/wik ... ee_Control

J'arrive à "simuler" des nœuds plus complexes comme des checkbox en mettant soit une bitmap d'une checkbox cochée ou décochée.
Voici le code ajouté au code du 2ème lien. Il faut juste prévoir de rajouter les bitmaps correspondant à la checkbox cochée cocheOn.bmp et décochée cocheOFF.bmp

Code : Tout sélectionner

Sub CheckBoxSimple(oEvt)
'  MsgBox("Selection Changed")
  if oEvt.Source.SelectionCount > 0 then
	  if oEvt.Source.Selection.dataValue = 0 then
    	oEvt.Source.Selection.dataValue = 1
	    oEvt.Source.Selection.NodeGraphicURL = ConvertToUrl("C:\temp\cocheON.bmp")
	  else
    	oEvt.Source.Selection.dataValue = 0
		oEvt.Source.Selection.NodeGraphicURL = ConvertToUrl("C:\temp\cocheOFF.bmp")
  	 endif
  endif
end sub
Mais je n'arrive pas à aller plus loin avec cette méthode et j'envisage de développer en java un composant.
Je recherche donc soit un petit code exemple d'un composant OpenOffice en java implémentant les interfaces XTreeDataModel ou XTreeNode
soit une méthode pour dériver les Interfaces XMutableTreeDataModele et XMutableTreeNode de base.

D'avance je vous remercie

Damien
Dernière modification par Oukcha le 30 mars 2010 06:05, modifié 1 fois.
Raison : TO:"[Java] Enrichir le contrôle d'arborescence d'OpenOffice" / "OpenOffice" est implicite sur ce forum
OpenOffice 3.1.1 Windows XP sp3
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Re: [Java] Enrichir le contrôle d'arborescence

Message par Pierre-Yves Samyn »

Bonjour

Ne pratiquant pas java j'avais laissé ce post mais la curiosité (et le manque de réponse) m'y ont conduit. Je ne comprends pas ceci :
DamDam a écrit :pour enrichir le contrôle d'arborescence d'Open Office...
je n'arrive pas à aller plus loin avec cette méthode
Quelles fonctionnalités souhaites-tu ajouter ?

Encore une fois, je ne pratique pas java couramment mais cela m'a donné envie de regarder d'un peu plus près ce type de contrôle que je n'avais pas encore utilisé...
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 est fondé sur la base exemple du tutoriel : débuter base à partir d'un exemple.

Tu as déjà donné les liens vers la documentation :
http://wiki.services.openoffice.org/wiki/Treecontrol
http://wiki.services.openoffice.org/wik ... ee_Control

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

Je crains ne pas répondre à ta question (puisque je ne la comprends pas...) mais bon... cela illustre d'autres possibilités :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
DamDam
Fraîchement OOthentifié
Messages : 2
Inscription : 29 mars 2010 07:55

Re: [Java] Enrichir le contrôle d'arborescence

Message par DamDam »

Merci Pierre-Yves de ta réponse. Désolé si je n'ai pas été clair. En fait ce que je voulais c'est un contrôle CheckBoxTree
comme objet de dialogue OpenOffice, comme cet exemple:
checkboxtree.JPG
Le contrôle d'arborescence de base des boites de dialogue OpenOffice ne suffit pas (ou alors je n'ai pas compris).
Une solution consiste à implémenter un composant OpenOffice, éventuellement en Java (ou C++) mais ce n'est pas si simple.

J'ai bricolé un truc qui marchotte mais je suis loin d'avoir fini. Je me suis basé sur le chexboxtree de Tristate
http://www.ansir.ca/tristate.jsp
puis j'ai crée un composant OpenOffice avec Netbeans pour pouvoir appeler ce composant Tristate depuis OOobasic.
Ca marche mais il me reste encore pas mal de points à résoudre avant que ce soit "comme si" ce contrôle était natif OpenOffice et qu'on puisse l'ajouter simplement dans des boites de dialogue.
Quand j'aurai fini (si j'y arrive), je demanderai à Tristate l'autorisation de publier ma solution.
A moins que... une bonne âme ait déjà la soluce :D

Merci encore pour ta réponse et ton exemple de code qui est très intéressant.

A bientôt

Damien
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
OpenOffice 3.1.1 Windows XP sp3