diff --git a/main.go b/main.go index f1a5581..b94c7fb 100644 --- a/main.go +++ b/main.go @@ -41,7 +41,7 @@ type TMainForm struct { insertRows map[int32]struct{} // Rows in the StringGrid that are to-be-inserted deleteRows map[int32]struct{} updateRows map[int32][]int32 // Row->cells that are to-be-updated - queryInput *vcl.TMemo + queryInput *vcl.TRichEdit queryResult *vcl.TStringGrid none *noLoadedDatabase @@ -293,7 +293,7 @@ func (f *TMainForm) OnFormCreate(sender vcl.IObject) { queryExecBtn.SetImageIndex(imgResultsetNext) queryExecBtn.SetOnClick(f.OnQueryExecute) - f.queryInput = vcl.NewMemo(queryTab) + f.queryInput = vcl.NewRichEdit(queryTab) f.queryInput.SetParent(queryTab) f.queryInput.SetHeight(MY_HEIGHT) f.queryInput.SetAlign(types.AlTop) @@ -303,10 +303,12 @@ func (f *TMainForm) OnFormCreate(sender vcl.IObject) { } else { f.queryInput.Font().SetName("monospace") } + f.queryInput.SetCursor(types.CrIBeam) // Use text cursor instead of default pointer cursor f.queryInput.BorderSpacing().SetLeft(MY_SPACING) //f.queryInput.BorderSpacing().SetTop(1) f.queryInput.BorderSpacing().SetRight(MY_SPACING) f.queryInput.SetBorderStyle(types.BsFrame) + // f.queryInput.SetOnKeyUp(f.OnQueryTextChanged) // Performs extremely slowly vsplit := vcl.NewSplitter(queryTab) vsplit.SetParent(queryTab) @@ -692,6 +694,46 @@ func (f *TMainForm) OnNavContextClose(sender vcl.IObject) { // n.b. This triggers OnNavChange, which will then re-render from noLoadedDatabase{} } +// func (f *TMainForm) OnQueryTextChanged(sender vcl.IObject) { +func (f *TMainForm) OnQueryTextChanged(sender vcl.IObject, key *types.Char, shift types.TShiftState) { + + // FIXME changing the text colour calls the onchange handler recursively + // FIXME changing the text colour pushes into the undo stack + + // Preserve + f.queryInput.Lines().BeginUpdate() + origPos := f.queryInput.SelStart() + origLen := f.queryInput.SelLength() + defer func() { + f.queryInput.SetSelStart(origPos) + f.queryInput.SetSelLength(origLen) + f.queryInput.Lines().EndUpdate() + }() + + tx := strings.ToLower(f.queryInput.Text()) + + // Reset all existing colors + f.queryInput.SetSelStart(0) + f.queryInput.SetSelLength(int32(len(tx))) + f.queryInput.SelAttributes().SetColor(colors.ClBlack) + + searchPos := 0 + for { + matchPos := strings.Index(tx[searchPos:], "select") + if matchPos == -1 { + break + } + + matchPos += searchPos // compensate for slicing + + f.queryInput.SetSelStart(int32(matchPos)) + f.queryInput.SetSelLength(6) + f.queryInput.SelAttributes().SetColor(colors.ClRed) + + searchPos = matchPos + 6 // strlen(SELECT) + } +} + func (f *TMainForm) OnQueryExecute(sender vcl.IObject) { // If query tab is not selected, switch to it, but do not exec if f.Tabs.ActivePageIndex() != 2 {