From 252c0feff38d0b0cfd95d3449b00ca337aa661a8 Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 18 Mar 2006 14:39:13 +0000 Subject: [PATCH] OnSelChange for tComboBox fired only one per click from Darek git-svn-id: trunk@8957 - --- lcl/interfaces/gtk/gtkcallback.inc | 43 +++++++++++++++++++++++++++--- lcl/interfaces/gtk/gtklistsl.inc | 24 ++++++++++------- lcl/interfaces/gtk/gtkobject.inc | 10 +++++-- lcl/interfaces/gtk/gtkproc.pp | 2 ++ lcl/interfaces/gtk/gtkwinapi.inc | 22 ++++++++------- 5 files changed, 77 insertions(+), 24 deletions(-) diff --git a/lcl/interfaces/gtk/gtkcallback.inc b/lcl/interfaces/gtk/gtkcallback.inc index 173fac11a5..5c3351b3fd 100644 --- a/lcl/interfaces/gtk/gtkcallback.inc +++ b/lcl/interfaces/gtk/gtkcallback.inc @@ -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} diff --git a/lcl/interfaces/gtk/gtklistsl.inc b/lcl/interfaces/gtk/gtklistsl.inc index 69b3a6e772..04e1a4ab67 100644 --- a/lcl/interfaces/gtk/gtklistsl.inc +++ b/lcl/interfaces/gtk/gtklistsl.inc @@ -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; diff --git a/lcl/interfaces/gtk/gtkobject.inc b/lcl/interfaces/gtk/gtkobject.inc index 68de800c05..0c8e68131a 100644 --- a/lcl/interfaces/gtk/gtkobject.inc +++ b/lcl/interfaces/gtk/gtkobject.inc @@ -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 diff --git a/lcl/interfaces/gtk/gtkproc.pp b/lcl/interfaces/gtk/gtkproc.pp index e6af2e778a..ec98b3ac48 100644 --- a/lcl/interfaces/gtk/gtkproc.pp +++ b/lcl/interfaces/gtk/gtkproc.pp @@ -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; diff --git a/lcl/interfaces/gtk/gtkwinapi.inc b/lcl/interfaces/gtk/gtkwinapi.inc index bc45a44e21..cda0c3848d 100644 --- a/lcl/interfaces/gtk/gtkwinapi.inc +++ b/lcl/interfaces/gtk/gtkwinapi.inc @@ -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;