1
1
Fork 0
mirror of https://github.com/FellippeHeitor/InForm.git synced 2025-01-15 11:59:34 +00:00
InForm/examples/TextFetch/TextFetch.bas

447 lines
10 KiB
QBasic
Raw Normal View History

' Text Fetch.bas started b+ 2019-11-12 from other work with Dirs and Files loading
' Changes and updates by a740g (24-June-2023). Also simplified direntry.h
'
': This program uses
': InForm - GUI library for QB64 - v1.0
': Fellippe Heitor, 2016-2019 - fellippe@qb64.org - @fellippeheitor
': https://github.com/FellippeHeitor/InForm
'-----------------------------------------------------------
OPTION _EXPLICIT
': Controls' IDs: ------------------------------------------------------------------
DIM SHARED frmTextFetch AS LONG
DIM SHARED lbCWD AS LONG
DIM SHARED lbDirs AS LONG
DIM SHARED ListDirs AS LONG
DIM SHARED lbFiles AS LONG
DIM SHARED ListFiles AS LONG
DIM SHARED lbFile AS LONG
DIM SHARED ListFile AS LONG
DIM SHARED lbTxt AS LONG
DIM SHARED ListTxt AS LONG
DIM SHARED BtnStart AS LONG
DIM SHARED BtnEnd AS LONG
DIM SHARED lbStart AS LONG
DIM SHARED lbEnd AS LONG
': External modules: ---------------------------------------------------------------
'$INCLUDE:'../../InForm/InForm.bi'
'$INCLUDE:'TextFetch.frm'
2023-07-21 22:53:35 +00:00
' --- DIRENTRY STUFF ---
DECLARE LIBRARY "direntry"
2023-07-21 22:53:35 +00:00
' This opens a directly for reading it's contents
' IMPORTANT: Call the open_dir() wrapper instead of calling this directly. open_dir() properly null-terminates the directory string
FUNCTION __open_dir%% (dirName AS STRING)
' This reads a single directory entry. You can call this repeatedly
' It will return an empty string once all entries have been read
' "flags" and "fileSize" are output parameters (i.e. use a variable)
' If "flag" is 1 then it is a directory and 2 if it is a file
FUNCTION read_dir$ (flags AS LONG, fileSize AS LONG)
' Close the directory. This must be called before open_dir() or read_dir$() can be used again
SUB close_dir
END DECLARE
2023-07-21 22:53:35 +00:00
' This properly null-terminates the directory name before passing it to __load_dir()
FUNCTION open_dir%% (dirName AS STRING)
open_dir = __open_dir(dirName + CHR$(0))
END FUNCTION
2023-07-21 22:53:35 +00:00
' --- DIRENTRY STUFF ---
SUB loadText
DIM i AS INTEGER, b$, clip$
ResetList ListTxt
FOR i = VAL(Caption(lbStart)) TO VAL(Caption(lbEnd))
b$ = GetItem$(ListFile, i)
AddItem ListTxt, GetItem$(ListFile, i)
IF clip$ = "" THEN clip$ = b$ ELSE clip$ = clip$ + CHR$(13) + CHR$(10) + b$
NEXT
_CLIPBOARD$ = clip$
Caption(lbTxt) = "Selected Text (in Clipboard):"
END SUB
SUB loadDirsFilesList
DIM AS LONG nDirs, i
Caption(lbCWD) = "Current Directory: " + _CWD$
2023-07-21 22:53:35 +00:00
REDIM AS STRING Dir(0 TO 0), File(0 TO 0)
nDirs = GetCurDirLists(Dir(), File())
IF nDirs > 0 THEN
ResetList ListDirs
FOR i = LBOUND(Dir) TO UBOUND(Dir)
AddItem ListDirs, Dir(i)
NEXT
ResetList ListFiles
FOR i = LBOUND(File) TO UBOUND(File)
AddItem ListFiles, File(i)
NEXT
END IF
END SUB
FUNCTION GetCurDirLists& (DirList() AS STRING, FileList() AS STRING)
CONST RESIZE_BLOCK_SIZE = 64
2023-07-21 22:53:35 +00:00
REDIM AS STRING DirList(0 TO RESIZE_BLOCK_SIZE), FileList(0 TO RESIZE_BLOCK_SIZE) ' resize the file and dir list arrays (and toss contents)
DIM dirName AS STRING: dirName = _CWD$ ' we'll enumerate the current directory contents
DIM AS LONG dirCount, fileCount, flags, fileSize
DIM entryName AS STRING
2023-07-21 22:53:35 +00:00
IF open_dir(dirName) THEN
DO
2023-07-21 22:53:35 +00:00
entryName = read_dir(flags, fileSize)
IF entryName <> "" THEN
SELECT CASE flags
CASE 1
2023-07-21 22:53:35 +00:00
IF dirCount > UBOUND(DirList) THEN REDIM _PRESERVE DirList(0 TO UBOUND(DirList) + RESIZE_BLOCK_SIZE) AS STRING
DirList(dirCount) = entryName
2023-07-21 22:53:35 +00:00
dirCount = dirCount + 1
CASE 2
2023-07-21 22:53:35 +00:00
IF fileCount > UBOUND(FileList) THEN REDIM _PRESERVE FileList(0 TO UBOUND(FileList) + RESIZE_BLOCK_SIZE) AS STRING
FileList(fileCount) = entryName
2023-07-21 22:53:35 +00:00
fileCount = fileCount + 1
END SELECT
END IF
LOOP UNTIL entryName = ""
close_dir
END IF
2023-07-21 22:53:35 +00:00
REDIM _PRESERVE DirList(0 TO dirCount) AS STRING
REDIM _PRESERVE FileList(0 TO fileCount) AS STRING
GetCurDirLists = dirCount + fileCount ' return total count of items
END FUNCTION
'This SUB will take a given N delimited string, and delimiter$ and create an array of N+1 strings using the LBOUND of the given dynamic array to load.
'notes: the loadMeArray() needs to be dynamic string array and will not change the LBOUND of the array it is given. rev 2019-08-27
SUB Split (SplitMeString AS STRING, delim AS STRING, loadMeArray() AS STRING)
DIM curpos AS LONG, arrpos AS LONG, LD AS LONG, dpos AS LONG 'fix use the Lbound the array already has
curpos = 1: arrpos = LBOUND(loadMeArray): LD = LEN(delim)
dpos = INSTR(curpos, SplitMeString, delim)
DO UNTIL dpos = 0
loadMeArray(arrpos) = MID$(SplitMeString, curpos, dpos - curpos)
arrpos = arrpos + 1
IF arrpos > UBOUND(loadMeArray) THEN REDIM _PRESERVE loadMeArray(LBOUND(loadMeArray) TO UBOUND(loadMeArray) + 1000) AS STRING
curpos = dpos + LD
dpos = INSTR(curpos, SplitMeString, delim)
LOOP
loadMeArray(arrpos) = MID$(SplitMeString, curpos)
REDIM _PRESERVE loadMeArray(LBOUND(loadMeArray) TO arrpos) AS STRING 'get the ubound correct
END SUB
2023-07-21 22:53:35 +00:00
FUNCTION fileStr$ (txtFile AS STRING)
IF _FILEEXISTS(txtFile) THEN
DIM ff AS LONG: ff = FREEFILE
OPEN txtFile FOR BINARY AS ff
fileStr$ = INPUT$(LOF(ff), ff)
CLOSE ff
END IF
2023-07-21 22:53:35 +00:00
END FUNCTION
FUNCTION rightOf$ (source$, of$)
IF INSTR(source$, of$) > 0 THEN rightOf$ = MID$(source$, INSTR(source$, of$) + LEN(of$))
END FUNCTION
': Event procedures: ---------------------------------------------------------------
SUB __UI_BeforeInit
END SUB
SUB __UI_OnLoad
loadDirsFilesList
END SUB
SUB __UI_BeforeUpdateDisplay
'This event occurs at approximately 30 frames per second.
'You can change the update frequency by calling SetFrameRate DesiredRate%
END SUB
SUB __UI_BeforeUnload
'If you set __UI_UnloadSignal = False here you can
'cancel the user's request to close.
END SUB
SUB __UI_Click (id AS LONG)
2023-07-21 22:53:35 +00:00
DIM AS LONG value, i
DIM AS STRING dir, fi, fs, fa(0)
SELECT CASE id
CASE frmTextFetch
CASE lbCWD
CASE lbDirs
CASE ListDirs
dir$ = GetItem$(ListDirs, Control(ListDirs).Value)
IF _DIREXISTS(dir$) THEN
CHDIR dir$
Caption(lbCWD) = "Current Directory: " + _CWD$
loadDirsFilesList
END IF
CASE lbFiles
CASE ListFiles
fi$ = GetItem$(ListFiles, Control(ListFiles).Value)
IF _FILEEXISTS(fi$) THEN
fs$ = fileStr$(fi$)
2023-07-21 22:53:35 +00:00
Split fs$, CHR$(13) + CHR$(10), fa()
ResetList ListFile
2023-07-21 22:53:35 +00:00
FOR i = LBOUND(fa) TO UBOUND(fa)
AddItem ListFile, fa(i)
NEXT
'clear
Caption(lbStart) = "Line Start"
Caption(lbEnd) = "Line End"
Caption(lbFile) = "Selected File: Path = " + _CWD$ + ", Name = " + fi$
END IF
CASE lbFile
CASE ListFile
CASE lbTxt
CASE ListTxt
CASE BtnStart
value = Control(ListFile).Value
Caption(lbStart) = STR$(value) + " Start Line"
IF VAL(Caption(lbStart)) - VAL(Caption(lbEnd)) > 0 THEN loadText
CASE BtnEnd
value = Control(ListFile).Value
Caption(lbEnd) = STR$(value) + " End Line"
IF VAL(Caption(lbEnd)) - VAL(Caption(lbStart)) > 0 THEN loadText
CASE lbStart
CASE lbEnd
END SELECT
END SUB
SUB __UI_MouseEnter (id AS LONG)
SELECT CASE id
CASE frmTextFetch
CASE lbCWD
CASE lbDirs
CASE ListDirs
CASE lbFiles
CASE ListFiles
CASE lbFile
CASE ListFile
CASE lbTxt
CASE ListTxt
CASE BtnStart
CASE BtnEnd
CASE lbStart
CASE lbEnd
END SELECT
END SUB
SUB __UI_MouseLeave (id AS LONG)
SELECT CASE id
CASE frmTextFetch
CASE lbCWD
CASE lbDirs
CASE ListDirs
CASE lbFiles
CASE ListFiles
CASE lbFile
CASE ListFile
CASE lbTxt
CASE ListTxt
CASE BtnStart
CASE BtnEnd
CASE lbStart
CASE lbEnd
END SELECT
END SUB
SUB __UI_FocusIn (id AS LONG)
SELECT CASE id
CASE ListDirs
CASE ListFiles
CASE ListFile
CASE ListTxt
CASE BtnStart
CASE BtnEnd
END SELECT
END SUB
SUB __UI_FocusOut (id AS LONG)
'This event occurs right before a control loses focus.
'To prevent a control from losing focus, set __UI_KeepFocus = True below.
SELECT CASE id
CASE ListDirs
CASE ListFiles
CASE ListFile
CASE ListTxt
CASE BtnStart
CASE BtnEnd
END SELECT
END SUB
SUB __UI_MouseDown (id AS LONG)
SELECT CASE id
CASE frmTextFetch
CASE lbCWD
CASE lbDirs
CASE ListDirs
CASE lbFiles
CASE ListFiles
CASE lbFile
CASE ListFile
CASE lbTxt
CASE ListTxt
CASE BtnStart
CASE BtnEnd
CASE lbStart
CASE lbEnd
END SELECT
END SUB
SUB __UI_MouseUp (id AS LONG)
SELECT CASE id
CASE frmTextFetch
CASE lbCWD
CASE lbDirs
CASE ListDirs
CASE lbFiles
CASE ListFiles
CASE lbFile
CASE ListFile
CASE lbTxt
CASE ListTxt
CASE BtnStart
CASE BtnEnd
CASE lbStart
CASE lbEnd
END SELECT
END SUB
SUB __UI_KeyPress (id AS LONG)
'When this event is fired, __UI_KeyHit will contain the code of the key hit.
'You can change it and even cancel it by making it = 0
SELECT CASE id
CASE ListDirs
CASE ListFiles
CASE ListFile
CASE ListTxt
CASE BtnStart
CASE BtnEnd
END SELECT
END SUB
SUB __UI_TextChanged (id AS LONG)
SELECT CASE id
END SELECT
END SUB
SUB __UI_ValueChanged (id AS LONG)
2023-07-21 22:53:35 +00:00
SELECT CASE id
CASE ListDirs
CASE ListFiles
CASE ListFile
CASE ListTxt
END SELECT
END SUB
SUB __UI_FormResized
END SUB
'$INCLUDE:'../../InForm/InForm.ui'
'$INCLUDE:'../../InForm/xp.uitheme'