OnSelChange for tComboBox fired only one per click from Darek

git-svn-id: trunk@8957 -
This commit is contained in:
mattias 2006-03-18 14:39:13 +00:00
parent bddde6ee5e
commit 252c0feff3
5 changed files with 77 additions and 24 deletions

View File

@ -19,7 +19,13 @@
// {$DEFINE ASSERT_IS_ON}
{$ENDIF}
{$IFDEF RELEASE}
{$DEFINE ASSERT_IS_ON}
{$ELSE}
{.$DEFINE EventTrace}
{$ENDIF}
function DeliverPaintMessage(const Target: Pointer; var TheMessage): GBoolean;
var
@ -133,7 +139,9 @@ var
begin
Result := CallBackDefaultReturn;
{$IFDEF EventTrace}
EventTrace('realize', nil);
{$ENDIF}
if (Data<>nil) then begin
if TObject(Data) is TCustomForm then begin
@ -182,7 +190,9 @@ begin
Result := CallBackDefaultReturn;
if Data=nil then ;
{$IFDEF EventTrace}
EventTrace('realizeafter', nil);
{$ENDIF}
HiddenLCLObject:=GetHiddenLCLObject(Widget);
if HiddenLCLObject=nil then begin
@ -255,7 +265,9 @@ var
begin
Result := True;
{$IFDEF EventTrace}
EventTrace('show', data);
{$ENDIF}
if Widget=nil then ;
FillChar(Mess,SizeOf(Mess),0);
Mess.Msg := LM_SHOWWINDOW;
@ -270,7 +282,9 @@ var
begin
Result := True;
{$IFDEF EventTrace}
EventTrace('hide', data);
{$ENDIF}
if Widget=nil then ;
FillChar(Mess,SizeOf(Mess),0);
Mess.Msg := LM_SHOWWINDOW;
@ -283,7 +297,9 @@ var
Mess: TLMActivate;
begin
Result:= True;
{$IFDEF EventTrace}
EventTrace('activate', data);
{$ENDIF}
if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
@ -307,8 +323,9 @@ var
LCLMenuItem: TMenuItem;
begin
Result := CallBackDefaultReturn;
{$IFDEF EventTrace}
EventTrace('toggled', AData);
{$ENDIF}
LCLMenuItem := TMenuItem(AData);
// some sanity checks
@ -332,8 +349,9 @@ var
begin
if ComponentIsDestroyingHandle(TWinControl(Data))
or (LockOnChange(PgtkObject(Widget),0)>0) then exit;
{$IFDEF EventTrace}
EventTrace('changed', data);
{$ENDIF}
Mess.Msg := LM_CHANGED;
DeliverMessage(Data, Mess);
@ -347,7 +365,9 @@ begin
Result := CallBackDefaultReturn;
if LockOnChange(PgtkObject(Widget),0)>0 then exit;
{$IFDEF EventTrace}
EventTrace('changed_editbox', data);
{$ENDIF}
Mess.Msg := CM_TEXTCHANGED;
DeliverMessage(Data, Mess);
@ -3049,7 +3069,9 @@ Procedure GTKStyleChanged(Widget: PGtkWidget; previous_style : PGTKStyle;
Data: Pointer); cdecl;
begin
if (Widget=nil) or (Data=nil) or (previous_style=nil) then ;
{$IFDEF EventTrace}
EventTrace('style-set', nil);
{$ENDIF}
//ReleaseAllStyles;
end;
@ -3058,15 +3080,28 @@ function gtkListBoxSelectionChangedAfter(widget: PGtkWidget; data: gPointer
var
Mess: TLMessage;
begin
//debugln('gtkListBoxSelectionChangedAfter ',GetWidgetDebugReport(Widget));
Result := CallBackDefaultReturn;
{$IFDEF EventTrace}
EventTrace('gtkListBoxSelectionChangedAfter', data);
{$ENDIF}
FillChar(Mess,SizeOf(Mess),0);
Mess.msg := LM_SelChange;
DeliverMessage(Data, Mess);
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 gtkListViewCallback.inc}

View File

