Skip to content

Commit eb679b3

Browse files
committed
bk/2024-06-21-1330
1 parent 7e5dd3b commit eb679b3

File tree

8 files changed

+353
-3
lines changed

8 files changed

+353
-3
lines changed

Package/DelphiAIDeveloper.dpk

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ contains
6060
DelphiAIDev.ModuleCreator.OTA in '..\Src\ModuleCreator\DelphiAIDev.ModuleCreator.OTA.pas',
6161
DelphiAIDev.ModuleCreator in '..\Src\ModuleCreator\DelphiAIDev.ModuleCreator.pas',
6262
DelphiAIDev.ModuleCreator.Interfaces in '..\Src\ModuleCreator\DelphiAIDev.ModuleCreator.Interfaces.pas',
63-
DelphiAIDev.IDE.ImageListMain in '..\Src\IDE\ImageListMain\DelphiAIDev.IDE.ImageListMain.pas';
63+
DelphiAIDev.IDE.ImageListMain in '..\Src\IDE\ImageListMain\DelphiAIDev.IDE.ImageListMain.pas',
64+
DelphiAIDev.IDE.Shortcuts in '..\Src\IDE\Shortcuts\DelphiAIDev.IDE.Shortcuts.pas',
65+
DelphiAIDev.Utils.CnWizard in '..\Src\Utils\DelphiAIDev.Utils.CnWizard.pas';
6466

6567
end.

Package/DelphiAIDeveloper.dproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@
161161
<DCCReference Include="..\Src\ModuleCreator\DelphiAIDev.ModuleCreator.pas"/>
162162
<DCCReference Include="..\Src\ModuleCreator\DelphiAIDev.ModuleCreator.Interfaces.pas"/>
163163
<DCCReference Include="..\Src\IDE\ImageListMain\DelphiAIDev.IDE.ImageListMain.pas"/>
164+
<DCCReference Include="..\Src\IDE\Shortcuts\DelphiAIDev.IDE.Shortcuts.pas"/>
165+
<DCCReference Include="..\Src\Utils\DelphiAIDev.Utils.CnWizard.pas"/>
164166
<RcItem Include="Img\c4d_gear.bmp">
165167
<ResourceType>BITMAP</ResourceType>
166168
<ResourceId>c4d_gear</ResourceId>

Src/Chat/DelphiAIDev.Chat.View.dfm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ object DelphiAIDevChatView: TDelphiAIDevChatView
22
Left = 0
33
Top = 0
44
BorderIcons = [biSystemMenu, biMaximize]
5-
Caption = 'Delphi AI Developer Chat'
5+
Caption = 'AI Chat'
66
ClientHeight = 661
77
ClientWidth = 975
88
Color = clBtnFace

Src/DelphiAIDeveloper.Register.pas

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ interface
44

55
uses
66
DelphiAIDev.Chat.View,
7-
DelphiAIDev.MainMenu.Register;
7+
DelphiAIDev.MainMenu.Register,
8+
DelphiAIDev.IDE.Shortcuts;
89

910
procedure Register;
1011

@@ -14,6 +15,7 @@ procedure Register;
1415
begin
1516
DelphiAIDev.Chat.View.RegisterSelf;
1617
DelphiAIDev.MainMenu.Register.RegisterSelf;
18+
DelphiAIDev.IDE.Shortcuts.RefreshRegister;
1719
end;
1820

