Created
July 16, 2022 06:19
-
-
Save andreievg/be2cae2255b29cc507764875954401e0 to your computer and use it in GitHub Desktop.
4d vscode-like search for methods
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
For description see: https://discuss.4d.com/t/quick-search-open-run-method/24166