mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-26 23:23:48 +02:00
parent
55fdc3df73
commit
a1f22a3dff
@ -214,7 +214,7 @@ begin
|
||||
lbfRevert in Flags)
|
||||
else
|
||||
ACodeBuffer:=nil;
|
||||
|
||||
|
||||
if ACodeBuffer<>nil then begin
|
||||
Result:=mrOk;
|
||||
end else begin
|
||||
|
@ -30,7 +30,7 @@ unit IDEProcs;
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Laz_XMLCfg, FileUtil, LCLProc, AvgLvlTree,
|
||||
Classes, SysUtils, Laz_XMLCfg, FileUtil, LCLProc, AvgLvlTree, SourceLog,
|
||||
FileProcs, LazConf, StdCtrls, ExtCtrls;
|
||||
|
||||
type
|
||||
@ -210,8 +210,8 @@ procedure SplitString(const s: string; Delimiter: char; AddTo: TStrings;
|
||||
ClearList: boolean = true);
|
||||
function SpecialCharsToSpaces(const s: string; FixUTF8: boolean): string;
|
||||
function SpecialCharsToHex(const s: string): string;
|
||||
function LineBreaksToDelimiter(const s: string; Delimiter: char): string;
|
||||
function LineBreaksToSystemLineBreaks(const s: string): string;
|
||||
function LineBreaksToDelimiter(const s: string; Delimiter: char): string;
|
||||
function StringListToText(List: TStrings; const Delimiter: string;
|
||||
IgnoreEmptyLines: boolean = false): string;
|
||||
function StringListPartToText(List: TStrings; FromIndex, ToIndex: integer;
|
||||
@ -1614,6 +1614,11 @@ begin
|
||||
+copy(Result,i+1,length(Result));
|
||||
end;
|
||||
|
||||
function LineBreaksToSystemLineBreaks(const s: string): string;
|
||||
begin
|
||||
Result:=ChangeLineEndings(s,LineEnding);
|
||||
end;
|
||||
|
||||
function LineBreaksToDelimiter(const s: string; Delimiter: char): string;
|
||||
var
|
||||
p: Integer;
|
||||
@ -1637,56 +1642,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function LineBreaksToSystemLineBreaks(const s: string): string;
|
||||
var
|
||||
e: string;
|
||||
NewLength: Integer;
|
||||
p, StartPos: Integer;
|
||||
Src: PChar;
|
||||
Dest: PChar;
|
||||
EndLen: Integer;
|
||||
EndPos: PChar;
|
||||
begin
|
||||
if s='' then begin
|
||||
Result:=s;
|
||||
exit;
|
||||
end;
|
||||
e:=LineEnding;
|
||||
EndLen:=length(e);
|
||||
NewLength:=length(s);
|
||||
p:=1;
|
||||
while p<length(s) do begin
|
||||
if s[p] in [#10,#13] then begin
|
||||
StartPos:=p;
|
||||
inc(p);
|
||||
if (s[p] in [#10,#13]) and (s[p]<>s[p-1]) then inc(p);
|
||||
inc(NewLength,EndLen-(p-StartPos));
|
||||
end else
|
||||
inc(p);
|
||||
end;
|
||||
SetLength(Result,NewLength);
|
||||
Src:=PChar(s);
|
||||
Dest:=PChar(Result);
|
||||
EndPos:=Dest+NewLength;
|
||||
while (Dest<EndPos) do begin
|
||||
if Src^ in [#10,#13] then begin
|
||||
for p:=1 to EndLen do begin
|
||||
Dest^:=e[p];
|
||||
inc(Dest);
|
||||
end;
|
||||
if (Src[1] in [#10,#13]) and (Src^<>Src[1]) then
|
||||
inc(Src,2)
|
||||
else
|
||||
inc(Src);
|
||||
end else begin
|
||||
Dest^:=Src^;
|
||||
inc(Src);
|
||||
inc(Dest);
|
||||
end;
|
||||
end;
|
||||
//if Src-1<>@s[length(s)] then RaiseGDBException('');
|
||||
end;
|
||||
|
||||
function StringListToText(List: TStrings; const Delimiter: string;
|
||||
IgnoreEmptyLines: boolean): string;
|
||||
begin
|
||||
|
@ -2024,6 +2024,7 @@ resourcestring
|
||||
lisCodeHelpShowUnusedUnits = 'Show unused units';
|
||||
uemHighlighter = 'Highlighter';
|
||||
uemEncoding = 'Encoding';
|
||||
uemLineEnding = 'Line ending';
|
||||
|
||||
// Form designer
|
||||
lisInvalidMultiselection = 'Invalid multiselection';
|
||||
|
@ -8261,6 +8261,7 @@ begin
|
||||
DebugLn(['TMainIDE.DoOpenEditorFile failed LoadCodeBuffer: ',AFilename]);
|
||||
exit;
|
||||
end;
|
||||
|
||||
NewUnitInfo.Source:=NewBuf;
|
||||
if FilenameIsPascalUnit(NewUnitInfo.Filename) then
|
||||
NewUnitInfo.ReadUnitNameFromSource(false);
|
||||
@ -8281,6 +8282,7 @@ begin
|
||||
{$IFDEF IDE_DEBUG}
|
||||
writeln('[TMainIDE.DoOpenEditorFile] B');
|
||||
{$ENDIF}
|
||||
|
||||
// open file in source notebook
|
||||
Result:=DoOpenFileInSourceEditor(NewUnitInfo,PageIndex,Flags);
|
||||
if Result<>mrOk then begin
|
||||
@ -8288,6 +8290,7 @@ begin
|
||||
exit;
|
||||
end;
|
||||
|
||||
|
||||
{$IFDEF IDE_DEBUG}
|
||||
writeln('[TMainIDE.DoOpenEditorFile] C');
|
||||
{$ENDIF}
|
||||
|
@ -498,6 +498,7 @@ type
|
||||
procedure BookMarkToggleClicked(Sender: TObject);
|
||||
procedure BookmarkSetFreeClicked(Sender: TObject);
|
||||
procedure EditorPropertiesClicked(Sender: TObject);
|
||||
procedure LineEndingClicked(Sender: TObject);
|
||||
procedure EncodingClicked(Sender: TObject);
|
||||
procedure HighlighterClicked(Sender: TObject);
|
||||
procedure FindDeclarationClicked(Sender: TObject);
|
||||
@ -595,6 +596,7 @@ type
|
||||
function GetPageIndex: Integer;
|
||||
procedure SetPageIndex(const AValue: Integer);
|
||||
procedure UpdateHighlightMenuItems;
|
||||
procedure UpdateLineEndingMenuItems;
|
||||
procedure UpdateEncodingMenuItems;
|
||||
procedure RemoveUserDefinedMenuItems;
|
||||
function AddUserDefinedPopupMenuItem(const NewCaption: string;
|
||||
@ -1057,6 +1059,8 @@ begin
|
||||
uemHighlighter);
|
||||
SrcEditSubMenuEncoding:=RegisterIDESubMenu(AParent,'Encoding',
|
||||
uemEncoding);
|
||||
SrcEditSubMenuLineEnding:=RegisterIDESubMenu(AParent,'LineEnding',
|
||||
uemLineEnding);
|
||||
|
||||
// register the Clipboard section
|
||||
SrcEditMenuSectionClipboard:=RegisterIDEMenuSection(SourceEditorMenuRoot,
|
||||
@ -4420,6 +4424,33 @@ begin
|
||||
FOnEditorPropertiesClicked(Sender);
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.LineEndingClicked(Sender: TObject);
|
||||
var
|
||||
IDEMenuItem: TIDEMenuItem;
|
||||
SrcEdit: TSourceEditor;
|
||||
NewLineEnding: String;
|
||||
OldLineEnding: String;
|
||||
begin
|
||||
SrcEdit:=GetActiveSE;
|
||||
if SrcEdit=nil then exit;
|
||||
if not (Sender is TIDEMenuItem) then exit;
|
||||
if SrcEdit.CodeBuffer=nil then exit;
|
||||
IDEMenuItem:=TIDEMenuItem(Sender);
|
||||
NewLineEnding:=IDEMenuItem.Caption;
|
||||
DebugLn(['TSourceNotebook.LineEndingClicked NewLineEnding=',NewLineEnding]);
|
||||
NewLineEnding:=StringReplace(StringReplace(NewLineEnding,'CR',#13,[rfReplaceAll]),'LF',#10,[rfReplaceAll]);
|
||||
OldLineEnding:=SrcEdit.CodeBuffer.DiskLineEnding;
|
||||
if OldLineEnding='' then
|
||||
OldLineEnding:=LineEnding;
|
||||
if NewLineEnding<>SrcEdit.CodeBuffer.DiskLineEnding then begin
|
||||
DebugLn(['TSourceNotebook.LineEndingClicked Old=',dbgstr(OldLineEnding),' New=',dbgstr(NewLineEnding)]);
|
||||
// change file
|
||||
SrcEdit.CodeBuffer.DiskLineEnding:=NewLineEnding;
|
||||
SrcEdit.CodeBuffer.Modified:=true;
|
||||
SrcEdit.Modified:=true;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.EncodingClicked(Sender: TObject);
|
||||
var
|
||||
IDEMenuItem: TIDEMenuItem;
|
||||
@ -4574,6 +4605,7 @@ begin
|
||||
SrcEditMenuShowLineNumbers.MenuItem.Checked :=
|
||||
EditorComp.Gutter.LineNumberPart.Visible;
|
||||
UpdateHighlightMenuItems;
|
||||
UpdateLineEndingMenuItems;
|
||||
UpdateEncodingMenuItems;
|
||||
|
||||
// bookmarks
|
||||
@ -4897,6 +4929,48 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.UpdateLineEndingMenuItems;
|
||||
var
|
||||
List: TStringList;
|
||||
i: Integer;
|
||||
SrcEdit: TSourceEditor;
|
||||
DiskLineEnding: String;
|
||||
CurLineEnding: string;
|
||||
CurName: String;
|
||||
CurCaption: String;
|
||||
IDEMenuItem: TIDEMenuItem;
|
||||
begin
|
||||
SrcEditSubMenuLineEnding.ChildsAsSubMenu:=true;
|
||||
SrcEdit:=GetActiveSE;
|
||||
DiskLineEnding:=LineEnding;
|
||||
if (SrcEdit<>nil) and (SrcEdit.CodeBuffer<>nil) then
|
||||
DiskLineEnding:=SrcEdit.CodeBuffer.DiskLineEnding;
|
||||
DiskLineEnding:=StringReplace(StringReplace(DiskLineEnding,#13,'CR',[rfReplaceAll]),#10,'LF',[rfReplaceAll]);
|
||||
//DebugLn(['TSourceNotebook.UpdateEncodingMenuItems ',Encoding]);
|
||||
List:=TStringList.Create;
|
||||
List.add('LF');
|
||||
List.add('CR');
|
||||
List.add('CRLF');
|
||||
for i:=0 to List.Count-1 do begin
|
||||
CurName:='LineEnding'+IntToStr(i);
|
||||
CurLineEnding:=List[i];
|
||||
CurCaption:=CurLineEnding;
|
||||
if SrcEditSubMenuLineEnding.Count=i then begin
|
||||
// add new item
|
||||
IDEMenuItem:=RegisterIDEMenuCommand(SrcEditSubMenuLineEnding,
|
||||
CurName,CurCaption,@LineEndingClicked);
|
||||
end else begin
|
||||
IDEMenuItem:=SrcEditSubMenuLineEnding[i];
|
||||
IDEMenuItem.Caption:=CurCaption;
|
||||
IDEMenuItem.OnClick:=@LineEndingClicked;
|
||||
end;
|
||||
if IDEMenuItem is TIDEMenuCommand then
|
||||
TIDEMenuCommand(IDEMenuItem).Checked:=
|
||||
DiskLineEnding=CurLineEnding;
|
||||
end;
|
||||
List.Free;
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.UpdateEncodingMenuItems;
|
||||
var
|
||||
List: TStringList;
|
||||
|
@ -390,6 +390,7 @@ var
|
||||
SrcEditSubMenuRefactor: TIDEMenuSection;
|
||||
SrcEditSubMenuFlags: TIDEMenuSection;
|
||||
SrcEditSubMenuHighlighter: TIDEMenuSection;
|
||||
SrcEditSubMenuLineEnding: TIDEMenuSection;
|
||||
SrcEditSubMenuEncoding: TIDEMenuSection;
|
||||
|
||||
// Messages window popupmenu
|
||||
|
Loading…
Reference in New Issue
Block a user