@ -209,6 +209,9 @@ var
//ItemIndex: LongInt;
Mess: TLMessage;
begin
{$IFDEF EventTrace}
Debugln('gtkListItemSelectAfterCB');
{$ENDIF}
// get context
GtkList:=PGtkList(gtk_object_get_data(PGtkObject(Data),GtkListItemGtkListTag));
if GtkList=nil then
@ -317,6 +320,9 @@ var
ListItem: PGtkListItem;
begin
UpdateItemCache;
{$IFDEF EventTrace}
Debugln( 'connect ',strings[index]);
{$ENDIF}
ListItem:=FCachedItems[Index];
ConnectItemCallbacks(ListItem);
end;
@ -329,6 +335,9 @@ procedure TGtkListStringList.ConnectItemCallbacks(Li: PGtkListItem);
var
ChildWidget: Pointer;
begin
{$IFDEF EventTrace}
Debugln('connect itemCallback');
{$ENDIF}
gtk_object_set_data(PGtkObject(li),GtkListItemLCLListTag,Self);
gtk_object_set_data(PGtkObject(li),GtkListItemGtkListTag,FGtkList);
//DebugLn('TGtkListStringList.ConnectItemCallbacks Self=',DbgS(Self),
@ -348,10 +357,6 @@ begin
g_signal_connect_after(G_OBJECT(ChildWidget), 'toggled',
G_CALLBACK(@gtkListItemToggledCB), li);
end;
if FOwner is TCustomComboBox then begin
gtk_signal_connect_after(PGtkObject(li), 'select',
TGTKSignalFunc(@gtkListItemSelectAfterCB),li);
end;
end;
{------------------------------------------------------------------------------
@ -366,6 +371,9 @@ begin
i := FCachedCount - 1;
while i >= 0 do
begin
{$IFDEF EventTrace}
DebugLn('connect ',strings[i]);
{$ENDIF}
ConnectItemCallbacks(FCachedItems[i]);
Dec(i);
end;
@ -401,11 +409,6 @@ begin
gtk_signal_disconnect_by_func(
PGtkObject(ChildWidget), TGTKSignalFunc(@gtkListItemToggledCB), AItem);
end;
if FOwner is TCustomComboBox
then begin
gtk_signal_disconnect_by_func(
PGtkObject(AItem), TGTKSignalFunc(@gtkListItemSelectAfterCB), AItem);
end;
end;
{------------------------------------------------------------------------------
@ -887,6 +890,9 @@ begin
{$IFDEF DebugLCLComponents}
DebugGtkWidgets.MarkCreated(li,dbgsName(Owner)+' Index='+dbgs(Index)+' Count='+dbgs(Count));
{$ENDIF}
{$IFDEF EventTrace}
Debugln('insertListItem',s);
{$ENDIF}
ConnectItemCallbacks(PGtkListItem(li));
// grow capacity
UpdateItemCache;

View File

@ -1298,7 +1298,6 @@ var
begin
Caption := ACaption;
LabelFromAmpersands(Caption, Pattern, AccelKey);
gtk_label_set_text(ALabel, PChar(Caption));
{$ifdef gtk1}
@ -3985,7 +3984,10 @@ begin
if ALCLObject is TCustomListBox then begin
ConnectSenderSignalAfter(PgtkObject(gCore),
'selection_changed', @gtkListBoxSelectionChangedAfter);
end;
end else if ALCLObject is TCustomCombobox then
ConnectSenderSignal (PGtkObject(
PGtkCombo(gObject)^.list), 'unselect_child', @gtkListSelectChild)
else
end;
(*
@ -4228,6 +4230,7 @@ begin
Begin
SetCallback(LM_CHANGED, AGTKObject, ALCLObject);
SetCallback(LM_COMMAND, AGTKObject, ALCLObject);
SetCallback(LM_SELCHANGE, AGTKObject, ALCLObject);
End;
csListBox:
@ -6962,12 +6965,14 @@ var
function FindLineEnd(LineStart: integer): integer;
var
LineStop,
LineWidth, WordWidth, WordEnd, CharWidth: integer;
begin
// first search line break or text break
Result:=LineStart;
while not (AText[Result] in [#0,#10,#13]) do inc(Result);
if Result<=LineStart+1 then exit;
lineStop:=Result;
// get current line width in pixel
LineWidth:=GetLineWidthInPixel(LineStart,Result-LineStart);
@ -6996,6 +7001,7 @@ var
CharWidth:=GetLineWidthInPixel(Result,1);
inc(LineWidth,CharWidth);
if LineWidth>MaxWidthInPixel then break;
if result=lineStop then break;
inc(Result);
until false;
// at least one char

View File

@ -280,6 +280,8 @@ procedure GTKStyleChanged(Widget: PGtkWidget; previous_style :
function gtkListBoxSelectionChangedAfter(widget: PGtkWidget;
data: gPointer): GBoolean; cdecl;
function gtkListSelectChild(widget: PGtkWidget;child : PGtkWidget;
data: gPointer): GBoolean; cdecl;
// gtkDragCallback.inc headers
Function edit_drag_data_received(widget: pgtkWidget;

View File

@ -2779,30 +2779,34 @@ var
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
GetTextExtentPoint(DC, Str, Count, AP);
theRect.Right := theRect.Left + Min(MaxLength, AP.cX);
theRect.Bottom := theRect.Top + TM.tmHeight;
end
else begin
// 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
GetTextExtentPoint(DC, Str, Count, AP);
MaxLength := AP.cX;
end;
Self.WordWrap(DC, Str, MaxLength, Lines, NumLines);
LineWidth := 0;
If (Lines <> nil) then begin
For J := 0 to NumLines - 1 do begin
GetTextExtentPoint(DC, Lines[J], StrLen(Lines[J]), AP);
LineWidth := Max(LineWidth, AP.cX);
if (Flags and DT_CalcRect)<>0 then begin
LineWidth := 0;
if (Lines <> nil) then begin
LineWidth := 0;
For J := 0 to NumLines - 1 do begin
GetTextExtentPoint(DC, Lines[J], StrLen(Lines[J]), AP);
LineWidth := Max(LineWidth, AP.cX);
end;
end;
LineWidth := Min(MaxLength, LineWidth);
end else begin
LineWidth:=MaxLength;
end;
LineWidth := Min(MaxLength, LineWidth);
theRect.Right := theRect.Left + LineWidth;
theRect.Bottom := theRect.Top + NumLines*TM.tmHeight;