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:
paul 2009-03-29 09:06:48 +00:00
parent e383d89e63
commit ac0184724f
7 changed files with 77 additions and 55 deletions

View File

@ -37,6 +37,16 @@ begin
TWSCustomEditClass(WidgetSetClass).SetAlignment(Self, FAlignment);
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
Params: none
@ -460,11 +470,7 @@ begin
end;
if not (wcfCreatingHandle in FWinControlFlags) then
begin
Modified := True;
if HandleAllocated then
Change;
end;
end;
procedure TCustomEdit.Change;

View File

@ -155,6 +155,7 @@ type
class procedure SetReadOnly(const ACustomEdit: TCustomEdit; NewReadOnly: boolean); override;
class procedure SetSelStart(const ACustomEdit: TCustomEdit; NewStart: 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;
var PreferredWidth, PreferredHeight: integer;
@ -1250,6 +1251,14 @@ begin
NewLength);
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;
var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean);
begin

View File

@ -21,10 +21,11 @@ type
constructor Create(TextView : PGtkTextView; TheOwner: TWinControl);
destructor Destroy; override;
procedure Assign(Source : TPersistent); override;
procedure AddStrings(TheStrings: TStrings); override;
procedure Clear; override;
procedure Delete(Index : integer); override;
procedure Insert(Index : integer; const S: string); override;
procedure SetText(TheText: PChar); override;
procedure SetTextStr(const Value: string); override;
//procedure Sort; virtual;
procedure QueueCursorMove(APosition: Integer);
public
@ -126,18 +127,30 @@ begin
end;
procedure TGtk2MemoStrings.Assign(Source: TPersistent);
var
S: TStrings absolute Source;
begin
if (Source=Self) or (Source=nil) then exit;
if Source is TStrings then begin
gtk_text_buffer_set_text(FGtkBuf, PChar(TStrings(Source).Text), -1);
exit;
end;
Inherited Assign(Source);
if Source is TStrings then
begin
// to prevent Clear and then SetText we need to use our own Assign
QuoteChar := S.QuoteChar;
Delimiter := S.Delimiter;
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;
procedure TGtk2MemoStrings.Clear;
begin
gtk_text_buffer_set_text(FGtkBuf, PChar(''), -1);
SetText('');
end;
procedure TGtk2MemoStrings.Delete(Index: integer);
@ -188,9 +201,13 @@ begin
gtk_text_buffer_insert(FGtkBuf, @StartIter, PChar(NewLine) ,-1);
end;
procedure TGtk2MemoStrings.SetText(TheText: PChar);
procedure TGtk2MemoStrings.SetTextStr(const Value: string);
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;
procedure TGtk2MemoStrings.QueueCursorMove(APosition: Integer);

View File

@ -65,7 +65,6 @@ type
class procedure SetBiDiMode(const AWinControl: TWinControl; UseRightToLeftAlign, UseRightToLeftReading, UseRightToLeftScrollBar : 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;
end;
@ -276,37 +275,6 @@ begin
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(
const AWinControl: TWinControl; const ABorderStyle: TBorderStyle);
var

View File

@ -2,18 +2,23 @@
{ Callbacks }
procedure Gtk2WS_MemoChanged( AGtkTextBuffer: PGtkTextBuffer; WidgetInfo: PWidgetInfo); cdecl;
procedure Gtk2WS_MemoChanged(AGtkTextBuffer: PGtkTextBuffer; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
Mess: TLMessage;
begin
EventTrace('Gtk2WS_MemoChanged', WidgetInfo^.LCLObject);
if WidgetInfo^.ChangeLock > 0 then
begin
Dec(WidgetInfo^.ChangeLock);
Exit;
end;
Mess.Msg := CM_TEXTCHANGED;
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
procedure Gtk2WS_MemoCutToClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
procedure Gtk2WS_MemoCutToClip(widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
Mess: TLMessage;
begin
EventTrace('Gtk2WS_MemoCutToClip', WidgetInfo^.LCLObject);
if (Widget=nil) then ;
@ -21,9 +26,9 @@ begin
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
procedure Gtk2WS_MemoCopyToClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
procedure Gtk2WS_MemoCopyToClip(widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
Mess: TLMessage;
begin
EventTrace('Gtk2WS_MemoCopyToClip', WidgetInfo^.LCLObject);
if (Widget=nil) then ;
@ -31,9 +36,9 @@ begin
DeliverMessage(WidgetInfo^.LCLObject, Mess);
end;
procedure Gtk2WS_MemoPasteFromClip( widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
procedure Gtk2WS_MemoPasteFromClip(widget: PGtkWidget; WidgetInfo: PWidgetInfo); cdecl;
var
Mess : TLMessage;
Mess: TLMessage;
begin
EventTrace('Gtk2WS_MemoPasteFromClip', WidgetInfo^.LCLObject);
if (Widget=nil) then ;
@ -124,7 +129,8 @@ begin
SetMainWidget(Widget, 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]);
if TCustomMemo(AWinControl).WordWrap then
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);
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(
const AWinControl: TWinControl; var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean);

View File

@ -206,6 +206,7 @@ type
class procedure SetCharCase(const ACustomEdit: TCustomEdit; NewCase: TEditCharCase); override;
class procedure SetMaxLength(const ACustomEdit: TCustomEdit; NewLength: integer); 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;
var PreferredWidth, PreferredHeight: integer;

View File

@ -688,6 +688,7 @@ type
procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean); override;
procedure CreateWnd; override;
procedure CMTextChanged(var Message: TLMessage); message CM_TEXTCHANGED;
procedure TextChanged; override;
procedure Change; dynamic;
procedure DoEnter; override;