-- TABLE SEARCH local version = 0.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]], } local function initTableSearch() frmTS = createForm() frmTS.Name = "formTableSearch" frmTS.Caption = "Table Search" frmTS.OnClose = frmTS.hide frmTS.Position = 'poScreenCenter' frmTS.BorderStyle = 'bsSizeable' frmTS.Height = 400 frmTS.Width = 700 frmTS.tsLabel0 = createLabel(frmTS) frmTS.tsLabel0.Caption = ('Version: %s'):format(version) frmTS.tsLabel0.Anchors = '[akTop,akLeft]' frmTS.tsLabel0.AutoSize = true frmTS.tsLabel0.AnchorSideTop.Control = frmTS frmTS.tsLabel0.AnchorSideTop.Side = asrTop frmTS.tsLabel0.BorderSpacing.Top = 10 frmTS.tsLabel0.AnchorSideLeft.Control = frmTS frmTS.tsLabel0.AnchorSideLeft.Side = asrLeft frmTS.tsLabel0.BorderSpacing.Left = 20 frmTS.tsLabel0_1 = createLabel(frmTS) frmTS.tsLabel0_1.Caption = 'Results: 0' frmTS.tsLabel0_1.Anchors = '[akTop,akRight]' frmTS.tsLabel0_1.AnchorSideTop.Control = frmTS frmTS.tsLabel0_1.AnchorSideTop.Side = asrTop frmTS.tsLabel0_1.BorderSpacing.Top = 10 frmTS.tsLabel0_1.AnchorSideRight.Control = frmTS frmTS.tsLabel0_1.AnchorSideRight.Side = asrRight frmTS.tsLabel0_1.BorderSpacing.Right = 20 frmTS.tsEditBox = createEdit(frmTS) frmTS.tsEditBox.Anchors = '[akTop,akLeft,akRight]' frmTS.tsEditBox.AutoSize = true frmTS.tsEditBox.AutoSelect = true frmTS.tsEditBox.Height = 23 frmTS.tsEditBox.AnchorSideTop.Control = frmTS.tsLabel0 frmTS.tsEditBox.AnchorSideTop.Side = asrBottom frmTS.tsEditBox.BorderSpacing.Top = 10 frmTS.tsEditBox.AnchorSideLeft.Control = frmTS frmTS.tsEditBox.AnchorSideLeft.Side = asrLeft frmTS.tsEditBox.BorderSpacing.Left = 20 frmTS.tsCheckbox1 = createCheckBox(frmTS) frmTS.tsCheckbox1.Caption = "Case Sensitive" frmTS.tsCheckbox1.Anchors = '[akTop,akRight]' frmTS.tsCheckbox1.AutoSize = true frmTS.tsCheckbox1.AnchorSideTop.Control = frmTS.tsEditBox frmTS.tsCheckbox1.AnchorSideTop.Side = asrCenter frmTS.tsCheckbox1.BorderSpacing.Top = 20 frmTS.tsCheckbox1.AnchorSideRight.Control = frmTS frmTS.tsCheckbox1.AnchorSideRight.Side = asrRight frmTS.tsCheckbox1.BorderSpacing.Right = 20 frmTS.tsCheckbox2 = createCheckBox(frmTS) frmTS.tsCheckbox2.Caption = "Auto Search" frmTS.tsCheckbox2.Anchors = '[akTop,akLeft]' frmTS.tsCheckbox2.AutoSize = true frmTS.tsCheckbox2.AnchorSideTop.Control = frmTS.tsCheckbox1 frmTS.tsCheckbox2.AnchorSideTop.Side = asrTop frmTS.tsCheckbox2.BorderSpacing.Top = 20 frmTS.tsCheckbox2.AnchorSideLeft.Control = frmTS.tsCheckbox1 frmTS.tsCheckbox2.AnchorSideLeft.Side = asrLeft frmTS.tsCheckbox2.BorderSpacing.Left = 0 frmTS.tsButton1 = createButton(frmTS) frmTS.tsButton1.Caption = "Search" frmTS.tsButton1.Anchors = '[akTop,akRight]' frmTS.tsButton1.AutoSize = true frmTS.tsButton1.AnchorSideTop.Control = frmTS.tsEditBox frmTS.tsButton1.AnchorSideTop.Side = asrCenter frmTS.tsButton1.BorderSpacing.Top = 0 frmTS.tsButton1.AnchorSideRight.Control = frmTS.tsCheckbox1 frmTS.tsButton1.AnchorSideRight.Side = asrLeft frmTS.tsButton1.BorderSpacing.Right = 20 frmTS.tsLabel1 = createLabel(frmTS) frmTS.tsLabel1.Caption = "Double click to change the memory record value" frmTS.tsLabel1.Anchors = '[akTop,akLeft]' frmTS.tsLabel1.AutoSize = true frmTS.tsLabel1.AnchorSideTop.Control = frmTS.tsEditBox frmTS.tsLabel1.AnchorSideTop.Side = asrBottom frmTS.tsLabel1.BorderSpacing.Top = 10 frmTS.tsLabel1.AnchorSideLeft.Control = frmTS.tsEditBox frmTS.tsLabel1.AnchorSideLeft.Side = asrLeft frmTS.tsLabel1.BorderSpacing.Left = 0 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 frmTS.tsListView1.AnchorSideTop.Control = frmTS.tsCheckbox2 frmTS.tsListView1.AnchorSideTop.Side = asrBottom frmTS.tsListView1.BorderSpacing.Top = 20 frmTS.tsListView1.AnchorSideLeft.Control = frmTS.tsEditBox frmTS.tsListView1.AnchorSideLeft.Side = asrLeft frmTS.tsListView1.BorderSpacing.Left = 0 frmTS.tsListView1.AnchorSideRight.Control = frmTS.tsCheckbox1 frmTS.tsListView1.AnchorSideRight.Side = asrRight frmTS.tsListView1.BorderSpacing.Right = 0 frmTS.tsListView1.AnchorSideBottom.Control = frmTS frmTS.tsListView1.AnchorSideBottom.Side = asrBottom frmTS.tsListView1.BorderSpacing.Bottom = 20 -- editbox is created late, hence this frmTS.tsEditBox.AnchorSideRight.Control = frmTS.tsButton1 frmTS.tsEditBox.AnchorSideRight.Side = asrLeft frmTS.tsEditBox.BorderSpacing.Right = 20 -- 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 translateVartype(vartype) local tbl = { 'Byte', '2 Bytes', '4 Bytes', '8 Bytes', 'Float', 'Double', 'String', 'Wide String', '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 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('