Display number of lines in grid popup text editor

This commit is contained in:
Ansgar Becker
2018-12-12 20:05:23 +01:00
parent f589ba58a8
commit 0fb66ac295
4 changed files with 67 additions and 12 deletions

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: HeidiSQL\n"
"POT-Creation-Date: 2012-11-05 21:40\n"
"PO-Revision-Date: 2018-12-08 16:06+0100\n"
"PO-Revision-Date: 2018-12-12 20:04+0100\n"
"Last-Translator: Ansgar Becker <anse@heidisql.com>\n"
"Language-Team: English (http://www.transifex.com/projects/p/heidisql/language/en/)\n"
"MIME-Version: 1.0\n"
@ -6296,3 +6296,6 @@ msgstr "Theme: \"%s\""
msgid "Pixels per inch on current monitor: %d"
msgstr "Pixels per inch on current monitor: %d"
msgid "%s characters (max: %s), %s lines"
msgstr "%s characters (max: %s), %s lines"

View File

@ -266,6 +266,7 @@ type
function IsNumeric(Str: String): Boolean;
function esc(Text: String; ProcessJokerChars: Boolean=false; DoQuote: Boolean=True): String;
function ScanLineBreaks(Text: String): TLineBreaks;
function CountLineBreaks(Text: String; LineBreak: TLineBreaks=lbsWindows): Cardinal;
function fixNewlines(txt: String): String;
function ExtractLiteral(var SQL: String; Prefix: String): String;
function GetShellFolder(CSIDL: integer): string;
@ -683,7 +684,7 @@ end;
}
function ScanLineBreaks(Text: String): TLineBreaks;
var
i: integer;
i, SeekSize: Integer;
c: Char;
procedure SetResult(Style: TLineBreaks);
begin
@ -697,12 +698,14 @@ var
end;
begin
Result := lbsNone;
if length(Text) = 0 then exit;
SeekSize := Min(Length(Text), SIZE_MB);
if SeekSize = 0 then
Exit;
i := 1;
repeat
c := Text[i];
if c = #13 then begin
if (i < length(Text)) and (Text[i+1] = #10) then begin
if (i < SeekSize) and (Text[i+1] = #10) then begin
Inc(i);
SetResult(lbsWindows);
end else
@ -715,7 +718,29 @@ begin
// No need to do more checks after detecting mixed style
if Result = lbsMixed then
break;
until i > length(Text);
until i > SeekSize;
end;
function CountLineBreaks(Text: String; LineBreak: TLineBreaks=lbsWindows): Cardinal;
var
Offset: Integer;
BreakStr: String;
begin
// Count number of given line breaks in text
Result := 0;
case LineBreak of
lbsWindows: BreakStr := CRLF;
lbsUnix: BreakStr := LB_UNIX;
lbsMac: BreakStr := LB_MAC;
lbsWide: BreakStr := LB_WIDE;
else Exit;
end;
Offset := PosEx(BreakStr, Text, 1);
while Offset <> 0 do begin
Inc(Result);
Offset := PosEx(BreakStr, Text, Offset + Length(BreakStr));
end;
end;

View File

@ -31,13 +31,12 @@ object frmTextEditor: TfrmTextEditor
Caption = 'Panel1'
ShowCaption = False
TabOrder = 0
ExplicitWidth = 332
object lblTextLength: TLabel
AlignWithMargins = True
Left = 210
Top = 3
Width = 65
Height = 13
Height = 16
Align = alLeft
BiDiMode = bdLeftToRight
Caption = 'lblTextLength'
@ -177,4 +176,10 @@ object frmTextEditor: TfrmTextEditor
ImageIndex = 59
end
end
object TimerMemoChange: TTimer
Interval = 500
OnTimer = TimerMemoChangeTimer
Left = 120
Top = 16
end
end

View File

@ -34,6 +34,7 @@ type
btnSearchReplace: TToolButton;
btnSearchFindNext: TToolButton;
btnSeparator1: TToolButton;
TimerMemoChange: TTimer;
procedure btnApplyClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure btnLoadTextClick(Sender: TObject);
@ -45,6 +46,7 @@ type
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SelectLinebreaks(Sender: TObject);
procedure TimerMemoChangeTimer(Sender: TObject);
private
{ Private declarations }
FModified: Boolean;
@ -103,8 +105,6 @@ begin
SelectLineBreaks(Detected);
FmemoText.Text := text;
FmemoText.SelectAll;
// Trigger change event, which is not fired when text is empty. See #132.
FmemoText.OnChange(FmemoText);
Modified := False;
end;
@ -117,6 +117,27 @@ begin
end;
procedure TfrmTextEditor.TimerMemoChangeTimer(Sender: TObject);
var
Lines: Cardinal;
TextLen: Integer;
MaxLen: String;
begin
// Timer based onchange handler, so we don't scan the whole text on every typed character
TimerMemoChange.Enabled := False;
TextLen := Length(FmemoText.Text);
if FmemoText.MaxLength = 0 then
MaxLen := '?'
else
MaxLen := FormatNumber(FmemoText.MaxLength);
if TextLen = 0 then
Lines := 0
else
Lines := CountLineBreaks(FmemoText.Text) + 1;
lblTextLength.Caption := f_('%s characters (max: %s), %s lines', [FormatNumber(TextLen), MaxLen, FormatNumber(Lines)]);
end;
procedure TfrmTextEditor.SelectLinebreaks(Sender: TObject);
var
Selected, Item: TMenuItem;
@ -202,6 +223,8 @@ end;
procedure TfrmTextEditor.FormShow(Sender: TObject);
begin
// Trigger change event, which is not fired when text is empty. See #132.
TimerMemoChangeTimer(Self);
FmemoText.SetFocus;
end;
@ -294,10 +317,9 @@ end;
procedure TfrmTextEditor.memoTextChange(Sender: TObject);
begin
lblTextLength.Caption := FormatNumber(Length(FmemoText.Text)) + ' characters.';
if FmemoText.MaxLength > 0 then
lblTextLength.Caption := lblTextLength.Caption + ' (Max: '+FormatNumber(FmemoText.MaxLength)+')';
Modified := True;
TimerMemoChange.Enabled := False;
TimerMemoChange.Enabled := True;
end;