mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 00:49:18 +02:00
Qt: TQtTextEdit rework - added insertLine() setLineText() removeLine() using QTextCursor
git-svn-id: trunk@24799 -
This commit is contained in:
parent
c5b9638600
commit
41715a8d27
@ -97,11 +97,10 @@ type
|
|||||||
procedure ExternalUpdate(var Astr: WideString; AClear: Boolean = True);
|
procedure ExternalUpdate(var Astr: WideString; AClear: Boolean = True);
|
||||||
procedure IsChanged; // OnChange triggered by program action
|
procedure IsChanged; // OnChange triggered by program action
|
||||||
protected
|
protected
|
||||||
procedure Put(Index: Integer; const S: string); override;
|
|
||||||
function GetTextStr: string; override;
|
function GetTextStr: string; override;
|
||||||
function GetCount: integer; override;
|
function GetCount: integer; override;
|
||||||
function Get(Index : Integer) : string; override;
|
function Get(Index : Integer) : string; override;
|
||||||
//procedure SetSorted(Val : boolean); virtual;
|
procedure Put(Index: Integer; const S: string); override;
|
||||||
public
|
public
|
||||||
constructor Create(TextEdit : QTextEditH; TheOwner: TWinControl);
|
constructor Create(TextEdit : QTextEditH; TheOwner: TWinControl);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -110,9 +109,7 @@ type
|
|||||||
procedure Delete(Index : integer); override;
|
procedure Delete(Index : integer); override;
|
||||||
procedure Insert(Index : integer; const S: string); override;
|
procedure Insert(Index : integer; const S: string); override;
|
||||||
procedure SetText(TheText: PChar); override;
|
procedure SetText(TheText: PChar); override;
|
||||||
//procedure Sort; virtual;
|
|
||||||
public
|
public
|
||||||
//property Sorted: boolean read FSorted write SetSorted;
|
|
||||||
property Owner: TWinControl read FOwner;
|
property Owner: TWinControl read FOwner;
|
||||||
procedure TextChangedHandler; cdecl;
|
procedure TextChangedHandler; cdecl;
|
||||||
end;
|
end;
|
||||||
@ -130,10 +127,10 @@ implementation
|
|||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
procedure TQtMemoStrings.InternalUpdate;
|
procedure TQtMemoStrings.InternalUpdate;
|
||||||
var
|
var
|
||||||
Astr: WideString;
|
W: WideString;
|
||||||
begin
|
begin
|
||||||
QTextEdit_toPlainText(FQtTextEdit,@Astr); // get the memo content
|
QTextEdit_toPlainText(FQtTextEdit,@W); // get the memo content
|
||||||
FStringList.Text := UTF16ToUTF8(Astr);
|
FStringList.Text := UTF16ToUTF8(W);
|
||||||
FTextChanged := False;
|
FTextChanged := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -146,17 +143,17 @@ end;
|
|||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
procedure TQtMemoStrings.ExternalUpdate(var Astr: WideString; AClear: Boolean = True);
|
procedure TQtMemoStrings.ExternalUpdate(var Astr: WideString; AClear: Boolean = True);
|
||||||
var
|
var
|
||||||
Str: WideString;
|
W: WideString;
|
||||||
begin
|
begin
|
||||||
FUpdating := True;
|
FUpdating := True;
|
||||||
Str := GetUtf8String(AStr);
|
W := GetUtf8String(AStr);
|
||||||
if AClear then
|
if AClear then
|
||||||
begin
|
begin
|
||||||
QTextEdit_clear(FQtTextEdit);
|
QTextEdit_clear(FQtTextEdit);
|
||||||
QTextEdit_setPlainText(FQtTextEdit,@Str);
|
QTextEdit_setPlainText(FQtTextEdit,@W);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
QTextEdit_append(FQtTextEdit,@Str);
|
QTextEdit_append(FQtTextEdit,@W);
|
||||||
|
|
||||||
if QTextEdit_alignment(FQtTextEdit) <> AlignmentMap[TCustomMemo(FOwner).Alignment] then
|
if QTextEdit_alignment(FQtTextEdit) <> AlignmentMap[TCustomMemo(FOwner).Alignment] then
|
||||||
QTextEdit_setAlignment(FQtTextEdit, AlignmentMap[TCustomMemo(FOwner).Alignment]);
|
QTextEdit_setAlignment(FQtTextEdit, AlignmentMap[TCustomMemo(FOwner).Alignment]);
|
||||||
@ -185,16 +182,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TQtMemoStrings.Put(Index: Integer; const S: string);
|
|
||||||
var
|
|
||||||
W: WideString;
|
|
||||||
begin
|
|
||||||
FStringList[Index] := S;
|
|
||||||
W := FStringList.Text;
|
|
||||||
ExternalUpdate(W, True);
|
|
||||||
FTextChanged := False;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Method: TQtMemoStrings.GetTextStr
|
Method: TQtMemoStrings.GetTextStr
|
||||||
Params: None
|
Params: None
|
||||||
@ -236,6 +223,15 @@ begin
|
|||||||
else Result := '';
|
else Result := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TQtMemoStrings.Put(Index: Integer; const S: string);
|
||||||
|
var
|
||||||
|
W: WideString;
|
||||||
|
begin
|
||||||
|
if FTextChanged then InternalUpdate;
|
||||||
|
FStringList[Index] := S;
|
||||||
|
W := GetUTF8String(S);
|
||||||
|
TQtTextEdit(FOwner.Handle).setLineText(Index, W);
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Method: TQtMemoStrings.Create
|
Method: TQtMemoStrings.Create
|
||||||
@ -310,7 +306,7 @@ end;
|
|||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
procedure TQtMemoStrings.Assign(Source: TPersistent);
|
procedure TQtMemoStrings.Assign(Source: TPersistent);
|
||||||
var
|
var
|
||||||
Astr: WideString;
|
W: WideString;
|
||||||
begin
|
begin
|
||||||
if (Source=Self) or (Source=nil)
|
if (Source=Self) or (Source=nil)
|
||||||
then
|
then
|
||||||
@ -319,12 +315,12 @@ begin
|
|||||||
begin
|
begin
|
||||||
FStringList.Clear;
|
FStringList.Clear;
|
||||||
FStringList.Text := TStrings(Source).Text;
|
FStringList.Text := TStrings(Source).Text;
|
||||||
Astr := FStringList.Text;
|
W := FStringList.Text;
|
||||||
ExternalUpdate(Astr,True);
|
ExternalUpdate(W,True);
|
||||||
FTextChanged := False;
|
FTextChanged := False;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
Inherited Assign(Source);
|
inherited Assign(Source);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
@ -340,8 +336,7 @@ begin
|
|||||||
FStringList.Clear;
|
FStringList.Clear;
|
||||||
|
|
||||||
if not (csDestroying in FOwner.ComponentState)
|
if not (csDestroying in FOwner.ComponentState)
|
||||||
and not (csFreeNotification in FOwner.ComponentState)
|
and not (csFreeNotification in FOwner.ComponentState) then
|
||||||
then
|
|
||||||
QTextEdit_clear(FQtTextEdit);
|
QTextEdit_clear(FQtTextEdit);
|
||||||
|
|
||||||
FTextChanged := False;
|
FTextChanged := False;
|
||||||
@ -358,15 +353,18 @@ end;
|
|||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
procedure TQtMemoStrings.Delete(Index: integer);
|
procedure TQtMemoStrings.Delete(Index: integer);
|
||||||
var
|
var
|
||||||
Astr: WideString;
|
W: WideString;
|
||||||
begin
|
begin
|
||||||
if FTextChanged then InternalUpdate;
|
if FTextChanged then InternalUpdate;
|
||||||
if Index < FStringList.Count then
|
if (Index >= 0) and (Index < FStringList.Count) then
|
||||||
begin
|
begin
|
||||||
FStringList.Delete(Index);
|
FStringList.Delete(Index);
|
||||||
Astr := FStringList.Text;
|
TQtTextEdit(FOwner.Handle).removeLine(Index);
|
||||||
ExternalUpdate(AStr,True);
|
{TODO: remove old way after testing
|
||||||
|
W := FStringList.Text;
|
||||||
|
ExternalUpdate(W, True);
|
||||||
FTextChanged := False;
|
FTextChanged := False;
|
||||||
|
}
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -379,16 +377,24 @@ end;
|
|||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
procedure TQtMemoStrings.Insert(Index: integer; const S: string);
|
procedure TQtMemoStrings.Insert(Index: integer; const S: string);
|
||||||
var
|
var
|
||||||
Astr: WideString;
|
W: WideString;
|
||||||
begin
|
begin
|
||||||
if FTextChanged then InternalUpdate;
|
if FTextChanged then InternalUpdate;
|
||||||
if Index < 0 then Index := 0;
|
if Index < 0 then Index := 0;
|
||||||
if Index <= FStringList.Count then
|
if Index <= FStringList.Count then
|
||||||
begin
|
begin
|
||||||
FStringList.Insert(Index,S);
|
FStringList.Insert(Index, S);
|
||||||
Astr := S;
|
// append is much faster in case when we add strings
|
||||||
ExternalUpdate(AStr, False);
|
if TQtTextEdit(FOwner.Handle).getBlockCount - Index <= 1 then
|
||||||
FTextChanged := False;
|
begin
|
||||||
|
W := S;
|
||||||
|
ExternalUpdate(W, False);
|
||||||
|
FTextChanged := False;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
W := GetUTF8String(S);
|
||||||
|
TQtTextEdit(FOwner.Handle).insertLine(Index, W);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -401,13 +407,13 @@ end;
|
|||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
procedure TQtMemoStrings.SetText(TheText: PChar);
|
procedure TQtMemoStrings.SetText(TheText: PChar);
|
||||||
Var
|
Var
|
||||||
str: String;
|
S: String;
|
||||||
Astr: WideString;
|
W: WideString;
|
||||||
begin
|
begin
|
||||||
str := StrPas(TheText);
|
S := StrPas(TheText);
|
||||||
FStringList.Text := str;
|
FStringList.Text := S;
|
||||||
AStr := Str;
|
W := S;
|
||||||
ExternalUpdate(Astr,True);
|
ExternalUpdate(W,True);
|
||||||
FTextChanged := False;
|
FTextChanged := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -650,19 +650,23 @@ type
|
|||||||
FList: TStrings;
|
FList: TStrings;
|
||||||
procedure append(AStr: WideString);
|
procedure append(AStr: WideString);
|
||||||
function getAlignment: QtAlignment;
|
function getAlignment: QtAlignment;
|
||||||
|
function getBlockCount: Integer;
|
||||||
function getMaxLength: Integer;
|
function getMaxLength: Integer;
|
||||||
function getText: WideString; override;
|
function getText: WideString; override;
|
||||||
function getTextStatic: Boolean; override;
|
function getTextStatic: Boolean; override;
|
||||||
function getSelectionStart: Integer;
|
function getSelectionStart: Integer;
|
||||||
function getSelectionEnd: Integer;
|
function getSelectionEnd: Integer;
|
||||||
function getSelectionLength: Integer;
|
function getSelectionLength: Integer;
|
||||||
|
procedure insertLine(const AIndex: integer; AText: WideString);
|
||||||
function isUndoAvailable: Boolean;
|
function isUndoAvailable: Boolean;
|
||||||
|
procedure removeLine(const AIndex: integer);
|
||||||
procedure setAlignment(const AAlignment: QtAlignment);
|
procedure setAlignment(const AAlignment: QtAlignment);
|
||||||
procedure setBorder(const ABorder: Boolean);
|
procedure setBorder(const ABorder: Boolean);
|
||||||
procedure setDefaultColorRoles; override;
|
procedure setDefaultColorRoles; override;
|
||||||
procedure setEchoMode(const AMode: QLineEditEchoMode);
|
procedure setEchoMode(const AMode: QLineEditEchoMode);
|
||||||
procedure setLineWrapMode(const AMode: QTextEditLineWrapMode);
|
procedure setLineWrapMode(const AMode: QTextEditLineWrapMode);
|
||||||
procedure setMaxLength(const ALength: Integer);
|
procedure setMaxLength(const ALength: Integer);
|
||||||
|
procedure setLineText(const AIndex: integer; AText: WideString);
|
||||||
procedure setText(const AText: WideString); override;
|
procedure setText(const AText: WideString); override;
|
||||||
procedure setReadOnly(const AReadOnly: Boolean);
|
procedure setReadOnly(const AReadOnly: Boolean);
|
||||||
procedure setSelection(const AStart, ALength: Integer);
|
procedure setSelection(const AStart, ALength: Integer);
|
||||||
@ -5861,6 +5865,11 @@ begin
|
|||||||
Result := QTextEdit_alignment(QTextEditH(Widget));
|
Result := QTextEdit_alignment(QTextEditH(Widget));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TQtTextEdit.getBlockCount: Integer;
|
||||||
|
begin
|
||||||
|
Result := QTextDocument_blockCount(QTextEdit_document(QTextEditH(Widget)));
|
||||||
|
end;
|
||||||
|
|
||||||
function TQtTextEdit.getMaxLength: Integer;
|
function TQtTextEdit.getMaxLength: Integer;
|
||||||
begin
|
begin
|
||||||
{$note implement TQtTextEdit.getMaxLength}
|
{$note implement TQtTextEdit.getMaxLength}
|
||||||
@ -5922,6 +5931,127 @@ begin
|
|||||||
{$note implement TQtTextEdit.setMaxLength}
|
{$note implement TQtTextEdit.setMaxLength}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TQtTextEdit.insertLine(const AIndex: integer; AText: WideString);
|
||||||
|
var
|
||||||
|
QtCursor: QTextCursorH;
|
||||||
|
b: Boolean;
|
||||||
|
WrapMode: QTextEditLineWrapMode;
|
||||||
|
begin
|
||||||
|
WrapMode := QTextEdit_lineWrapMode(QTextEditH(Widget));
|
||||||
|
{we must remove wrapping to get correct line !}
|
||||||
|
setLineWrapMode(QTextEditNoWrap);
|
||||||
|
QtCursor := QTextCursor_create();
|
||||||
|
try
|
||||||
|
QTextEdit_textCursor(QTextEditH(Widget), QtCursor);
|
||||||
|
QTextCursor_beginEditBlock(QtCursor);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStart,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStartOfLine,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorDown,
|
||||||
|
QTextCursorMoveAnchor, AIndex);
|
||||||
|
QTextCursor_insertBlock(QtCursor);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorUp,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_insertText(QtCursor, @AText);
|
||||||
|
QTextCursor_endEditBlock(QtCursor);
|
||||||
|
finally
|
||||||
|
QTextCursor_destroy(QtCursor);
|
||||||
|
setLineWrapMode(WrapMode);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtTextEdit.removeLine(const AIndex: integer);
|
||||||
|
var
|
||||||
|
QtCursor: QTextCursorH;
|
||||||
|
B: Boolean;
|
||||||
|
WrapMode: QTextEditLineWrapMode;
|
||||||
|
Diff: Integer;
|
||||||
|
begin
|
||||||
|
Diff := getBlockCount - AIndex;
|
||||||
|
{we must remove wrapping to get correct line !}
|
||||||
|
WrapMode := QTextEdit_lineWrapMode(QTextEditH(Widget));
|
||||||
|
setLineWrapMode(QTextEditNoWrap);
|
||||||
|
QtCursor := QTextCursor_create();
|
||||||
|
try
|
||||||
|
QTextEdit_textCursor(QTextEditH(Widget), QtCursor);
|
||||||
|
QTextCursor_beginEditBlock(QtCursor);
|
||||||
|
// small optimization if we delete from end of list
|
||||||
|
if Diff <= 2 then
|
||||||
|
begin
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorEnd,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStartOfLine,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorUp,
|
||||||
|
QTextCursorMoveAnchor, Diff - 1);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStart,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStartOfLine,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorDown,
|
||||||
|
QTextCursorMoveAnchor, AIndex);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorEndOfLine,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
QTextCursor_select(QtCursor, QTextCursorLineUnderCursor);
|
||||||
|
B := QTextCursor_hasSelection(QtCursor);
|
||||||
|
if not B then
|
||||||
|
QTextCursor_deleteChar(QtCursor)
|
||||||
|
else
|
||||||
|
QTextCursor_deletePreviousChar(QtCursor);
|
||||||
|
|
||||||
|
if (AIndex = 0) then
|
||||||
|
begin
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStart,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStartOfLine,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorDown,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
end;
|
||||||
|
if B then
|
||||||
|
QTextCursor_deletePreviousChar(QtCursor);
|
||||||
|
QTextCursor_endEditBlock(QtCursor);
|
||||||
|
finally
|
||||||
|
QTextCursor_destroy(QtCursor);
|
||||||
|
setLineWrapMode(WrapMode);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtTextEdit.setLineText(const AIndex: integer; AText: WideString);
|
||||||
|
var
|
||||||
|
QtCursor: QTextCursorH;
|
||||||
|
WrapMode: QTextEditLineWrapMode;
|
||||||
|
begin
|
||||||
|
{we must remove wrapping to get correct line !}
|
||||||
|
WrapMode := QTextEdit_lineWrapMode(QTextEditH(Widget));
|
||||||
|
setLineWrapMode(QTextEditNoWrap);
|
||||||
|
QtCursor := QTextCursor_create();
|
||||||
|
try
|
||||||
|
QTextEdit_textCursor(QTextEditH(Widget), QtCursor);
|
||||||
|
QTextCursor_beginEditBlock(QtCursor);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStart,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorStartOfLine,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorDown,
|
||||||
|
QTextCursorMoveAnchor, AIndex);
|
||||||
|
QTextCursor_select(QtCursor, QTextCursorLineUnderCursor);
|
||||||
|
QTextCursor_removeSelectedText(QtCursor);
|
||||||
|
QTextCursor_insertText(QtCursor, @AText);
|
||||||
|
QTextCursor_movePosition(QtCursor, QTextCursorEndOfLine,
|
||||||
|
QTextCursorMoveAnchor, 1);
|
||||||
|
QTextCursor_endEditBlock(QtCursor);
|
||||||
|
finally
|
||||||
|
QTextCursor_destroy(QtCursor);
|
||||||
|
setLineWrapMode(WrapMode);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TQtTextEdit.setText(const AText: WideString);
|
procedure TQtTextEdit.setText(const AText: WideString);
|
||||||
begin
|
begin
|
||||||
QTextEdit_setPlainText(QTextEditH(Widget), @AText);
|
QTextEdit_setPlainText(QTextEditH(Widget), @AText);
|
||||||
|
Loading…
Reference in New Issue
Block a user