diff --git a/source/Sequal.Suggest.dfm b/source/Sequal.Suggest.dfm index 2815d0f9..9db28cdc 100644 --- a/source/Sequal.Suggest.dfm +++ b/source/Sequal.Suggest.dfm @@ -2,40 +2,138 @@ object SequalSuggestForm: TSequalSuggestForm Left = 0 Top = 0 Caption = 'SequalSuggestForm' - ClientHeight = 292 - ClientWidth = 418 + ClientHeight = 361 + ClientWidth = 484 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -12 Font.Name = 'Segoe UI' Font.Style = [] + Position = poOwnerFormCenter OnClose = FormClose OnCreate = FormCreate OnShow = FormShow DesignSize = ( - 418 - 292) + 484 + 361) TextHeight = 15 - object Label1: TLabel + object imgSequalLogo: TImage Left = 8 - Top = 8 - Width = 34 + Top = 328 + Width = 90 + Height = 25 + Cursor = crHandPoint + Hint = 'https://sequal.dev/' + Anchors = [akLeft, akBottom] + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D494844520000005A0000 + 00190806000000B16439C0000000017352474200AECE1CE90000000467414D41 + 0000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000009 + B24944415478DAED980B5094D71580775960792D8BB0A202BEAA5551A4152546 + 69699D248A48126C498C89557CA68D54273144D2888DC4884D529BD64E9292D2 + 181363EA23A6254A2198061A47298528A22286C1CAF09087BC9F02DBEFC2FD37 + BF2B558648653ADC993BFBEFDD7BCE3DE73BE79E7BFFD56A86DAFFA469EFB601 + 83BD8D1B372EB2BABAFA41F16C6B6B7BA4A6A6E6FDFEE819027D9B3672E4C8B7 + CBCBCBD788673B3BBBDDD7AF5FDFD01F3D43A06FD300FD06A07F269E01BD0BD0 + 9BFAA36708F46DDA80811E3B76ECB8FAFAFAD9CDCDCDDE3A9D4EE3E0E050EAEC + EC7CAAB8B8F8F2AD148D183162727B7BFB9C969616935EAF6F4236372222222B + 2121A1FD56721E1E1E414D4D4D336C6C6CEC0D06C3B9AB57AFA6C4C5C5D9C6C7 + C707A3CB9E296DF413F4F63367CE6867CF9E3DA7B5B5D595F962CDECB2B2B24A + 2B9513E9DF96CF85F402EB35BDBCBC46E1DF9CB6B6B6B15A1A3E96D8DBDB6702 + F4261FFB0BBA3A628FB7C646DBE0716045FD0DA0E7CF9FEF989E9EFE724747C7 + DAAEAE2E17B3D9DC1309AD5683534D8E8E8E6F6ED9B2E5F99898980EB5C2F1E3 + C7BB959494FC1AB965C8D92BE3020486E512A40DD7AE5D4BB736047D3E9D9D9D + 7F42EE01E42C3204E8A3A0A0A05F6466666601DAC0701D7D12BD02D03A409F05 + B4AF04FD10A093AC546FA7BF209F77D12D6056AF5E6DBB6FDFBE5F022B8A35DD + AC7D04F85E4F4FCF4D4545452DDF0474D5C284683EB6D14B21FCA8E9D8BA1C0B + 6816791707962B0BE370218B77A178220689C00B38BBC804CB42A3478F369496 + 96FE0D60731550F472E63B33669063AD6E6E6E0B81FDB92AFB8D9595951938EB + AF8CA1BF8D6ECB988EF929D812487717C9419FAA02FD25E3D325E830401FB5F2 + 338E1E2B9F5FA347AB7C4C447695CAC7521E31B573B4029D39EF33E727FD055D + FD50A287B9BD43EC24A374EC0353F2BA27B4D2F1E9387E0627B522B26CE127C2 + C2C292030303BB76EEDC195255557590CC73C0B076223E05E78A6456BE4ED66D + 94469C462ECAC7C7278F60182835EBD99A31E237B6E5B979F3E6CD4A49496915 + DF9D9C9C763267B374B893EF2FA27B3FFAF4757575AB917B46715C82F6A557F6 + 11B4C8A4ADD6A0B1EB7EE67E0A5411FC06D65C191010904A503BD8C93F6A6868 + 7807FFED845E7777F719F87CBA3FA06B567FE8D059569FA9E932F724918DF605 + 327A87562A5B545151F189D8C240C9A7D6FAAA85870F1F1E06504FEE91C53897 + 79F1E2C57A5F5F5F9F4B972EE511002390AAA87B01C02D56CB51AB0F022D4264 + 0F8E2DA2161F0394212727270F83C748E82F017DAB5A0EE07B586FC59D043D71 + E2442F7C9C85BD93B0F73C608F59D99A8EADC172FDC7597F7F7F40CBAC9E6CBE + DEB15EA3B329B6313AFECE7DDFB2B69B325A96883D2E2E2E8946A3311F9855BD + 29E3108BA01C1C14994770FE02B0C76A6B6B1DE5CF426F33C6AFC0F8B724D05F + 0134861D1140B6FC4BAC85C3CDDEDEDE7E57AE5C2952EB36994C41E8FE42D6EE + 3B02BAB7E6EFEF6F601D23764DE102904810C6C89F44097DAFBFA07B6B961A0D + DC778862A4F25DD6DB4A7A010B9C00D4018291ADFC4E2D7B16875F955F9BE90D + 428C6E56E9D76B64AD62FE7EE63F4EF04271EAA808107A0B2951D38F1C39D2A2 + 368AECF3B97CF9F2791C37DC49D0AB56ADB23B7CF8F0C3C82F62FD69047214DD + 9D672759AACC92C9C0810E0909B1CFC8C8D88CA235D4B131CA4D4005DE4C0DDE + 410DDD228744FD8DEF56429DE5F70ECDCDD7456178A78823FD5DF4AE04781859 + 9E241C43EEECA4499366508A3AD5429C0D5E403D4F0933DE0A3410C2388CFB04 + 9AF2E7CE8E3B44F0E659DD361AE9F98C7B323EF019ADB4B973E73A512EFC8131 + 13A5B3E8F761C468095BE3EAEA1A82C1295CDBA2A8B9BBC53825E200D7BC8DD4 + 3D27CDD719AD9590B1DFACE3B31128951C34C1353535E9C2594A47D9840913A6 + 161414D4AA6D107772764FAEBC2E5A409F3A754AC7A1FA253B6FBA8084AED0EA + EAEA64B52C656C07017ADE1A34A5F08DC6C6C66E609C359709F8ABE2EE3C6CD8 + B0B2C2C24271FB38407F6440412F58B0C0961705478C36723A5F3B79F264B332 + 813AE6969F9F9F86F133C57740BFC2D6DFCCE7F7019B214B401606DC63AD7CF1 + E2C576172E5C30646767D71298EE2D326AD4A831AC950744838085A321D4C914 + B51C63510473B7CC3C0B6871CDA4C46591D1DDB650CE9EA2BEBEA99605E0DFF9 + FD876AD0B1B1B13A5E804E93307E624D6E1ADF23D827D472EAC370C040032D1A + 839FC3111716FC33CF9156C6A761FC7D72EE5640BFC416D6033007E3A7CA03F4 + E7C8FD5E9191500E60D80232B71628CF88AD2BB3EE530277BF74F0B49F9FDF42 + 74952BD94CC03F43AF975465012DE777DF6494CCA49C3D08B43C6ABDE3F1E3C7 + A3C9F66D2AD3BB41878787DB262525E552BA7CB1D5CC417E8F389095492269C8 + F634D50BD78081160B891788EEBA05D8839489249E75287E18C7C2C53CC6DA31 + 7216DBFAACF84E663C06F4FD8A1C003F66F873F1568B53E1C8DE2BE601BA869B + C477C9E42BE23B5BFE01A0A72AE700C0AE88608A7B2C010D63C8D9DCD3F4D6A0 + 29014B28591F2A7556D458D6CBA38F64CD71AC75892029AFE096D241A045023D + 2A81E5A1E737C85E253001ACB9097D46D5DDFD1B81AE0AF943281F62AD76AE78 + F1A6A36B8B2C359ACC88C68157AC0F41A509C818FB2401D9A31EE716B199B178 + 9CECF50F2A71C746F752C0A6A9C709522C418AEBE5D015017B0AE75FE4ABA735 + 6865A7F07B442F6B1DE2F753E87C4D0EBD4E7F5A3C708DFC0E81163BC5DD9265 + 24873C2B7208761909B548FEB492BE47824E00F45A09BA4F7F93568526ECE285 + E56991C65A3BDD648FBFAE29B8010E77DC1F00FBA7280BC000770CEEC2F12AFA + 3FC47F1DC03AD39B624EF4D9C05E0FEC7B11198603E2067215C33E2310BFE50A + F6EFDEE4D81D61ACB70199690220EB7C452DDF26D661EC2B4DCFD5F006D0A205 + 0505D97103D9889D4B58D3035075ACF53137A2389E4398F29C9CBA8FFE47458E + 5D358DF562919B837E67E636B0661A7EC760E323046189A6E7307F997E5C828E + 02F48F25E80F907DBB0FA0DF03F4324017699DF57E1E87229B7BCDC2E5CB97EB + 7373730D386C0E0E0EAEDBBB776FC7ED948BB674E9523D6F7D0660756EDFBEBD + 2E3434B4AB2F72DC248C044A9B9595A5DC3EBCE9E7E9AEBD8156375EA39DA8EF + AD04B74F6B893673E64C97929212470EFAE6D4D4D4A6BECAF5B5552D4CF882AD + 12C496F9C894BCAE3B4883F5FF6801FA9CE6BF64F4606ED5E18946735BC779F6 + 8597C646BBC6746C5DA2181F027D871B652390B2F14F8D785BB6B59962FA646D + F7FF3F8315B48FA6E74F7B71DD125BFB5BF48ABB6D545F1AA09702FA2DC81E31 + 253F19A98C0F4AD0DC52C4CD40FC8F22FEEB1075FB595E8EEAEFB65D7D695CED + 1C3422416C6D5AC8E6EBCAF8A004FDFFD8FE03833BE76573FF7FB80000000049 + 454E44AE426082} + OnClick = imgSequalLogoClick + end + object lblRecentPrompts: TLabel + Left = 8 + Top = 11 + Width = 87 Height = 15 - Caption = 'Label1' + Caption = 'Recent prompts:' end object memoPrompt: TMemo Left = 8 - Top = 32 - Width = 402 - Height = 89 + Top = 37 + Width = 468 + Height = 84 Anchors = [akLeft, akTop, akRight] + EditMargins.Auto = True Lines.Strings = ( 'Give me column a, b and c from table foobar') + ScrollBars = ssBoth TabOrder = 0 + WantTabs = True + WordWrap = False end object btnGenerateSQL: TButton - Left = 288 + Left = 354 Top = 127 Width = 122 Height = 25 @@ -47,8 +145,8 @@ object SequalSuggestForm: TSequalSuggestForm object memoGeneratedSQL: TSynMemo Left = 8 Top = 158 - Width = 402 - Height = 95 + Width = 468 + Height = 164 SingleLineMode = False Anchors = [akLeft, akTop, akRight, akBottom] Font.Charset = DEFAULT_CHARSET @@ -80,8 +178,8 @@ object SequalSuggestForm: TSequalSuggestForm FontSmoothing = fsmNone end object btnExecute: TButton - Left = 288 - Top = 259 + Left = 354 + Top = 328 Width = 122 Height = 25 Anchors = [akRight, akBottom] @@ -92,8 +190,8 @@ object SequalSuggestForm: TSequalSuggestForm OnClick = btnExecuteClick end object btnClose: TButton - Left = 207 - Top = 259 + Left = 273 + Top = 328 Width = 75 Height = 25 Anchors = [akRight, akBottom] @@ -103,8 +201,8 @@ object SequalSuggestForm: TSequalSuggestForm TabOrder = 4 end object btnHelp: TButton - Left = 126 - Top = 259 + Left = 192 + Top = 328 Width = 75 Height = 25 Anchors = [akRight, akBottom] @@ -112,4 +210,15 @@ object SequalSuggestForm: TSequalSuggestForm TabOrder = 5 OnClick = btnHelpClick end + object comboRecentPrompts: TComboBox + Left = 136 + Top = 8 + Width = 340 + Height = 23 + AutoDropDownWidth = True + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + TabOrder = 6 + OnSelect = comboRecentPromptsSelect + end end diff --git a/source/Sequal.Suggest.pas b/source/Sequal.Suggest.pas index f9d42960..182e71c3 100644 --- a/source/Sequal.Suggest.pas +++ b/source/Sequal.Suggest.pas @@ -5,7 +5,8 @@ interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, SynEdit, SynMemo, extra_controls, apphelpers, - IdHTTP, IdSSLOpenSSL, System.JSON, dbconnection; + IdHTTP, IdSSLOpenSSL, System.JSON, dbconnection, Vcl.Imaging.pngimage, + Vcl.ExtCtrls; type TSequalSuggestForm = class(TExtForm) @@ -14,14 +15,18 @@ type memoGeneratedSQL: TSynMemo; btnExecute: TButton; btnClose: TButton; - Label1: TLabel; btnHelp: TButton; + imgSequalLogo: TImage; + comboRecentPrompts: TComboBox; + lblRecentPrompts: TLabel; procedure btnHelpClick(Sender: TObject); procedure btnGenerateSQLClick(Sender: TObject); procedure btnExecuteClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); + procedure imgSequalLogoClick(Sender: TObject); + procedure comboRecentPromptsSelect(Sender: TObject); private { Private declarations } FConnection: TDBConnection; @@ -68,6 +73,7 @@ var JsonBodyStr, JsonResponseStr: String; JsonBodyStream: TStringStream; JsonTmp: TJSONValue; + ComboIdx: Integer; begin // Call suggest API HttpReq := TIdHTTP.Create; @@ -76,6 +82,7 @@ begin SSLio.SSLOptions.SSLVersions := [sslvTLSv1_1, sslvTLSv1_2]; HttpReq.Request.ContentType := 'application/json'; HttpReq.Request.CharSet := 'utf-8'; + HttpReq.Request.UserAgent := apphelpers.UserAgent(Self); JsonBodyStr := '{"prompt": '+JsonEncode(memoPrompt.Text)+', "type":'+JsonEncode(EngineType)+'}'; //showmessage(jsonbodystr); @@ -83,7 +90,7 @@ begin try Screen.Cursor := crHourGlass; - JsonResponseStr := HttpReq.Post('https://api.sequal.dev:2000/simple-suggest', JsonBodyStream); + JsonResponseStr := HttpReq.Post('https://api.sequal.dev/simple-suggest', JsonBodyStream); JsonTmp := TJSONObject.ParseJSONValue(JsonResponseStr); memoGeneratedSQL.Text := JsonTmp.FindValue('data').Value; btnExecute.Enabled := Length(Trim(memoGeneratedSQL.Text)) > 0; @@ -95,6 +102,15 @@ begin end; HttpReq.Free; JsonBodyStream.Free; + + // Add to recent prompts if not already done + ComboIdx := comboRecentPrompts.Items.IndexOf(memoPrompt.Text); + if ComboIdx = -1 then + comboRecentPrompts.Items.Insert(0, memoPrompt.Text) + else if ComboIdx > 0 then + comboRecentPrompts.Items.Move(ComboIdx, 0); + comboRecentPrompts.ItemIndex := 0; + Screen.Cursor := crDefault; end; @@ -104,26 +120,51 @@ begin ShellExec('https://sequal.dev/our-plans'); end; +procedure TSequalSuggestForm.comboRecentPromptsSelect(Sender: TObject); +begin + memoPrompt.Text := comboRecentPrompts.Text; +end; + procedure TSequalSuggestForm.FormClose(Sender: TObject; var Action: TCloseAction); begin // Store GUI setup AppSettings.WriteIntDpiAware(asSequalSuggestWindowWidth, Self, Width); AppSettings.WriteIntDpiAware(asSequalSuggestWindowHeight, Self, Height); + AppSettings.WriteString(asSequalSuggestPrompt, memoPrompt.Text); + AppSettings.WriteString(asSequalSuggestRecentPrompts, Implode(DELIM, comboRecentPrompts.Items)); end; procedure TSequalSuggestForm.FormCreate(Sender: TObject); begin HasSizeGrip := True; + Caption := MainForm.actSequalSuggest.Caption; end; procedure TSequalSuggestForm.FormShow(Sender: TObject); +var + RecentPromptsText: String; + RecentPromptsList: TStringList; begin // Restore GUI setup Width := AppSettings.ReadIntDpiAware(asSequalSuggestWindowWidth, Self); Height := AppSettings.ReadIntDpiAware(asSequalSuggestWindowHeight, Self); + RecentPromptsText := AppSettings.ReadString(asSequalSuggestRecentPrompts); + RecentPromptsList := Explode(DELIM, RecentPromptsText); + comboRecentPrompts.Items.AddStrings(RecentPromptsList); + FConnection := MainForm.ActiveConnection; - memoPrompt.Text := 'Write me a '+EngineType+' query to select column a, b and c from table foobar'; + memoPrompt.TextHint := 'Write me a '+EngineType+' query to select column a, b and c from table foobar'; + memoPrompt.Text := AppSettings.ReadString(asSequalSuggestPrompt); + if Length(Trim(memoPrompt.Text)) = 0 then + memoPrompt.Text := memoPrompt.TextHint; + comboRecentPrompts.ItemIndex := comboRecentPrompts.Items.IndexOf(memoPrompt.Text); +end; + +procedure TSequalSuggestForm.imgSequalLogoClick(Sender: TObject); +begin + // Logo clicked + ShellExec(TControl(Sender).Hint); end; procedure TSequalSuggestForm.btnExecuteClick(Sender: TObject); diff --git a/source/apphelpers.pas b/source/apphelpers.pas index e0535874..305edfb3 100644 --- a/source/apphelpers.pas +++ b/source/apphelpers.pas @@ -216,7 +216,7 @@ type asFileDialogEncoding, asThemePreviewWidth, asThemePreviewHeight, asThemePreviewTop, asThemePreviewLeft, asCreateDbCollation, asRealTrailingZeros, - asSequalSuggestWindowWidth, asSequalSuggestWindowHeight, + asSequalSuggestWindowWidth, asSequalSuggestWindowHeight, asSequalSuggestPrompt, asSequalSuggestRecentPrompts, asUnused); TAppSetting = record Name: String; @@ -407,7 +407,7 @@ type function DirSep: Char; procedure FindComponentInstances(BaseForm: TComponent; ClassType: TClass; var List: TObjectList); function WebColorStrToColorDef(WebColor: string; Default: TColor): TColor; - {function GetCurrentUserSID: String;} + function UserAgent(OwnerComponent: TComponent): String; var AppSettings: TAppSettings; @@ -3114,6 +3114,18 @@ begin end; +function UserAgent(OwnerComponent: TComponent): String; +var + OS: String; +begin + if IsWine then + OS := 'Linux/Wine' + else + OS := 'Windows NT '+IntToStr(Win32MajorVersion)+'.'+IntToStr(Win32MinorVersion); + Result := APPNAME+'/'+MainForm.AppVersion+' ('+OS+'; '+ExtractFilename(Application.ExeName)+'; '+OwnerComponent.Name+')'; +end; + + { Get SID of current Windows user, probably useful in the future function GetCurrentUserSID: string; type @@ -3488,17 +3500,11 @@ var BytesInChunk, HeadSize, Reserved, TimeOutSeconds: Cardinal; LocalFile: File; DoStore: Boolean; - UserAgent, OS: String; HttpStatus: Integer; ContentChunk: UTF8String; begin DoStore := False; - if IsWine then - OS := 'Linux/Wine' - else - OS := 'Windows NT '+IntToStr(Win32MajorVersion)+'.'+IntToStr(Win32MinorVersion); - UserAgent := APPNAME+'/'+MainForm.AppVersion+' ('+OS+'; '+ExtractFilename(Application.ExeName)+'; '+FOwner.Name+')'; - NetHandle := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); + NetHandle := InternetOpen(PChar(UserAgent(FOwner)), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); // Do not let the user wait 30s TimeOutSeconds := FTimeOut * 1000; @@ -3876,6 +3882,8 @@ begin InitSetting(asMySQLBinaries, 'MySQL_Binaries', 0, False, ''); InitSetting(asSequalSuggestWindowWidth, 'SequalSuggestWindowWidth', 500); InitSetting(asSequalSuggestWindowHeight, 'SequalSuggestWindowHeight', 400); + InitSetting(asSequalSuggestPrompt, 'SequalSuggestPrompt', 0, False, ''); + InitSetting(asSequalSuggestRecentPrompts, 'SequalSuggestRecentPrompts', 0, False, ''); // Default folder for snippets if FPortableMode then diff --git a/source/main.dfm b/source/main.dfm index 497649d7..a082677b 100644 --- a/source/main.dfm +++ b/source/main.dfm @@ -3608,6 +3608,7 @@ object MainForm: TMainForm object actSequalSuggest: TAction Category = 'Tools' Caption = 'Sequal Suggest' + ImageIndex = 206 OnExecute = actSequalSuggestExecute end end @@ -4275,6 +4276,9 @@ object MainForm: TMainForm object menuSQLhelp2: TMenuItem Action = actSQLhelp end + object SequalSuggest2: TMenuItem + Action = actSequalSuggest + end object menuQueryInsertFunction: TMenuItem Caption = 'Insert function' ImageIndex = 13 @@ -17396,6 +17400,107 @@ object MainForm: TMainForm C148B94B201F1348EF3F70B70BFC3F9C434FDE627F724C0000000049454E44AE 426082} end> + end + item + Name = 'logo-sequal' + SourceImages = < + item + Image.Data = { + 89504E470D0A1A0A0000000D494844520000006400000064080600000070E295 + 54000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000 + 00097048597300000EC300000EC301C76FA86400000B4249444154785EED9D0B + 70D4C51DC777F7FFB8BBDC25B93CA1098F189022CA432108C2A430CC54A88EA3 + 8D8E7D286AA7D551A9D65A6DED3843B5B5763A0547ADD23AB6B5B454C4DA6955 + AC561115AD4880040AA8A00984242610925CEEFD7F6D7FBFBDA48356920BE8B8 + 7F673F3397BDDD7BCCFEF7BBBFC7FE33B74B140AC530D0C1D297A49E6C66E90D + CDD46E3CCC597998D0804EB8ED12F7FD1E125A5E47C3D7CDE7C6D431DEE0DB15 + 9F16E917DE61FD373EA50F56872576C746DDDAD6E69B89E73B0B89AFDAAC15DE + BAD8C5E75653476DEA0F6F9DC32A23DFF3BAE2A63790F15824C0F5A99526AB88 + 3C1CFADAD95B29A57BF1BDD9AD87B4C0BC89E27332E32B41120FBCA6476EAA77 + 3CC7AD4EDCF3D2EDCEFB3DD77A7DE920C93A84B0E32EC5E3841607895E534ACC + F935EB83974CBF0684C9C4EE7A8115AF3C5F6A17E61B41926B1BF5F0F23AC7DA + DDB920FD44D3ABF68E768D3830B61A7508A56CF06D39F0AA1CCF8378C25834C4 + 8C59D5AF16AE3CFF6A10E5E0C0AA5758D1AD8BA415C51782A49FDAA5851A66BA + F6DEAEF3926BDED80225A3A66E1346208A0F730D6835B66B138D19C10BA625C3 + 2B168E05511256639B66D64D90D27D7D78664988D5DCC1500CCEF9B4F486A6D7 + ED3D2046D070410663583110705D446706944EE6E93DE1C47DAF6E84EF294031 + 9CC37D524E46E90589FDE01FA24C3DD6F8636B7B3BA5A66613C235D1980FA009 + 5888CEC181D94D1DF5D94D07EEC6E6E4EFDE92F2DAA51624FBF20156F1D20D9E + 97CCCEB11BDBBEC9D396185C31C8A38183290574DD3DDC47ECA6F66F8395448A + 7FB2D4B577774A6725520B62ED6817FD4BFD6567BDDB93249431B48E931B4414 + 45873C605F77B1DDDCB1189B20964877FD725BC8E603A2CC6C684EF0810CC603 + 3A6AEB1802E30D85DC0BBEC73B9ABC4434651C6521F9E2B4F4D0F2E7AE75C0BD + 68C10BCFBC915B90147D34BD1D2D906261A0775A8F25B0EA75C745B34C482B08 + C7C55E8E0009EAB522633AF5349DA385F1941D14155BBECC575A418C33C6F216 + 720983499D72F6763D0CD9158C203FD5051DC358A28D2B3E88151A099CAC03FC + D4903A8694DDF91DD13FC8905A686100D715A73280F859460CCDCA6E697D041B + 9C03479520A3C1985925062C78E9CC340DC13AD0F520309FA4D782CFA18B32CE + 1A1B8FDE7FB1F8DEC84DF54A90D1C0D3B67051817327AED5C645F78214E8B746 + EFF85143D773698149E0713FB8C1637DD73DA99BE78C53828C86F0F23A9E5CDB + 2856E5A1CB66DEAB4DA900911CEF437776F3C30577A79B75E31391DB163F800D + A1AF4E57F7B24E0610C57D0DE6B8397BFC3A637AD51A561931C0726C7041F9CE + 6E07DEAF6993CB49E8AABACBC03A62B195FF64C1F3A74A671D88F482200B8E8A + 650389DCB0E00698E5BFD1AA8A0D62BBB8A6C05BEFB0E43BCE62F069AEEEC1EB + C23220161173EE842F1BA7953DDFF7ADC7B5E2BB96A9DBEFA78AB5AB939A8341 + 3EB5BEE9CECC73FB6E81D57BA917CF62FEE4520D5440215C8F70C7E334A86BD4 + D489565BBA3D7C73FD0F8DDAF297E3F7BD6214DEB2C8165F2829BE1104C96E3D + 44930FBEC64AD75DE9C24A7E56F6E5F7565A3B0ECF218E378EC7329885115A14 + 242C1A021FA76D63E5917B0A6F5BFC347E3676FBD37AF12F2FFADF6A53567C25 + C810F1559BF5C25B178BC1E59C7F21F3ECDE49F6F6768B272DAA9F5DCD834BA7 + 6A5A59F84D7CBD9534D0CA3FDFC1C257CC9132887F6E88AFDECC067EB1C918AC + 7E2C033F7B31FFFF9B48822F2DE478C06551ABA983B9FBBAB997B1890EA9B139 + 6F223567557B346848994929140A8542A15028140A8542A15028140A8542A150 + 28140A8542A15028140A8542A15028140A8542E16F7CF77384F8AF36537BF707 + A3EB39E784150649F4A106F5F304C5E8F09D852437EC8AD8BB3A74E8795EB31D + 2F1037E4D022015E78C792815CABBCF8469023F3EF67956FDEEC0DDCF5C2267B + 77673DA1340E233DF2CFBA29C59F47076951B03DB8E4F4E90557CEC9F6DFF857 + 1A7DE85229DD972F7EA72EB0723FA0753B63C53C9ED5793C53C213D9E2111FF1 + 6C098FA543ACD08C86AE982DBE439B542E4A19F18F2083F31906D8115B6B50B1 + 5F2F6E1A30FC8351173FCA2A0AF107A0E27AF5DA322CA4C4378204164D12EED5 + EB4D0DEDC280F53C1E3CB7AF03257B28A5697CAA8D8F622125BE10C439D8CB8A + 575F8C7BF72ED42795CD17BBCDE5BBDD1F271E3175DCE1F48F583D76F95ADD9C + 3D5ECAF881F84210880562927B3DC931C400CF837B9CE42C6064701FF8A04ECC + 793521AC6A151169C540FC612187FB73E5C15E9BA76CE8F5F1BBCD0C033A2CD7 + E3341220C6DC09016CD26755E5F7D9CF085F08029955AE3CD447D15D51B15F56 + 1E139D4300D1186EE734A0D7966ECCB59DF2BE8D9F2AFE10A4B53757BEDFC360 + 70D142443D0F30D3424BE9366756BF8B0DA9DF6F532EEB54715B8F8932F3ECBE + 244F5AD06BE8763EC38ABA791ED14F2B33212110D75A70751D16D2E20B41E2EB + FE25863FD4306329C1BD76F336104A380475ADA6C4829457B82AF3DC89E21559 + F1852013C99FC460B2F2F0C59835C138E72789E771163689DBD6BF1AAB3DCB1E + D1CC59D5CA657D52D8EF1E4988F89197BBC26D6121C32A2D20E6C2D3C41E8105 + CBE7889764C61782F45FFFA4B008B7A53717A4F301B2296A309D0F645B82174C + FBBB68B2F08C24B9915E10FB3F9D5A74CD659CA7ADA5B4C09801838AA2E4D76F + B0247D4A05C68F443BB99E86AF9A2BB5BB42A417C469CB2D0AED3D5D55E20918 + CA60393C6848B8CF7B4DA9D8E7BD9DACC1427AE417645F9728B35B5A523C9E25 + B0D083DA08131DC5B05C8F8D29C4DA6FF1CF99AB5F91FE5A11E93B995EDF2C4A + AFBDBFC28B6708D120AA8FE478F086229E3B95B00E99F593C46698AC3C227DFC + 40A416C46AEEA0953BBE8F77799936B9FC169E76A0C77945758833103FCE18D3 + 6B4E1BD3DD7BF95A2DBC7C8EF4F103915A90A135032EEA9C3D5D2ED5A1BBF99C + 58816F3134A24FAD14F7AF9C9663BE1003915A90F4337B45FFDC23F1D95E6FAA + 5A8831D2A210D71F9643B5AA62A27FB1E2196C2ABC7B693E562505520B421C4F + F4CF79AF6711A4BC21EE7AB618F1E1C0F547004C29EBEC0CCCABD9B69F2CA0A1 + 6567F8661365A905C96EDA2FCAF4134D71B0103CF60EA67F7E2E8B5515BD844F + 2BAE5921F7A4FB08D276D669EFA7D15F37E0296DBA3EB9FCBB5E4C645823F717 + FF21150DE17BD7639516057D133F106905C96C7C7BF019E1EE07F131F9AD3F28 + E78EA769630B63453F5D96C4A6F08A85E225BF20AD20BC3F256285F376F778E7 + 9D23C6E04DC5E1E38707F12364106D42740B6466FB633F7A56374EAFF0C5FA63 + 086905D1C64545DF9CD6DEAFC32047C115392366589C533C670A5CDC3A51B55D + 5F8981482B48E2C1D7857F72767716F14476E4153ABA2BDB657A6DA91DBCE8AC + D7B1A9E01BE78897FC849482D8FB8FD0CAAD37E30ABD04ACE37AAF3F8DE7E00E + DFD7417745187B14DC557BCF858F6AE6ECF1CA423E09528F358A32BBB52D69BF + DDED0D9EF229DA4E08E71AAC3FE08AA838854DAF29F1557635849482B0F2B088 + 15947B4BBC238912B1161C7E788525B08AC8CEA27BBED28ACFF519B9F3AAFC86 + 948250531727E3D8BB3ABF04AE0A67BF3D6C404777556010F3BC9ACDE0AEB203 + 3F7FD1885C3B5F09F249E0F5246864C54271929AB3FFE8143E143F4E34BC18EA + 3DAED3920248774B1E134D86E6DBF3A6A413C4DAD3252C01027A198B862E82CC + 69E8FFE8E8963EE6411D8C2F7A6DD981C0E2C9E25E4BA861862FAD03914E10BB + A95D94D61BAD673A078E6AB042A7C4E51A0C3A1EBDFDFF0FC73568D884E53CBF + 17DC95155BF9BCAED796FB569013FBE5CF086BDB21CD9C3BD175DEEBB9D3DADE + 7605B7DC63903941FAF4B14E8B832806A4BB7DA186991762FCC86EDA4F034BA6 + F856102949ADDF39EA8992FADB6EE926D7C920ED4564FFDD4AFBAF7E9CBA5D71 + 3CB5F304692F364254B75D5235702FC6148542F1398690FF029A8D9B27B85043 + 410000000049454E44AE426082} + end> end> Left = 593 Top = 339 @@ -18422,6 +18527,21 @@ object MainForm: TMainForm CollectionIndex = 203 CollectionName = 'server-interbase' Name = 'server-interbase' + end + item + CollectionIndex = 204 + CollectionName = 'server-firebird' + Name = 'server-firebird' + end + item + CollectionIndex = 205 + CollectionName = 'server-rds-mysql' + Name = 'server-rds-mysql' + end + item + CollectionIndex = 206 + CollectionName = 'logo-sequal' + Name = 'logo-sequal' end> ImageCollection = ImageCollectionIcons8 ImageNameAvailable = False @@ -25573,6 +25693,107 @@ object MainForm: TMainForm C148B94B201F1348EF3F70B70BFC3F9C434FDE627F724C0000000049454E44AE 426082} end> + end + item + Name = 'logo-sequal' + SourceImages = < + item + Image.Data = { + 89504E470D0A1A0A0000000D494844520000006400000064080600000070E295 + 54000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000 + 00097048597300000EC300000EC301C76FA86400000B4249444154785EED9D0B + 70D4C51DC777F7FFB8BBDC25B93CA1098F189022CA432108C2A430CC54A88EA3 + 8D8E7D286AA7D551A9D65A6DED3843B5B5763A0547ADD23AB6B5B454C4DA6955 + AC561115AD4880040AA8A00984242610925CEEFD7F6D7FBFBDA48356920BE8B8 + 7F673F3397BDDD7BCCFEF7BBBFC7FE33B74B140AC530D0C1D297A49E6C66E90D + CDD46E3CCC597998D0804EB8ED12F7FD1E125A5E47C3D7CDE7C6D431DEE0DB15 + 9F16E917DE61FD373EA50F56872576C746DDDAD6E69B89E73B0B89AFDAAC15DE + BAD8C5E75653476DEA0F6F9DC32A23DFF3BAE2A63790F15824C0F5A99526AB88 + 3C1CFADAD95B29A57BF1BDD9AD87B4C0BC89E27332E32B41120FBCA6476EAA77 + 3CC7AD4EDCF3D2EDCEFB3DD77A7DE920C93A84B0E32EC5E3841607895E534ACC + F935EB83974CBF0684C9C4EE7A8115AF3C5F6A17E61B41926B1BF5F0F23AC7DA + DDB920FD44D3ABF68E768D3830B61A7508A56CF06D39F0AA1CCF8378C25834C4 + 8C59D5AF16AE3CFF6A10E5E0C0AA5758D1AD8BA415C51782A49FDAA5851A66BA + F6DEAEF3926BDED80225A3A66E1346208A0F730D6835B66B138D19C10BA625C3 + 2B168E05511256639B66D64D90D27D7D78664988D5DCC1500CCEF9B4F486A6D7 + ED3D2046D070410663583110705D446706944EE6E93DE1C47DAF6E84EF294031 + 9CC37D524E46E90589FDE01FA24C3DD6F8636B7B3BA5A66613C235D1980FA009 + 5888CEC181D94D1DF5D94D07EEC6E6E4EFDE92F2DAA51624FBF20156F1D20D9E + 97CCCEB11BDBBEC9D396185C31C8A38183290574DD3DDC47ECA6F66F8395448A + 7FB2D4B577774A6725520B62ED6817FD4BFD6567BDDB93249431B48E931B4414 + 45873C605F77B1DDDCB1189B20964877FD725BC8E603A2CC6C684EF0810CC603 + 3A6AEB1802E30D85DC0BBEC73B9ABC4434651C6521F9E2B4F4D0F2E7AE75C0BD + 68C10BCFBC915B90147D34BD1D2D906261A0775A8F25B0EA75C745B34C482B08 + C7C55E8E0009EAB522633AF5349DA385F1941D14155BBECC575A418C33C6F216 + 720983499D72F6763D0CD9158C203FD5051DC358A28D2B3E88151A099CAC03FC + D4903A8694DDF91DD13FC8905A686100D715A73280F859460CCDCA6E697D041B + 9C03479520A3C1985925062C78E9CC340DC13AD0F520309FA4D782CFA18B32CE + 1A1B8FDE7FB1F8DEC84DF54A90D1C0D3B67051817327AED5C645F78214E8B746 + EFF85143D773698149E0713FB8C1637DD73DA99BE78C53828C86F0F23A9E5CDB + 2856E5A1CB66DEAB4DA900911CEF437776F3C30577A79B75E31391DB163F800D + A1AF4E57F7B24E0610C57D0DE6B8397BFC3A637AD51A561931C0726C7041F9CE + 6E07DEAF6993CB49E8AABACBC03A62B195FF64C1F3A74A671D88F482200B8E8A + 650389DCB0E00698E5BFD1AA8A0D62BBB8A6C05BEFB0E43BCE62F069AEEEC1EB + C23220161173EE842F1BA7953DDFF7ADC7B5E2BB96A9DBEFA78AB5AB939A8341 + 3EB5BEE9CECC73FB6E81D57BA917CF62FEE4520D5440215C8F70C7E334A86BD4 + D489565BBA3D7C73FD0F8DDAF297E3F7BD6214DEB2C8165F2829BE1104C96E3D + 44930FBEC64AD75DE9C24A7E56F6E5F7565A3B0ECF218E378EC7329885115A14 + 242C1A021FA76D63E5917B0A6F5BFC347E3676FBD37AF12F2FFADF6A53567C25 + C810F1559BF5C25B178BC1E59C7F21F3ECDE49F6F6768B272DAA9F5DCD834BA7 + 6A5A59F84D7CBD9534D0CA3FDFC1C257CC9132887F6E88AFDECC067EB1C918AC + 7E2C033F7B31FFFF9B48822F2DE478C06551ABA983B9FBBAB997B1890EA9B139 + 6F223567557B346848994929140A8542A15028140A8542A15028140A8542A150 + 28140A8542A15028140A8542A15028140A8542E16F7CF77384F8AF36537BF707 + A3EB39E784150649F4A106F5F304C5E8F09D852437EC8AD8BB3A74E8795EB31D + 2F1037E4D022015E78C792815CABBCF8469023F3EF67956FDEEC0DDCF5C2267B + 77673DA1340E233DF2CFBA29C59F47076951B03DB8E4F4E90557CEC9F6DFF857 + 1A7DE85229DD972F7EA72EB0723FA0753B63C53C9ED5793C53C213D9E2111FF1 + 6C098FA543ACD08C86AE982DBE439B542E4A19F18F2083F31906D8115B6B50B1 + 5F2F6E1A30FC8351173FCA2A0AF107A0E27AF5DA322CA4C4378204164D12EED5 + EB4D0DEDC280F53C1E3CB7AF03257B28A5697CAA8D8F622125BE10C439D8CB8A + 575F8C7BF72ED42795CD17BBCDE5BBDD1F271E3175DCE1F48F583D76F95ADD9C + 3D5ECAF881F84210880562927B3DC931C400CF837B9CE42C6064701FF8A04ECC + 793521AC6A151169C540FC612187FB73E5C15E9BA76CE8F5F1BBCD0C033A2CD7 + E3341220C6DC09016CD26755E5F7D9CF085F08029955AE3CD447D15D51B15F56 + 1E139D4300D1186EE734A0D7966ECCB59DF2BE8D9F2AFE10A4B53757BEDFC360 + 70D142443D0F30D3424BE9366756BF8B0DA9DF6F532EEB54715B8F8932F3ECBE + 244F5AD06BE8763EC38ABA791ED14F2B33212110D75A70751D16D2E20B41E2EB + FE25863FD4306329C1BD76F336104A380475ADA6C4829457B82AF3DC89E21559 + F1852013C99FC460B2F2F0C59835C138E72789E771163689DBD6BF1AAB3DCB1E + D1CC59D5CA657D52D8EF1E4988F89197BBC26D6121C32A2D20E6C2D3C41E8105 + CBE7889764C61782F45FFFA4B008B7A53717A4F301B2296A309D0F645B82174C + FBBB68B2F08C24B9915E10FB3F9D5A74CD659CA7ADA5B4C09801838AA2E4D76F + B0247D4A05C68F443BB99E86AF9A2BB5BB42A417C469CB2D0AED3D5D55E20918 + CA60393C6848B8CF7B4DA9D8E7BD9DACC1427AE417645F9728B35B5A523C9E25 + B0D083DA08131DC5B05C8F8D29C4DA6FF1CF99AB5F91FE5A11E93B995EDF2C4A + AFBDBFC28B6708D120AA8FE478F086229E3B95B00E99F593C46698AC3C227DFC + 40A416C46AEEA0953BBE8F77799936B9FC169E76A0C77945758833103FCE18D3 + 6B4E1BD3DD7BF95A2DBC7C8EF4F103915A90A135032EEA9C3D5D2ED5A1BBF99C + 58816F3134A24FAD14F7AF9C9663BE1003915A90F4337B45FFDC23F1D95E6FAA + 5A8831D2A210D71F9643B5AA62A27FB1E2196C2ABC7B693E562505520B421C4F + F4CF79AF6711A4BC21EE7AB618F1E1C0F547004C29EBEC0CCCABD9B69F2CA0A1 + 6567F8661365A905C96EDA2FCAF4134D71B0103CF60EA67F7E2E8B5515BD844F + 2BAE5921F7A4FB08D276D669EFA7D15F37E0296DBA3EB9FCBB5E4C645823F717 + FF21150DE17BD7639516057D133F106905C96C7C7BF019E1EE07F131F9AD3F28 + E78EA769630B63453F5D96C4A6F08A85E225BF20AD20BC3F256285F376F778E7 + 9D23C6E04DC5E1E38707F12364106D42740B6466FB633F7A56374EAFF0C5FA63 + 086905D1C64545DF9CD6DEAFC32047C115392366589C533C670A5CDC3A51B55D + 5F8981482B48E2C1D7857F72767716F14476E4153ABA2BDB657A6DA91DBCE8AC + D7B1A9E01BE78897FC849482D8FB8FD0CAAD37E30ABD04ACE37AAF3F8DE7E00E + DFD7417745187B14DC557BCF858F6AE6ECF1CA423E09528F358A32BBB52D69BF + DDED0D9EF229DA4E08E71AAC3FE08AA838854DAF29F1557635849482B0F2B088 + 15947B4BBC238912B1161C7E788525B08AC8CEA27BBED28ACFF519B9F3AAFC86 + 948250531727E3D8BB3ABF04AE0A67BF3D6C404777556010F3BC9ACDE0AEB203 + 3F7FD1885C3B5F09F249E0F5246864C54271929AB3FFE8143E143F4E34BC18EA + 3DAED3920248774B1E134D86E6DBF3A6A413C4DAD3252C01027A198B862E82CC + 69E8FFE8E8963EE6411D8C2F7A6DD981C0E2C9E25E4BA861862FAD03914E10BB + A95D94D61BAD673A078E6AB042A7C4E51A0C3A1EBDFDFF0FC73568D884E53CBF + 17DC95155BF9BCAED796FB569013FBE5CF086BDB21CD9C3BD175DEEBB9D3DADE + 7605B7DC63903941FAF4B14E8B832806A4BB7DA186991762FCC86EDA4F034BA6 + F856102949ADDF39EA8992FADB6EE926D7C920ED4564FFDD4AFBAF7E9CBA5D71 + 3CB5F304692F364254B75D5235702FC6148542F1398690FF029A8D9B27B85043 + 410000000049454E44AE426082} + end> end> Left = 689 Top = 339 diff --git a/source/main.pas b/source/main.pas index f8154c15..c5f7de7c 100644 --- a/source/main.pas +++ b/source/main.pas @@ -781,6 +781,7 @@ type Undo1: TMenuItem; actSequalSuggest: TAction; SequalSuggest1: TMenuItem; + SequalSuggest2: TMenuItem; procedure actCreateDBObjectExecute(Sender: TObject); procedure menuConnectionsPopup(Sender: TObject); procedure actExitApplicationExecute(Sender: TObject);