IDE: added Line ending menu item, bug #15420

git-svn-id: trunk@23277 -
This commit is contained in:
mattias 2009-12-25 13:14:58 +00:00
parent 55fdc3df73
commit a1f22a3dff
6 changed files with 87 additions and 53 deletions

View File

@ -214,7 +214,7 @@ begin
lbfRevert in Flags)
else
ACodeBuffer:=nil;
if ACodeBuffer<>nil then begin
Result:=mrOk;
end else begin

View File

@ -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

View File

@ -2024,6 +2024,7 @@ resourcestring
lisCodeHelpShowUnusedUnits = 'Show unused units';
uemHighlighter = 'Highlighter';
uemEncoding = 'Encoding';
uemLineEnding = 'Line ending';
// Form designer
lisInvalidMultiselection = 'Invalid multiselection';

View File

@ -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}

View File

@ -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;

View File

@ -390,6 +390,7 @@ var
SrcEditSubMenuRefactor: TIDEMenuSection;
SrcEditSubMenuFlags: TIDEMenuSection;
SrcEditSubMenuHighlighter: TIDEMenuSection;
SrcEditSubMenuLineEnding: TIDEMenuSection;
SrcEditSubMenuEncoding: TIDEMenuSection;
// Messages window popupmenu