[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 !

[Java] Enrichir le contrôle d'arborescence

Messagepar DamDam » 29 Mars 2010 23:34

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/wiki/Going_further_with_Dialog_and_Component#The_New_Tree_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   AgrandirRéduire
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 édition par Oukcha le 30 Mars 2010 07:05, édité 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
DamDam
Fraîchement OOthentifié
 
Message(s) : 2
Inscrit le : 29 Mars 2010 08:55

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

Messagepar Pierre-Yves Samyn » 05 Avr 2010 08:18

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
Capture-1.png (2.39 Kio) Consulté 840 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



Je crains ne pas répondre à ta question (puisque je ne la comprends pas...) mais bon... cela illustre d'autres possibilités :)
Pièces jointes
TreeView.odb
(11.36 Kio) Téléchargé 55 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

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

Messagepar DamDam » 07 Avr 2010 21:50

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
checkboxtree
checkboxtree.JPG (11.06 Kio) Consulté 813 fois

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
OpenOffice 3.1.1 Windows XP sp3
DamDam
Fraîchement OOthentifié
 
Message(s) : 2
Inscrit le : 29 Mars 2010 08:55


Retour vers Macros et API

Qui est en ligne ?

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