1921
end.
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
unit DelphiAIDev.IDE.Shortcuts;
2+
3+
interface
4+
5+
uses
6+
System.SysUtils,
7+
System.Classes,
8+
Winapi.Windows,
9+
Vcl.Menus,
10+
ToolsAPI,
11+
DelphiAIDev.Utils.CnWizard;
12+
13+
type
14+
TDelphiAIDevIDEShortcuts = class(TNotifierObject, IOTAKeyboardBinding)
15+
private
16+
procedure KeyProcBlockReturn(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
17+
procedure KeyProcBlockReturnAndAlt(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
18+
protected
19+
function GetBindingType: TBindingType;
20+
function GetDisplayName: string;
21+
function GetName: string;
22+
procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
23+
public
24+
class function New: IOTAKeyboardBinding;
25+
constructor Create;
26+
destructor Destroy; override;
27+
end;
28+
29+
procedure RefreshRegister;
30+
31+
implementation
32+
33+
uses
34+
DelphiAIDev.Utils,
35+
DelphiAIDev.Utils.OTA;
36+
37+
var
38+
Index: Integer = -1;
39+
40+
procedure RegisterSelf;
41+
begin
42+
if(Index < 0)and(true)then
43+
Index := TUtilsOTA.GetIOTAKeyboardServices.AddKeyboardBinding(TDelphiAIDevIDEShortcuts.New);
44+
end;
45+
46+
procedure UnRegisterSelf;
47+
begin
48+
if(Index >= 0)then
49+
begin
50+
TUtilsOTA.GetIOTAKeyboardServices.RemoveKeyboardBinding(Index);
51+
Index := -1;
52+
end;
53+
end;
54+
55+
procedure RefreshRegister;
56+
begin
57+
UnRegisterSelf;
58+
RegisterSelf;
59+
end;
60+
61+
class function TDelphiAIDevIDEShortcuts.New: IOTAKeyboardBinding;
62+
begin
63+
Result := Self.Create;
64+
end;
65+
66+
constructor TDelphiAIDevIDEShortcuts.Create;
67+
begin
68+
69+
end;
70+
71+
destructor TDelphiAIDevIDEShortcuts.Destroy;
72+
begin
73+
inherited;
74+
end;
75+
76+
function TDelphiAIDevIDEShortcuts.GetBindingType: TBindingType;
77+
begin
78+
Result := btPartial;
79+
end;
80+
81+
function TDelphiAIDevIDEShortcuts.GetDisplayName: string;
82+
begin
83+
Result := Self.ClassName;
84+
end;
85+
86+
function TDelphiAIDevIDEShortcuts.GetName: string;
87+
begin
88+
Result := Self.ClassName;
89+
end;
90+
91+
procedure TDelphiAIDevIDEShortcuts.BindKeyboard(const BindingServices: IOTAKeyBindingServices);
92+
begin
93+
Exit;
94+
95+
BindingServices.AddKeyBinding([Shortcut(VK_RETURN, [])], Self.KeyProcBlockReturn, nil);
96+
BindingServices.AddKeyBinding([Shortcut(VK_RETURN, [ssAlt])], Self.KeyProcBlockReturnAndAlt, nil);
97+
end;
98+
99+
procedure TDelphiAIDevIDEShortcuts.KeyProcBlockReturn(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
100+
begin
101+
TUtils.ShowMsg(GetCurrentLine(CnOtaGetTopMostEditView));
102+
BindingResult := krUnhandled;
103+
end;
104+
105+
procedure TDelphiAIDevIDEShortcuts.KeyProcBlockReturnAndAlt(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
106+
begin
107+
TUtils.ShowMsg('Enter and Alt' + GetCurrentLine(CnOtaGetTopMostEditView));
108+
BindingResult := krUnhandled;
109+
end;
110+
initialization
111+
112+
finalization
113+
UnRegisterSelf;
114+
115+
//procedure TDelphiAIDevIDEShortcuts.KeyProcBlockReturnAndAlt(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
116+
//var
117+
// LIOTAProject: IOTAProject;
118+
//begin
119+
// LIOTAProject := TUtilsOTA.GetCurrentProject;
120+
// if LIOTAProject = nil then
121+
// begin
122+
// BindingResult := krUnhandled;
123+
// Exit;
124+
// end;
125+
126+
// if TUtils.FileNameIsDelphiAIDeveloperDPROJ(LIOTAProject.FileName) then
127+
// begin
128+
// BindingResult := krUnhandled;
129+
// Exit;
130+
// end;
131+
//
132+
// TUtils.ShowMsg('Enter and Alt' + GetCurrentLine(CnOtaGetTopMostEditView));
133+
134+
// if(C4DWizardSettingsModel.BlockKeyInsert)then
135+
// BindingResult := krHandled
136+
// else
137+
// BindingResult := krUnhandled;
138+
//end;
139+
140+
end.

Src/Test/Test.pas

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ interface
44

55
implementation
66

7+
//minha pergunta aqui
8+
9+
710
end.
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
{******************************************************************************}
2+
{ Unit Note: }
3+
{ This file is partly derived from CnPack For Delphi/C++Builder }
4+
{ }
5+
{ Original author: }
6+
{ CnPack For Delphi/C++Builder }
7+
{ 中国人自己的开放源码第三方开发包 }
8+
{ (C)Copyright 2001-2023 CnPack 开发组 }
9+
{ 网站地址:http://www.cnpack.org }
10+
{ 电子邮件:master@cnpack.org }
11+
{******************************************************************************}
12+
13+
unit DelphiAIDev.Utils.CnWizard;
14+
15+
interface
16+
17+
uses
18+
System.SysUtils,
19+
System.Classes,
20+
System.Variants,
21+
Winapi.Windows,
22+
ToolsAPI;
23+
24+
function QuerySvcs(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean;
25+
function CnOtaGetEditBuffer: IOTAEditBuffer;
26+
function CnOtaGetTopMostEditView: IOTAEditView;
27+
function CnOtaEditPosToLinePos(EditPos: TOTAEditPos; EditView: IOTAEditView = nil): Integer;
28+
function OTAEditPos(Col: SmallInt; Line: Longint): TOTAEditPos;
29+
function CnOtaGetCurrLineText(var Text: string; var LineNo: Integer; var CharIndex: Integer; View: IOTAEditView = nil): Boolean;
30+
function GetCurrentLine(const AEditView: IOTAEditView): string;
31+
32+
implementation
33+
34+
function QuerySvcs(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean;
35+
begin
36+
Result := (Instance <> nil) and Supports(Instance, Intf, Inst);
37+
end;
38+
39+
function CnOtaGetEditBuffer: IOTAEditBuffer;
40+
var
41+
iEditorServices: IOTAEditorServices;
42+
begin
43+
QuerySvcs(BorlandIDEServices, IOTAEditorServices, iEditorServices);
44+
if iEditorServices <> nil then
45+
begin
46+
Result := iEditorServices.GetTopBuffer;
47+
Exit;
48+
end;
49+
Result := nil;
50+
end;
51+
52+
function CnOtaGetTopMostEditView: IOTAEditView;
53+
var
54+
iEditBuffer: IOTAEditBuffer;
55+
begin
56+
iEditBuffer := CnOtaGetEditBuffer;
57+
if iEditBuffer <> nil then
58+
begin
59+
Result := iEditBuffer.GetTopView;
60+
Exit;
61+
end;
62+
Result := nil;
63+
end;
64+
65+
function CnOtaEditPosToLinePos(EditPos: TOTAEditPos; EditView: IOTAEditView = nil): Integer;
66+
var
67+
CharPos: TOTACharPos;
68+
begin
69+
if EditView = nil then
70+
EditView := CnOtaGetTopMostEditView;
71+
if Assigned(EditView) then
72+
begin
73+
EditView.ConvertPos(True, EditPos, CharPos);
74+
Result := EditView.CharPosToPos(CharPos);
75+
end
76+
else
77+
Result := 0;
78+
end;
79+
80+
function OTAEditPos(Col: SmallInt; Line: Longint): TOTAEditPos;
81+
begin
82+
Result.Col := Col;
83+
Result.Line := Line;
84+
end;
85+
86+
function ConvertEditorTextToTextW(const Text: AnsiString): string;
87+
begin
88+
Result := UTF8ToUnicodeString(Text);
89+
end;
90+
91+
function CnOtaGetCurrLineText(var Text: string; var LineNo: Integer; var CharIndex: Integer; View: IOTAEditView = nil): Boolean;
92+
var
93+
L1, L2: Integer;
94+
Reader: IOTAEditReader;
95+
EditBuffer: IOTAEditBuffer;
96+
EditPos: TOTAEditPos;
97+
CharPos: TOTACharPos;
98+
OutStr: AnsiString;
99+
begin
100+
Result := False;
101+
//teste
102+
if not Assigned(View)then
103+
View := CnOtaGetTopMostEditView;
104+
if not Assigned(View) then
105+
Exit ;
106+
107+
EditPos := View.CursorPos;
108+
View.ConvertPos(True, EditPos, CharPos);
109+
LineNo := CharPos.Line;
110+
CharIndex := CharPos.CharIndex;
111+
112+
EditBuffer := View.Buffer;
113+
L1 := CnOtaEditPosToLinePos(OTAEditPos(1, LineNo), EditBuffer.TopView);
114+
if (LineNo >= View.Buffer.GetLinesInBuffer) then
115+
L2 := CnOtaEditPosToLinePos(OTAEditPos(High(SmallInt), LineNo + 1), EditBuffer.TopView)
116+
else
117+
L2 := CnOtaEditPosToLinePos(OTAEditPos(1, LineNo + 1), EditBuffer.TopView) - 2;
118+
SetLength(OutStr, L2 - L1);
119+
Reader := EditBuffer.CreateReader;
120+
try
121+
Reader.GetText(L1, PAnsiChar(OutStr), L2 - L1);
122+
finally
123+
Reader := nil;
124+
end;
125+
{$IFDEF UNICODE}
126+
Text := TrimRight(ConvertEditorTextToTextW(OutStr));
127+
{$ELSE}
128+
Text := TrimRight(string(ConvertEditorTextToText(OutStr)));
129+
{$ENDIF}
130+
Result := True;
131+
end;
132+
133+
function GetCurrentLine(const AEditView: IOTAEditView): string;
134+
var
135+
TextLen: Integer;
136+
StartPos: Integer;
137+
EndPos: Integer;
138+
LineNo: Integer;
139+
CharIndex: Integer;
140+
LineText: String;
141+
begin
142+
Result := '';
143+
// if IsEditControl(Screen.ActiveControl) and Assigned(AEditView) then
144+
// if not (IsEditControl(Screen.ActiveControl))then
145+
// Exit;
146+
147+
if not(Assigned(AEditView)) then
148+
Exit;
149+
150+
if AEditView.Block.IsValid then
151+
begin
152+
// StartPos := CnOtaEditPosToLinePos(OTAEditPos(AEditView.Block.StartingColumn,
153+
// AEditView.Block.StartingRow), AEditView);
154+
// EndPos := CnOtaEditPosToLinePos(OTAEditPos(AEditView.Block.EndingColumn,
155+
// AEditView.Block.EndingRow), AEditView);
156+
// TextLen := AEditView.Block.Size;
157+
//
158+
// {$IFDEF UNICODE}
159+
// CnOtaInsertTextIntoEditorAtPosW(AEditView.Block.Text, StartPos, AEditView.Buffer);
160+
// {$ELSE}
161+
// CnOtaInsertTextIntoEditorAtPos(ConvertEditorTextToText(AEditView.Block.Text), StartPos, AEditView.Buffer);
162+
// {$ENDIF}
163+
// AEditView.CursorPos := CnOtaLinePosToEditPos(StartPos + TextLen);
164+
// AEditView.Block.BeginBlock;
165+
// AEditView.CursorPos := CnOtaLinePosToEditPos(EndPos + TextLen);
166+
// AEditView.Block.EndBlock;
167+
//
168+
// AEditView.Paint;
169+
end
170+
else
171+
begin
172+
CnOtaGetCurrLineText(LineText, LineNo, CharIndex);
173+
Result := LineText;
174+
175+
//Inc(LineNo);
176+
//CnOtaInsertSingleLine(LineNo, LineText, AEditView);
177+
end;
178+
end;
179+
180+
end.

0 commit comments

Comments
 (0)