Tu as raison, je m'avais pas osez (de peur que cela fasse repédition) car en fait je n'ai fait que peu de changement.
Code : Tout sélectionner
Declare List_View_API(DossierAPI$)
Declare LoadApiFolder()
Declare selectionner_tout(editor)
Declare Enregistrer_Fiche() ; Format texte
Declare MoveToRecycleBin(Fiche.s)
Declare Suppression(FichierSelect$, mode.l)
; ********* procedure piqué au forum anglais !! ****
Declare Editor_Save(EGid.l,file.s)
Declare Editor_Load(EGid.l, file.s)
Declare StreamFileIn_Callback(hFile, pbBuff, cb, pcb)
Declare StreamFileOut_Callback(hFile, pbBuff, cb, pcb)
;********************non utilisé pour le moment **********
Declare EditorGadgetSelectAll(Gadget_ID) ; selectionne tout
Declare EditorGadgetCOPY(Gadget_ID); copy dans le clip board
Declare EditorGadgetPASTE(Gadget_ID) ; pose dans l'editeur
; ****************************************************
;-constantes
Enumeration
#ApiWin
#ToolBar
#TB_New
#TB_Open
#TB_Save
#TB_Cut
#TB_Copy
#TB_Paste
#TB_Undo
#TB_Redo
#TB_Sel
#TB_Print
#TB_Delete
#TB_Recycle
#String_dossier
#List_View
#Text_String_APIname
#String_APIname
#Panel
#editeur:#editeur1
#API_choisie
#Text_compte_fichiers
#Text_compte_lignes
#bouton
EndEnumeration
#version = "beta 01 - 2007"
#WindowWidth = 795 ; adaptation au 800x600
#WindowHeight = 560
;-Fonts
Global Font0 , Font1,flg
Font0 = LoadFont(0, "courier", 8,#PB_Font_HighQuality)
Font1 = LoadFont(1, "Verdana", 8,#PB_Font_Bold|#PB_Font_HighQuality)
;-variables
Global AppliDir$,RepAPI$,RepAPIsave$
AppliDir$ = GetCurrentDirectory()
If FileSize(AppliDir$+"DossierAPI") = -1
CreateDirectory(AppliDir$+"DossierAPI");Dossier a créer pour contenir ou recevoir les fiches créées
EndIf
RepAPIsave$ = AppliDir$+"DossierAPI\"
;-Fenêtre
ExamineDesktops() ; on se réfère au bureau pour centrer ou non la fenêtre en fonction de sa taille
Largeur$ = Str(DesktopWidth(0))
Hauteur$ = Str(DesktopHeight(0))
If Val(Largeur$)>800 And Val(Hauteur$)>600
FlagWin = #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget |#PB_Window_TitleBar|#PB_Window_MaximizeGadget
Else
FlagWin = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget |#PB_Window_TitleBar|#PB_Window_MaximizeGadget
EndIf
If OpenWindow(#ApiWin,0,0, #WindowWidth, #WindowHeight," API PureViewer "+#version, FlagWin)
SetWindowColor(#ApiWin,RGB(173, 191, 193))
If CreateGadgetList(WindowID(#ApiWin))
StringGadget(#String_dossier,10,25,770,18,"",#PB_String_ReadOnly)
ListViewGadget(#List_View,0,47,200,483)
SetGadgetColor(#List_View,#PB_Gadget_FrontColor,RGB(32, 233, 221))
SetGadgetColor(#List_View,#PB_Gadget_BackColor,RGB(75, 96, 98))
TextGadget(#Text_compte_fichiers,0,530,200,20,"Il y a "+ Str(CountGadgetItems(#List_View))+" fiches API dans ce dossier",#PB_Text_Border)
SetGadgetColor(#Text_compte_fichiers,#PB_Gadget_BackColor,RGB(75, 96, 98))
SetGadgetColor(#Text_compte_fichiers,#PB_Gadget_FrontColor,RGB(208, 219, 220))
PanelGadget(#Panel, 200,47,595,450) ;ajouter pour avoir des onglets
AddGadgetItem(#Panel, -1, "Editeur : ") ;un onglet pour la description de l'API
EditorGadget(#editeur,10,10,570,400)
SendMessage_(GadgetID(#editeur), #EM_SETTARGETDEVICE, #Null, 0);retour à la ligne automatique
; SetGadgetFont(#editeur, Font0)
SetGadgetColor(#editeur, #PB_Gadget_BackColor, RGB(245, 243, 199))
;SetGadgetColor(#editeur, #PB_Gadget_FrontColor, RGB(64, 101, 53))
AddGadgetItem(#Panel, -1, "Code") ; deux onglet pour un exemple de code en PB
EditorGadget(#editeur1,10,10,570,400)
CloseGadgetList()
;EditorGadget(#editeur,200,47,595,450)
TextGadget(#Text_String_APIname,205,532,40,15,"Fichier")
SetGadgetColor(#Text_String_APIname,#PB_Gadget_BackColor,RGB(173, 191, 193))
;SetGadgetColor(#Text_String_APIname,#PB_Gadget_FrontColor,RGB(208, 219, 220))
StringGadget(#String_APIname,245,532,300,16,"",#PB_String_ReadOnly|#PB_Text_Center)
SetGadgetFont(#String_APIname, Font1)
TextGadget(#Text_compte_lignes,545,530,250,20," Cette fiche est composée de "+ Str(CountGadgetItems(#editeur))+" lignes",#PB_Text_Border)
SetGadgetColor(#Text_compte_lignes,#PB_Gadget_BackColor,RGB(75, 96, 98))
SetGadgetColor(#Text_compte_lignes,#PB_Gadget_FrontColor,RGB(208, 219, 220))
ButtonGadget(#bouton,#WindowWidth-100,#WindowHeight-50,50,20,"edite",#PB_Button_Toggle);#PB_Button_Toggle
EndIf
If CreateToolBar(#ToolBar, WindowID(#ApiWin))
ToolBarStandardButton(#TB_New, #PB_ToolBarIcon_New) :ToolBarToolTip(#ToolBar,#TB_New,"Créer une nouvelle fiche")
ToolBarStandardButton(#TB_Open, #PB_ToolBarIcon_Open):ToolBarToolTip(#ToolBar,#TB_Open,"Sélectionner et ouvrir un autre dossier")
ToolBarStandardButton(#TB_Save, #PB_ToolBarIcon_Save):ToolBarToolTip(#ToolBar,#TB_Save,"Enregistrer sous")
ToolBarSeparator()
ToolBarStandardButton(#TB_Cut,#PB_ToolBarIcon_Cut) :ToolBarToolTip(#ToolBar,#TB_Cut,"Couper")
ToolBarStandardButton(#TB_Copy,#PB_ToolBarIcon_Copy) :ToolBarToolTip(#ToolBar,#TB_Copy,"Copier")
ToolBarStandardButton(#TB_Paste,#PB_ToolBarIcon_Paste):ToolBarToolTip(#ToolBar,#TB_Paste,"Coller")
ToolBarSeparator()
ToolBarStandardButton(#TB_Undo,#PB_ToolBarIcon_Undo):ToolBarToolTip(#ToolBar,#TB_Undo,"Annuler")
ToolBarStandardButton(#TB_Redo,#PB_ToolBarIcon_Redo):ToolBarToolTip(#ToolBar,#TB_Redo,"Recommencer")
ToolBarStandardButton(#TB_Sel ,#PB_ToolBarIcon_Find):ToolBarToolTip(#ToolBar,#TB_Sel,"Sélectionner tout dans l'éditeur")
ToolBarSeparator()
ToolBarStandardButton(#TB_Print,#PB_ToolBarIcon_Print):ToolBarToolTip(#ToolBar,#TB_Print,"Imprimer la fiche en cours")
ToolBarSeparator()
ToolBarStandardButton(#TB_Recycle,#PB_ToolBarIcon_Replace):ToolBarToolTip(#ToolBar,#TB_Recycle,"Envoyer la fiche sélectionnée à la corbeille")
ToolBarStandardButton(#TB_Delete ,#PB_ToolBarIcon_Delete) :ToolBarToolTip(#ToolBar,#TB_Delete ,"Supprimer définitivement la fiche sélectionnée")
EndIf
EndIf
btflg=0 ; bouton flag
SetGadgetAttribute(#editeur, #PB_Editor_ReadOnly, 1)
;-Chargement des fiches
Load.l = List_View_API(RepAPIsave$)
If Load = 0 ; si dossier par défaut est vide
LoadApiFolder() ; on relance un chargement de dossier au choix
EndIf
;-Programme
Repeat
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadget() ; Is it a gadget event?
EventType = EventType() ; The event type
;-Menus events
Select Event
Case #PB_Event_Gadget
Select GadgetID
Case #bouton
Beep_(200,200)
If btflg=0
SetGadgetAttribute(#editeur, #PB_Editor_ReadOnly, 0)
btflg=1
Else
SetGadgetAttribute(#editeur, #PB_Editor_ReadOnly, 1)
btflg=0
EndIf
Case #List_View
Select EventType
Case #PB_EventType_LeftClick
ClearGadgetItemList(#editeur)
PosElement = GetGadgetState(#List_View)
NomFichier$ = GetGadgetText(#List_View)
RepAPI$ = GetGadgetText(#String_dossier)
FicheVue$ = RepAPI$ + NomFichier$+".rtf"
If PosElement >= 0
Editor_Load(#editeur, FicheVue$)
SetGadgetText(#Text_compte_lignes," Cette fiche est composée de "+ Str(CountGadgetItems(#editeur))+" lignes")
SetGadgetText(#String_APIname, NomFichier$)
SetGadgetItemText(#Panel, 0, "Editeur : " +NomFichier$);ajouter pour avoir le nom dans l'onglet
Else
MessageRequester("ERREUR","Impossible d'ouvrir ce fichier, il est peut être défectueux.",16)
EndIf
EndSelect
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case #TB_New
ClearGadgetItemList(#editeur)
SetGadgetText(#String_APIname, "Nouvelle fiche")
SetGadgetState(#List_View, -1)
SetGadgetText(#Text_compte_lignes,"")
ApiName$ = InputRequester("Création de fiche", "Donnez un nom à cette fiche","")
If ApiName$
;AddGadgetItem(#List_View, -1, ApiName$) ; qu'on ajoute au listviewgadget()
SetGadgetText(#String_APIname, ApiName$+".rtf")
SetActiveGadget(#editeur)
EndIf
Case #TB_Open
LoadApiFolder()
Case #TB_Save
Enregistrer_Fiche()
Case #TB_Cut
Vide$ = ""
SendMessage_(GadgetID(#editeur),#EM_GETSEL,@StartSel,@EndSel)
Buffer$ = Space(EndSel-StartSel)
SendMessage_(GadgetID(#editeur),#EM_GETSELTEXT,0,@Buffer$)
ClearClipboard()
SetClipboardText(Buffer$)
SendMessage_(GadgetID(#editeur),#EM_REPLACESEL,#True,@Vide$)
SetGadgetText(#Text_compte_lignes," Cette fiche est composée de "+ Str(CountGadgetItems(#editeur))+" lignes")
Case #TB_Copy
SendMessage_(GadgetID(#editeur),#EM_GETSEL,@StartSel,@EndSel)
Buffer$ = Space(EndSel-StartSel)
SendMessage_(GadgetID(#editeur),#EM_GETSELTEXT,0,@Buffer$)
ClearClipboard()
EditorGadgetCOPY(#editeur)
Case #TB_Paste
SetGadgetText(#Text_compte_lignes," Cette fiche est composée de "+ Str(CountGadgetItems(#editeur))+" lignes")
EditorGadgetPASTE(#editeur)
Case #TB_Undo : SendMessage_(GadgetID(#editeur),#EM_UNDO,0,0)
SetGadgetText(#Text_compte_lignes," Cette fiche est composée de "+ Str(CountGadgetItems(#editeur))+" lignes")
Case #TB_Redo : SendMessage_(GadgetID(#editeur),#EM_REDO,0,0)
SetGadgetText(#Text_compte_lignes," Cette fiche est composée de "+ Str(CountGadgetItems(#editeur))+" lignes")
Case #TB_Sel : selectionner_tout(#editeur)
Case #TB_Print ; impression à faire, j'ai la flemme et pas le temps maintenant...
Case #TB_Recycle
If GetGadgetText(#String_APIname)=""
MessageRequester("ERREUR","Il n'y a pas de fichier sélectionné",#MB_ICONEXCLAMATION)
Else
Selection$ = GetGadgetText(#String_dossier)+GetGadgetText(#String_APIname)+".rtf"
Suppression(Selection$, 1) ; mode corbeille
EndIf
Case #TB_Delete
If GetGadgetText(#String_APIname)=""
MessageRequester("ERREUR","Il n'y a pas de fichier sélectionné",#MB_ICONEXCLAMATION)
Else
Selection$ = GetGadgetText(#String_dossier)+GetGadgetText(#String_APIname)+".rtf"
Suppression(Selection$, 0) ; mode suppression directe
EndIf
;-Fin
EndSelect
; Case #WM_SIZE
Case #PB_Event_CloseWindow :Quitter = 1
EndSelect
Until Quitter
End
Procedure List_View_API(DossierAPI$) ;CHARGEMENT DES FICHES TROUVEES DANS LE DOSSIER
NbFiles = 0 ; initialisation du compte total
If ExamineDirectory(0, DossierAPI$, "*.*") ; on examine tout le dossier
Chemin$ = GetPathPart(DossierAPI$)
SetGadgetText(#String_dossier,Chemin$)
Repeat
FileType = NextDirectoryEntry(0)
If FileType
FileName$ = DirectoryEntryName(0)
If FileName$ <> "." And FileName$ <> ".."
Ext$ = GetExtensionPart(FileName$)
If Ext$ = "rtf" ; on recherche les deux types Ext$ = "txt" Or
FileName2$=Left(FileName$,Len(FileName$)-4)
AddGadgetItem(#List_View, -1, FileName2$) ; qu'on ajoute au listviewgadget()
NbFiles = NbFiles + 1 ; à chaque élément trouvés on incrémente de 1 pour compter le tout
EndIf
EndIf
EndIf
Until FileType = 0
SetGadgetState(#List_View, -1)
ClearGadgetItemList(#editeur)
SetGadgetText(#String_APIname,"")
Else
MessageRequester("Erreur","Impossible d'examiner le répertoire: "+Chr(10)+ DossierAPI$,64)
EndIf
SetGadgetText(#Text_compte_fichiers,"Il y a "+ Str(CountGadgetItems(#List_View))+" fiches API dans ce dossier")
ProcedureReturn NbFiles
EndProcedure
Procedure LoadApiFolder()
If DefautRepAPI$ = ""
DefautRepAPI$ = "c:\"
EndIf
NewRepAPI$ = PathRequester("Sélectionner un dossier", DefautRepAPI$)
If NewRepAPI$
ClearGadgetItemList(#List_View)
ClearGadgetItemList(#editeur)
SetGadgetState(#List_View, -1)
SetGadgetText(#String_APIname,"")
List_View_API(NewRepAPI$)
DefautRepAPI$ = NewRepAPI$
EndIf
EndProcedure
Procedure selectionner_tout(editor)
range.CHARRANGE\cpMin = 0
range\cpMax = -1
ProcedureReturn SendMessage_(GadgetID(editor),#EM_EXSETSEL,0,@range)
EndProcedure
Procedure Enregistrer_Fiche() ; Format texte
ApiFile$ = GetGadgetText(#String_APIname)
If ApiFile$ = ""
MessageRequester("ERREUR","Il n'y a rien à enregistrer!"+Chr(13)+"Vous devez d'abord créer ou modifier la fiche pour la sauvegarder.",#MB_ICONEXCLAMATION)
Else
fichier.s = SaveFileRequester("Enregistrer une fiche",RepAPIsave$+ApiFile$,"Fichier Texte |*.rtf", 0); enregistrement dans le dossier par défaut avec nom de fiche en cours
If fichier = ""
Else
If GetExtensionPart(fichier) = ""
fichier = fichier + ".rtf"
EndIf
api.s = GetFilePart(fichier.s)
EnregistreFichier = #True
If FileSize(fichier.s)>0
Reponse = MessageRequester("Cette fiche existe déjà !","Voulez vous remplacer la fiche : " + api +" ?" ,#MB_ICONEXCLAMATION |#PB_MessageRequester_YesNo )
If Reponse <> 6
EnregistreFichier = #False
EndIf
EndIf
EndIf
If EnregistreFichier
Editor_Save(#editeur,fichier.s)
FileName2$=GetFilePart(fichier.s)
FileName2$=Left( FileName2$,Len(FileName2$)-4)
AddGadgetItem(#List_View, -1, FileName2$) ; qu'on ajoute au listviewgadget()
EndIf
EndIf
EndProcedure
Procedure MoveToRecycleBin(Fiche.s)
Protected lpFileOp.SHFILEOPSTRUCT
If FileSize(Fiche) <> - 1
*Mem = AllocateMemory(Len(Fiche) + 2)
If *Mem
lpFileOp\hwnd = 0
lpFileOp\pTo = 0
lpFileOp\wFunc = #FO_DELETE
lpFileOp\pFrom = *Mem
lpFileOp\fFlags = #FOF_ALLOWUNDO | #FOF_NOCONFIRMATION
CopyMemoryString(Fiche, @*Mem)
CopyMemoryString(Chr(0))
CopyMemoryString(Chr(0))
retour=SHFileOperation_(@lpFileOp)
If retour=0 : retour=1 : Else : retour =0 : EndIf
ProcedureReturn retour
FreeMemory(*Mem)
EndIf
EndIf
EndProcedure
Procedure Suppression(FichierSelect$, mode.l) ; une seule procedure pour 2 modes de suppression
If mode = 0
mode$ = "SI VOUS CLIQUEZ SUR OUI LE FICHIER SERA DEFINITIVEMENT SUPPRIME !"
ElseIf mode = 1
mode$ = "SI VOUS CLIQUEZ SUR OUI LE FICHIER SERA ENVOYE A LA CORBEILLE !"
EndIf
NumElement = GetGadgetState(#List_View)
Resultat = MessageRequester("AVERTISSEMENT","VOUS ETES SUR LE POINT DE SUPPRIMER UNE FICHE!"+Chr(13)+""+Chr(13)+"VOULEZ VOUS CONTINUER ?"+Chr(13)+""+Chr(13)+"SI VOUS N'ÊTES PAS SÛR CLIQUEZ SUR NON"+Chr(13)+""+Chr(13)+mode$,#MB_ICONEXCLAMATION | #PB_MessageRequester_YesNo)
If Resultat = 6
;on a cliqué sur oui
If mode = 0
If DeleteFile(FichierSelect$)<>0
If NumElement<>-1
RemoveGadgetItem(#List_View, NumElement)
EndIf
ClearGadgetItemList(#editeur)
SetGadgetText(#String_APIname, "")
SetGadgetState(#List_View, -1)
SetGadgetText(#Text_compte_lignes,"")
SetGadgetText(#Text_compte_fichiers,"Il y a "+ Str(CountGadgetItems(#List_View))+" fiches API dans ce dossier")
Else
MessageRequester("ERREUR","Le fichier n'a pu être effacé!",#MB_ICONERROR)
EndIf
ElseIf mode = 1
If MoveToRecycleBin(FichierSelect$)
If NumElement<>-1
RemoveGadgetItem(#List_View, NumElement)
EndIf
ClearGadgetItemList(#editeur)
SetGadgetText(#String_APIname, "")
SetGadgetState(#List_View, -1)
SetGadgetText(#Text_compte_lignes,"")
SetGadgetText(#Text_compte_fichiers,"Il y a "+ Str(CountGadgetItems(#List_View))+" fiches API dans ce dossier")
Else
MessageRequester("ERREUR","Le fichier n'a pu être effacé!",#MB_ICONERROR)
EndIf
EndIf
ElseIf Resultat = 7
;on a cliqué sur non, donc rien.
EndIf
EndProcedure
Procedure Editor_Save(EGid.l,file.s)
Protected StreamData.EDITSTREAM
Protected FileID.l
If file <> ""
FileID = CreateFile(#PB_Any, file)
If FileID
StreamData\dwCookie = FileID(FileID)
StreamData\dwError = #Null
StreamData\pfnCallback = @StreamFileOut_Callback()
If UCase(GetExtensionPart(file)) = "RTF"
SendMessage_(GadgetID(EGid), #EM_STREAMOUT, #SF_RTF, @StreamData)
Else
SendMessage_(GadgetID(EGid), #EM_STREAMOUT, #SF_TEXT, @StreamData)
EndIf
CloseFile(FileID)
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure Editor_Load(EGid.l, file.s)
Protected StreamData.EDITSTREAM
Protected FileID.l
FileID = ReadFile(#PB_Any, file)
If FileID
StreamData\dwCookie = FileID(FileID)
StreamData\dwError = #Null
StreamData\pfnCallback = @StreamFileIn_Callback()
If UCase(GetExtensionPart(file)) = "RTF"
SendMessage_(GadgetID(EGid), #EM_STREAMIN, #SF_RTF, @StreamData)
Else
SendMessage_(GadgetID(EGid), #EM_STREAMIN, #SF_TEXT, @StreamData)
EndIf
CloseFile(FileID)
EndIf
EndProcedure
Procedure StreamFileIn_Callback(hFile, pbBuff, cb, pcb)
ProcedureReturn ReadFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure
Procedure StreamFileOut_Callback(hFile, pbBuff, cb, pcb)
ProcedureReturn WriteFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure
Procedure EditorGadgetSelectAll(Gadget_ID)
; Select the whole Text of the EditorGadget
RangeAll.CHARRANGE\cpMin = 0
RangeAll\cpMax = -1
ProcedureReturn SendMessage_(GadgetID(Gadget_ID),#EM_EXSETSEL,0,@RangeAll) ; Select All
EndProcedure
Procedure EditorGadgetCOPY(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID), #WM_COPY, 0, 0)
EndProcedure
Procedure EditorGadgetPASTE(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID), #EM_PASTESPECIAL, 0, 0)
EndProcedure
Affiché le l'exemple de l'utilisation de l'API dans le deuxiéme onglet, me parais un plus au niveau de la lisibilité.
Car si l'on devais visualisé l'exemple a la suite de la description de l'API cela serais certainement non fonctionnel !
Le problême serait, je pense de savoir si l'exemple d'utilisation de l'API doit être dans deux fichiers distingue (1 pour la description de L'API, l'autre pour l'exemple) ou bien un seule fichier (dans ce cas prévoir un moyen lors de la lecture du fichier de séparer la description de l'API (affichage dans le 1er onglet, et l'exemple affichage dans le 2eme onglet)