[writer] Comment éviter le saut d'affichage sur rafraichissement des champs ?

Bonjour,

lorsque l'on force le rafraîchissement des champs (F9) sous Writer, la focalisation saute brutalement vers l'endroit où se trouve le point d'insertion.

Ainsi, j'ai un document qui comporte des cases à cocher. Une macro, associée à l'évènement "Statut de l'élément modifié", compte les cases qui sont cochées. Ce nombre est répercuté dans un champ utilisateur qui est actualisé par Document.TextFields.Refresh (qui revient à la manip mentionnée ci-dessus).
Malheureusement, lorsque le rafraîchissement a lieu, le document "saute" de manière à mettre à l'écran l'endroit où se trouve le point d'insertion (au demeurant, ce dernier n'est plus visible puisque la case a obtenu la focalisation).

Bref, comment empêcher ce saut, tout en conservant le rafraîchissement de l'affichage du champ utilisateur ?

J'ai essayé un Document.lockControllers mais cela ne fait que retarder l'évènement jusqu'au prochain unlockControllers.

Merci d'avance pour toute piste,

Bonjour Jean-François

Si je comprends bien le problème, au risque de paraître manquer
d'imagination, il me semble que...

oEnum = thiscomponent.TextFields.createEnumeration
oTF = oEnum.nextElement
oTF.content = now
thiscomponent.CurrentController.setFormDesignMode(true)
thiscomponent.TextFields.Refresh
thiscomponent.CurrentController.setFormDesignMode(false)

:slight_smile:

Pierre-Yves

Bonjour Pierre-Yves,

Si je comprends bien le problème, au risque de paraître manquer
d'imagination, il me semble que...

oEnum = thiscomponent.TextFields.createEnumeration
oTF = oEnum.nextElement
oTF.content = now
thiscomponent.CurrentController.setFormDesignMode(true)
thiscomponent.TextFields.Refresh
thiscomponent.CurrentController.setFormDesignMode(false)

comme moi non plus je ne manque pas de manque d'imagination, tu penses bien que j'avais essayé :wink: Sans succès. L'affichage saute vers la zone du document où se trouvait le point d'insertion :frowning:

Suite...

Jean-Francois Nifenecker wrote

comme moi non plus je ne manque pas de manque d'imagination, tu penses
bien que j'avais essayé :wink: Sans succès. L'affichage saute vers la zone
du document où se trouvait le point d'insertion :frowning:

Déçu suis...

Cela marchait avec mon fichier d'essai. Après vérification, parce que
j'étais
passé "manuellement" en mode design avant de tester. Dans ce cas le truc
précédent fonctionne... Ne me demande pas pourquoi...

Du coup le plus simple me semble être... de ne pas faire de refresh mais de
faire
une boucle sur l'énumération des champs avec des update. Tu obtiens le même
résultat sans l'effet du refresh.

Cordialement
Pierre-Yves

Ah, oui. Seulement... comment qu'on fait des update ? Pas trouvé dans
l'API, ou alors mal cherché.

Merci encore,

Suite...

Jean-Francois Nifenecker wrote

Ah, oui. Seulement... comment qu'on fait des update ? Pas trouvé dans
l'API, ou alors mal cherché.

Je pensais qqchose comme ce qui suit... Mais après test (ci-dessous)
cela ne résout pas le pbm. Du coup j'ai testé le contournement suivant.
Mais il faudrait voir concrètement ton document car la gestion des
champs est différente selon les cas (nombreux type de champs, avec
champ maître ou non, etc.).

MajVariable.odt
<http://nabble.documentfoundation.org/file/n4117205/MajVariable.odt>

sub PysMajVar

dim oDoc as object, oColl as object, oVar as object

oDoc = thiscomponent
oColl = oDoc.textFields.createEnumeration

do while oColl.hasMoreElements
  oVar = oColl.nextElement
  if oVar.supportsService("com.sun.star.text.TextField.SetExpression") then
    if oVar.VariableName = "MaVar" then
      oVar.Content = "il est " & time
' oVar.update
      oVar.CurrentPresentation = oVar.Content
      exit do
    end if
  end if
loop

'oDoc.textFields.refresh

end sub

Bonsoir Pierre-Yves,

j'ai mis un peu de temps à répondre car j'étais au fond du jardin quand
ton mail est arrivé...

Je pensais qqchose comme ce qui suit... Mais après test (ci-dessous)
cela ne résout pas le pbm. Du coup j'ai testé le contournement suivant.
Mais il faudrait voir concrètement ton document car la gestion des
champs est différente selon les cas (nombreux type de champs, avec
champ maître ou non, etc.).

merci pour ce code. Ça m'a donné à réfléchir sur la nature du champ que
j'avais inséré, en l'occurrence un champ utilisateur (donc un champ
maître). Du coup j'ai changé mon fusil d'épaule et j'ai choisi d'insérer
une variable (un champ texte) et là ça va beaucoup mieux. Pas encore
parfait mais beaucoup mieux quand même.

Merci encore !