431 lines
9.4 KiB
Text
431 lines
9.4 KiB
Text
VERSION DVX 1.00
|
|
' resedit.frm -- DVX Resource Editor
|
|
'
|
|
' Graphical editor for the resource blocks appended to DXE3
|
|
' files (.app, .wgt, .lib). View, add, remove, and extract
|
|
' resources of type icon, text, or binary.
|
|
'
|
|
' Add commdlg.bas and resource.bas to your project, then click Run.
|
|
|
|
Begin Form ResEdit
|
|
Caption = "DVX Resource Editor"
|
|
Layout = VBox
|
|
AutoSize = False
|
|
Resizable = True
|
|
Centered = True
|
|
Width = 500
|
|
Height = 340
|
|
|
|
Begin Menu mnuFile
|
|
Caption = "&File"
|
|
Begin Menu mnuOpen
|
|
Caption = "&Open..."
|
|
End
|
|
Begin Menu mnuClose
|
|
Caption = "&Close"
|
|
Enabled = False
|
|
End
|
|
Begin Menu mnuSep1
|
|
Caption = "-"
|
|
End
|
|
Begin Menu mnuExit
|
|
Caption = "E&xit"
|
|
End
|
|
End
|
|
|
|
Begin Menu mnuResource
|
|
Caption = "&Resource"
|
|
Begin Menu mnuAddText
|
|
Caption = "Add &Text..."
|
|
Enabled = False
|
|
End
|
|
Begin Menu mnuAddFile
|
|
Caption = "Add &File..."
|
|
Enabled = False
|
|
End
|
|
Begin Menu mnuEditText
|
|
Caption = "&Edit Text..."
|
|
Enabled = False
|
|
End
|
|
Begin Menu mnuSep2
|
|
Caption = "-"
|
|
End
|
|
Begin Menu mnuExtract
|
|
Caption = "E&xtract..."
|
|
Enabled = False
|
|
End
|
|
Begin Menu mnuRemove
|
|
Caption = "&Remove"
|
|
Enabled = False
|
|
End
|
|
End
|
|
|
|
Begin ListView ResList
|
|
Weight = 1
|
|
End
|
|
|
|
Begin Label LblStatus
|
|
Caption = "No file loaded."
|
|
Weight = 0
|
|
End
|
|
End
|
|
|
|
OPTION EXPLICIT
|
|
|
|
DIM filePath AS STRING
|
|
DIM resHandle AS LONG
|
|
filePath = ""
|
|
resHandle = 0
|
|
|
|
Load ResEdit
|
|
ResEdit.Show
|
|
|
|
ResList.SetColumns "Name,20|Type,8|Size,12"
|
|
LblStatus.Caption = "Ready. Use File > Open to load a DXE file."
|
|
|
|
|
|
' ============================================================
|
|
' Type name helper
|
|
' ============================================================
|
|
|
|
FUNCTION TypeName$(t AS LONG)
|
|
IF t = RES_TYPE_ICON THEN
|
|
TypeName$ = "Icon"
|
|
ELSEIF t = RES_TYPE_TEXT THEN
|
|
TypeName$ = "Text"
|
|
ELSEIF t = RES_TYPE_BINARY THEN
|
|
TypeName$ = "Binary"
|
|
ELSE
|
|
TypeName$ = "Unknown"
|
|
END IF
|
|
END FUNCTION
|
|
|
|
|
|
' ============================================================
|
|
' Format a byte size for display
|
|
' ============================================================
|
|
|
|
FUNCTION FormatSize$(sz AS LONG)
|
|
IF sz < 1024 THEN
|
|
FormatSize$ = STR$(sz) + " B"
|
|
ELSE
|
|
FormatSize$ = STR$(sz \ 1024) + " KB"
|
|
END IF
|
|
END FUNCTION
|
|
|
|
|
|
' ============================================================
|
|
' Refresh the resource list from the open handle
|
|
' ============================================================
|
|
|
|
SUB RefreshList
|
|
ResList.Clear
|
|
|
|
IF resHandle = 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM n AS LONG
|
|
n = ResCount(resHandle)
|
|
|
|
DIM ix AS LONG
|
|
FOR ix = 0 TO n - 1
|
|
ResList.AddItem ResName$(resHandle, ix)
|
|
ResList.SetCell ix, 1, TypeName$(ResType(resHandle, ix))
|
|
ResList.SetCell ix, 2, FormatSize$(ResSize(resHandle, ix))
|
|
NEXT ix
|
|
|
|
LblStatus.Caption = filePath + " - " + STR$(n) + " resource(s)"
|
|
END SUB
|
|
|
|
|
|
' ============================================================
|
|
' Close the current file
|
|
' ============================================================
|
|
|
|
SUB CloseFile
|
|
IF resHandle <> 0 THEN
|
|
ResClose resHandle
|
|
resHandle = 0
|
|
END IF
|
|
filePath = ""
|
|
ResList.Clear
|
|
ResEdit.Caption = "DVX Resource Editor"
|
|
mnuClose.Enabled = False
|
|
mnuAddText.Enabled = False
|
|
mnuAddFile.Enabled = False
|
|
mnuEditText.Enabled = False
|
|
mnuExtract.Enabled = False
|
|
mnuRemove.Enabled = False
|
|
LblStatus.Caption = "No file loaded."
|
|
END SUB
|
|
|
|
|
|
' ============================================================
|
|
' Reopen the file (after modification) and refresh
|
|
' ============================================================
|
|
|
|
SUB ReopenAndRefresh
|
|
DIM path AS STRING
|
|
path = filePath
|
|
|
|
IF resHandle <> 0 THEN
|
|
ResClose resHandle
|
|
resHandle = 0
|
|
END IF
|
|
|
|
resHandle = ResOpen(path)
|
|
|
|
IF resHandle = 0 THEN
|
|
' File may have had all resources stripped
|
|
filePath = path
|
|
ResList.Clear
|
|
LblStatus.Caption = path + " - 0 resource(s)"
|
|
ELSE
|
|
filePath = path
|
|
RefreshList
|
|
END IF
|
|
END SUB
|
|
|
|
|
|
' ============================================================
|
|
' Enable/disable selection-dependent menus
|
|
' ============================================================
|
|
|
|
SUB UpdateMenuState
|
|
DIM hasSel AS INTEGER
|
|
hasSel = (ResList.ListIndex >= 0)
|
|
mnuExtract.Enabled = hasSel
|
|
mnuRemove.Enabled = hasSel
|
|
mnuEditText.Enabled = hasSel
|
|
END SUB
|
|
|
|
|
|
' ============================================================
|
|
' Menu handlers
|
|
' ============================================================
|
|
|
|
SUB mnuOpen_Click
|
|
DIM path AS STRING
|
|
path = basFileOpen("Open DXE File", "Applications (*.app)|Widget Modules (*.wgt)|Libraries (*.lib)|All Files (*.*)")
|
|
IF path = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
CloseFile
|
|
|
|
filePath = path
|
|
ResEdit.Caption = path + " - DVX Resource Editor"
|
|
mnuClose.Enabled = True
|
|
mnuAddText.Enabled = True
|
|
mnuAddFile.Enabled = True
|
|
|
|
resHandle = ResOpen(path)
|
|
IF resHandle = 0 THEN
|
|
LblStatus.Caption = "No resources in " + path
|
|
EXIT SUB
|
|
END IF
|
|
|
|
RefreshList
|
|
END SUB
|
|
|
|
|
|
SUB mnuClose_Click
|
|
CloseFile
|
|
END SUB
|
|
|
|
|
|
SUB mnuExit_Click
|
|
Unload ResEdit
|
|
END SUB
|
|
|
|
|
|
SUB mnuAddText_Click
|
|
IF filePath = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM rName AS STRING
|
|
rName = basInputBox2("Add Text Resource", "Resource name:", "")
|
|
IF rName = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM text AS STRING
|
|
text = basInputBox2("Add Text Resource", "Text value:", "")
|
|
|
|
IF ResAddText(filePath, rName, text) THEN
|
|
ReopenAndRefresh
|
|
LblStatus.Caption = "Added text resource: " + rName
|
|
ELSE
|
|
LblStatus.Caption = "Failed to add resource."
|
|
END IF
|
|
END SUB
|
|
|
|
|
|
SUB mnuAddFile_Click
|
|
IF filePath = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM rName AS STRING
|
|
rName = basInputBox2("Add File Resource", "Resource name:", "")
|
|
IF rName = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM typeChoice AS LONG
|
|
typeChoice = basChoiceDialog("Resource Type", "Select resource type:", "Icon|Binary", 0)
|
|
IF typeChoice < 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM typeVal AS LONG
|
|
IF typeChoice = 0 THEN
|
|
typeVal = RES_TYPE_ICON
|
|
ELSE
|
|
typeVal = RES_TYPE_BINARY
|
|
END IF
|
|
|
|
DIM srcPath AS STRING
|
|
srcPath = basFileOpen("Select Source File", "All Files (*.*)")
|
|
IF srcPath = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
IF ResAddFile(filePath, rName, typeVal, srcPath) THEN
|
|
ReopenAndRefresh
|
|
LblStatus.Caption = "Added resource: " + rName
|
|
ELSE
|
|
LblStatus.Caption = "Failed to add resource."
|
|
END IF
|
|
END SUB
|
|
|
|
|
|
SUB mnuEditText_Click
|
|
IF filePath = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM sel AS LONG
|
|
sel = ResList.ListIndex
|
|
IF sel < 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM rName AS STRING
|
|
rName = ResName$(resHandle, sel)
|
|
|
|
DIM t AS LONG
|
|
t = ResType(resHandle, sel)
|
|
IF t <> RES_TYPE_TEXT THEN
|
|
LblStatus.Caption = "Only text resources can be edited inline."
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM oldText AS STRING
|
|
oldText = ResGetText$(filePath, rName)
|
|
|
|
DIM newText AS STRING
|
|
newText = basInputBox2("Edit Text Resource", "Value for '" + rName + "':", oldText)
|
|
|
|
IF ResAddText(filePath, rName, newText) THEN
|
|
ReopenAndRefresh
|
|
LblStatus.Caption = "Updated: " + rName
|
|
ELSE
|
|
LblStatus.Caption = "Failed to update resource."
|
|
END IF
|
|
END SUB
|
|
|
|
|
|
SUB mnuExtract_Click
|
|
IF filePath = "" OR resHandle = 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM sel AS LONG
|
|
sel = ResList.ListIndex
|
|
IF sel < 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM rName AS STRING
|
|
rName = ResName$(resHandle, sel)
|
|
|
|
DIM outPath AS STRING
|
|
outPath = basFileSave("Extract Resource", "All Files (*.*)")
|
|
IF outPath = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
IF ResExtract(filePath, rName, outPath) THEN
|
|
LblStatus.Caption = "Extracted '" + rName + "' to " + outPath
|
|
ELSE
|
|
LblStatus.Caption = "Failed to extract resource."
|
|
END IF
|
|
END SUB
|
|
|
|
|
|
SUB mnuRemove_Click
|
|
IF filePath = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM sel AS LONG
|
|
sel = ResList.ListIndex
|
|
IF sel < 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM rName AS STRING
|
|
rName = ResName$(resHandle, sel)
|
|
|
|
DIM ans AS INTEGER
|
|
ans = MsgBox("Remove resource '" + rName + "'?", vbYesNo)
|
|
IF ans = vbNo THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
' Close handle before modifying
|
|
ResClose resHandle
|
|
resHandle = 0
|
|
|
|
IF ResRemove(filePath, rName) THEN
|
|
ReopenAndRefresh
|
|
LblStatus.Caption = "Removed: " + rName
|
|
ELSE
|
|
ReopenAndRefresh
|
|
LblStatus.Caption = "Failed to remove resource."
|
|
END IF
|
|
END SUB
|
|
|
|
|
|
' ============================================================
|
|
' ListView selection change
|
|
' ============================================================
|
|
|
|
SUB ResList_Click
|
|
UpdateMenuState
|
|
END SUB
|
|
|
|
|
|
SUB ResList_DblClick
|
|
IF filePath = "" OR resHandle = 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM sel AS LONG
|
|
sel = ResList.ListIndex
|
|
IF sel < 0 THEN
|
|
EXIT SUB
|
|
END IF
|
|
|
|
DIM t AS LONG
|
|
t = ResType(resHandle, sel)
|
|
|
|
IF t = RES_TYPE_TEXT THEN
|
|
mnuEditText_Click
|
|
ELSE
|
|
mnuExtract_Click
|
|
END IF
|
|
END SUB
|