-- TABLE SEARCH local version = '0.2.2.2' -- Developer: ImJustMaxie -- Credits: Akira Fudo, Fury Zenblade, LeFiXER -- CHANGELOGS (FULL) local changelogs = { ['0.1'] = 'Initial Release', ['0.2'] = [[- Added version number (click to see current changelog) - Included number of results in bold (top right label) - Incorporated LeFiXER's method of using for loops for list columns creation (Thank you!) - Includes a generic 'Unknown Type' fallback for vartypes not included in the default vartype list - Includes string size for string type values - Fixes a minor UI bug (Auto Search checkbox should disable the Search button, no typing required) - Fixes an issue where the next search result containing previous checked boxes do not display as checked - Fixes the binary type display to include startbit and binary size]], ['0.2.1'] = '- High priority fix where the checkboxes do not appear when using any resolution scaling methods', ['0.2.2'] = '- Code optimization', ['0.2.2.1'] = '- Set the `Auto Search` checkbox to be enabled by default', ['0.2.2.2'] = [[- Added group header types - Add string size provided from the memrec - Pointer memrecs now display the address as pointer form as opposed to the base address - Fixes a bug where the form checkboxes are able to be checked even when the actual memrecs have invalid/unknown ?? values]] } local asrs = { ['asrTop'] = asrTop, ['asrLeft'] = asrLeft, ['asrRight'] = asrRight, ['asrBottom'] = asrBottom, ['asrCenter'] = asrCenter } local function capWord(str) local str = (str:lower()):gsub("^%l",string.upper) ; return str end local function setAnchor(varComponent,strSide,varControl,intBorder,strAltSide) if varComponent == nil or strSide == nil or varControl == nil then return end varComponent['AnchorSide'..capWord(strSide)].Control = varControl if intBorder then varComponent.BorderSpacing[strSide] = intBorder end if strAltSide then varComponent['AnchorSide'..capWord(strSide)].Side = asrs['asr'..capWord(strAltSide)] else varComponent['AnchorSide'..capWord(strSide)].Side = asrs['asr'..capWord(strSide)] end end local function translateVartype(vartype) local tbl = { 'Byte', '2 Bytes', '4 Bytes', '8 Bytes', 'Float', 'Double', 'String [%s]', 'Wide String [%s]', 'Byte Array', 'Binary', 'All', 'AA Script', 'Pointer', 'Custom Type', 'Grouped', } if vartype ~= nil then return tbl[vartype+1] or 'Unknown Type' else return '' end end local function mod_string(textstring) local modstr = textstring:gsub("%W","%%%1") ; return modstr end local function initTableSearch() frmTS = createForm() frmTS.Name = "formTableSearch" frmTS.Caption = "Table Search" frmTS.OnClose = frmTS.hide frmTS.Position = 'poScreenCenter' frmTS.BorderStyle = 'bsSizeable' frmTS.DesignTimePPI = getScreenDPI() frmTS.Height = 400 frmTS.Width = 700 frmTS.tsLabel0 = createLabel(frmTS) frmTS.tsLabel0.Caption = ('Version: %s [Click for changelog]'):format(version) frmTS.tsLabel0.Anchors = '[akTop,akLeft]' frmTS.tsLabel0.AutoSize = true setAnchor(frmTS.tsLabel0,'top',frmTS,10) setAnchor(frmTS.tsLabel0,'left',frmTS,20) frmTS.tsLabel0_1 = createLabel(frmTS) frmTS.tsLabel0_1.Caption = 'Results: 0' frmTS.tsLabel0_1.Anchors = '[akTop,akRight]' setAnchor(frmTS.tsLabel0_1,'top',frmTS,10) setAnchor(frmTS.tsLabel0_1,'right',frmTS,20) frmTS.tsEditBox = createEdit(frmTS) frmTS.tsEditBox.Anchors = '[akTop,akLeft,akRight]' frmTS.tsEditBox.AutoSize = true frmTS.tsEditBox.AutoSelect = true frmTS.tsEditBox.Height = 23 setAnchor(frmTS.tsEditBox,'top',frmTS.tsLabel0,10,'bottom') setAnchor(frmTS.tsEditBox,'left',frmTS,20) frmTS.tsCheckbox1 = createCheckBox(frmTS) frmTS.tsCheckbox1.Caption = "Case Sensitive" frmTS.tsCheckbox1.Anchors = '[akTop,akRight]' frmTS.tsCheckbox1.AutoSize = true setAnchor(frmTS.tsCheckbox1,'top',frmTS.tsEditBox,20,'center') setAnchor(frmTS.tsCheckbox1,'right',frmTS,20) frmTS.tsCheckbox2 = createCheckBox(frmTS) frmTS.tsCheckbox2.Caption = "Auto Search" frmTS.tsCheckbox2.Anchors = '[akTop,akLeft]' frmTS.tsCheckbox2.AutoSize = true frmTS.tsCheckbox2.Checked = true setAnchor(frmTS.tsCheckbox2,'top',frmTS.tsCheckbox1,20) setAnchor(frmTS.tsCheckbox2,'left',frmTS.tsCheckbox1) frmTS.tsButton1 = createButton(frmTS) frmTS.tsButton1.Caption = "Search" frmTS.tsButton1.Anchors = '[akTop,akRight]' frmTS.tsButton1.AutoSize = true frmTS.tsButton1.Enabled = false setAnchor(frmTS.tsButton1,'top',frmTS.tsEditBox,0,'center') setAnchor(frmTS.tsButton1,'right',frmTS.tsCheckbox1,20,'left') frmTS.tsLabel1 = createLabel(frmTS) frmTS.tsLabel1.Caption = "Double click to change the memory record value" frmTS.tsLabel1.Anchors = '[akTop,akLeft]' frmTS.tsLabel1.AutoSize = true setAnchor(frmTS.tsLabel1,'top',frmTS.tsEditBox,10,'bottom') setAnchor(frmTS.tsLabel1,'left',frmTS.tsEditBox) frmTS.fixDPI() frmTS.tsListView1 = createListView(frmTS) frmTS.tsListView1.Anchors = '[akTop,akLeft,akRight,akBottom]' frmTS.tsListView1.ViewStyle = 'vsReport' frmTS.tsListView1.AutoWidthLastColumn = true frmTS.tsListView1.AutoSort = true frmTS.tsListView1.ReadOnly = true frmTS.tsListView1.RowSelect = true frmTS.tsListView1.Checkboxes = true setAnchor(frmTS.tsListView1,'top',frmTS.tsCheckbox2,20,'bottom') setAnchor(frmTS.tsListView1,'left',frmTS.tsEditBox) setAnchor(frmTS.tsListView1,'right',frmTS.tsCheckbox1) setAnchor(frmTS.tsListView1,'bottom',frmTS,20) -- editbox is created late, hence this setAnchor(frmTS.tsEditBox,'right',frmTS.tsButton1,20,'left') -- columns section -- thank you fixer for the for loop method local tmp_columnwidth = (frmTS.tsListView1.Width - 260) / 4 frmTS.tsColumn = { [1] = { ['Caption'] = "ID", ['Width'] = 50 }, [2] = { ['Caption'] = "Description", ['Width'] = 205 }, [3] = { ['Caption'] = "Parent", ['Width'] = tmp_columnwidth }, [4] = { ['Caption'] = "Address", ['Width'] = tmp_columnwidth }, [5] = { ['Caption'] = "Type", ['Width'] = tmp_columnwidth }, [6] = { ['Caption'] = "Value", ['Width'] = tmp_columnwidth }, } for i,column in ipairs(frmTS.tsColumn) do local mcolumn = frmTS.tsListView1.Columns.add() mcolumn.Caption = column.Caption mcolumn.Width = column.Width end end local function ts_useTableSearch() frmTS.tsListView1.Items.Clear() local al = getAddressList() local str = frmTS.tsEditBox.text local desc = nil local desc2 = nil if str == '' then frmTS.tsLabel0_1.Caption = 'Results: 0' frmTS.tsLabel0_1.Font.Style = '' return end for i=0,al.Count-1 do if frmTS.tsCheckbox1.Checked == false then desc = al[i].description:lower() ; desc2 = str:lower() else desc = al[i].description ; desc2 = str end if string.match(desc,mod_string(desc2)) then local num = i local l = frmTS.tsListView1.Items.Add() if al[num].Active == true then l.Checked = true end l.Caption = i l.SubItems.add(al[num].Description) if al[num].Parent then l.SubItems.add(('%s'):format(al[num].Parent.Description)) else l.SubItems.add(('%s'):format('')) end if al[num].type == vtAutoAssembler then l.SubItems.add(('%s'):format('')) l.SubItems.add(('%s'):format(translateVartype(al[num].type))) l.SubItems.add('