mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-06 01:26:24 +02:00
OnSelChange for tComboBox fired only one per click from Darek
git-svn-id: trunk@8957 -
This commit is contained in:
parent
bddde6ee5e
commit
252c0feff3
@ -19,7 +19,13 @@
|
|||||||
// {$DEFINE ASSERT_IS_ON}
|
// {$DEFINE ASSERT_IS_ON}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF RELEASE}
|
||||||
|
|
||||||
{$DEFINE ASSERT_IS_ON}
|
{$DEFINE ASSERT_IS_ON}
|
||||||
|
{$ELSE}
|
||||||
|
{.$DEFINE EventTrace}
|
||||||
|
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
function DeliverPaintMessage(const Target: Pointer; var TheMessage): GBoolean;
|
function DeliverPaintMessage(const Target: Pointer; var TheMessage): GBoolean;
|
||||||
var
|
var
|
||||||
@ -133,7 +139,9 @@ var
|
|||||||
begin
|
begin
|
||||||
Result := CallBackDefaultReturn;
|
Result := CallBackDefaultReturn;
|
||||||
|
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('realize', nil);
|
EventTrace('realize', nil);
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
if (Data<>nil) then begin
|
if (Data<>nil) then begin
|
||||||
if TObject(Data) is TCustomForm then begin
|
if TObject(Data) is TCustomForm then begin
|
||||||
@ -182,7 +190,9 @@ begin
|
|||||||
Result := CallBackDefaultReturn;
|
Result := CallBackDefaultReturn;
|
||||||
|
|
||||||
if Data=nil then ;
|
if Data=nil then ;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('realizeafter', nil);
|
EventTrace('realizeafter', nil);
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
HiddenLCLObject:=GetHiddenLCLObject(Widget);
|
HiddenLCLObject:=GetHiddenLCLObject(Widget);
|
||||||
if HiddenLCLObject=nil then begin
|
if HiddenLCLObject=nil then begin
|
||||||
@ -255,7 +265,9 @@ var
|
|||||||
begin
|
begin
|
||||||
Result := True;
|
Result := True;
|
||||||
|
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('show', data);
|
EventTrace('show', data);
|
||||||
|
{$ENDIF}
|
||||||
if Widget=nil then ;
|
if Widget=nil then ;
|
||||||
FillChar(Mess,SizeOf(Mess),0);
|
FillChar(Mess,SizeOf(Mess),0);
|
||||||
Mess.Msg := LM_SHOWWINDOW;
|
Mess.Msg := LM_SHOWWINDOW;
|
||||||
@ -270,7 +282,9 @@ var
|
|||||||
begin
|
begin
|
||||||
Result := True;
|
Result := True;
|
||||||
|
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('hide', data);
|
EventTrace('hide', data);
|
||||||
|
{$ENDIF}
|
||||||
if Widget=nil then ;
|
if Widget=nil then ;
|
||||||
FillChar(Mess,SizeOf(Mess),0);
|
FillChar(Mess,SizeOf(Mess),0);
|
||||||
Mess.Msg := LM_SHOWWINDOW;
|
Mess.Msg := LM_SHOWWINDOW;
|
||||||
@ -283,7 +297,9 @@ var
|
|||||||
Mess: TLMActivate;
|
Mess: TLMActivate;
|
||||||
begin
|
begin
|
||||||
Result:= True;
|
Result:= True;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('activate', data);
|
EventTrace('activate', data);
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
|
if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
|
||||||
|
|
||||||
@ -307,8 +323,9 @@ var
|
|||||||
LCLMenuItem: TMenuItem;
|
LCLMenuItem: TMenuItem;
|
||||||
begin
|
begin
|
||||||
Result := CallBackDefaultReturn;
|
Result := CallBackDefaultReturn;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('toggled', AData);
|
EventTrace('toggled', AData);
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
LCLMenuItem := TMenuItem(AData);
|
LCLMenuItem := TMenuItem(AData);
|
||||||
// some sanity checks
|
// some sanity checks
|
||||||
@ -332,8 +349,9 @@ var
|
|||||||
begin
|
begin
|
||||||
if ComponentIsDestroyingHandle(TWinControl(Data))
|
if ComponentIsDestroyingHandle(TWinControl(Data))
|
||||||
or (LockOnChange(PgtkObject(Widget),0)>0) then exit;
|
or (LockOnChange(PgtkObject(Widget),0)>0) then exit;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('changed', data);
|
EventTrace('changed', data);
|
||||||
|
{$ENDIF}
|
||||||
Mess.Msg := LM_CHANGED;
|
Mess.Msg := LM_CHANGED;
|
||||||
DeliverMessage(Data, Mess);
|
DeliverMessage(Data, Mess);
|
||||||
|
|
||||||
@ -347,7 +365,9 @@ begin
|
|||||||
Result := CallBackDefaultReturn;
|
Result := CallBackDefaultReturn;
|
||||||
|
|
||||||
if LockOnChange(PgtkObject(Widget),0)>0 then exit;
|
if LockOnChange(PgtkObject(Widget),0)>0 then exit;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('changed_editbox', data);
|
EventTrace('changed_editbox', data);
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
Mess.Msg := CM_TEXTCHANGED;
|
Mess.Msg := CM_TEXTCHANGED;
|
||||||
DeliverMessage(Data, Mess);
|
DeliverMessage(Data, Mess);
|
||||||
@ -3049,7 +3069,9 @@ Procedure GTKStyleChanged(Widget: PGtkWidget; previous_style : PGTKStyle;
|
|||||||
Data: Pointer); cdecl;
|
Data: Pointer); cdecl;
|
||||||
begin
|
begin
|
||||||
if (Widget=nil) or (Data=nil) or (previous_style=nil) then ;
|
if (Widget=nil) or (Data=nil) or (previous_style=nil) then ;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('style-set', nil);
|
EventTrace('style-set', nil);
|
||||||
|
{$ENDIF}
|
||||||
//ReleaseAllStyles;
|
//ReleaseAllStyles;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3058,15 +3080,28 @@ function gtkListBoxSelectionChangedAfter(widget: PGtkWidget; data: gPointer
|
|||||||
var
|
var
|
||||||
Mess: TLMessage;
|
Mess: TLMessage;
|
||||||
begin
|
begin
|
||||||
//debugln('gtkListBoxSelectionChangedAfter ',GetWidgetDebugReport(Widget));
|
|
||||||
Result := CallBackDefaultReturn;
|
Result := CallBackDefaultReturn;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
EventTrace('gtkListBoxSelectionChangedAfter', data);
|
EventTrace('gtkListBoxSelectionChangedAfter', data);
|
||||||
|
{$ENDIF}
|
||||||
FillChar(Mess,SizeOf(Mess),0);
|
FillChar(Mess,SizeOf(Mess),0);
|
||||||
Mess.msg := LM_SelChange;
|
Mess.msg := LM_SelChange;
|
||||||
DeliverMessage(Data, Mess);
|
DeliverMessage(Data, Mess);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function gtkListSelectChild(widget: PGtkWidget;child : PGtkWidget; data: gPointer
|
||||||
|
): GBoolean; cdecl;
|
||||||
|
var
|
||||||
|
Mess: TLMessage;
|
||||||
|
begin
|
||||||
|
Result := CallBackDefaultReturn;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
|
EventTrace('gtkListBoxSelectionChangedAfter', data);
|
||||||
|
{$ENDIF}
|
||||||
|
FillChar(Mess,SizeOf(Mess),0);
|
||||||
|
Mess.msg := LM_SelChange;
|
||||||
|
DeliverMessage(Data, Mess);
|
||||||
|
end;
|
||||||
|
|
||||||
{$I gtkDragCallback.inc}
|
{$I gtkDragCallback.inc}
|
||||||
{$I gtkListViewCallback.inc}
|
{$I gtkListViewCallback.inc}
|
||||||
|
@ -209,6 +209,9 @@ var
|
|||||||
//ItemIndex: LongInt;
|
//ItemIndex: LongInt;
|
||||||
Mess: TLMessage;
|
Mess: TLMessage;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF EventTrace}
|
||||||
|
Debugln('gtkListItemSelectAfterCB');
|
||||||
|
{$ENDIF}
|
||||||
// get context
|
// get context
|
||||||
GtkList:=PGtkList(gtk_object_get_data(PGtkObject(Data),GtkListItemGtkListTag));
|
GtkList:=PGtkList(gtk_object_get_data(PGtkObject(Data),GtkListItemGtkListTag));
|
||||||
if GtkList=nil then
|
if GtkList=nil then
|
||||||
@ -317,6 +320,9 @@ var
|
|||||||
ListItem: PGtkListItem;
|
ListItem: PGtkListItem;
|
||||||
begin
|
begin
|
||||||
UpdateItemCache;
|
UpdateItemCache;
|
||||||
|
{$IFDEF EventTrace}
|
||||||
|
Debugln( 'connect ',strings[index]);
|
||||||
|
{$ENDIF}
|
||||||
ListItem:=FCachedItems[Index];
|
ListItem:=FCachedItems[Index];
|
||||||
ConnectItemCallbacks(ListItem);
|
ConnectItemCallbacks(ListItem);
|
||||||
end;
|
end;
|
||||||
@ -329,6 +335,9 @@ procedure TGtkListStringList.ConnectItemCallbacks(Li: PGtkListItem);
|
|||||||
var
|
var
|
||||||
ChildWidget: Pointer;
|
ChildWidget: Pointer;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF EventTrace}
|
||||||
|
Debugln('connect itemCallback');
|
||||||
|
{$ENDIF}
|
||||||
gtk_object_set_data(PGtkObject(li),GtkListItemLCLListTag,Self);
|
gtk_object_set_data(PGtkObject(li),GtkListItemLCLListTag,Self);
|
||||||
gtk_object_set_data(PGtkObject(li),GtkListItemGtkListTag,FGtkList);
|
gtk_object_set_data(PGtkObject(li),GtkListItemGtkListTag,FGtkList);
|
||||||
//DebugLn('TGtkListStringList.ConnectItemCallbacks Self=',DbgS(Self),
|
//DebugLn('TGtkListStringList.ConnectItemCallbacks Self=',DbgS(Self),
|
||||||
@ -348,10 +357,6 @@ begin
|
|||||||
g_signal_connect_after(G_OBJECT(ChildWidget), 'toggled',
|
g_signal_connect_after(G_OBJECT(ChildWidget), 'toggled',
|
||||||
G_CALLBACK(@gtkListItemToggledCB), li);
|
G_CALLBACK(@gtkListItemToggledCB), li);
|
||||||
end;
|
end;
|
||||||
if FOwner is TCustomComboBox then begin
|
|
||||||
gtk_signal_connect_after(PGtkObject(li), 'select',
|
|
||||||
TGTKSignalFunc(@gtkListItemSelectAfterCB),li);
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
@ -366,6 +371,9 @@ begin
|
|||||||
i := FCachedCount - 1;
|
i := FCachedCount - 1;
|
||||||
while i >= 0 do
|
while i >= 0 do
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF EventTrace}
|
||||||
|
DebugLn('connect ',strings[i]);
|
||||||
|
{$ENDIF}
|
||||||
ConnectItemCallbacks(FCachedItems[i]);
|
ConnectItemCallbacks(FCachedItems[i]);
|
||||||
Dec(i);
|
Dec(i);
|
||||||
end;
|
end;
|
||||||
@ -401,11 +409,6 @@ begin
|
|||||||
gtk_signal_disconnect_by_func(
|
gtk_signal_disconnect_by_func(
|
||||||
PGtkObject(ChildWidget), TGTKSignalFunc(@gtkListItemToggledCB), AItem);
|
PGtkObject(ChildWidget), TGTKSignalFunc(@gtkListItemToggledCB), AItem);
|
||||||
end;
|
end;
|
||||||
if FOwner is TCustomComboBox
|
|
||||||
then begin
|
|
||||||
gtk_signal_disconnect_by_func(
|
|
||||||
PGtkObject(AItem), TGTKSignalFunc(@gtkListItemSelectAfterCB), AItem);
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
@ -887,6 +890,9 @@ begin
|
|||||||
{$IFDEF DebugLCLComponents}
|
{$IFDEF DebugLCLComponents}
|
||||||
DebugGtkWidgets.MarkCreated(li,dbgsName(Owner)+' Index='+dbgs(Index)+' Count='+dbgs(Count));
|
DebugGtkWidgets.MarkCreated(li,dbgsName(Owner)+' Index='+dbgs(Index)+' Count='+dbgs(Count));
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
{$IFDEF EventTrace}
|
||||||
|
Debugln('insertListItem',s);
|
||||||
|
{$ENDIF}
|
||||||
ConnectItemCallbacks(PGtkListItem(li));
|
ConnectItemCallbacks(PGtkListItem(li));
|
||||||
// grow capacity
|
// grow capacity
|
||||||
UpdateItemCache;
|
UpdateItemCache;
|
||||||
|
@ -1298,7 +1298,6 @@ var
|
|||||||
begin
|
begin
|
||||||
Caption := ACaption;
|
Caption := ACaption;
|
||||||
LabelFromAmpersands(Caption, Pattern, AccelKey);
|
LabelFromAmpersands(Caption, Pattern, AccelKey);
|
||||||
|
|
||||||
gtk_label_set_text(ALabel, PChar(Caption));
|
gtk_label_set_text(ALabel, PChar(Caption));
|
||||||
|
|
||||||
{$ifdef gtk1}
|
{$ifdef gtk1}
|
||||||
@ -3985,7 +3984,10 @@ begin
|
|||||||
if ALCLObject is TCustomListBox then begin
|
if ALCLObject is TCustomListBox then begin
|
||||||
ConnectSenderSignalAfter(PgtkObject(gCore),
|
ConnectSenderSignalAfter(PgtkObject(gCore),
|
||||||
'selection_changed', @gtkListBoxSelectionChangedAfter);
|
'selection_changed', @gtkListBoxSelectionChangedAfter);
|
||||||
end;
|
end else if ALCLObject is TCustomCombobox then
|
||||||
|
ConnectSenderSignal (PGtkObject(
|
||||||
|
PGtkCombo(gObject)^.list), 'unselect_child', @gtkListSelectChild)
|
||||||
|
else
|
||||||
end;
|
end;
|
||||||
|
|
||||||
(*
|
(*
|
||||||
@ -4228,6 +4230,7 @@ begin
|
|||||||
Begin
|
Begin
|
||||||
SetCallback(LM_CHANGED, AGTKObject, ALCLObject);
|
SetCallback(LM_CHANGED, AGTKObject, ALCLObject);
|
||||||
SetCallback(LM_COMMAND, AGTKObject, ALCLObject);
|
SetCallback(LM_COMMAND, AGTKObject, ALCLObject);
|
||||||
|
SetCallback(LM_SELCHANGE, AGTKObject, ALCLObject);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
csListBox:
|
csListBox:
|
||||||
@ -6962,12 +6965,14 @@ var
|
|||||||
|
|
||||||
function FindLineEnd(LineStart: integer): integer;
|
function FindLineEnd(LineStart: integer): integer;
|
||||||
var
|
var
|
||||||
|
LineStop,
|
||||||
LineWidth, WordWidth, WordEnd, CharWidth: integer;
|
LineWidth, WordWidth, WordEnd, CharWidth: integer;
|
||||||
begin
|
begin
|
||||||
// first search line break or text break
|
// first search line break or text break
|
||||||
Result:=LineStart;
|
Result:=LineStart;
|
||||||
while not (AText[Result] in [#0,#10,#13]) do inc(Result);
|
while not (AText[Result] in [#0,#10,#13]) do inc(Result);
|
||||||
if Result<=LineStart+1 then exit;
|
if Result<=LineStart+1 then exit;
|
||||||
|
lineStop:=Result;
|
||||||
|
|
||||||
// get current line width in pixel
|
// get current line width in pixel
|
||||||
LineWidth:=GetLineWidthInPixel(LineStart,Result-LineStart);
|
LineWidth:=GetLineWidthInPixel(LineStart,Result-LineStart);
|
||||||
@ -6996,6 +7001,7 @@ var
|
|||||||
CharWidth:=GetLineWidthInPixel(Result,1);
|
CharWidth:=GetLineWidthInPixel(Result,1);
|
||||||
inc(LineWidth,CharWidth);
|
inc(LineWidth,CharWidth);
|
||||||
if LineWidth>MaxWidthInPixel then break;
|
if LineWidth>MaxWidthInPixel then break;
|
||||||
|
if result=lineStop then break;
|
||||||
inc(Result);
|
inc(Result);
|
||||||
until false;
|
until false;
|
||||||
// at least one char
|
// at least one char
|
||||||
|
@ -280,6 +280,8 @@ procedure GTKStyleChanged(Widget: PGtkWidget; previous_style :
|
|||||||
function gtkListBoxSelectionChangedAfter(widget: PGtkWidget;
|
function gtkListBoxSelectionChangedAfter(widget: PGtkWidget;
|
||||||
data: gPointer): GBoolean; cdecl;
|
data: gPointer): GBoolean; cdecl;
|
||||||
|
|
||||||
|
function gtkListSelectChild(widget: PGtkWidget;child : PGtkWidget;
|
||||||
|
data: gPointer): GBoolean; cdecl;
|
||||||
|
|
||||||
// gtkDragCallback.inc headers
|
// gtkDragCallback.inc headers
|
||||||
Function edit_drag_data_received(widget: pgtkWidget;
|
Function edit_drag_data_received(widget: pgtkWidget;
|
||||||
|
@ -2779,30 +2779,34 @@ var
|
|||||||
|
|
||||||
MaxLength := theRect.Right - theRect.Left;
|
MaxLength := theRect.Right - theRect.Left;
|
||||||
|
|
||||||
If (Flags and DT_SingleLine) = DT_SingleLine then begin
|
If (Flags and DT_SingleLine) > 0 then begin
|
||||||
// ignore word and line breaks
|
// ignore word and line breaks
|
||||||
GetTextExtentPoint(DC, Str, Count, AP);
|
GetTextExtentPoint(DC, Str, Count, AP);
|
||||||
theRect.Right := theRect.Left + Min(MaxLength, AP.cX);
|
theRect.Right := theRect.Left + Min(MaxLength, AP.cX);
|
||||||
theRect.Bottom := theRect.Top + TM.tmHeight;
|
theRect.Bottom := theRect.Top + TM.tmHeight;
|
||||||
|
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
// consider line breaks
|
// consider line breaks
|
||||||
If (Flags and DT_WordBreak) <> DT_WordBreak then begin
|
If (Flags and DT_WordBreak) = 0 then begin
|
||||||
// do not break at word boundaries
|
// do not break at word boundaries
|
||||||
GetTextExtentPoint(DC, Str, Count, AP);
|
GetTextExtentPoint(DC, Str, Count, AP);
|
||||||
MaxLength := AP.cX;
|
MaxLength := AP.cX;
|
||||||
end;
|
end;
|
||||||
Self.WordWrap(DC, Str, MaxLength, Lines, NumLines);
|
Self.WordWrap(DC, Str, MaxLength, Lines, NumLines);
|
||||||
|
|
||||||
|
if (Flags and DT_CalcRect)<>0 then begin
|
||||||
|
LineWidth := 0;
|
||||||
|
if (Lines <> nil) then begin
|
||||||
LineWidth := 0;
|
LineWidth := 0;
|
||||||
If (Lines <> nil) then begin
|
|
||||||
For J := 0 to NumLines - 1 do begin
|
For J := 0 to NumLines - 1 do begin
|
||||||
GetTextExtentPoint(DC, Lines[J], StrLen(Lines[J]), AP);
|
GetTextExtentPoint(DC, Lines[J], StrLen(Lines[J]), AP);
|
||||||
LineWidth := Max(LineWidth, AP.cX);
|
LineWidth := Max(LineWidth, AP.cX);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
LineWidth := Min(MaxLength, LineWidth);
|
LineWidth := Min(MaxLength, LineWidth);
|
||||||
|
end else begin
|
||||||
|
LineWidth:=MaxLength;
|
||||||
|
end;
|
||||||
|
|
||||||
theRect.Right := theRect.Left + LineWidth;
|
theRect.Right := theRect.Left + LineWidth;
|
||||||
theRect.Bottom := theRect.Top + NumLines*TM.tmHeight;
|
theRect.Bottom := theRect.Top + NumLines*TM.tmHeight;
|
||||||
|
Loading…
Reference in New Issue
Block a user