Skip to content

Instantly share code, notes, and snippets.

@andreievg
Created July 16, 2022 06:19
Show Gist options
  • Save andreievg/be2cae2255b29cc507764875954401e0 to your computer and use it in GitHub Desktop.
Save andreievg/be2cae2255b29cc507764875954401e0 to your computer and use it in GitHub Desktop.
4d vscode-like search for methods
// Quick search, open and run method, should be named to appear first in "Execute Method"
// ctrl + r + enter to quickly open method search
$MIN_NUMBER_OF_SEARCH_LETTERS:=3
$INPUT_NAME:="input"
$LIST_NAME:="list"
$event:=FORM Event
Case of
// ON START
: ($event=Null)
// Create FORM
$form:=New object
$form.method:=Current method name
$form.events:=New collection
$form.events.push("onLoad")
$form.events.push("onAfterKeystroke")
$form.events.push("onBeforeKeystroke")
// Create PAGE
$form.pages:=New collection
$form.pages.push(Null)
$form.pages.push(New object)
$form.pages[1].objects:=New object
// Create SEARCH INPUT
$form.pages[1].objects[$INPUT_NAME]:=New object("type"; "input")
$form.pages[1].objects[$INPUT_NAME].top:=0
$form.pages[1].objects[$INPUT_NAME].left:=0
$form.pages[1].objects[$INPUT_NAME].width:=300
$form.pages[1].objects[$INPUT_NAME].height:=18
// Create METHOD LIST
$form.pages[1].objects[$LIST_NAME]:=New object("type"; "listbox")
$form.pages[1].objects[$LIST_NAME].method:=Current method name
$form.pages[1].objects[$LIST_NAME].events:=New collection
$form.pages[1].objects[$LIST_NAME].dataSource:="Form.methodList"
$form.pages[1].objects[$LIST_NAME].listboxType:="collection"
$form.pages[1].objects[$LIST_NAME].currentItemSource:="Form.selectedMethod"
$form.pages[1].objects[$LIST_NAME].events.push("onDoubleClick")
$form.pages[1].objects[$LIST_NAME].top:=18
$form.pages[1].objects[$LIST_NAME].left:=0
$form.pages[1].objects[$LIST_NAME].width:=300
$form.pages[1].objects[$LIST_NAME].height:=500
$form.pages[1].objects[$LIST_NAME].showHeaders:=False
$form.pages[1].objects[$LIST_NAME].showFooters:=False
$form.pages[1].objects[$LIST_NAME].scrollbarHorizontal:="hidden"
$form.pages[1].objects[$LIST_NAME].scrollbarVertical:="hidden"
// Add column to METHOD LIST
$form.pages[1].objects[$LIST_NAME].columns:=New collection
$form.pages[1].objects[$LIST_NAME].columns.push(New object)
$form.pages[1].objects[$LIST_NAME].columns[0].dataSource:="This.name"
$form.pages[1].objects[$LIST_NAME].columns[0].width:=300
$form.pages[1].objects[$LIST_NAME].columns[0].enterable:=False
// Create INVISIBLE BUTTON, for ENTER to work
$form.pages[1].objects.openButton:=New object("type"; "button")
$form.pages[1].objects.openButton.method:=Current method name
$form.pages[1].objects.openButton.events:=New collection
$form.pages[1].objects.openButton.events.push("onClick")
$form.pages[1].objects.openButton.shortcutKey:="[Enter]"
$form.pages[1].objects.openButton.defaultButton:=True
$form.pages[1].objects.openButton.width:=0
$form.pages[1].objects.openButton.height:=0
// Create TOOL TIP
$form.pages[1].objects.tooltip:=New object("type"; "text")
$form.pages[1].objects.tooltip.top:=520
$form.pages[1].objects.tooltip.left:=0
$form.pages[1].objects.tooltip.width:=300
$form.pages[1].objects.tooltip.height:=68
$form.pages[1].objects.tooltip.text:="[ENTER] - Open Method"+Char(Carriage return)+"[R] - Run Method"+Char(Carriage return)+"[Up/Down Arrow] - Move from list to input"+Char(Carriage return)+"[ESC] - Close"
// LOAD THE FORM
$r:=Open form window($form; Pop up form window; Horizontally centered; Vertically centered)
DIALOG($form)
// ON ESC
: (($event.code=On Before Keystroke) & (Character code(Keystroke)=Escape))
CANCEL
// ON ENTER (when button is clicked), and method selected, go to method
: (($event.code=On Clicked) & (Form.selectedMethod#Null))
METHOD OPEN PATH(Form.selectedMethod.name)
CANCEL
// FORM EVENT
: ($event.objectName=Null)
// FORM ON LOAD
If ($event.code=On Load)
// Get all method names, sort by name
METHOD GET NAMES($methodNamesArray)
SORT ARRAY($methodNamesArray; >)
// Convert to collection and save in form
$methodNames:=New collection
ARRAY TO COLLECTION($methodNames; $methodNamesArray)
Form.$methodNames:=$methodNames
// Convert to list
$methodList:=New collection
For each ($methodName; $methodNames)
$method:=New object;
$method.name:=$methodName
$methodList.push($method)
End for each
// Add to from state
Form.fullMethodList:=$methodList
Form.methodList:=$methodList
// Always pre select first row
LISTBOX SELECT ROW(*; $LIST_NAME; 1)
// TODO highlight and show last value
GOTO OBJECT(*; $INPUT_NAME)
End if
// SEARCH INPUT EVENT, ON DOWN ARROW, navigate to first row of listbox
: (($event.objectName=$INPUT_NAME) & (Character code(Keystroke)=Down arrow key))
LISTBOX SELECT ROW(*; $LIST_NAME; 1)
GOTO OBJECT(*; $LIST_NAME)
// SEARCH INPUT EVENT, ANY OTHER KEY and minimum number of search letters
: (($event.objectName=$INPUT_NAME) & (Length(Get edited text)>=$MIN_NUMBER_OF_SEARCH_LETTERS))
$methodSearch:=Get edited text
// Make method search regex, for input "aBc" regex will be "a.*b.*c.*"
$regex:=".*"
For ($index; 1; Length($methodSearch))
$regex:=$regex+$methodSearch[[$index]]+".*"
End for
$regex:=Lowercase($regex)
// Search for matches
$methodList:=New collection
For each ($method; Form.fullMethodList)
If (Match regex($regex; Lowercase($method.name)))
$methodList.push($method)
End if
End for each
Form.methodList:=$methodList
// Always select first row
If ($methodList.count()#0)
LISTBOX SELECT ROW(*; $LIST_NAME; 1)
End if
// LISTBOX EVENT, ON UP ARROW KEY, and first element, navigate to search input
: (($event.objectName=$LIST_NAME) & (Character code(Keystroke)=Up arrow key))
If (Form.methodList[0].name=Form.selectedMethod.name)
GOTO OBJECT(*; $INPUT_NAME)
End if
// LISTBOX EVENT, ON DOUBLE CLICKED ROW, open method
: (($event.objectName=$LIST_NAME) & ($event.code=On Double Clicked) & (String($event.row)#""))
METHOD OPEN PATH(Form.methodList[$event.row-1].name)
CANCEL
// LISTBOX EVENT, ON 'R' PRESSED, run method
: (($event.objectName=$LIST_NAME) & (Character code(Keystroke)=Character code("r")) & (Form.selectedMethod#Null))
$r:=New process(Form.selectedMethod.name; 0; Form.selectedMethod.name)
CANCEL
End case
@andreievg
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment