mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-25 18:17:48 +01:00
gtk, gtk2, win32: don't call OnChange twice when we change TEdit text (bug #0013102)
gtk2: don't call OnChange more than one time when we change TMemo text git-svn-id: trunk@19151 -
This commit is contained in:
parent
e383d89e63
commit
ac0184724f
@ -37,6 +37,16 @@ begin
|
|||||||
TWSCustomEditClass(WidgetSetClass).SetAlignment(Self, FAlignment);
|
TWSCustomEditClass(WidgetSetClass).SetAlignment(Self, FAlignment);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomEdit.CMTextChanged(var Message: TLMessage);
|
||||||
|
begin
|
||||||
|
if not (wcfCreatingHandle in FWinControlFlags) then
|
||||||
|
begin
|
||||||
|
Modified := True;
|
||||||
|
if HandleAllocated then
|
||||||
|
Change;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Method: TCustomEdit.Create
|
Method: TCustomEdit.Create
|
||||||
Params: none
|
Params: none
|
||||||
@ -460,11 +470,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
if not (wcfCreatingHandle in FWinControlFlags) then
|
if not (wcfCreatingHandle in FWinControlFlags) then
|
||||||
begin
|
|
||||||
Modified := True;
|
Modified := True;
|
||||||
if HandleAllocated then
|
|
||||||
Change;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomEdit.Change;
|
procedure TCustomEdit.Change;
|
||||||
|
|||||||
@ -155,6 +155,7 @@ type
|
|||||||
class procedure SetReadOnly(const ACustomEdit: TCustomEdit; NewReadOnly: boolean); override;
|
class procedure SetReadOnly(const ACustomEdit: TCustomEdit; NewReadOnly: boolean); override;
|
||||||
class procedure SetSelStart(const ACustomEdit: TCustomEdit; NewStart: integer); override;
|
class procedure SetSelStart(const ACustomEdit: TCustomEdit; NewStart: integer); override;
|
||||||
class procedure SetSelLength(const ACustomEdit: TCustomEdit; NewLength: integer); override;
|
class procedure SetSelLength(const ACustomEdit: TCustomEdit; NewLength: integer); override;
|
||||||
|
class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
|
||||||
|
|
||||||
class procedure GetPreferredSize(const AWinControl: TWinControl;
|
class procedure GetPreferredSize(const AWinControl: TWinControl;
|
||||||
var PreferredWidth, PreferredHeight: integer;
|
var PreferredWidth, PreferredHeight: integer;
|
||||||
@ -1250,6 +1251,14 @@ begin
|
|||||||
NewLength);
|
NewLength);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class procedure TGtkWSCustomEdit.SetText(const AWinControl: TWinControl;
|
||||||
|
const AText: string);
|
||||||
|
begin
|
||||||
|
if not WSCheckHandleAllocated(AWinControl, 'SetText') then
|
||||||
|
Exit;
|
||||||
|
gtk_entry_set_text(PGtkEntry(AWinControl.Handle), PChar(AText));
|
||||||
|
end;
|
||||||
|
|
||||||
class procedure TGtkWSCustomEdit.GetPreferredSize(const AWinControl: TWinControl;
|
class procedure TGtkWSCustomEdit.GetPreferredSize(const AWinControl: TWinControl;
|
||||||
var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean);
|
var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean);
|
||||||
begin
|
begin
|
||||||
|
|||||||
@ -21,10 +21,11 @@ type
|
|||||||
constructor Create(TextView : PGtkTextView; TheOwner: TWinControl);
|
constructor Create(TextView : PGtkTextView; TheOwner: TWinControl);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Assign(Source : TPersistent); override;
|
procedure Assign(Source : TPersistent); override;
|
||||||
|
procedure AddStrings(TheStrings: TStrings); override;
|
||||||
procedure Clear; override;
|
procedure Clear; override;
|
||||||
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 SetTextStr(const Value: string); override;
|
||||||
//procedure Sort; virtual;
|
//procedure Sort; virtual;
|
||||||
procedure QueueCursorMove(APosition: Integer);
|
procedure QueueCursorMove(APosition: Integer);
|
||||||
public
|
public
|
||||||
@ -126,18 +127,30 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TGtk2MemoStrings.Assign(Source: TPersistent);
|
procedure TGtk2MemoStrings.Assign(Source: TPersistent);
|
||||||
|
var
|
||||||
|
S: TStrings absolute Source;
|
||||||
begin
|
begin
|
||||||
if (Source=Self) or (Source=nil) then exit;
|
if Source is TStrings then
|
||||||
if Source is TStrings then begin
|
begin
|
||||||
gtk_text_buffer_set_text(FGtkBuf, PChar(TStrings(Source).Text), -1);
|
// to prevent Clear and then SetText we need to use our own Assign
|
||||||
exit;
|
QuoteChar := S.QuoteChar;
|
||||||
end;
|
Delimiter := S.Delimiter;
|
||||||
Inherited Assign(Source);
|
NameValueSeparator := S.NameValueSeparator;
|
||||||
|
TextLineBreakStyle := S.TextLineBreakStyle;
|
||||||
|
Text := S.Text;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
inherited Assign(Source);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TGtk2MemoStrings.AddStrings(TheStrings: TStrings);
|
||||||
|
begin
|
||||||
|
SetTextStr(GetTextStr + TStrings(TheStrings).Text);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TGtk2MemoStrings.Clear;
|
procedure TGtk2MemoStrings.Clear;
|
||||||
begin
|
begin
|
||||||
gtk_text_buffer_set_text(FGtkBuf, PChar(''), -1);
|
SetText('');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TGtk2MemoStrings.Delete(Index: integer);
|
procedure TGtk2MemoStrings.Delete(Index: integer);
|
||||||
@ -188,9 +201,13 @@ begin
|
|||||||
gtk_text_buffer_insert(FGtkBuf, @StartIter, PChar(NewLine) ,-1);
|
gtk_text_buffer_insert(FGtkBuf, @StartIter, PChar(NewLine) ,-1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TGtk2MemoStrings.SetText(TheText: PChar);
|
procedure TGtk2MemoStrings.SetTextStr(const Value: string);
|
||||||
begin
|
begin
|
||||||
gtk_text_buffer_set_text(FGtkBuf, TheText, -1);
|
if (Value <> Text) then
|
||||||
|
begin
|
||||||
|
LockOnChange(PGtkObject(Owner.Handle), 1);
|
||||||
|
gtk_text_buffer_set_text(FGtkBuf, PChar(Value), -1);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TGtk2MemoStrings.QueueCursorMove(APosition: Integer);
|
procedure TGtk2MemoStrings.QueueCursorMove(APosition: Integer);
|
||||||
|
|||||||
@ -65,7 +65,6 @@ type
|
|||||||
class procedure SetBiDiMode(const AWinControl: TWinControl; UseRightToLeftAlign, UseRightToLeftReading, UseRightToLeftScrollBar : Boolean); override;
|
class procedure SetBiDiMode(const AWinControl: TWinControl; UseRightToLeftAlign, UseRightToLeftReading, UseRightToLeftScrollBar : Boolean); override;
|
||||||
|
|
||||||
class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override;
|
class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override;
|
||||||
class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
|
|
||||||
class procedure SetBorderStyle(const AWinControl: TWinControl; const ABorderStyle: TBorderStyle); override;
|
class procedure SetBorderStyle(const AWinControl: TWinControl; const ABorderStyle: TBorderStyle); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -276,37 +275,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class procedure TGtk2WSWinControl.SetText(const AWinControl: TWinControl;
|
|
||||||
const AText: string);
|
|
||||||
var
|
|
||||||
P : Pointer;
|
|
||||||
TextBuf: PGtkTextBuffer;
|
|
||||||
StartIter: TGtkTextIter;
|
|
||||||
pLabel: pchar;
|
|
||||||
begin
|
|
||||||
P := Pointer(AWinControl.Handle);
|
|
||||||
|
|
||||||
pLabel := pchar(AText);
|
|
||||||
|
|
||||||
case AWinControl.fCompStyle of
|
|
||||||
csMemo : begin
|
|
||||||
TextBuf := gtk_text_view_get_buffer(PGtkTextView(GetWidgetInfo(P, True)^.CoreWidget));
|
|
||||||
gtk_text_buffer_set_text(TextBuf, plabel, -1);
|
|
||||||
gtk_text_buffer_get_start_iter(TextBuf, @StartIter);
|
|
||||||
gtk_text_buffer_place_cursor(TextBuf, @StartIter);
|
|
||||||
//debugln('TGtkWSWinControl.SetText A ',dbgs(gtk_text_get_length(PGtkText(P))),' AText="',AText,'"');
|
|
||||||
//gtk_text_freeze(PGtkText(P));
|
|
||||||
//gtk_text_set_point(PGtkText(P), 0);
|
|
||||||
//gtk_text_forward_delete(PGtkText(P), gtk_text_get_length(PGtkText(P)));
|
|
||||||
//gtk_text_insert(PGtkText(P), nil, nil, nil, pLabel, -1);
|
|
||||||
//gtk_text_thaw(PGtkText(P));
|
|
||||||
//debugln('TGtkWSWinControl.SetText B ',dbgs(gtk_text_get_length(PGtkText(P))));
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
TGtkWSWinControl{(ClassParent)}.SetText(AWinControl, AText);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
class procedure TGtk2WSWinControl.SetBorderStyle(
|
class procedure TGtk2WSWinControl.SetBorderStyle(
|
||||||
const AWinControl: TWinControl; const ABorderStyle: TBorderStyle);
|
const AWinControl: TWinControl; const ABorderStyle: TBorderStyle);
|
||||||
var
|
var
|
||||||
|
|||||||
@ -2,18 +2,23 @@
|
|||||||
|
|
||||||
{ Callbacks }
|
{ Callbacks }
|
||||||
|
|
||||||
procedure Gtk2WS_MemoChanged( AGtkTextBuffer: PGtkTextBuffer; WidgetInfo: PWidgetInfo); cdecl;
|
procedure Gtk2WS_MemoChanged(AGtkTextBuffer: PGtkTextBuffer; WidgetInfo: PWidgetInfo); cdecl;
|
||||||
var
|
var
|
||||||
Mess : TLMessage;
|
Mess: TLMessage;
|
||||||
begin
|
begin
|
||||||
EventTrace('Gtk2WS_MemoChanged', WidgetInfo^.LCLObject);
|
EventTrace('Gtk2WS_MemoChanged', WidgetInfo^.LCLObject);
|
||||||
|
if WidgetInfo^.ChangeLock > 0 then
|
||||||
|
begin
|
||||||
|
Dec(WidgetInfo^.ChangeLock);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
Mess.Msg := CM_TEXTCHANGED;
|
Mess.Msg := CM_TEXTCHANGED;
|
||||||
DeliverMessage(WidgetInfo^.LCLObject, Mess);
|
DeliverMessage(WidgetInfo^.LCLObject, Mess);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure Gtk2WS_MemoCutToClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
|
procedure Gtk2WS_MemoCutToClip(widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
|
||||||
var
|
var
|
||||||
Mess : TLMessage;
|
Mess: TLMessage;
|
||||||
begin
|
begin
|
||||||
EventTrace('Gtk2WS_MemoCutToClip', WidgetInfo^.LCLObject);
|
EventTrace('Gtk2WS_MemoCutToClip', WidgetInfo^.LCLObject);
|
||||||
if (Widget=nil) then ;
|
if (Widget=nil) then ;
|
||||||
@ -21,9 +26,9 @@ begin
|
|||||||
DeliverMessage(WidgetInfo^.LCLObject, Mess);
|
DeliverMessage(WidgetInfo^.LCLObject, Mess);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure Gtk2WS_MemoCopyToClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
|
procedure Gtk2WS_MemoCopyToClip(widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
|
||||||
var
|
var
|
||||||
Mess : TLMessage;
|
Mess: TLMessage;
|
||||||
begin
|
begin
|
||||||
EventTrace('Gtk2WS_MemoCopyToClip', WidgetInfo^.LCLObject);
|
EventTrace('Gtk2WS_MemoCopyToClip', WidgetInfo^.LCLObject);
|
||||||
if (Widget=nil) then ;
|
if (Widget=nil) then ;
|
||||||
@ -31,9 +36,9 @@ begin
|
|||||||
DeliverMessage(WidgetInfo^.LCLObject, Mess);
|
DeliverMessage(WidgetInfo^.LCLObject, Mess);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure Gtk2WS_MemoPasteFromClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
|
procedure Gtk2WS_MemoPasteFromClip(widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
|
||||||
var
|
var
|
||||||
Mess : TLMessage;
|
Mess: TLMessage;
|
||||||
begin
|
begin
|
||||||
EventTrace('Gtk2WS_MemoPasteFromClip', WidgetInfo^.LCLObject);
|
EventTrace('Gtk2WS_MemoPasteFromClip', WidgetInfo^.LCLObject);
|
||||||
if (Widget=nil) then ;
|
if (Widget=nil) then ;
|
||||||
@ -124,7 +129,8 @@ begin
|
|||||||
SetMainWidget(Widget, TempWidget);
|
SetMainWidget(Widget, TempWidget);
|
||||||
GetWidgetInfo(Widget, True)^.CoreWidget := TempWidget;
|
GetWidgetInfo(Widget, True)^.CoreWidget := TempWidget;
|
||||||
|
|
||||||
gtk_text_view_set_editable (PGtkTextView(TempWidget), not TCustomMemo(AWinControl).ReadOnly);
|
gtk_text_buffer_set_text(gtk_text_view_get_buffer(PGtkTextView(TempWidget)), PChar(TCustomMemo(AWinControl).Text), -1);
|
||||||
|
gtk_text_view_set_editable(PGtkTextView(TempWidget), not TCustomMemo(AWinControl).ReadOnly);
|
||||||
gtk_text_view_set_justification(PGtkTextView(TempWidget), aGtkJustification[TCustomMemo(AWinControl).Alignment]);
|
gtk_text_view_set_justification(PGtkTextView(TempWidget), aGtkJustification[TCustomMemo(AWinControl).Alignment]);
|
||||||
if TCustomMemo(AWinControl).WordWrap then
|
if TCustomMemo(AWinControl).WordWrap then
|
||||||
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_WORD)
|
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_WORD)
|
||||||
@ -274,6 +280,20 @@ begin
|
|||||||
gtk_entry_set_editable(GTK_ENTRY(Widget), not ACustomEdit.ReadOnly);
|
gtk_entry_set_editable(GTK_ENTRY(Widget), not ACustomEdit.ReadOnly);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class procedure TGtk2WSCustomMemo.SetText(const AWinControl: TWinControl;
|
||||||
|
const AText: string);
|
||||||
|
var
|
||||||
|
TextBuf: PGtkTextBuffer;
|
||||||
|
StartIter: TGtkTextIter;
|
||||||
|
begin
|
||||||
|
if not WSCheckHandleAllocated(AWinControl, 'SetText') then
|
||||||
|
Exit;
|
||||||
|
TextBuf := gtk_text_view_get_buffer(PGtkTextView(GetWidgetInfo(Pointer(AWinControl.Handle), True)^.CoreWidget));
|
||||||
|
gtk_text_buffer_set_text(TextBuf, PChar(AText), -1);
|
||||||
|
gtk_text_buffer_get_start_iter(TextBuf, @StartIter);
|
||||||
|
gtk_text_buffer_place_cursor(TextBuf, @StartIter);
|
||||||
|
end;
|
||||||
|
|
||||||
class procedure TGtk2WSCustomMemo.GetPreferredSize(
|
class procedure TGtk2WSCustomMemo.GetPreferredSize(
|
||||||
const AWinControl: TWinControl; var PreferredWidth, PreferredHeight: integer;
|
const AWinControl: TWinControl; var PreferredWidth, PreferredHeight: integer;
|
||||||
WithThemeSpace: Boolean);
|
WithThemeSpace: Boolean);
|
||||||
|
|||||||
@ -206,6 +206,7 @@ type
|
|||||||
class procedure SetCharCase(const ACustomEdit: TCustomEdit; NewCase: TEditCharCase); override;
|
class procedure SetCharCase(const ACustomEdit: TCustomEdit; NewCase: TEditCharCase); override;
|
||||||
class procedure SetMaxLength(const ACustomEdit: TCustomEdit; NewLength: integer); override;
|
class procedure SetMaxLength(const ACustomEdit: TCustomEdit; NewLength: integer); override;
|
||||||
class procedure SetReadOnly(const ACustomEdit: TCustomEdit; NewReadOnly: boolean); override;
|
class procedure SetReadOnly(const ACustomEdit: TCustomEdit; NewReadOnly: boolean); override;
|
||||||
|
class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
|
||||||
|
|
||||||
class procedure GetPreferredSize(const AWinControl: TWinControl;
|
class procedure GetPreferredSize(const AWinControl: TWinControl;
|
||||||
var PreferredWidth, PreferredHeight: integer;
|
var PreferredWidth, PreferredHeight: integer;
|
||||||
|
|||||||
@ -688,6 +688,7 @@ type
|
|||||||
procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
|
procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
|
||||||
WithThemeSpace: Boolean); override;
|
WithThemeSpace: Boolean); override;
|
||||||
procedure CreateWnd; override;
|
procedure CreateWnd; override;
|
||||||
|
procedure CMTextChanged(var Message: TLMessage); message CM_TEXTCHANGED;
|
||||||
procedure TextChanged; override;
|
procedure TextChanged; override;
|
||||||
procedure Change; dynamic;
|
procedure Change; dynamic;
|
||||||
procedure DoEnter; override;
|
procedure DoEnter; override;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user