Ich suche für PureBasic 4.51 32bit unter Linux einen Memory Hex Editor. Ich habe mir zwar den AdvancedHexEditor.pb V0.9 von ShadowTurtle so angepasst das er unter Ubuntu 10.04 läuft ,
aber wenn ich auf die ScrollBar gehe ist der so langsam . Vielleicht kann das jemand bestätigen.
und natürlich fehlt bei dem auch die Edit Funktion.
mfg Dristar
Code: Alles auswählen
; AdvancedHexEditor_Sample.pb V1.0
; by ShadowTurtle @ Sonntag, 01. Juli 2007
IncludeFile("AdvancedHexEditor.pb")
#Window_0 = 0
Procedure Sample()
If OpenWindow(#Window_0, 257, 116, 667, 477, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
LengthTest.l = 5000;794
*LoadedMemory = AllocateMemory(LengthTest.l)
OpenFile(0, "AdvancedHexEditor.pb")
ReadData(0, *LoadedMemory, LengthTest.l)
CloseFile(0)
CompilerIf #AdvHexEditor_UseBitmapFont = #True
AdvHexEditor_CatchFont( ?AdvancedHex_Font_ASCII )
CompilerElse
CompilerEndIf
;*MyHex = AdvHexEditor_Create( *LoadedMemory, 5, 5, 300, 180);650, 460 )
*MyHex = AdvHexEditor_Create( *LoadedMemory, 5, 5, 650, 460 )
;AdvHexEditor_SetScrollBarWidth( *MyHex, 20 )
;AdvHexEditor_UseFont(*MyHex, "Arial", 8)
;EndIf
EndIf
Repeat ; Start of the event loop
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
;You can place code here, and use the result as parameters for the procedures
If Event = #PB_Event_SizeWindow
If WindowID = #Window_0
AdvHexEditor_Resize( *MyHex, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 10)
EndIf
EndIf
AdvHexEditor_Update( *MyHex, Event, GadgetID, EventType )
Until Event = #PB_Event_CloseWindow ; End of the event loop
AdvHexEditor_Delete( *MyHex )
EndProcedure
Sample()
Code: Alles auswählen
; AdvancedHexEditor.pb V0.9
; by ShadowTurtle @ Sonntag, 01. Juli 2007
;
; 1. Mit AdvHexEditor_Create wird ein Hex-Editor-Gadget erstellt,
; wobei die Rückgabe ein Pointer ist. Angegeben werden müssen ein
; Pointer zu einer Mit AllocateMemory reservierten Speichers und die
; Position/Größe des Gadgets. z.B. *MyHex = AdvHexEditor_Create(
; *LoadedMemory, 5, 5, 650, 460 )
;
; 2. die Größe kann mittels AdvHexEditor_Resize eingestellt
; werden. wobei hier der Pointer zum Hex-Editor-Gadget Angegeben werden
; muss. z.B. AdvHexEditor_Resize( *MyHex, #PB_Ignore, #PB_Ignore,
; WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 10)
; Wie man sieht, man kann in dieser Funktion auch #PB_Ignore anwenden.
;
; 3. Um die Breite des Scroll-Balken einzustellen muss
; AdvHexEditor_SetScrollBarWidth benutzt werden. z.B.
; AdvHexEditor_SetScrollBarWidth( *MyHex, 40 )
;
; 4. Wenn #AdvHexEditor_UseBitmapFont deaktiviert ist, dann kann
; man Mit AdvHexEditor_UseFont die Schrift einstellen welche zur
; Darstellung der einzelne Zeichen benutzt werden soll. z.B.
; [b]AdvHexEditor_UseFont(*MyHex, "Arial", 8)
;
; 5. Damit dieses Gadget auf die Reaktionen der Benutzer reagiert, muss
; nach jeden Aufruf von z.b. WaitWindowEvent() die Funktion
; AdvHexEditor_Update aufgerufen werden. Als Parameter müssen die
; entsprechenden Ergebnisse der Funktionen Wie z.b. EventGadget()
; und EventType() Angegeben werden. z.B. AdvHexEditor_Update(
; *MyHex, Event, GadgetID, EventType )
;
; 6. dann gibt es da natürlich noch AdvHexEditor_Delete. es
; löscht einfach das HexEditor-Gadget. z.B. AdvHexEditor_Delete(
; *MyHex ).
;
; Wer keine Als DataSection eingebundenes Font zur Darstellung der ASCII
; Zeichen benutzen will, der braucht in der Library nur die Konstante
; #AdvHexEditor_UseBitmapFont in #False abzuändern. z.B.
; #AdvHexEditor_UseBitmapFont = #False
;
; Möchte nun irgendjemand Unicode-Zeichen statt ASCII im Hex-Gadget
; sehen, dann muss einfach nur ein entsprechendes Font Mit dem Font-
; Generator erstellt werden, oder es muss Mit AdvHexEditor_UseFont die
; entsprechende System-Schriftart gesetzt werden.
;
; Jetzt kommt bei dir garantiert zum 100sten mal die Frage auf: Haben wir
; nicht schon genug Hex-Betrachter in Purebasic? Ja, aber alle erledigen
; ihre Darstellungen in einen Text-Editor Gadget, Richtext-Editor-Gadget
; oder in einen MemoPad-Gadget (per WinApi), sind also nie wirklich auf
; das Bearbeiten ausgelegt worden und Haben dementsprechend auch weniger
; Features.
;
; Diese Advanced Library hingegen ist, so wie alle vorherigen dieser reihe,
; auf einfaches Weiterentwickeln ausgelegt. Ich habe also bewusst den
; Cursor + Hex-Eingabe Modus entfernt Damit man gleich loslegen kann Diese
; Library zu erweitern. aber keine bange. Als Hex-Viewer funktioniert Diese
; Library auch zu 100% einwandfrei.
;
#AdvHexEditor_UseBitmapFont = #False
;#AdvHexEditor_UseBitmapFont = #True
CompilerIf #AdvHexEditor_UseBitmapFont = #True
DataSection
AdvancedHex_Font_ASCII: IncludeBinary "AdvancedHexASCII.bmp"
EndDataSection
CompilerEndIf
Structure AdvHexEditor
HND_ScrollBarGadget.l
HND_ImageGadGet.l
HND_Image.l
CompilerIf #AdvHexEditor_UseBitmapFont = #True
HND_FontImage.l
CompilerEndIf
HND_Font.l
ScrollBar_Minimal.l
ScrollBar_Maximal.l
ScrollBar_Position.l
ScrollBar_Width.l
*Memory
offset.l
offsetline.l
maximallines.l
x.l
y.l
width.l
height.l
BytesPerLine.l
LineHeight.l
EndStructure
CompilerIf #AdvHexEditor_UseBitmapFont = #True
Dim AdvHexEditor_FontChar.l(255*2+2)
Procedure AdvHexEditor_PrepareFont( FontImage.l )
Shared AdvHexEditor_FontChar()
For ScanChar.l = 0 To 255*2
AdvHexEditor_FontChar(ScanChar.l) = GrabImage( FontImage.l, #PB_Any, ScanChar.l*18, 0, 18, 18 )
Next
EndProcedure
Procedure AdvHexEditor_CatchFont( *FontBitmap )
FontImage.l = CatchImage( #PB_Any, *FontBitmap )
AdvHexEditor_PrepareFont( FontImage.l )
FreeImage(FontImage.l)
EndProcedure
Procedure AdvHexEditor_LoadFont( Filename.s = "AdvancedHexASCII.bmp" )
FontImage.l = LoadImage( #PB_Any, Filename.s )
AdvHexEditor_PrepareFont( FontImage.l )
FreeImage(FontImage.l)
EndProcedure
Procedure AdvHexEditor_FreeFont()
Shared AdvHexEditor_FontChar()
For ScanChar.l = 0 To 255*2
FreeImage( AdvHexEditor_FontChar(ScanChar.l) )
Next
EndProcedure
Procedure AdvHexEditor_DrawChar( Byte.b, x.l, y.l )
Shared AdvHexEditor_FontChar()
DrawImage( ImageID( AdvHexEditor_FontChar(255+Byte.b) ), x.l, y.l )
EndProcedure
Procedure AdvHexEditor_DrawChars( String.s, x.l, y.l )
StrLen.l = Len(String.s)
For I = 1 To StrLen.l
AdvHexEditor_DrawChar( Asc(Mid(String.s, I, 1)), x.l + (I-1) * 10, y.l )
Next
EndProcedure
Procedure AdvHexEditor_CharsWidth( String.s )
ProcedureReturn( Len(String.s) * 10 )
EndProcedure
; AdvHexEditor_DrawChar( PeekB(ManageAdress + ReadOffset), DrawX + WorkX, DrawY + WorkY )
; DrawImage( ImageID( AdvHexEditor_FontChar(256+PeekB(ManageAdress + ReadOffset)) ), DrawX + WorkX, DrawY + WorkY )
CompilerEndIf
Procedure AdvHexEditor_GetScrollBarMaximal( *AHE.AdvHexEditor )
ProcedureReturn(*AHE\ScrollBar_Maximal.l)
EndProcedure
Procedure AdvHexEditor_SetScrollBarMinimal( *AHE.AdvHexEditor, Value.l )
*AHE\ScrollBar_Minimal.l = Value.l
EndProcedure
Procedure AdvHexEditor_SetScrollBarMaximal( *AHE.AdvHexEditor, Value.l )
*AHE\ScrollBar_Maximal.l = Value.l
EndProcedure
Procedure AdvHexEditor_SetScrollBarPos( *AHE.AdvHexEditor, Value.l )
*AHE\ScrollBar_Position.l = Value.l
EndProcedure
Procedure AdvHexEditor_GetScrollBarPos( *AHE.AdvHexEditor )
ProcedureReturn(*AHE\ScrollBar_Position.l)
EndProcedure
Procedure AdvHexEditor_SetScrollBarWidth( *AHE.AdvHexEditor, Value.l )
*AHE\ScrollBar_Width.l = Value.l
EndProcedure
Procedure AdvHexEditor_GetScrollBarWidth( *AHE.AdvHexEditor )
ProcedureReturn(*AHE\ScrollBar_Width.l)
EndProcedure
Procedure AdvHexEditor_UpdateScrollBar( *AHE.AdvHexEditor )
If ( *AHE\ScrollBar_Position.l > *AHE\ScrollBar_Maximal.l )
*AHE\ScrollBar_Position.l = *AHE\ScrollBar_Maximal.l
EndIf
SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\ScrollBar_Maximal.l )
SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, *AHE\ScrollBar_Minimal.l )
SetGadgetState( *AHE\HND_ScrollBarGadget, *AHE\ScrollBar_Position.l )
If Not (*AHE\ScrollBar_Width.l = GadgetWidth(*AHE\HND_ScrollBarGadget))
ResizeGadget(*AHE\HND_ScrollBarGadget, #PB_Ignore, #PB_Ignore, *AHE\ScrollBar_Width.l, #PB_Ignore)
*AHE\ScrollBar_Width.l = GadgetWidth(*AHE\HND_ScrollBarGadget)
EndIf
EndProcedure
Procedure AdvHexEditor_SetLine( *AHE.AdvHexEditor, Line.l )
NewOffset = Line.l * *AHE\BytesPerLine
*AHE\offset = NewOffset
*AHE\offsetline.l = NewOffset / *AHE\BytesPerLine
AdvHexEditor_SetScrollBarPos( *AHE, *AHE\offsetline.l )
; SetGadgetState( *AHE\HND_ScrollBarGadget, Line.l )
; Debug( "AdvHexEditor_SetLine:"+ Str(NewOffset) )
EndProcedure
Procedure.l AdvHexEditor_GetLineFromOffset( *AHE.AdvHexEditor, offset.l )
; Debug( "AdvHexEditor_GetLineFromOffset:"+ Str(Offset.l / *AHE\BytesPerLine) )
ProcedureReturn( offset.l / *AHE\BytesPerLine )
EndProcedure
Procedure.l AdvHexEditor_SetBytesPerLine( *AHE.AdvHexEditor, SetBytes.l )
DoRun.b = 1
While (DoRun.b = 1)
;OrgLine.l = *AHE\offsetline.l ;AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset )
OrgLine.l = AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset )
If ( *AHE\BytesPerLine > SetBytes.l )
*AHE\BytesPerLine = *AHE\BytesPerLine - 1
Else
*AHE\BytesPerLine = *AHE\BytesPerLine + 1
EndIf
If ( *AHE\Memory = 0 )
*AHE\maximallines = 0
Else
*AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
EndIf
AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
AdvHexEditor_SetLine( *AHE, OrgLine.l )
If OrgLine.l > AdvHexEditor_GetScrollBarMaximal(*AHE);*AHE\maximallines
AdvHexEditor_SetLine( *AHE.AdvHexEditor, AdvHexEditor_GetScrollBarMaximal(*AHE) )
EndIf
If ( *AHE\BytesPerLine = SetBytes.l )
DoRun.b = 0
EndIf
Wend
EndProcedure
Procedure.b AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, UpdateMode.b = 0, UpdateGUI.b = 1 )
MyDraw = StartDrawing( ImageOutput( *AHE\HND_Image ) )
CompilerIf #AdvHexEditor_UseBitmapFont = #True
Shared AdvHexEditor_FontChar()
CompilerEndIf
DrawingFont(FontID(*AHE\HND_Font))
If ( UpdateMode.b = 0 )
; DrawingMode(#PB_2DDrawing_XOr)
Box(0, 0, *AHE\width, *AHE\height, RGB(255, 255, 255))
; DrawingMode(0)
EndIf
DrawX.l = 3
DrawY.l = 3
AreaHeight.l = ImageHeight( *AHE\HND_Image )
ManageMode.b = 0
ManageAdress.l = Int(*AHE\Memory) + *AHE\offset
AbsoluteOffset.l = *AHE\offset
If ( *AHE\Memory = 0 )
MemSize.l = 0
Else
MemSize.l = MemorySize(*AHE\Memory)
EndIf
WorkX.l = 0
WorkY.l = 0
WorkAfterAdressX.l = 0
ReadOffset.l = 0
offset.l = 0
DrawAdress.s = ""
Redraw.b = 0
Work.b = 1
AbsoluteOffset.l = 0
If ( *AHE\Memory = 0 )
Work.b = 0
EndIf
While ( Work.b = 1 )
Select ManageMode.b
Case 0 ; Draw adress at left side
If ( DrawY + WorkY > AreaHeight.l )
Work.b = 0
Else
DrawAdress.s = Right("000000000"+Hex( ManageAdress + ReadOffset ),9)
If ( UpdateMode.b = 0 )
HexWidth.l = TextWidth( "000000000" ) + 20
Box(0, WorkY, HexWidth.l - 10, *AHE\LineHeight, RGB(230, 230, 230))
BackColor(RGB(230, 230, 230))
DrawText( DrawX + WorkX, DrawY + WorkY, DrawAdress.s,RGB(0, 0, 0) )
BackColor(RGB(255, 255, 255))
WorkX = WorkX + HexWidth.l
EndIf
WorkAfterAdressX.l = WorkX
ManageMode.b = 1
EndIf
Case 1 ; Draw byte as HEX at middle
DoNext.b = 0
;If ( Offset.l > MemSize.l - *AHE\offset)
If ( ManageAdress + ReadOffset > Int(*AHE\Memory) + MemSize.l - 1 )
DoNext.b = 1
Else
DrawOffset.s = Right("00"+Hex( PeekB(ManageAdress + ReadOffset) ),2)
If ( UpdateMode.b = 0 )
DrawText( DrawX + WorkX, DrawY + WorkY, DrawOffset.s ,RGB(0, 0, 0))
HexWidth.l = TextWidth( "00" ) + 10
WorkX = WorkX + HexWidth.l
EndIf
EndIf
ReadOffset.l = ReadOffset.l + 1
If ( ReadOffset.l > *AHE\BytesPerLine.l - 1)
DoNext.b = 1
EndIf
If ( DoNext.b = 1)
BPL.l = *AHE\BytesPerLine.l
WorkX = WorkAfterAdressX + (HexWidth.l) * BPL.l + 8
ReadOffset.l = 0
ManageMode.b = 2
EndIf
offset.l = offset.l + 1
Case 2 ; Draw original byte at right side
DoNext.b = 0
If ( ManageAdress + ReadOffset > Int(*AHE\Memory) + MemSize.l - 1 )
;If ( Offset.l > MemSize.l - *AHE\offset)
DoNext.b = 0
Work.b = 0
Else
DrawOffset.s = Chr( PeekB(ManageAdress + ReadOffset) )
;Debug PeekB(ManageAdress + ReadOffset)
If ( UpdateMode.b = 0 )
CompilerIf #AdvHexEditor_UseBitmapFont = #True
AdvHexEditor_DrawChar( PeekB(ManageAdress + ReadOffset), DrawX + WorkX, DrawY + WorkY )
; DrawImage( ImageID( AdvHexEditor_FontChar(256+PeekB(ManageAdress + ReadOffset)) ), DrawX + WorkX, DrawY + WorkY )
WorkX = WorkX + 12
CompilerElse
DrawText( DrawX + WorkX, DrawY + WorkY, DrawOffset.s,RGB(0, 0, 0))
WorkX = WorkX + TextWidth( "0" ) ;+ 5
CompilerEndIf
EndIf
EndIf
ReadOffset.l = ReadOffset.l + 1
If ( ReadOffset.l > *AHE\BytesPerLine.l - 1)
DoNext.b = 1
EndIf
If ( DrawX + WorkX => *AHE\width - *AHE\ScrollBar_Width.l And *AHE\BytesPerLine > 1 )
If ( UpdateMode.b = 0 )
Box(0, 0, *AHE\width, *AHE\height, RGB(255, 255, 255))
EndIf
;AdvHexEditor_SetBytesPerLine(*AHE, *AHE\BytesPerLine - 1)
*AHE\BytesPerLine = *AHE\BytesPerLine - 1
*AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
ManageAdress.l = Int(*AHE\Memory) + *AHE\offset
AbsoluteOffset.l = *AHE\offset
MemSize.l = MemorySize(*AHE\Memory)
WorkX = 0
WorkY = 0
ReadOffset.l = 0
ManageMode.b = 0
AbsoluteOffset = 0
DoNext.b = 0
UpdateGUI.b = 0
EndIf
If ( DoNext.b )
WorkX = 0
WorkY = WorkY + *AHE\LineHeight
ManageAdress = ManageAdress + ReadOffset
AbsoluteOffset = AbsoluteOffset + ReadOffset
ReadOffset.l = 0
ManageMode.b = 0
EndIf
EndSelect
;Debug Str(ManageMode.b) + "_" + Str(WorkX)
Wend
StopDrawing()
If ( UpdateMode.b = 0 )
SetGadgetState( *AHE\HND_ImageGadGet, ImageID( *AHE\HND_Image ) )
EndIf
If ( UpdateMode.b = 1 )
If ( UpdateGUI.b = 1 )
If Event = #PB_Event_Gadget
If ( GadgetID = *AHE\HND_ScrollBarGadget )
;*AHE\offsetline.l = GetGadgetState( *AHE\HND_ScrollBarGadget )
;*AHE\offset = *AHE\offsetline.l * *AHE\BytesPerLine
AdvHexEditor_SetScrollBarPos( *AHE, GetGadgetState( *AHE\HND_ScrollBarGadget ) )
AdvHexEditor_SetLine( *AHE, AdvHexEditor_GetScrollBarPos( *AHE ) )
AdvHexEditor_UpdateScrollBar( *AHE )
Redraw.b = 1
EndIf
EndIf
EndIf
EndIf
ProcedureReturn Redraw.b
EndProcedure
Procedure AdvHexEditor_Update( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l )
Redraw.b = AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, 1)
If ( Redraw.b = 1 )
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, 0)
Delay(10)
EndIf
EndProcedure
Procedure AdvHexEditor_UpdateView( *AHE.AdvHexEditor )
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure
Procedure AdvHexEditor_SetMemory( *AHE.AdvHexEditor, *Memory )
If ( *Memory = #Null )
*AHE\Memory = 0
AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
AdvHexEditor_SetScrollBarMaximal( *AHE, 0 )
AdvHexEditor_SetScrollBarPos( *AHE, 0 )
AdvHexEditor_UpdateScrollBar( *AHE )
Else
*AHE\Memory = *Memory
*AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
AdvHexEditor_SetScrollBarPos( *AHE, 0 )
AdvHexEditor_UpdateScrollBar( *AHE )
; AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
AdvHexEditor_SetBytesPerLine( *AHE, 24 )
AdvHexEditor_SetLine( *AHE, 0 )
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
;SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines );- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
;SetGadgetState( *AHE\HND_ScrollBarGadget, 0 )
EndIf
*AHE\offset = 0
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure
Procedure AdvHexEditor_SetOffset( *AHE.AdvHexEditor, offset.l )
*AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
AdvHexEditor_SetScrollBarPos( *AHE, AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset ) )
AdvHexEditor_UpdateScrollBar( *AHE )
; SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, 0 )
; SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines );- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
; SetGadgetState( *AHE\HND_ScrollBarGadget, AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset ) )
*AHE\offset = offset.l
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure
Procedure AdvHexEditor_Resize( *AHE.AdvHexEditor, x, y, width, height )
If ( x = #PB_Ignore )
x = *AHE\x
EndIf
If ( y = #PB_Ignore )
y = *AHE\y
EndIf
If ( width = #PB_Ignore )
width = *AHE\width
EndIf
If ( height = #PB_Ignore )
height = *AHE\height
EndIf
If ( height < 3 Or width < 3 )
ProcedureReturn
EndIf
AdvHexEditor_SetBytesPerLine( *AHE, 24 )
; *AHE\BytesPerLine = width / 16
*AHE\x = x
*AHE\y = y
*AHE\width = width
*AHE\height = height
; ResizeImage( *AHE\HND_Image, width - *AHE\ScrollBar_Width.l, height, #PB_Image_Raw)
FreeImage(*AHE\HND_Image)
*AHE\HND_Image = CreateImage( #PB_Any, width - *AHE\ScrollBar_Width.l, height )
ResizeGadget( *AHE\HND_ImageGadGet, x, y, width - *AHE\ScrollBar_Width.l, height )
ResizeGadget( *AHE\HND_ScrollBarGadget, x + width - *AHE\ScrollBar_Width.l, y, 16, height )
; AdvHexEditor_SetOffset(*AHE, 0 )
; OriginalLine.l = AdvHexEditor_GetLineFromOffset(*AHE, *AHE\offset)
; OldBytesPerLine.l = *AHE\BytesPerLine
; While Not ( OldBytesPerLine.l = *AHE\BytesPerLine )
; AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0, 0)
; OldBytesPerLine.l = *AHE\BytesPerLine
; AdvHexEditor_SetLine(*AHE, OriginalLine.l )
; OriginalLine.l = AdvHexEditor_GetLineFromOffset(*AHE, *AHE\offset)
; Wend
; AdvHexEditor_SetOffset(*AHE, (*AHE\BytesPerLine * OriginalLine.l) )
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
AdvHexEditor_SetBytesPerLine( *AHE, 24 )
AdvHexEditor_SetLine( *AHE, 0 )
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
; AdvHexEditor_SetScrollBarMaximal( *AHE.AdvHexEditor, AdvHexEditor_GetScrollBarMaximal(*AHE) - (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
; AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
; AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
AdvHexEditor_UpdateScrollBar( *AHE.AdvHexEditor )
EndProcedure
Procedure AdvHexEditor_UseFont( *AHE.AdvHexEditor, FontName.s, FontSize.l)
FreeFont( *AHE\HND_Font )
*AHE\HND_Font = LoadFont(#PB_Any, FontName.s, FontSize.l)
EndProcedure
Procedure AdvHexEditor_Create( *Memory, x, y, width, height )
CompilerIf #AdvHexEditor_UseBitmapFont = #True
Shared AdvHexEditor_FontChar()
CompilerEndIf
*AHE.AdvHexEditor = AllocateMemory(SizeOf(AdvHexEditor))
AdvHexEditor_SetScrollBarWidth( *AHE, 18 )
*AHE\HND_Image = CreateImage( #PB_Any, width - *AHE\ScrollBar_Width.l, height )
*AHE\HND_ImageGadGet = ImageGadget(#PB_Any, x, y, width - *AHE\ScrollBar_Width.l, height, ImageID( *AHE\HND_Image ), 0)
*AHE\HND_ScrollBarGadget = ScrollBarGadget(#PB_Any, x + width - *AHE\ScrollBar_Width.l, y, *AHE\ScrollBar_Width.l, height, 0, 100, 3, #PB_ScrollBar_Vertical)
*AHE\HND_Font = LoadFont(#PB_Any, "Courier New",8)
;*AHE\HND_Font = LoadFont(#PB_Any, "ASCII",8)
*AHE\Memory = *Memory
*AHE\offset = 0
*AHE\x = x
*AHE\y = y
*AHE\width = width
*AHE\height = height
*AHE\BytesPerLine = 24;24;12
*AHE\LineHeight = 18
If ( *AHE\Memory = 0 )
*AHE\maximallines = 0
Else
*AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
EndIf
AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines - (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
AdvHexEditor_SetScrollBarPos( *AHE, 0 )
AdvHexEditor_UpdateScrollBar( *AHE )
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
AdvHexEditor_SetBytesPerLine( *AHE, 24 )
AdvHexEditor_SetLine( *AHE, 0 )
AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
; SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, 0)
; SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines);- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
AdvHexEditor_Update( *AHE, 0, 0, 0 )
AdvHexEditor_UpdateView( *AHE )
ProcedureReturn *AHE
EndProcedure
Procedure AdvHexEditor_Delete( *AHE.AdvHexEditor )
FreeGadget( *AHE\HND_ScrollBarGadget )
FreeGadget( *AHE\HND_ImageGadGet )
FreeImage( *AHE\HND_Image )
FreeFont( *AHE\HND_Font )
FreeMemory( *AHE )
EndProcedure