1

J'essaie de créer un composant sélecteur d'image dans LibreOffice. J'ai une boîte de dialogue qui est dynamiquement remplie d'images. Lorsque l'utilisateur clique sur une image, elle doit être sélectionnée et la boîte de dialogue doit être fermée. Le problème est que le nombre d'images est variable. J'ai donc besoin d'activer le défilement dans la boîte de dialogue (pour que l'utilisateur puisse naviguer dans toutes les images).Barre de défilement dans la boîte de dialogue LibreOffice

Il semble y avoir quelques propriétés sur l'objet de dialogue (barres de défilement, largeur de défilement, hauteur de défilement, etc.) Cependant, je ne trouve pas un moyen de les utiliser n'importe où.

Des idées?

+0

> "Il semble y avoir des propriétés sur l'objet de dialogue" Où se trouvent ces propriétés? En regardant dedans je n'en trouve aucun dans l'éditeur de dialogue de base ou dans la documentation de l'API. Peut-être que vous le confondez avec les propriétés d'un formulaire? – ngulam

+0

@ngulam Je ne sais pas pourquoi vous ne pouvez pas le voir. Je peux voir ceux-ci dans l'éditeur de dialogue. J'utilise LO 5.0.0.5 (x64) – Beemen

+0

Mon mauvais - regardé à la mauvaise version. LO l'a dans la version 4.3 et 5.0.0.5, désolé pour la perturbation. – ngulam

Répondre

2

La barre de défilement est l'une des Controls disponibles via l'éditeur de boîte de dialogue. C'est le moyen le plus simple de mettre un ScrollBar dans une boîte de dialogue. Insérez-le comme n'importe quel autre contrôle. Il y a un moyen plus difficile via DialogModel.addControl mais cela semble non-essentiel pour répondre à cette question.

Si vous ajoutez une barre de défilement à la boîte de dialogue et exécutez la boîte de dialogue, vous constaterez qu'elle ne fait rien par défaut. La fonctionnalité (apparemment) doit être écrite dans une macro. L'événement déclencheur approprié est l'événement While Adjusting sur l'objet ScrollBar, bien qu'il ne déclenche pas la macro simplement avec la fonction "Mode Test" dans l'éditeur de dialogue. L'exécution de la boîte de dialogue via une macro déclenche l'événement While Adjusting lorsque les flèches de défilement sont déclenchées, lorsque vous cliquez sur la zone de curseur pour déplacer le curseur et lorsque le curseur est lui-même déplacé. La variable Object renvoyée par l'événement scrollbar contient une propriété .Value qui est une valeur absolue comprise entre 0 et EventObject.Model.ScrollValueMax, ce qui vous permet de manipuler manuellement les autres objets de la page en fonction de la position du curseur.

Oui, c'est vrai, manipulez les objets manuellement. Le seul exemple que j'ai trouvé, à partir du LibreOffice 4.5 SDK, fait précisément cela. Bien sûr, ce n'est pas aussi grave que ça en a l'air, car on peut parcourir tous les objets de la page en lisant le tableau Dialog.getControls(). En tout cas, la sauce secrète de l'exemple fourni dans le SDK est de définir Static variables pour sauvegarder les positions initiales de tous les objets que vous manipulez avec la barre de défilement puis simplement indexer ces positions initiales en fonction d'un ratio dérivé de la barre de défilement Value divisé par le ScrollValueMax.

Voici un exemple de travail très simple sur la façon de faire défiler. Cela nécessite un Dialog1 enregistré dans la bibliothèque Standard de votre document, qui contient un objet ScrollBar1 (une barre de défilement verticale) et Label1 n'importe où dans la boîte de dialogue. Le ScrollBar1 doit être configuré pour exécuter le sous-programme de la macro ScrBar (ci-dessous) sur l'événement While Adjusting. Ouvrez la boîte de dialogue en exécutant la macro OpenDialog et la barre de défilement déplacera le contrôle Label1 de haut en bas proportionnellement à la page.

Sub OpenDialog 

    DialogLibraries.LoadLibrary("Standard") 
    oVariable = DialogLibraries.Standard.Dialog1 
    oDialog1 = CreateUnoDialog(oVariable) 
    oDialog1.Execute() 

End Sub 

Sub ScrBar (oEventObj As Object) 
    Static bInit As Boolean 
    Static PositionLbl1Y0 As Long 

    oSrc = oEventObj.Source 
    oSrcModel = oSrc.Model 

    scrollRatio = oEventObj.Value/oSrcModel.ScrollValueMax 

    oContx = oSrc.Context 
    oContxModl = oContx.Model 

    oLbl1 = oContx.getControl("Label1") 
    oLbl1Model = oLbl1.Model 

    REM on initialization remember the position of the label 
    If bInit = False Then 
    bInit = True 
    PositionLbl1Y0 = oLbl1Model.PositionY 
    End If  

    oLbl1Model.PositionY = PositionLbl1Y0 - (scrollRatio * oContx.Size.Height) 

End Sub 

L'exemple fourni par le SDK ne s'exécute pas sur ma configuration, mais les principes sont sains.

Il semble y avoir une deuxième méthode improvisée plus proche de la fonctionnalité que l'on pourrait attendre. Cette méthode utilise la propriété DialogModel.scrollTop. La propriété semble parcourir la totalité de la boîte vers le haut ou vers le bas comme un défilement basé sur l'entrée de l'utilisateur. Cependant, il existe deux problèmes d'utilisation de cette méthodologie. Tout d'abord, sauf si vous placez la barre de défilement à un autre endroit, la barre de défilement défile avec le reste de la page. Vous devrez ajuster l'emplacement de la barre de défilement précisément pour compenser/annuler le défilement de la page entière.Dans l'exemple ci-dessous j'ai essayé mais je n'ai pas perfectionné ceci. Deuxièmement, la propriété semble manquer des entrées avec la fréquence et sort facilement de l'alignement/entre dans un état inadapté. Peut-être que vous pouvez surmonter ces limitations. Voici l'exemple, en s'appuyant sur la même configuration décrite ci-dessus. Ce (sorte de) fera défiler le contenu de la boîte de dialogue entière, dans les limites et avec les mises en garde notées ci-dessus.