Suche einen Memory Hex Editor
Verfasst: 19.01.2011 22:14
Hallo Zusammen ,
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
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