Page 1 sur 1

Plier du texte dans un editor gadget.

Publié : mar. 13/sept./2011 10:05
par hackotedelaplaque
Bonjour,

Cela fait une eternité que je n´ai plus posté ici mais je n´ai pas cessé de coder sur pb depuis.

Actuellement je développe un éditeur de texte. On passe au logiciel un fichier binaire et depuis une table de caractère l´editor gadget affiche du texte intelligible.
Je souhaite ajouter un système de pliage et depliage du texte par double clic. Par exemple si on double clic sur le mot "pause" l´expression se deplie en "pause de 10 secondes”.
Y´a t il un moyen de faire ça avec l´API windows?
Je précise que je ne souhaite pas basculer sur scintilla car j´exploite la fonction de mise en forme rtf de l´éditeur classique.

Merci de votre aide car là je sèche.

Re: Plier du texte dans un editor gadget.

Publié : mar. 13/sept./2011 10:23
par falsam
Bonjour,
dans ton exemple de Pause, pause de 10 secondes est une valeur fixe stockée dans une table ou une liste ou autres ?

Re: Plier du texte dans un editor gadget.

Publié : mar. 13/sept./2011 12:21
par hackotedelaplaque
Pour préciser, ”pause” est un code de controle de texte qui équivaut au word hexa 14BE et qui prend un argument le word suivant).
Depuis une table le programme lit BE14 et affiche dans l´editeur <pause>. Je voudrai qu´en double cliquant dessus il développe en <pause de XXXXh secondes>.

Les textes longs et courts sont stockés dans une liste chaînée de tyoe code à 2 champs de texte.

Re: Plier du texte dans un editor gadget.

Publié : mar. 13/sept./2011 21:40
par falsam
Le double-click n'étant pas détecter dans les évènements avec l'editorgadget, j'utilise un boutongadget pour illustrer ta demande.

Comment ce code fonctionne ?
Tu doubles-click gauche sur le mot que tu souhaites déplier.
Le programme se charge de copier en mémoire ce que tu as sélectionner puis compare cette sélection avec un référentiel. Si trouver, ce résultat est copié en mémoire puis collé à la place de la sélection.

Code : Tout sélectionner

Enumeration 
  #mainform
  #editor
  #Go
EndEnumeration

;Structure pour le referenciel de mots
Structure sWords
  key.s
  Dependence.s
EndStructure

;Buffer de comparaison avec le référenciel
Buffer.s

;//Quelques mots clé
Dim words.sWords(10)

words(0)\key="B10"
words(0)\Dependence="Pause de 10 secondes"

words(1)\key="B11"
words(1)\Dependence="Je prends un café"

words(2)\key="B12"
words(2)\Dependence="Touché coulé"

;Fenetre principale
OpenWindow(#mainform, 0, 0, 500, 500, "Pliage/dépliage", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(#Go, 5, 10, 24, 24, "Go")
EditorGadget(#editor, 5, 40, 490, 420)

;Evitons les mauvais effets de la touche tabulation
RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)

SetActiveGadget(#Editor)

Repeat
  Event=WaitWindowEvent()
  Select Event
    Case #PB_Event_Menu
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #editor
          
        Case #Go         
          ;Copy de la selection
          SendMessage_(GadgetID(#Editor), #WM_COPY,0,0)
          
          ;Que l'on stocke dans un buffer
          ;aprés transformation en majuscule
          Buffer=UCase(GetClipboardText())
          
          ;Qui est Rapproché avec le referentiel
          For i =0 To 2
           If words(i)\key = Trim(Buffer)
             SetClipboardText(words(i)\Dependence)
             SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
           EndIf
           
           If UCase(words(i)\Dependence) = Trim(Buffer)
             SetClipboardText(words(i)\key)
             SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
           EndIf
      
          Next         
      EndSelect
      
      Case #PB_Event_CloseWindow
        End
  EndSelect      
ForEver

Re: Plier du texte dans un editor gadget.

Publié : mer. 14/sept./2011 17:53
par hackotedelaplaque
C'est pas mal du tout comme solution ce que tu proposes. Si je remplace le bouton par un menu contextuel via le click droit ça peut même être suffisamment ergonomique.
Je te remercie.

Re: Plier du texte dans un editor gadget.

Publié : mer. 14/sept./2011 21:13
par falsam
Tu peux aussi mettre en place une touche de raccourci lié à la fenêtre.
Le code dans ce cas :

Code : Tout sélectionner

Enumeration 
  #mainform
  #editor
  #Go
  
  #Kbd_F4
EndEnumeration

;Structure pour le referenciel de mots
Structure sWords
  key.s
  Dependence.s
EndStructure
Global Dim words.sWords(10)

;Buffer de comparaison avec le référenciel
Global Buffer.s


Procedure OpenCloseBbracket()
  ;Copy de la selection
  SendMessage_(GadgetID(#Editor), #WM_COPY,0,0)
        
  ;Que l'on stocke dans un buffer
  ;aprés transformation en majuscule
  Buffer=UCase(GetClipboardText())
          
  ;Qui est Rapproché avec le referentiel
  For i =0 To 2
    If words(i)\key = Trim(Buffer)
      SetClipboardText(words(i)\Dependence)
      SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)  
    EndIf
           
    If UCase(words(i)\Dependence) = Trim(Buffer)
      SetClipboardText(words(i)\key)
      SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
    EndIf  
  Next         
 
EndProcedure

;//Quelques mots clé
words(0)\key="B10"
words(0)\Dependence="Pause de 10 secondes"

words(1)\key="B11"
words(1)\Dependence="Je prends un café"

words(2)\key="B12"
words(2)\Dependence="Touché coulé"

;Fenetre principale
OpenWindow(#mainform, 0, 0, 500, 500, "Pliage/dépliage", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(#Go, 5, 10, 24, 24, "Go")
EditorGadget(#editor, 5, 40, 490, 420)

;Evitons les mauvais effets de la touche tabulation
RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)


;Touche F5 à la place du bouton
AddKeyboardShortcut(#mainform, #PB_Shortcut_F4, #Kbd_F4)  

SetActiveGadget(#Editor)

Repeat
  Event=WaitWindowEvent()
  Select Event
    Case #PB_Event_Menu
      If EventMenu()=#Kbd_F4
        OpenCloseBbracket()
      EndIf
      
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #editor
          
        Case #Go
          OpenCloseBbracket()
          
      EndSelect
      
      Case #PB_Event_CloseWindow
        End
  EndSelect      
ForEver