📄 syncompletionproposal.pas
字号:
ErrorFound := True;
end;
end else
ErrorFound := True;
if (CommandType <> fcNoCommand) and (not (CommandType in StripCommands)) then
AddCommandChunk(CommandType, Data);
NextChar;
end;
end;
Result := not ErrorFound;
end;
procedure ParseString;
begin
Assert(CurChar <> '\');
while (CurChar <> '\') and (CurPos <= Length(FormattedString)) do
begin
CurrentChunk := CurrentChunk +CurChar;
NextChar;
end;
end;
begin
Assert(Assigned(ChunkList));
if FormattedString = '' then
exit;
ErrorFound := False;
CurrentChunk := '';
CurPos := 1;
CurChar := FormattedString[1];
while CurPos <= Length(FormattedString) do
begin
if CurChar = '\' then
ParseEscapeSequence
else
ParseString;
end;
if CurrentChunk <> '' then
AddStringChunk;
end;
function StripFormatCommands(const FormattedString: string): string;
var
Chunks: TFormatChunkList;
i: Integer;
begin
Chunks := TFormatChunkList.Create;
try
ParseFormatChunks(FormattedString, Chunks, AllCommands);
Result := '';
for i := 0 to Chunks.Count -1 do
Result := Result + Chunks[i]^.Str;
finally
Chunks.Free;
end;
end;
function PaintChunks(TargetCanvas: TCanvas; const Rect: TRect;
ChunkList: TFormatChunkList; Columns: TProposalColumns; Images: TImageList;
Invisible: Boolean): Integer;
var
i: Integer;
X: Integer;
C: PFormatChunk;
CurrentColumn: TProposalColumn;
CurrentColumnIndex: Integer;
LastColumnStart: Integer;
Style: TFontStyles;
OldFont: TFont;
begin
OldFont := TFont.Create;
try
OldFont.Assign(TargetCanvas.Font);
if Assigned(Columns) and (Columns.Count > 0) then
begin
CurrentColumnIndex := 0;
CurrentColumn := TProposalColumn(Columns.Items[0]);
TargetCanvas.Font.Style := CurrentColumn.FFontStyle;
end else
begin
CurrentColumnIndex := -1;
CurrentColumn := nil;
end;
LastColumnStart := Rect.Left;
X := Rect.Left;
TargetCanvas.Brush.Style := bsClear;
for i := 0 to ChunkList.Count -1 do
begin
C := ChunkList[i];
case C^.Command of
fcNoCommand:
begin
if not Invisible then
TargetCanvas.TextOut(X, Rect.Top, C^.Str);
inc(X, TargetCanvas.TextWidth(C^.Str));
if X > Rect.Right then
break;
end;
fcColor:
if not Invisible then
TargetCanvas.Font.Color := TColor(C^.Data);
fcStyle:
begin
case PFormatStyleData(C^.Data)^.Style of
'I': Style := [fsItalic];
'B': Style := [fsBold];
'U': Style := [fsUnderline];
'S': Style := [fsStrikeout];
else Assert(False);
end;
case PFormatStyleData(C^.Data)^.Action of
-1: TargetCanvas.Font.Style := TargetCanvas.Font.Style - Style;
0: if TargetCanvas.Font.Style * Style = [] then
TargetCanvas.Font.Style := TargetCanvas.Font.Style + Style
else
TargetCanvas.Font.Style := TargetCanvas.Font.Style - Style;
1: TargetCanvas.Font.Style := TargetCanvas.Font.Style + Style;
else Assert(False);
end;
end;
fcColumn:
if Assigned(Columns) and (Columns.Count > 0) then
begin
if CurrentColumnIndex <= Columns.Count -1 then
begin
inc(LastColumnStart, TargetCanvas.TextWidth(CurrentColumn.FBiggestWord+' '));
X := LastColumnStart;
inc(CurrentColumnIndex);
if CurrentColumnIndex <= Columns.Count -1 then
begin
CurrentColumn := TProposalColumn(Columns.Items[CurrentColumnIndex]);
TargetCanvas.Font.Style := CurrentColumn.FFontStyle;
end else
CurrentColumn := nil;
end;
end;
fcHSpace:
begin
inc(X, Integer(C^.Data));
if X > Rect.Right then
break;
end;
fcImage:
begin
Assert(Assigned(Images));
Images.Draw(TargetCanvas, X, Rect.Top, Integer(C^.Data));
inc(X, Images.Width);
if X > Rect.Right then
break;
end;
end;
end;
Result := X;
TargetCanvas.Font.Assign(OldFont);
finally
OldFont.Free;
end;
end;
procedure FormattedTextOut(TargetCanvas: TCanvas; const Rect: TRect;
const Text: string; Selected: Boolean; Columns: TProposalColumns; Images: TImageList);
var
Chunks: TFormatChunkList;
StripCommands: TFormatCommands;
begin
Chunks := TFormatChunkList.Create;
try
if Selected then
StripCommands := [fcColor]
else
StripCommands := [];
ParseFormatChunks(Text, Chunks, StripCommands);
PaintChunks(TargetCanvas, Rect, Chunks, Columns, Images, False);
finally
Chunks.Free;
end;
end;
function FormattedTextWidth(TargetCanvas: TCanvas; const Text: string;
Columns: TProposalColumns; Images: TImageList): Integer;
var
Chunks: TFormatChunkList;
TmpRect: TRect;
begin
Chunks := TFormatChunkList.Create;
try
TmpRect := Rect(0, 0, MaxInt, MaxInt);
ParseFormatChunks(Text, Chunks, [fcColor]);
Result := PaintChunks(TargetCanvas, TmpRect, Chunks, Columns, Images, True);
finally
Chunks.Free;
end;
end;
function PrettyTextToFormattedString(const APrettyText: string;
AlternateBoldStyle: Boolean {$IFDEF SYN_COMPILER_4_UP} = False {$ENDIF}): string;
var
i: Integer;
Color: TColor;
Begin
Result := '';
i := 1;
while i <= Length(APrettyText) do
case APrettyText[i] of
#1, #2:
begin
Color := (Ord(APrettyText[i+3]) shl 8
+Ord(APrettyText[i+2])) shl 8
+Ord(APrettyText[i+1]);
Result := Result+'\color{'+ColorToString(Color)+'}';
inc(i, 4);
end;
#3:
begin
if UpCase(APrettyText[i+1]) in ['B', 'I', 'U'] then
begin
Result := Result+'\style{';
case APrettyText[i+1] of
'B': Result := Result+'+B';
'b': Result := Result+'-B';
'I': Result := Result+'+I';
'i': Result := Result+'-I';
'U': Result := Result+'+U';
'u': Result := Result+'-U';
end;
Result := Result+'}';
end;
inc(i, 2);
end;
#9:
begin
Result := Result+'\column{}';
if AlternateBoldStyle then
Result := Result+'\style{~B}';
inc(i);
end;
else
Result := Result+APrettyText[i];
inc(i);
end;
end;
// TProposalColumn
constructor TProposalColumn.Create(Collection: TCollection);
begin
inherited;
FBiggestWord := 'CONSTRUCTOR';
FInternalWidth := -1;
FFontStyle := [];
end;
destructor TProposalColumn.Destroy;
begin
inherited;
end;
procedure TProposalColumn.Assign(Source: TPersistent);
begin
if Source is TProposalColumn then
begin
FBiggestWord := TProposalColumn(Source).FBiggestWord;
FInternalWidth := TProposalColumn(Source).FInternalWidth;
FFontStyle := TProposalColumn(Source).FFontStyle;
end
else
inherited Assign(Source);
end;
constructor TProposalColumns.Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
begin
inherited Create(ItemClass);
FOwner := AOwner;
end;
function TProposalColumns.GetOwner: TPersistent;
begin
Result := FOwner;
end;
function TProposalColumns.GetItem(Index: Integer): TProposalColumn;
begin
Result := inherited GetItem(Index) as TProposalColumn;
end;
procedure TProposalColumns.SetItem(Index: Integer; Value: TProposalColumn);
begin
inherited SetItem(Index, Value);
end;
function TProposalColumns.Add: TProposalColumn;
begin
Result := inherited Add as TProposalColumn;
end;
{$IFDEF SYN_COMPILER_3_UP}
function TProposalColumns.FindItemID(ID: Integer): TProposalColumn;
begin
Result := inherited FindItemID(ID) as TProposalColumn;
end;
{$ENDIF}
{$IFDEF SYN_COMPILER_4_UP}
function TProposalColumns.Insert(Index: Integer): TProposalColumn;
begin
Result := inherited Insert(Index) as TProposalColumn;
end;
{$ENDIF}
//============================================================================
//GBN 10/11/2001
//Moved from completion component
function FormatParamList(const S: String; CurrentIndex: Integer): string;
var
i: Integer;
List: TStrings;
begin
Result := '';
List := TStringList.Create;
try
List.CommaText := S;
for i := 0 to List.Count - 1 do
begin
if i = CurrentIndex then
Result := Result + '\style{~B}' + List[i] + '\style{~B}'
else
Result := Result + List[i];
if i < List.Count - 1 then
// Result := Result + ', ';
Result := Result + ' ';
end;
finally
List.Free;
end;
end;
// End GBN 10/11/2001
{ TSynBaseCompletionProposalForm }
constructor TSynBaseCompletionProposalForm.Create(AOwner: TComponent);
begin
FResizeable := True;
{$IFDEF SYN_CPPB_1}
CreateNew(AOwner, 0);
{$ELSE}
CreateNew(AOwner);
{$ENDIF}
Bitmap := TBitmap.Create;
TitleBitmap := TBitmap.Create;
FItemList := TStringList.Create;
FInsertList := TStringList.Create;
FAssignedList := TStringList.Create;
FMatchText := False;
{$IFDEF SYN_CLX}
BorderStyle := fbsNone;
{$ELSE}
BorderStyle := bsNone;
{$ENDIF}
FScrollbar := TScrollBar.Create(Self);
FScrollbar.Kind := sbVertical;
{$IFNDEF SYN_CLX}
FScrollbar.ParentCtl3D := False;
{$ENDIF}
FScrollbar.OnChange := ScrollbarOnChange;
FScrollbar.OnScroll := ScrollbarOnScroll;
FScrollbar.OnEnter := ScrollbarOnEnter;
FScrollbar.Parent := Self;
Visible := False;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -