editor, add/rem breakpoints in the gutter

This commit is contained in:
Basile Burg 2015-10-01 14:43:59 +02:00
parent 256017709a
commit bfd1a9c6a8
1 changed files with 76 additions and 0 deletions

View File

@ -8,6 +8,7 @@ uses
Classes, SysUtils, controls,lcltype, Forms, graphics, ExtCtrls, crc, Classes, SysUtils, controls,lcltype, Forms, graphics, ExtCtrls, crc,
SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText, SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText, SynEdit,
SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView, SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView,
SynEditMarks,
ce_common, ce_observer, ce_writableComponent, ce_d2syn, ce_txtsyn, ce_dialogs, ce_common, ce_observer, ce_writableComponent, ce_d2syn, ce_txtsyn, ce_dialogs,
ce_sharedres; ce_sharedres;
@ -104,6 +105,8 @@ type
fCompletion: TSynCompletion; fCompletion: TSynCompletion;
fD2Highlighter: TSynD2Syn; fD2Highlighter: TSynD2Syn;
fTxtHighlighter: TSynTxtSyn; fTxtHighlighter: TSynTxtSyn;
fImages: TImageList;
fBreakPoints: TFPList;
function getMouseFileBytePos: Integer; function getMouseFileBytePos: Integer;
procedure changeNotify(Sender: TObject); procedure changeNotify(Sender: TObject);
procedure identifierToD2Syn; procedure identifierToD2Syn;
@ -125,6 +128,10 @@ type
Selected: boolean; Index: integer): boolean; Selected: boolean; Index: integer): boolean;
procedure completionCodeCompletion(var Value: string; SourceValue: string; procedure completionCodeCompletion(var Value: string; SourceValue: string;
var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char; Shift: TShiftState); var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char; Shift: TShiftState);
procedure gutterClick(Sender: TObject; X, Y, Line: integer; mark: TSynEditMark);
procedure addBreakPoint(line: integer);
procedure removeBreakPoint(line: integer);
function findBreakPoint(line: integer): boolean;
protected protected
procedure MouseLeave; override; procedure MouseLeave; override;
procedure SetVisible(Value: Boolean); override; procedure SetVisible(Value: Boolean); override;
@ -152,6 +159,9 @@ type
procedure save; procedure save;
procedure saveTempFile; procedure saveTempFile;
// //
function breakPointsCount: integer;
function BreakPointLine(index: integer): integer;
//
property Identifier: string read fIdentifier; property Identifier: string read fIdentifier;
property fileName: string read fFilename; property fileName: string read fFilename;
property modified: boolean read fModified; property modified: boolean read fModified;
@ -384,6 +394,7 @@ begin
Gutter.SeparatorPart.LineWidth := 1; Gutter.SeparatorPart.LineWidth := 1;
Gutter.SeparatorPart.MarkupInfo.Foreground := clGray; Gutter.SeparatorPart.MarkupInfo.Foreground := clGray;
Gutter.CodeFoldPart.MarkupInfo.Foreground := clGray; Gutter.CodeFoldPart.MarkupInfo.Foreground := clGray;
Gutter.OnGutterClick:= @gutterClick;
BracketMatchColor.Foreground:=clRed; BracketMatchColor.Foreground:=clRed;
// //
fSyncEdit := TSynPluginSyncroEdit.Create(self); fSyncEdit := TSynPluginSyncroEdit.Create(self);
@ -416,6 +427,11 @@ begin
fModified := false; fModified := false;
TextBuffer.AddNotifyHandler(senrUndoRedoAdded, @changeNotify); TextBuffer.AddNotifyHandler(senrUndoRedoAdded, @changeNotify);
// //
fImages := TImageList.Create(self);
fImages.AddLazarusResource('bullet_red');
fImages.AddLazarusResource('bullet_green');
fBreakPoints := TFPList.Create;
//
fPositions := TCESynMemoPositions.create(self); fPositions := TCESynMemoPositions.create(self);
fMultiDocSubject := TCEMultiDocSubject.create; fMultiDocSubject := TCEMultiDocSubject.create;
// //
@ -430,6 +446,7 @@ begin
fMultiDocSubject.Free; fMultiDocSubject.Free;
fPositions.Free; fPositions.Free;
fCompletion.Free; fCompletion.Free;
fBreakPoints.Free;
// //
if fileExists(fTempFileName) then if fileExists(fTempFileName) then
sysutils.DeleteFile(fTempFileName); sysutils.DeleteFile(fTempFileName);
@ -974,6 +991,65 @@ begin
fCanShowHint:=false; fCanShowHint:=false;
fHintTimer.Enabled:=false; fHintTimer.Enabled:=false;
end; end;
function TCESynMemo.breakPointsCount: integer;
begin
exit(fBreakPoints.Count);
end;
function TCESynMemo.BreakPointLine(index: integer): integer;
begin
if index >= fBreakPoints.Count then
exit(0);
{$WARNINGS OFF}
exit(Integer(fBreakPoints.Items[index]));
{$WARNINGS ON}
end;
procedure TCESynMemo.addBreakPoint(line: integer);
var
m: TSynEditMark;
begin
if findBreakPoint(line) then
exit;
m:= TSynEditMark.Create(self);
m.Line := line;
m.ImageList := fImages;
m.ImageIndex := 0;
m.Visible := true;
Marks.Add(m);
{$WARNINGS OFF}
fBreakPoints.Add(pointer(line));
{$WARNINGS ON}
end;
procedure TCESynMemo.removeBreakPoint(line: integer);
begin
if not findBreakPoint(line) then
exit;
if (marks.Line[line] <> nil) and (marks.Line[line].Count > 0) then
marks.Line[line].Clear(true);
{$WARNINGS OFF}
fBreakPoints.Remove(pointer(line));
{$WARNINGS ON}
end;
function TCESynMemo.findBreakPoint(line: integer): boolean;
begin
{$WARNINGS OFF}
exit(fBreakPoints.IndexOf(pointer(line)) <> -1);
{$WARNINGS ON}
end;
procedure TCESynMemo.gutterClick(Sender: TObject; X, Y, Line: integer; mark: TSynEditMark);
var
m: TSynEditMark;
begin
if findBreakPoint(line) then
removeBreakPoint(line)
else
addBreakPoint(line);
end;
{$ENDREGION --------------------------------------------------------------------} {$ENDREGION --------------------------------------------------------------------}
initialization initialization