
PureASM 1.0
Oui Denis,
j'avais fait la modifie plus haut
j'avais fait la modifie plus haut

Code : Tout sélectionner
fileASM.s = PureBasicRepertoire+"Compilers\PureBasic.asm"
Une fois le problème "Compilers\" résolut sur mon deuxième ordinateur, ça marche impeccable. Maintenant je n'ai plus aucun ordinateur où ça ne fonctionne pas... Donc, je vais avoir du mal à trouver le problème
j'espère que ça ne va pas te décourager et que tu finiras par trouver la solution car c'est un outil qui met très utile, ça serait dommage que tu n'en profites pas. 


Voici la version 1.1 qui marche sur mes deux ordi, avec l'astuce de Denis pour ne pas voir l'exe, plus ouverture des fichiers ASM (la colorisation n'est prevu que pour les fichiers généré par le compilateur PB)
Partie 1 :
Partie 1 :
Code : Tout sélectionner
;/
;/ - PureASM 1.1 - Programme Eric Ducoulombier ( Erix14 )
;/ Windows XP SP2 - PureBasic 3.92 - jaPBe 2.4.9.25
;/ 12/11/2004
;/
Enumeration
#IDM_FILE_NEW
#IDM_FILE_OPEN
#IDM_FILE_OPEN_ASM
#IDM_FILE_SAVE
#IDM_EDIT_CUT
#IDM_EDIT_COPY
#IDM_EDIT_PASTE
#IDM_EDIT_DELETE
#IDM_EDIT_SELECTALL
#IDM_EDIT_UNDO
#IDM_EDIT_REDO
#OPTIONS
#COMPILER
#MENU_QUITTER
#IDM_EDIT_COMPIL
#IDM_HELP_ABOUT
EndEnumeration
#Longueur = 800
#Largeur = 600
#WM_MOUSEWHEEL = $20A
#CDDS_ITEM = $10000
#CDDS_SUBITEM = $20000
#CDDS_PREPAINT = $1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM | #CDDS_ITEMPREPAINT
#CDRF_NEWFONT = $2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_NOTIFYSUBITEMDRAW = $20
#PROCESS32LIB = 0
#TH32CS_SNAPPROCESS = 2
#ERROR_ALREADY_EXISTS = $B7
Structure PROCESSENTRY32
dwSize.l
cntUsage.l
th32ProcessID.l
*th32DefaultHeapID.l
th32ModuleID.l
cntThreads.l
th32ParentProcessID.l
pcPriClassBase.l
dwFlags.l
szExeFile.b[#MAX_PATH]
EndStructure
Structure Editeur
Handle.l
OldCallback.l
EndStructure
Structure ListeSLV
Texte.s
Ligne.l
Index.b
type.b
EndStructure
NewList Process32.PROCESSENTRY32 ()
Global ToolBarHeight,StatusBarHeight,StatusBar,MenuBar,ToolBar,hwnd,Splitter,PanelCode,PanelSignet
Global TexteHeight,MaxLignePage,NombreDeLignes,TotalLignesVisible,AncienDebutLigne,Editor_RunOnceMessage
Global RTF.s,ThumbTrack,SplitterPos,*RTF.BYTE,*Texte.BYTE,Mot$,CouleurRTF,LongMot,OldPanelCallBack,ListeSignet
Global ListeSignetID,ListeLabelID,ListeVariableID,OldSplitterCallBack,hFont,IndexRTF,OldSLVCallBack,PureBasicRepertoire.s
Global SplitterMove,SplitterAction,NoPaintPanel,NoPaintSignet
NewList hEditeur.Editeur()
NewList Code.s()
NewList Registre.s()
NewList ListeSLV.ListeSLV()
NewList ListeS.ListeSLV()
NewList ListeL.ListeSLV()
NewList ListeV.ListeSLV()
RTF = "{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Verdana;}}"
RTF + "{\colortbl ;\red250\green250\blue250;"; Couleur commentaire
RTF + "\red100\green250\blue100;"; Couleur registre
RTF + "\red250\green100\blue100;"; Couleur code
RTF + "\red100\green100\blue250;"; Couleur nombre
RTF + "\red250\green100\blue0;"; Couleur séparateur
RTF + "\red200\green200\blue0;"; Couleur "Texte"
RTF + "\red128\green128\blue128;}"; Couleur normal
RTF + "\viewkind4\uc1\pard\f0\fs20 "
Procedure CopieMot(Couleur)
If CouleurRTF <> Couleur
CopyMemoryString("\cf"+Str(Couleur)+" "+Mot$) : LongMot = 0 : CouleurRTF = Couleur
Else : CopyMemoryString(Mot$) : LongMot = 0
EndIf
!MOV dword[v_Mot$],0; Mot$ = ""
EndProcedure
Procedure ColoriserTexte()
CopyMemoryString(RTF, @*RTF)
CouleurRTF = 0 : LigneRTF = 0
While *Texte\b<>0
c = *Texte\b & $FF
If c < 9 : *Texte + 1 : Continue : EndIf
If c=10 Or c=13
If Commentaire = #True
If ListeSignet
ListeSignet = #False
ListeSLV()\Ligne = LigneRTF
ListeSLV()\Index = IndexRTF
ListeSLV()\type = 1
EndIf
CopyMemoryString("\line ") : LigneRTF + 1 : Commentaire = #False
While *Texte\b<=32 : *Texte + 1 : Wend
Continue
EndIf
If LongMot > 0
*n.BYTE = @Mot$ + LongMot - 1
If *n\b = ':'
AddElement(ListeSLV())
ListeSLV()\Texte = Mid(Mot$,1,LongMot-1)
ListeSLV()\Ligne = LigneRTF
ListeSLV()\Index = IndexRTF
ListeSLV()\type = 2
EndIf
*n.BYTE = @Mot$
UnNombre = #True
For t=1 To LongMot
If *n\b > 57 Or *n\b < 48 : UnNombre = #False : Break : EndIf
Next
If UnNombre : CopieMot(4)
ElseIf LongMot <= 7
MotBis$ = UCase(Mot$)
ForEach Code()
If MotBis$=Code()
If CouleurRTF <> 3
CopyMemoryString(Chr(9)+"\cf3 "+MotBis$) : LongMot = 0 : CouleurRTF = 3
Else : CopyMemoryString(Chr(9)+MotBis$) : LongMot = 0
EndIf
!MOV dword[v_Mot$],0
Break
EndIf
Next
If LongMot > 0
ForEach Registre()
If MotBis$=Registre() : CopieMot(2) : Break : EndIf
Next
EndIf
If LongMot > 0 : CopieMot(7) : EndIf
Else : CopieMot(7)
EndIf
EndIf
CopyMemoryString("\line ") : LigneRTF + 1
While *Texte\b<=32 : *Texte + 1 : Wend
If CompareMemoryString(*Texte,"v_",1,2) = 0 : Variable = #True : EndIf
Continue
EndIf
If c='\' Or c='{' Or c='}'
CopyMemoryString("\"+Chr(c))
*Texte + 1 : Continue
EndIf
If c=';' And DataTexte=#False And Commentaire = #False
Commentaire = #True
If CouleurRTF <> 1 : CopyMemoryString("\cf1 ") : CouleurRTF = 1 : EndIf
If CompareMemoryString(*Texte,"; Procedure ",1,12) = 0 Or CompareMemoryString(*Texte,"; Procedure.",1,12) = 0
AddElement(ListeSLV())
ListeSignet = #True
CopyMemoryString("; Procedure") : *Texte + 10
While *Texte\b<>32 : *Texte + 1 : CopyMemoryString(Chr(*Texte\b & $FF)) : Wend : Continue
ElseIf CompareMemoryString(*Texte,";-",1,2) = 0
AddElement(ListeSLV()) : ListeSLV()\Texte = "> "
ListeSignet = #True
CopyMemoryString(";-") : *Texte + 2
While *Texte\b=32 : CopyMemoryString(Chr(*Texte\b & $FF)) : *Texte + 1 : Wend : Continue
EndIf
CopyMemoryString(";")
*Texte + 1 : Continue
EndIf
If c='"' And Commentaire=#False
If DataTexte = #False
If CouleurRTF <> 6
CopyMemoryString("\cf6 "+Chr(c)) : LongMot = 0 : CouleurRTF = 6
Else : CopyMemoryString(Chr(c)) : LongMot = 0
EndIf
*Texte + 1 : DataTexte = #True : Continue
Else
CopyMemoryString(Chr(c))
*Texte + 1 : DataTexte = #False : Continue
EndIf
EndIf
If ListeSignet
ListeSLV()\Texte + Chr(c)
CopyMemoryString(Chr(c))
*Texte + 1 : Continue
EndIf
If DataTexte Or Commentaire
CopyMemoryString(Chr(c))
*Texte + 1 : Continue
EndIf
If c=' ' Or c=',' Or c='(' Or c=')' Or c='[' Or c=']' Or c='+' Or c='-' Or c=9
If LongMot > 0
If Variable
Variable = #False
AddElement(ListeSLV())
ListeSLV()\Texte = Mid(Mot$,3,LongMot-2)
ListeSLV()\Index = IndexRTF
ListeSLV()\type = 3
EndIf
*n.BYTE = @Mot$
UnNombre = #True
For t=1 To LongMot
If *n\b > 57 Or *n\b < 48 : UnNombre = #False : Break : EndIf
*n + 1
Next
If UnNombre : CopieMot(4)
ElseIf LongMot <= 7
MotBis$ = UCase(Mot$)
ForEach Code()
If MotBis$=Code()
If CouleurRTF <> 3
CopyMemoryString(Chr(9)+"\cf3 "+MotBis$) : LongMot = 0 : CouleurRTF = 3
Else : CopyMemoryString(Chr(9)+MotBis$) : LongMot = 0
EndIf
!MOV dword[v_Mot$],0
Break
EndIf
Next
If LongMot > 0
ForEach Registre()
If MotBis$=Registre() : CopieMot(2) : Break : EndIf
Next
EndIf
If LongMot > 0 : CopieMot(7) : EndIf
Else : CopieMot(7)
EndIf
EndIf
If (CouleurRTF <> 5) And (c <> ' ') And (c <> ',')
CopyMemoryString("\cf5 "+Chr(c)) : LongMot = 0 : CouleurRTF = 5
Else : CopyMemoryString(Chr(c)) : LongMot = 0
EndIf
*Texte + 1 : Continue
Else
Mot$ + Chr(c) : LongMot + 1 : *Texte + 1
EndIf
Wend
CopyMemoryString("}")
EndProcedure
Procedure EnleveTabulation(GadgetID)
SetWindowLong_(GadgetID, #GWL_STYLE, GetWindowLong_(GadgetID, #GWL_STYLE) & ~ #WS_TABSTOP)
EndProcedure
Procedure.s CheminPureBasic()
Buffer$=Space(10000):BufferSize=Len(Buffer$)-1
If GetVersion_() & $FF0000 ; Windows NT/XP
If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Applications\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS , @Key) = #ERROR_SUCCESS
If RegQueryValueEx_(Key, "", 0, @type, @Buffer$, @BufferSize) = #ERROR_SUCCESS
OutputDirectory$ = GetPathPart(Mid(Buffer$, 2, Len(Buffer$)-7))
EndIf
EndIf
Else ; La même chose pour Win9x
If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS , @Key) = #ERROR_SUCCESS
If RegQueryValueEx_(Key, "", 0, @type, @Buffer$, @BufferSize) = #ERROR_SUCCESS
OutputDirectory$ = GetPathPart(Mid(Buffer$, 2, Len(Buffer$)-7))
EndIf
EndIf
EndIf
ProcedureReturn OutputDirectory$
EndProcedure
Procedure GetTextHeight(hDC)
PrevMapMode = SetMapMode_(hDC,#MM_TEXT)
GetTextMetrics_(hDC,tm.textmetric)
If PrevMapMode : SetMapMode_(hDC,PrevMapMode) : EndIf
ProcedureReturn tm\tmHeight
EndProcedure
Procedure GetPanelDisplayWindowID(gadget,Item)
tc_item.TC_ITEM
tc_item\Mask = #TCIF_PARAM
SendMessage_(GadgetID(gadget),#tcm_getitem,Item,tc_item)
ProcedureReturn tc_item\lParam
EndProcedure
Procedure GetInnerSizeWidth(gadget)
GetWindowRect_(GetPanelDisplayWindowID(gadget,GetGadgetState(gadget)),rect.RECT)
ProcedureReturn rect\right-rect\left
EndProcedure
Procedure GetInnersizeHeight(gadget)
GetWindowRect_(GetPanelDisplayWindowID(gadget,GetGadgetState(gadget)),rect.RECT)
ProcedureReturn rect\bottom-rect\top
EndProcedure
Procedure Editor_Color(hGadget, Color.l)
format.CHARFORMAT
format\cbSize = SizeOf(CHARFORMAT)
format\dwMask = #CFM_COLOR
format\crTextColor = Color
SendMessage_(hGadget, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure
Procedure Editor_FontSize(hGadget, FontSize.l)
format.CHARFORMAT
format\cbSize = SizeOf(CHARFORMAT)
format\dwMask = #CFM_SIZE
format\yHeight = FontSize*20
SendMessage_(hGadget, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure
Procedure Editor_Font(hGadget, FontName.s)
format.CHARFORMAT
format\cbSize = SizeOf(CHARFORMAT)
format\dwMask = #CFM_FACE
PokeS(@format\szFaceName, FontName)
SendMessage_(hGadget, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure
; #CFM_BOLD #CFM_ITALIC #CFM_UNDERLINE #CFM_STRIKEOUT
Procedure Editor_Format(hGadget, Flags.l)
format.CHARFORMAT
format\cbSize = SizeOf(CHARFORMAT)
format\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE
format\dwEffects = Flags
SendMessage_(hGadget, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure
Procedure Editor_Locate(hGadget,X,Y)
reg = hGadget
CharIdx = SendMessage_(reg,#EM_LINEINDEX,Y-1,0)
LLength = SendMessage_(reg,#EM_LINELENGTH,CharIdx,0)
If LLength >= X-1 : CharIdx + X-1 : EndIf
Range.CHARRANGE
Range\cpMin = CharIdx
Range\cpMax = CharIdx
SendMessage_(reg,#EM_EXSETSEL,0,Range)
EndProcedure
Procedure Editor_Select(hGadget,LineStart.l, CharStart.l, LineEnd.l, CharEnd.l)
sel.CHARRANGE
sel\cpMin = SendMessage_(hGadget, #EM_LINEINDEX, LineStart, 0) + CharStart - 1
If LineEnd = -1 : LineEnd = SendMessage_(hGadget, #EM_GETLINECOUNT, 0, 0)-1 : EndIf
sel\cpMax = SendMessage_(hGadget, #EM_LINEINDEX, LineEnd, 0)
If CharEnd = -1 : sel\cpMax + SendMessage_(hGadget, #EM_LINELENGTH, sel\cpMax, 0)
Else : sel\cpMax + CharEnd - 1
EndIf
SendMessage_(hGadget, #EM_EXSETSEL, 0, @sel)
EndProcedure
Procedure EditorGadgetCursorX(hGadget)
SendMessage_(hGadget,#EM_EXGETSEL,0,Range.CHARRANGE)
ProcedureReturn (Range\cpMax-(SendMessage_(hGadget,#EM_LINEINDEX,SendMessage_(hGadget,#EM_EXLINEFROMCHAR,0,Range\cpMin),0))+1)
EndProcedure
Procedure EditorGadgetCursorY(hGadget)
SendMessage_(hGadget,#EM_EXGETSEL,0,Range.CHARRANGE)
ProcedureReturn SendMessage_(hGadget,#EM_EXLINEFROMCHAR,0,Range\cpMin)+1
EndProcedure
Procedure AfficheNumeroLigne()
DebutLigne = SendMessage_(hEditeur()\Handle, #EM_GETFIRSTVISIBLELINE, 0, 0)+1
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
hDC = GetDC_(hEditeur()\Handle)
SelectObject_(hDC,hFont)
SetBkColor_(hDC,RGB(150,200,250))
SetTextColor_(hDC, RGB(50,50,50))
GetClientRect_(hEditeur()\Handle, EditeurRect.RECT)
lastline = TotalLignesVisible+DebutLigne
EditeurRect\right = 64
EditeurRect\top + 1
While DebutLigne<=lastline
If DebutLigne>NombreDeLignes
DrawText_(hDC, " ", -1, EditeurRect, #DT_RIGHT)
Else : DrawText_(hDC, " "+Str(DebutLigne)+" ", -1, EditeurRect, #DT_RIGHT)
EndIf
EditeurRect\top + TexteHeight
DebutLigne+1
Wend
ReleaseDC_(hEditeur()\Handle, hDC)
EndProcedure
Procedure EditeurCallback(WindowId, message, wParam, lParam)
Select message
Case #WM_PAINT
AfficheNumeroLigne()
GetClientRect_(hEditeur()\Handle, EditeurRect.RECT)
EditeurRect\right = 64
ValidateRect_(hEditeur()\Handle,@EditeurRect)
StatusBarText( 0, 0, " "+Str(EditorGadgetCursorX(hEditeur()\Handle))+" : "+Str(EditorGadgetCursorY(hEditeur()\Handle)), #PB_StatusBar_Raised)
Result = CallWindowProc_(hEditeur()\OldCallback, WindowId, message, wParam, lParam)
Case #WM_VSCROLL
wLow = PeekW(@wParam) : wHi = PeekW(@wParam+2)
Select wLow
Case #SB_TOP
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,-PremiereLigneVisible)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #SB_BOTTOM
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,NombreDeLignes-TotalLignesVisible-PremiereLigneVisible)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #SB_LINEUP
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,-1)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #SB_LINEDOWN
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,1)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #SB_PAGEUP
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,1-TotalLignesVisible)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #SB_PAGEDOWN
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
If (PremiereLigneVisible+TotalLignesVisible-1)>(NombreDeLignes-TotalLignesVisible)
TotalLignes = NombreDeLignes-TotalLignesVisible-PremiereLigneVisible
Else : TotalLignes = TotalLignesVisible
EndIf
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,TotalLignes-1)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #SB_THUMBPOSITION
ThumbTrack = #False
Case #SB_THUMBTRACK
If ThumbTrack
VSB.SCROLLINFO
VSB\cbSize = SizeOf(SCROLLINFO)
VSB\fMask =#SIF_ALL
GetScrollInfo_(hEditeur()\Handle,#SB_VERT,VSB)
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
PremiereLigneVisible = (VSB\nTrackPos*NombreDeLignes)/VSB\nMax
If AncienDebutLigne <> PremiereLigneVisible
Difference = PremiereLigneVisible - AncienDebutLigne
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,Difference)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
EndIf
Else : ThumbTrack = #True
EndIf
EndSelect
Result = 0
Case #WM_MOUSEWHEEL
Difference = -(wParam>>16)/40
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
While (PremiereLigneVisible+TotalLignesVisible+Difference) > NombreDeLignes : Difference - 1 : Wend
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,Difference)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Result = 0
Case #WM_KEYDOWN
Select wParam
Case #VK_RETURN
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Result = CallWindowProc_(hEditeur()\OldCallback, WindowId, message, wParam, lParam)
Case #VK_CLEAR Or #VK_DELETE
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #VK_PRIOR
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,1-TotalLignesVisible)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Result = 0
Case #VK_NEXT
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
If (PremiereLigneVisible+TotalLignesVisible-1)>(NombreDeLignes-TotalLignesVisible)
TotalLignes = NombreDeLignes-TotalLignesVisible-PremiereLigneVisible
Else : TotalLignes = TotalLignesVisible
EndIf
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,TotalLignes-1)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Result = 0
Case #VK_HOME
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,-PremiereLigneVisible)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case #VK_END
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,NombreDeLignes-TotalLignesVisible-PremiereLigneVisible)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Default
Result = CallWindowProc_(hEditeur()\OldCallback, WindowId, message, wParam, lParam)
EndSelect
StatusBarText( 0, 0, " "+Str(EditorGadgetCursorX(hEditeur()\Handle))+" : "+Str(EditorGadgetCursorY(hEditeur()\Handle)), #PB_StatusBar_Raised)
Case #WM_KEYUP
StatusBarText( 0, 0, " "+Str(EditorGadgetCursorX(hEditeur()\Handle))+" : "+Str(EditorGadgetCursorY(hEditeur()\Handle)), #PB_StatusBar_Raised)
Case #WM_CONTEXTMENU
DisplayPopupMenu(1, hwnd)
Case #WM_LBUTTONUP
StatusBarText( 0, 0, " "+Str(EditorGadgetCursorX(hEditeur()\Handle))+" : "+Str(EditorGadgetCursorY(hEditeur()\Handle)), #PB_StatusBar_Raised)
Default
Result = CallWindowProc_(hEditeur()\OldCallback, WindowId, message, wParam, lParam)
EndSelect
ProcedureReturn Result
EndProcedure
Procedure CreerEditeurCode(FileName$)
AddGadgetItem(PanelCode, -1,FileName$)
IndexRTF = CountGadgetItems(PanelCode)
LastElement(hEditeur())
AddElement(hEditeur())
EditeurID = EditorGadget(#PB_Any,0,0,0,0)
hEditeur()\Handle = GadgetID(EditeurID)
SendMessage_(hEditeur()\Handle, #EM_SETEVENTMASK , 0, #ENM_CHANGE | #ENM_KEYEVENTS | #ENM_MOUSEEVENTS | #ENM_PROTECTED)
SendMessage_(hEditeur()\Handle,#EM_LIMITTEXT,-1,0)
SendMessage_(hEditeur()\Handle,#EM_SETMARGINS,#EC_LEFTMARGIN,65)
SendMessage_(hEditeur()\Handle,#EM_SETBKGNDCOLOR,#Null,RGB(20,20,40))
SetGadgetFont(EditeurID, hFont)
Editor_Color(hEditeur()\Handle,RGB(100,100,250))
Editor_Format(hEditeur()\Handle,#Null)
hEditeur()\OldCallback = SetWindowLong_(hEditeur()\Handle, #GWL_WNDPROC, @EditeurCallback())
EndProcedure
Procedure ResizeEditeurCode()
If hEditeur()\Handle
GetWindowRect_(ToolBar, ToolBarRect.RECT)
ToolBarHeight = ToolBarRect\bottom-ToolBarRect\top
GetWindowRect_(StatusBar, StatusBarRect.RECT)
StatusBarHeight = StatusBarRect\bottom-StatusBarRect\top
GetClientRect_(hwnd, WindowRect.RECT)
WindowWidth = WindowRect\right-WindowRect\left
WindowHeight = WindowRect\bottom-WindowRect\top
height = WindowHeight - ToolBarHeight - StatusBarHeight
SplitterPos = GetGadgetState(Splitter)
ResizeGadget(Splitter,0,ToolBarHeight,WindowWidth,height)
If SplitterPos = 0 : SplitterPos = WindowWidth * 0.8 : EndIf
ResizeGadget(PanelCode,0,0,SplitterPos,height)
ResizeGadget(PanelSignet,SplitterPos+3,0,WindowWidth-SplitterPos-3,height)
MoveWindow_(hEditeur()\Handle,1,1,GetInnerSizeWidth(PanelCode)-2,GetInnersizeHeight(PanelCode)-2,#False)
MoveWindow_(GadgetID(ListeSignetID),1,1,GetInnerSizeWidth(PanelSignet)-2,GetInnersizeHeight(PanelSignet)-2,#False)
MoveWindow_(GadgetID(ListeLabelID),1,1,GetInnerSizeWidth(PanelSignet)-2,GetInnersizeHeight(PanelSignet)-2,#False)
MoveWindow_(GadgetID(ListeVariableID),1,1,GetInnerSizeWidth(PanelSignet)-2,GetInnersizeHeight(PanelSignet)-2,#False)
GetWindowRect_(hEditeur()\Handle, EditeurRect.RECT)
TotalLignesVisible = (EditeurRect\bottom-EditeurRect\top)/TexteHeight
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
If (PremiereLigneVisible+TotalLignesVisible)>NombreDeLignes
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,NombreDeLignes-TotalLignesVisible-PremiereLigneVisible)
EndIf
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
EndIf
EndProcedure
Procedure ChargeSLV(IndexPanel)
ClearList(ListeS())
ForEach ListeSLV()
If ListeSLV()\Index = IndexPanel And ListeSLV()\type = 1 : AddElement(ListeS())
ListeS()\Texte = ListeSLV()\Texte
ListeS()\Ligne = ListeSLV()\Ligne
EndIf
Next
ClearGadgetItemList(ListeSignetID)
ForEach ListeS() : AddGadgetItem(ListeSignetID,-1,ListeS()\Texte) : Next
SendMessage_(GadgetID(ListeSignetID),#LVM_SETCOLUMNWIDTH,0,#LVSCW_AUTOSIZE)
ClearList(ListeL())
ForEach ListeSLV()
If ListeSLV()\Index = IndexPanel And ListeSLV()\type = 2 : AddElement(ListeL())
ListeL()\Texte = ListeSLV()\Texte
ListeL()\Ligne = ListeSLV()\Ligne
EndIf
Next
ClearGadgetItemList(ListeLabelID)
ForEach ListeL() : AddGadgetItem(ListeLabelID,-1,ListeL()\Texte) : Next
SendMessage_(GadgetID(ListeLabelID),#LVM_SETCOLUMNWIDTH,0,#LVSCW_AUTOSIZE)
ClearList(ListeV())
ForEach ListeSLV()
If ListeSLV()\Index = IndexPanel And ListeSLV()\type = 3 : AddElement(ListeV())
ListeV()\Texte = ListeSLV()\Texte
EndIf
Next
ClearGadgetItemList(ListeVariableID)
ForEach ListeV() : AddGadgetItem(ListeVariableID,-1,ListeV()\Texte) : Next
SendMessage_(GadgetID(ListeVariableID),#LVM_SETCOLUMNWIDTH,0,#LVSCW_AUTOSIZE)
EndProcedure
Partie 2:
Code : Tout sélectionner
Procedure OuvrirFichier(Parametre$)
If Parametre$ = ""
file.s = OpenFileRequester("Ouvrir un fichier PureBasic", "", "Fichiers PureBasic|*.pb", 0)
Else : file = Parametre$ : Parametre$ = ""
EndIf
If file<>""
processID.l = RunProgram(PureBasicRepertoire + "PBCompiler.exe", Chr(34) + file + Chr(34) + " /COMMENTED " + Chr(34) + file + Chr(34) + " /EXE " + Chr(34) + " " + Chr(34),"",1|2)
If processID = 0
MessageRequester("Erreur", "Le fichier PB n'a pu être compilé", #MB_ICONERROR)
EndIf
fileASM.s = PureBasicRepertoire+"PureBasic.asm"
iFile = ReadFile(#PB_Any, fileASM)
If iFile
FileLength = Lof()
*TextBuffer = LocalAlloc_(#LMEM_ZEROINIT, FileLength+10)
ReadData(*TextBuffer, FileLength)
CloseFile(iFile)
*MemPtr = AllocateMemory(FileLength*3)
*RTF = *MemPtr
*Texte = *TextBuffer
ColoriserTexte()
FileName$ = GetFilePart(file)
CreerEditeurCode(FileName$)
SendMessage_(hEditeur()\Handle,#EM_REPLACESEL,0,*MemPtr)
MoveWindow_(hEditeur()\Handle,1,1,GetInnerSizeWidth(PanelCode)-2,GetInnersizeHeight(PanelCode)-2,#False)
SetGadgetState(PanelCode,CountGadgetItems(PanelCode)-1)
LocalFree_(*TextBuffer)
FreeMemory(*MemPtr)
ChargeSLV(IndexRTF-1)
EndIf
EndIf
EndProcedure
Procedure OuvrirFichierASM()
fileASM.s = OpenFileRequester("Ouvrir un fichier ASM", "", "Fichiers ASM|*.asm", 0)
If fileASM<>""
iFile = ReadFile(#PB_Any, fileASM)
If iFile
FileLength = Lof()
*TextBuffer = LocalAlloc_(#LMEM_ZEROINIT, FileLength+10)
ReadData(*TextBuffer, FileLength)
CloseFile(iFile)
*MemPtr = AllocateMemory(FileLength*3)
*RTF = *MemPtr
*Texte = *TextBuffer
ColoriserTexte()
FileName$ = GetFilePart(fileASM)
CreerEditeurCode(FileName$)
SendMessage_(hEditeur()\Handle,#EM_REPLACESEL,0,*MemPtr)
MoveWindow_(hEditeur()\Handle,1,1,GetInnerSizeWidth(PanelCode)-2,GetInnersizeHeight(PanelCode)-2,#False)
SetGadgetState(PanelCode,CountGadgetItems(PanelCode)-1)
LocalFree_(*TextBuffer)
FreeMemory(*MemPtr)
ChargeSLV(IndexRTF-1)
EndIf
EndIf
EndProcedure
Procedure RunOnce(Name.s)
Editor_RunOnceMessage = RegisterWindowMessage_("ASM_Editor_RunOnce")
Editor_RunOnceMutex = CreateMutex_(0,0,"ASM_Editor")
If GetLastError_() = #ERROR_ALREADY_EXISTS
If GetVersion_() & $FF0000 ; Windows NT/XP
X = RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "Applications\PureASM.exe\", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo)
Else ; La même chose pour Win9x
X = RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\PureASM.exe\", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo)
EndIf
If X = #ERROR_SUCCESS
RegSetValueEx_(NewKey, "RunOnce_FileName", 0, #reg_sz, Name, Len(Name)+1)
RegCloseKey_(NewKey)
SendMessage_(#HWND_BROADCAST, Editor_RunOnceMessage, "OPENFILE", 0)
End
EndIf
EndIf
EndProcedure
Procedure RunOnce_Message()
If GetVersion_() & $FF0000 ; Windows NT/XP
X = RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Applications\PureASM.exe\",0,#KEY_ALL_ACCESS, @NewKey)
Else ; La même chose pour Win9x
X = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\PureASM.exe\", 0, #KEY_ALL_ACCESS, @NewKey)
EndIf
If X = #ERROR_SUCCESS
a$ = Space(2000) : ASize = 2000
RegQueryValueEx_(NewKey, "RunOnce_FileName", 0, 0, @a$, @ASize)
RegSetValueEx_(NewKey, "RunOnce_FileName", 0, #reg_sz, "", 1)
RegCloseKey_(NewKey)
If a$ <> ""
OuvrirFichier(a$)
SendMessage_(hEditeur()\Handle, #EM_SETSEL, 0, 0)
EndIf
EndIf
EndProcedure
Procedure PanelCallback(WindowId, message, wParam, lParam)
Select message
Case #WM_PAINT
If NoPaintPanel : ProcedureReturn 0 :EndIf
If SplitterAction
GetWindowRect_(GadgetID(PanelCode),wPanelRect.RECT)
GetWindowRect_(hEditeur()\Handle,wListeRect.RECT)
hPanel = wListeRect\top-wPanelRect\top
GetClientRect_(GadgetID(PanelCode),PanelRect.RECT)
PanelRect\top = hPanel
ValidateRect_(GadgetID(PanelCode),@PanelRect)
EndIf
ProcedureReturn CallWindowProc_(OldPanelCallBack, WindowId,message, wParam, lParam)
Case #WM_LBUTTONDOWN
NoPaintPanel = #True
CallWindowProc_(OldPanelCallBack, WindowId,message, wParam, lParam)
SendMessage_(GadgetID(PanelCode),#WM_LBUTTONUP,0,0)
ProcedureReturn 0
Case #WM_LBUTTONUP
If NoPaintPanel
NoPaintPanel = #False
ProcedureReturn CallWindowProc_(OldPanelCallBack,WindowId,message,wParam,lParam)
Else : ProcedureReturn 0
EndIf
Default
ProcedureReturn CallWindowProc_(OldPanelCallBack,WindowId,message,wParam,lParam)
EndSelect
EndProcedure
Procedure SLVCallback(WindowId, message, wParam, lParam)
Select message
Case #WM_PAINT
If NoPaintSignet : ProcedureReturn 0 :EndIf
If SplitterAction
GetWindowRect_(GadgetID(PanelSignet),wPanelRect.RECT)
GetWindowRect_(GadgetID(ListeSignetID),wListeRect.RECT)
hPanel = wListeRect\top-wPanelRect\top
GetClientRect_(GadgetID(PanelSignet),PanelRect.RECT)
PanelRect\top = hPanel
ValidateRect_(GadgetID(PanelSignet),@PanelRect)
EndIf
ProcedureReturn CallWindowProc_(OldSLVCallBack, WindowId,message, wParam, lParam)
Case #WM_LBUTTONDOWN
NoPaintSignet = #True
CallWindowProc_(OldSLVCallBack, WindowId,message, wParam, lParam)
SendMessage_(GadgetID(PanelSignet),#WM_LBUTTONUP,0,0)
ProcedureReturn 0
Case #WM_LBUTTONUP
If NoPaintSignet
NoPaintSignet = #False
ProcedureReturn CallWindowProc_(OldSLVCallBack,WindowId,message,wParam,lParam)
Else : ProcedureReturn 0
EndIf
Default
ProcedureReturn CallWindowProc_(OldSLVCallBack,WindowId,message,wParam,lParam)
EndSelect
EndProcedure
Procedure SplitterCallback(WindowId, message, wParam, lParam)
Select message
Case #WM_LBUTTONDOWN
SplitterAction = #True
ProcedureReturn CallWindowProc_(OldSplitterCallBack, WindowId,message, wParam, lParam)
Case #WM_LBUTTONUP
SplitterAction = #False
InvalidateRect_(GadgetID(PanelCode),0,1)
ProcedureReturn CallWindowProc_(OldSplitterCallBack, WindowId,message, wParam, lParam)
Case #WM_MOUSEMOVE
If SplitterMove<>GetGadgetState(Splitter) And SplitterAction
InvalidateRect_(GadgetID(PanelSignet), 0, 1)
SendMessage_(GadgetID(PanelSignet),#WM_PAINT,0,0)
InvalidateRect_(GadgetID(PanelCode), 0, 1)
SendMessage_(GadgetID(PanelCode),#WM_PAINT,0,0)
InvalidateRect_(hEditeur()\Handle,0,1)
SendMessage_(hEditeur()\Handle,#WM_PAINT,0,0)
NumPanel = GetGadgetState(PanelSignet)
If NumPanel = 0
InvalidateRect_(GadgetID(ListeSignetID),0,1)
SendMessage_(GadgetID(ListeSignetID),#WM_PAINT,0,0)
ElseIf NumPanel = 1
InvalidateRect_(GadgetID(ListeLabelID),0,1)
SendMessage_(GadgetID(ListeLabelID),#WM_PAINT,0,0)
ElseIf NumPanel = 2
InvalidateRect_(GadgetID(ListeVariableID),0,1)
SendMessage_(GadgetID(ListeVariableID),#WM_PAINT,0,0)
EndIf
SplitterMove = GetGadgetState(Splitter)
EndIf
ProcedureReturn CallWindowProc_(OldSplitterCallBack, WindowId,message, wParam, lParam)
Default
ProcedureReturn CallWindowProc_(OldSplitterCallBack,WindowId,message,wParam,lParam)
EndSelect
EndProcedure
Procedure.l myWindowCallback(WindowId, message, wParam, lParam)
Select message
Case #WM_NOTIFY
*LVCDHeader.NMLVCUSTOMDRAW = lParam
Select *LVCDHeader\nmcd\hdr\hwndFrom
Case GadgetID(ListeSignetID)
Select *LVCDHeader\nmcd\hdr\Code
Case #NM_CUSTOMDRAW
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
Lig.l = *LVCDHeader\nmcd\dwItemSpec
If Mid(GetGadgetItemText(ListeSignetID,Lig,0),1,1) = ">"
*LVCDHeader\clrTextBk = RGB(100,100,150)
Else : *LVCDHeader\clrTextBk = RGB(100,150,100)
EndIf
*LVCDHeader\clrText = RGB(250,250,250)
SelectObject_(*LVCDHeader\nmcd\hDC,hFont)
ProcedureReturn #CDRF_NEWFONT
EndSelect
Case #LVN_ITEMCHANGED
*nmLV.NM_LISTVIEW = lParam
If *nmLV\unewstate & #LVIS_SELECTED
SelectElement(ListeS(),*nmLV\iItem)
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Difference = ListeS()\Ligne - PremiereLigneVisible
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
While (PremiereLigneVisible+TotalLignesVisible+Difference) > NombreDeLignes : Difference - 1 : Wend
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,Difference)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
lvi.LV_ITEM
lvi\Mask=#LVIF_STATE
lvi\iItem=*nmLV\iItem
lvi\state=0
lvi\stateMask=#LVIS_SELECTED
SendMessage_(GadgetID(ListeSignetID),#LVM_SETITEMSTATE,*nmLV\iItem,lvi)
ProcedureReturn 0
EndIf
EndSelect
SetFocus_(hEditeur()\Handle)
Case GadgetID(ListeLabelID)
Select *LVCDHeader\nmcd\hdr\Code
Case #NM_CUSTOMDRAW
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
*LVCDHeader\clrTextBk = RGB(100,150,100)
*LVCDHeader\clrText = RGB(250,250,250)
SelectObject_(*LVCDHeader\nmcd\hDC,hFont)
ProcedureReturn #CDRF_NEWFONT
EndSelect
Case #LVN_ITEMCHANGED
*nmLV.NM_LISTVIEW = lParam
If *nmLV\unewstate & #LVIS_SELECTED
SelectElement(ListeL(),*nmLV\iItem)
PremiereLigneVisible = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Difference = ListeL()\Ligne - PremiereLigneVisible
NombreDeLignes = SendMessage_(hEditeur()\Handle,#EM_GETLINECOUNT,0,0)
While (PremiereLigneVisible+TotalLignesVisible+Difference) > NombreDeLignes : Difference - 1 : Wend
SendMessage_(hEditeur()\Handle, #EM_LINESCROLL, 0,Difference)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
lvi.LV_ITEM
lvi\Mask=#LVIF_STATE
lvi\iItem=*nmLV\iItem
lvi\state=0
lvi\stateMask=#LVIS_SELECTED
SendMessage_(GadgetID(ListeLabelID),#LVM_SETITEMSTATE,*nmLV\iItem,lvi)
ProcedureReturn 0
EndIf
EndSelect
SetFocus_(hEditeur()\Handle)
Case GadgetID(ListeVariableID)
Select *LVCDHeader\nmcd\hdr\Code
Case #NM_CUSTOMDRAW
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
*LVCDHeader\clrTextBk = RGB(100,150,100)
*LVCDHeader\clrText = RGB(250,250,250)
SelectObject_(*LVCDHeader\nmcd\hDC,hFont)
ProcedureReturn #CDRF_NEWFONT
EndSelect
Case #LVN_ITEMCHANGED
*nmLV.NM_LISTVIEW = lParam
If *nmLV\unewstate & #LVIS_SELECTED
lvi.LV_ITEM
lvi\Mask=#LVIF_STATE
lvi\iItem=*nmLV\iItem
lvi\state=0
lvi\stateMask=#LVIS_SELECTED
SendMessage_(GadgetID(ListeVariableID),#LVM_SETITEMSTATE,*nmLV\iItem,lvi)
ProcedureReturn 0
EndIf
EndSelect
SetFocus_(hEditeur()\Handle)
EndSelect
Case #WM_SIZE
ResizeEditeurCode()
ProcedureReturn 0
Case #WM_ACTIVATE
If wParam & $FFFF <> #WA_INACTIVE
SetFocus_(hEditeur()\Handle)
EndIf
ProcedureReturn 0
Case Editor_RunOnceMessage
If PeekS(wParam,9) = "OPENFILE"
RunOnce_Message()
SetForegroundWindow_(hwnd)
EnableWindow_(hwnd,#True)
If IsZoomed_(hwnd)
ShowWindow_(hwnd, #SW_MAXIMIZE)
Else : ShowWindow_(hwnd, #SW_RESTORE)
EndIf
ProcedureReturn 0
EndIf
Default
ProcedureReturn #PB_ProcessPureBasicEvents
EndSelect
EndProcedure
;- Boucle Principale
Parametre$ = ""
Repeat
p$ = ProgramParameter()
Parametre$ + p$ + " "
Until p$ = ""
Parametre$ = Trim(Parametre$)
RunOnce(Parametre$)
SystemPath.s=Space(255)
GetSystemDirectory_(SystemPath,255)
hwnd = OpenWindow( 0, 0, 0, #Longueur, #Largeur, #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "PureASM 1.1")
SendMessage_(hwnd,#wm_seticon,#False,ExtractIcon_(0,SystemPath+"\shell32.dll",130))
ToolBar = CreateToolBar( 0, hwnd)
If ToolBar
ToolBarStandardButton(#IDM_FILE_NEW, #PB_ToolBarIcon_New)
ToolBarStandardButton(#IDM_FILE_OPEN, #PB_ToolBarIcon_Open)
ToolBarStandardButton(#IDM_FILE_SAVE, #PB_ToolBarIcon_Save)
ToolBarSeparator()
ToolBarStandardButton(#IDM_EDIT_CUT, #PB_ToolBarIcon_Cut)
ToolBarStandardButton(#IDM_EDIT_COPY, #PB_ToolBarIcon_Copy)
ToolBarStandardButton(#IDM_EDIT_PASTE, #PB_ToolBarIcon_Paste)
ToolBarSeparator()
ToolBarImageButton(#IDM_EDIT_DELETE, #PB_ToolBarIcon_Delete)
ToolBarSeparator()
ToolBarStandardButton(#IDM_EDIT_UNDO, #PB_ToolBarIcon_Undo)
ToolBarStandardButton(#IDM_EDIT_REDO, #PB_ToolBarIcon_Redo)
;ToolBarSeparator()
;ToolBarImageButton(#IDM_EDIT_COMPIL, ExtractIcon_(0,SystemPath+"\shell32.dll",165))
EndIf
Tab.s = Chr(9)
hMenu = CreateMenu( 0, hwnd)
If hMenu
MenuTitle("Fichier")
MenuItem(#IDM_FILE_NEW, "Nouveau")
MenuItem(#IDM_FILE_OPEN, "Ouvrir")
MenuItem(#IDM_FILE_SAVE, "Enregistrer")
MenuBar()
MenuItem(#IDM_FILE_OPEN_ASM, "Ouvrir fichier ASM")
MenuBar()
MenuItem(#MENU_QUITTER, "Quitter")
MenuTitle("Edition")
MenuItem(#IDM_EDIT_CUT, "Couper"+Tab+"Ctl+X")
MenuItem(#IDM_EDIT_COPY, "Copier"+Tab+"Ctl+C")
MenuItem(#IDM_EDIT_PASTE, "Coller"+Tab+"Ctl+V")
MenuItem(#IDM_EDIT_DELETE, "Suprimer")
MenuBar()
MenuItem(#IDM_EDIT_SELECTALL, "Sélectionner tout")
MenuTitle("Projet")
MenuItem(#OPTIONS, "Options du projet")
EnableMenuItem_(hMenu, #OPTIONS,#True)
MenuBar()
MenuItem(#COMPILER, "Compiler")
EnableMenuItem_(hMenu, #COMPILER,#True)
MenuTitle("Aide")
MenuItem(#IDM_HELP_ABOUT, "A propos de PureASM...")
EndIf
If CreatePopupMenu(1)
MenuItem(#IDM_EDIT_CUT, "Couper"+Tab+"Ctl+X")
MenuItem(#IDM_EDIT_COPY, "Copier"+Tab+"Ctl+C")
MenuItem(#IDM_EDIT_PASTE, "Coller"+Tab+"Ctl+V")
MenuItem(#IDM_EDIT_DELETE, "Suprimer")
MenuBar()
MenuItem(#IDM_EDIT_SELECTALL, "Sélectionner tout")
EndIf
StatusBar = CreateStatusBar( 0, hwnd)
If StatusBar
BarT = WindowWidth() - 120
If BarT < 0 : BarT = 0 : EndIf
AddStatusBarField( 100)
AddStatusBarField( BarT)
StatusBarText(0, 1, " Programme Eric Ducoulombier (Erix14)", #PB_StatusBar_BorderLess)
EndIf
;/
hDC = StartDrawing(WindowOutput())
DrawingFont(LoadFont(0,"Verdana",10))
TexteHeight = GetTextHeight(hDC)
StopDrawing()
hFont = CreateFont_(TexteHeight,0,0,0,0,0,0,0,0,0,0,0,0,"Verdana")
PureBasicRepertoire = CheminPureBasic()
If FindString(UCase(PureBasicRepertoire),"COMPILERS\",1) = 0
PureBasicRepertoire + "Compilers\"
EndIf
CreateGadgetList(hwnd)
PanelCode = PanelGadget(#PB_Any,0,0,0,0) : EnleveTabulation(GadgetID(PanelCode))
OldPanelCallBack = SetWindowLong_(GadgetID(PanelCode),#GWL_WNDPROC,@PanelCallback())
PanelSignet = PanelGadget(#PB_Any,0,0,0,0) : EnleveTabulation(GadgetID(PanelSignet))
OldSLVCallBack = SetWindowLong_(GadgetID(PanelSignet),#GWL_WNDPROC,@SLVCallback())
Splitter = SplitterGadget(#PB_Any,0,0,0,0,PanelCode,PanelSignet,#PB_Splitter_Vertical) : EnleveTabulation(GadgetID(Splitter))
OldSplitterCallBack = SetWindowLong_(GadgetID(Splitter),#GWL_WNDPROC,@SplitterCallback())
AddGadgetItem(PanelSignet, 0, "Signet")
ListeSignetID = ListIconGadget(#PB_Any,0,0,0,0,"Non trié",0,#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
SendMessage_(GadgetID(ListeSignetID),#lvm_setbkcolor,0,RGB(100,150,100))
SendMessage_(GadgetID(ListeSignetID),#lvm_settextcolor,0,RGB(250,250,250))
SetGadgetFont(ListeSignetID,hFont)
AddGadgetItem(PanelSignet, 1, "Label")
ListeLabelID = ListIconGadget(#PB_Any,0,0,0,0,"Non trié",0,#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
SendMessage_(GadgetID(ListeLabelID),#lvm_setbkcolor,0,RGB(100,150,100))
SendMessage_(GadgetID(ListeLabelID),#lvm_settextcolor,0,RGB(250,250,250))
SetGadgetFont(ListeLabelID,hFont)
AddGadgetItem(PanelSignet, 2, "Variable")
ListeVariableID = ListIconGadget(#PB_Any,0,0,0,0,"Non trié",0,#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
SendMessage_(GadgetID(ListeVariableID),#lvm_setbkcolor,0,RGB(100,150,100))
SendMessage_(GadgetID(ListeVariableID),#lvm_settextcolor,0,RGB(250,250,250))
SetGadgetFont(ListeVariableID,hFont)
CloseGadgetList()
;/
Restore CodeASM
For t=1 To 294 : AddElement(Code()) : Read Code() : Next
For t=1 To 40 : AddElement(Registre()) : Read Registre() : Next
If Parametre$ <> "" : OuvrirFichier(Parametre$)
Else : CreerEditeurCode("Nouveau")
EndIf
ResizeEditeurCode() : SetGadgetState(Splitter,SplitterPos)
SetGadgetState(PanelCode,CountGadgetItems(PanelCode)-1)
SendMessage_(hEditeur()\Handle, #EM_SETSEL, 0, 0)
SetFocus_(hEditeur()\Handle)
SetWindowCallback(@myWindowCallback())
ShowWindow_(hwnd,#SW_MAXIMIZE)
Repeat
Select WaitWindowEvent()
Case #PB_EventMenu
Select EventMenuID()
Case #IDM_FILE_NEW
CreerEditeurCode("Nouveau")
SetGadgetState(PanelCode,CountGadgetItems(PanelCode)-1)
MoveWindow_(hEditeur()\Handle,1,1,GetInnerSizeWidth(PanelCode)-2,GetInnersizeHeight(PanelCode)-2,#False)
SetFocus_(hEditeur()\Handle)
Case #IDM_FILE_OPEN
OuvrirFichier("")
SendMessage_(hEditeur()\Handle, #EM_SETSEL,0,0)
SetFocus_(hEditeur()\Handle)
Case #IDM_FILE_OPEN_ASM
OuvrirFichierASM()
SendMessage_(hEditeur()\Handle, #EM_SETSEL,0,0)
SetFocus_(hEditeur()\Handle)
Case #IDM_FILE_SAVE
FileName$ = SaveFileRequester("Enregistrer le fichier ASM", "", "Fichier ASM (*.asm)|*.asm", 1)
If FileName$
If UCase(Right(FileName$,3)) <> ".ASM"
FileName$+".asm"
EndIf
iFile = CreateFile(#PB_Any,FileName$)
If iFile
FileLength = SendMessage_(hEditeur()\Handle, #WM_GETTEXTLENGTH, 0, 0)
*TextBuffer = LocalAlloc_(#LMEM_ZEROINIT, FileLength+1)
SendMessage_(hEditeur()\Handle, #WM_GETTEXT, FileLength+1,*TextBuffer)
WriteData(*TextBuffer, FileLength)
LocalFree_(*TextBuffer)
CloseFile(iFile)
EndIf
EndIf
Case #MENU_QUITTER
End
Case #IDM_EDIT_CUT
SendMessage_(hEditeur()\Handle, #WM_CUT, 0, 0)
Case #IDM_EDIT_COPY
SendMessage_(hEditeur()\Handle, #WM_COPY, 0, 0)
Case #IDM_EDIT_PASTE
SendMessage_(hEditeur()\Handle, #WM_PASTE, 0, 0)
Case #IDM_EDIT_DELETE
SendMessage_(hEditeur()\Handle, #EM_REPLACESEL, #True, 0)
Case #IDM_EDIT_SELECTALL
Editor_Select(hEditeur()\Handle,1,-1,-1,-1)
Case #IDM_EDIT_UNDO
SendMessage_(hEditeur()\Handle, #EM_UNDO, 0, 0)
Case #IDM_EDIT_REDO
SendMessage_(hEditeur()\Handle, #EM_REDO, 0, 0)
Case #IDM_HELP_ABOUT
AboutMessage.s = "Novembre 2004"+Chr(10)+"Programme Eric Ducoulombier (Erix14)"
ShellAbout_(hwnd, @"PureASM 1.1", @AboutMessage, LoadIcon_(#Null, #IDI_APPLICATION))
SetFocus_(hEditeur()\Handle)
EndSelect
Case #PB_EventGadget
Select EventGadgetID()
Case PanelCode
NumPanel = GetGadgetState(PanelCode)
SelectElement(hEditeur(),NumPanel)
ChargeSLV(NumPanel)
GetWindowRect_(GadgetID(PanelCode),wPanelRect.RECT)
GetWindowRect_(hEditeur()\Handle,wEditeurRect.RECT)
hPanel = wEditeurRect\top-wPanelRect\top
GetClientRect_(GadgetID(PanelCode),PanelRect.RECT)
PanelRect\top = hPanel
ValidateRect_(GadgetID(PanelCode),@PanelRect)
MoveWindow_(hEditeur()\Handle,1,1,GetInnerSizeWidth(PanelCode)-2,GetInnersizeHeight(PanelCode)-2,#False)
SetFocus_(hEditeur()\Handle)
AncienDebutLigne = SendMessage_(hEditeur()\Handle,#EM_GETFIRSTVISIBLELINE,0,0)
Case PanelSignet
GetWindowRect_(GadgetID(PanelSignet),wPanelRect.RECT)
GetWindowRect_(GadgetID(ListeSignetID),wListeRect.RECT)
hPanel = wListeRect\top-wPanelRect\top
GetClientRect_(GadgetID(PanelSignet),PanelRect.RECT)
PanelRect\top = hPanel
ValidateRect_(GadgetID(PanelSignet),@PanelRect)
NumPanel = GetGadgetState(PanelSignet)
If NumPanel = 0
InvalidateRect_(GadgetID(ListeSignetID),0,1)
SendMessage_(GadgetID(ListeSignetID),#WM_PAINT,0,0)
ElseIf NumPanel = 1
InvalidateRect_(GadgetID(ListeLabelID),0,1)
SendMessage_(GadgetID(ListeLabelID),#WM_PAINT,0,0)
ElseIf NumPanel = 2
InvalidateRect_(GadgetID(ListeVariableID),0,1)
SendMessage_(GadgetID(ListeVariableID),#WM_PAINT,0,0)
EndIf
SetFocus_(hEditeur()\Handle)
EndSelect
Case #PB_Event_CloseWindow: End
EndSelect
ForEver
DataSection
CodeASM:
;- Instructions des 8086/8088
Data.s "MOV","AAA","AAD","AAM","AAS","ADC","ADD","AND","CALL","CBW","CLC","CLD","CLI","CMC","CMP","CMPSB","CMPSB","CMPSW","CWD"
Data.s "MOVSW","MUL","NEG","NOP","NOT","OR","OUT","POP","POPF","PUSH","PUSHF","RCL","RCR","REP","REPE","REPNE","REPNZ","XOR"
Data.s "DAS","DEC","DIV","ESC","HLT","IDIV","IMUL","IN","INC","INT","INTO","IRET","JA","JAE","JB","JBE","JC","JCXZ","JE","JG","JGE","JL"
Data.s "JLE","JMP","JNA","JNAE","JNB","JNBE","JNC","JNE","JNG","JNL","JNLE","JNO","JNP","JNS","JNZ","JO","JP","JPE","JPO","JS","JZ"
Data.s "LAHF","LDS","LEA","LES","LOCK","LODSB","LODSW","LOOP","LOOPE","LOOPNE","LOOPNZ","LOOPZ","MOVSB","DAA"
Data.s "REPZ","RET","ROL","ROR","SAHF","SAL","SAR","SBB","SCASB","SCASW","SHL","SHR","STC","STD","STI","STOSB","STOSW"
Data.s "SUB","TEST","WAIT","XCHG","XLAT"
;- Coprocesseur numérique 8087
Data.s "F2XM1","FABS","FADD","FADDP","FBLD","FBSTP","FCHS","FCLEX","FCOM","FCOMP","FCOMPP","FDECSTP","FDISI"
Data.s "FDIV","FDIVP","FDIVR","FDIVRP","FENI","FFREE","FIADD","FICOM","FICOMP","FIDIV","FIDIVR","FILD","FIMUL","FINCSTP"
Data.s "FINIT","FIST","FISTP","FISUB","FISUBR","FLD","FLD1","FLDCW","FLDENV","FLD2E","FLDL2T","FLDLG2","FLDLN2","FLDPI"
Data.s "FLDZ","FMUL","FMULP","FNCLEX","FNDISI","FNENI","FNINIT","FNOP","FNSAVE","FNSTCW","FNSTENV","FNSTSW"
Data.s "FPATAN","FPREM","FPTAN","FRNDINT","FRSTOR","FSAVE","FSCALE","FSQRT","FST","FSTCW","FSTENV","FSTP","FSTSW"
Data.s "FSUB","FSUBP","FSUBR","FSUBRP","FTST","FWAIT","FXAM","FXCH","FXTRACT","FYL2X","FYL2XP1"
;- Instructions du 80286
Data.s "ARPL","BOUND","CLTS","ENTER","INS","INSB","INSW","LAR","LEAVE","LGDT","LIDT","LLDT","LMSW","LSL","LTR","OUTS"
Data.s "OUTSB","OUTSW","POPA","PUSHA","SGDT","SIDT","SLDT","SMSW","STR","VERR","VERW"
;- Coprocesseur numérique 80287
Data.s "FSETPM"
;- Instructions du 80386
Data.s "BSF","BSR","BT","BTC","BTR","BTS","CDQ","CMPSD","CWDE","INSD","JECXZ","LFS","LGS","LODSD","LSS","MOVSD","MOVSX"
Data.s "MOVZX","OUTSD","POPAD","POPFD","PUSHAD","PUSHFD","SCASD","SETA","SETAE","SETB","SETBE","SETC","SETE","SETG"
Data.s "SETGE","SETL","SETLE","SETNA","SETNAE","SETNB","SETNBE","SETNC","SETNE","SETNG","SETNGE","SETNL"
Data.s "SETNLE","SETNO","SETNP","SETNS","SETNZ","SETO","SETP","SETPE","SETPO","SETS","SETZ","SHLD","SHRD","STOSD"
;- Coprocesseur numérique 80387
Data.s "FCOS","FNSTSW","FPREM1","FSIN","FSINCOS","FSTSW","FUCOM","FUCOMP","FUCOMPP"
;- Instructions du 80486
Data.s "BSWAP","CMPXCHG","INVD","INVD","INVLPG","WBINVD","XADD"
;- Les registres
Data.s "EAX","EBX","ECX","EDX","ESP","EBP","EDI","ESI"
Data.s "AX","BX","CX","DX","SP","BP","DI","SI"
Data.s "AH","AL","BH","BL","CH","CL","DH","DL"
Data.s "ST0","ST1","ST2","ST3","ST4","ST5","ST6","ST7"
;-
Data.s "PUBLIC","EXTRN","MACRO","FORMAT","SECTION","RD","DB","DATA"
EndDataSection
une fois installé je n'arrive pas a charger un fichier PB avec ouvrir !!
sinon si je fait copier coller dans pureassembleur , je sauve , je recharge j'ai bien le code asm !!
mais le chargement direct ne fonctionne pas chez moi !
ps : sinon , c'est geant , et t'arrete quand tu veux, d'ecoeurer ton monde !
sinon si je fait copier coller dans pureassembleur , je sauve , je recharge j'ai bien le code asm !!
mais le chargement direct ne fonctionne pas chez moi !

ps : sinon , c'est geant , et t'arrete quand tu veux, d'ecoeurer ton monde !

Désolé de ne pas avoir réagit plus vite, mais Merci erix14 pour ce très bon utilitaire.
Du coup, en arrivant après la bataille, le prog marche bien chez moi
Cependant, l’option « Supprimer » n’est pas fonctionnelle et l’icône dans le menu n’apparaît meme pas…
Si tu t’en sens le courage, je dois avouer que souvent, je ne souhaite pas visualiser le code en entier, mais juste une portion.
J’utilise jaPBe et le top du top serait de sélectionner la partie de code PB à traduit en ASM et que la traduction s'affiche à l'écran sous la forme d’un texte flottant style 'Tooltip' !!?
Ok, c’est du luxe, c’est vraiment pas trivial, mais bon ca peut rendre la chose fort fonctionnelle, non ?!
Peut-etre pour une future version de PurASM
Du coup, en arrivant après la bataille, le prog marche bien chez moi

Cependant, l’option « Supprimer » n’est pas fonctionnelle et l’icône dans le menu n’apparaît meme pas…
Si tu t’en sens le courage, je dois avouer que souvent, je ne souhaite pas visualiser le code en entier, mais juste une portion.
J’utilise jaPBe et le top du top serait de sélectionner la partie de code PB à traduit en ASM et que la traduction s'affiche à l'écran sous la forme d’un texte flottant style 'Tooltip' !!?
Ok, c’est du luxe, c’est vraiment pas trivial, mais bon ca peut rendre la chose fort fonctionnelle, non ?!
Peut-etre pour une future version de PurASM

Oui, Dräc, c'est faisable il suffira simplement de choisir dans préférences le mode de fonctionnement de PureASM. Mais il ne faut pas perdre de vue que pour obtenir le code assembleur, il faut que le code PureBasic puisse être compilé sans aucune erreur...
Dans une future version de PureASM je mettrai mes propres icônes, ce qui résoudra certainement le problème de l'icône "Supprimer"
a+
Dans une future version de PureASM je mettrai mes propres icônes, ce qui résoudra certainement le problème de l'icône "Supprimer"
a+
