From 1b47078742d3eec2efcdad16d33386e4cd2c9a3c Mon Sep 17 00:00:00 2001 From: mattias Date: Tue, 25 Mar 2003 10:45:41 +0000 Subject: [PATCH] reduced focus handling and improved focus setting git-svn-id: trunk@3958 - --- lcl/forms.pp | 6 ++++- lcl/include/customform.inc | 50 +++++++++++++++++++++++++----------- lcl/include/promptdialog.inc | 11 ++++---- lcl/include/screen.inc | 21 +++++++++++++++ lcl/lclstrconsts.pas | 1 + 5 files changed, 68 insertions(+), 21 deletions(-) diff --git a/lcl/forms.pp b/lcl/forms.pp index f1d4e8834c..0899d93c38 100644 --- a/lcl/forms.pp +++ b/lcl/forms.pp @@ -285,7 +285,7 @@ type function IsForm : Boolean; procedure IconChanged(Sender: TObject); function IsIconStored: Boolean; - { events } + private procedure WMActivate(var Message : TLMActivate); message LM_ACTIVATE; procedure WMDeactivate(var Message : TLMActivate); message LM_DEACTIVATE; procedure WMPaint(var message: TLMPaint); message LM_PAINT; @@ -466,6 +466,7 @@ type FCursorCount: integer; FCursorList: PCursorRec; FCustomForms: TList; + FCustomFormsZOrdered: TList; FDefaultCursor: HCURSOR; FFocusedForm: TCustomForm; FFonts : TStrings; @@ -483,6 +484,7 @@ type function GetCursors(Index: Integer): HCURSOR; function GetCustomFormCount: Integer; function GetCustomForms(Index: Integer): TCustomForm; + function GetCustomFormsZOrdered(Index: Integer): TCustomForm; function GetFonts : TStrings; function GetFormCount: Integer; function GetForms(IIndex: Integer): TForm; @@ -498,6 +500,7 @@ type destructor Destroy; Override; function CustomFormIndex(AForm: TCustomForm): integer; function FormIndex(AForm: TForm): integer; + function CustomFormZIndex(AForm: TCustomForm): integer; public property ActiveControl: TWinControl read FActiveControl; property ActiveCustomForm: TCustomForm read FActiveCustomForm; @@ -506,6 +509,7 @@ type property Cursors[Index: Integer]: HCURSOR read GetCursors write SetCursors; property CustomFormCount: Integer read GetCustomFormCount; property CustomForms[Index: Integer]: TCustomForm read GetCustomForms; + property CustomFormsZOrdered[Index: Integer]: TCustomForm read GetCustomFormsZOrdered; property FormCount: Integer read GetFormCount; property Forms[Index: Integer]: TForm read GetForms; property Fonts : TStrings read GetFonts; diff --git a/lcl/include/customform.inc b/lcl/include/customform.inc index 9a15d09c48..b363761f59 100644 --- a/lcl/include/customform.inc +++ b/lcl/include/customform.inc @@ -229,13 +229,29 @@ end; Method: TCustomForm.SetFocus ------------------------------------------------------------------------------} Procedure TCustomForm.SetFocus; + + procedure RaiseCannotFocus; + var + s: String; + begin + s:='[TCustomForm.SetFocus] '+Name+':'+ClassName+' '+rsCanNotFocus; + {$IFDEF VerboseFocus} + RaiseGDBException(s); + {$ELSE} + raise EInvalidOperation.Create(s); + {$ENDIF} + end; + Begin {$IFDEF VerboseFocus} writeln('TCustomForm.SetFocus ',Name,':',ClassName); {$ENDIF} - if not (Visible and Enabled and HandleAllocated) then Exit; - if HandleAllocated then - CNSendMessage(LM_SETFOCUS,Self,nil); + if not FActive then + begin + if not (Visible and Enabled) then + RaiseCannotFocus; + SetWindowFocus; + end; end; {------------------------------------------------------------------------------ @@ -338,13 +354,6 @@ begin if (FormStyle <> fsMDIForm) or (csDesigning in ComponentState) then SetActive(Message.Active {<> WA_INACTIVE}); FActive:=true; - if (FActiveControl<>nil) and FActiveControl.HandleAllocated - and (FActiveControl.Visible) and (FActiveControl.Enabled) then begin - {$IFDEF VerboseFocus} - writeln('TCustomForm.WMActivate B ',FActiveControl.Name,':',FActiveControl.ClassName); - {$ENDIF} - LCLLinux.SetFocus(FActiveControl.Handle); - end; Activate; end; @@ -667,7 +676,7 @@ begin LM_ACTIVATE, LM_SETFOCUS, LM_KILLFOCUS: begin if not FocusMessages then Exit; - if (MSg = LM_SetFocus) and not (csDesigning in ComponentState) + if (Msg = LM_SetFocus) and not (csDesigning in ComponentState) then begin FocusHandle := 0; if FormStyle = fsMDIFORM @@ -682,7 +691,9 @@ begin TheMessage.Result:=0; if FocusHandle <> 0 then begin - //writeln('[TCustomForm.WndPRoc] A ',FActiveControl.ClassName); + {$IFDEF VerboseFocus} + writeln('[TCustomForm.WndProc] ',Name,':',ClassName); + {$ENDIF} LCLLinux.SetFocus(FocusHandle); Exit; end; @@ -865,14 +876,18 @@ Begin then RaiseGDBException(SCannotFocus); // EInvalidOperation.Create(SCannotFocus); - FActiveControl := AWinControl; {$IFDEF VerboseFocus} write('TCustomForm.SetActiveControl ',Name,':',ClassName,' FActive=',FActive); if FActiveControl<>nil then - writeln(' FActiveControl=',FActiveControl.Name,':',FActiveControl.ClassName) + writeln(' OldActiveControl=',FActiveControl.Name,':',FActiveControl.ClassName) else - writeln(' FActiveControl=nil'); + writeln(' OldActiveControl=nil'); + if AWinControl<>nil then + writeln(' NewActiveControl=',AWinControl.Name,':',AWinControl.ClassName) + else + writeln(' NewActiveControl=nil'); {$ENDIF} + FActiveControl := AWinControl; if not (csLoading in ComponentState) then begin if FActive then SetWindowFocus; @@ -1114,6 +1129,8 @@ begin write(' Control=',Control.Name,':',Control.ClassName,' Control.HandleAllocated=',Control.HandleAllocated); writeln(); {$ENDIF} + + Result:=true; { Inc(FocusCount); @@ -1374,6 +1391,9 @@ end; { ============================================================================= $Log$ + Revision 1.92 2003/03/25 10:45:40 mattias + reduced focus handling and improved focus setting + Revision 1.91 2003/03/18 13:04:25 mattias improved focus debugging output diff --git a/lcl/include/promptdialog.inc b/lcl/include/promptdialog.inc index f50789c961..a63df311bd 100644 --- a/lcl/include/promptdialog.inc +++ b/lcl/include/promptdialog.inc @@ -106,10 +106,8 @@ begin break; end; until false; - if NewFocusControl.HandleAllocated then begin - LCLLinux.SetFocus(NewFocusControl.Handle); - Key:=VK_UNKNOWN; - end; + ActiveControl:=NewFocusControl; + Key:=VK_UNKNOWN; end; end; end; @@ -341,7 +339,7 @@ begin for i:=0 to ComponentCount-1 do begin if (Components[i] is TBitBtn) and (TBitBtn(Components[i]).Default) then begin - TBitBtn(Components[i]).SetFocus; + ActiveControl:=TBitBtn(Components[i]); break; end; end; @@ -381,6 +379,9 @@ end; { $Log$ + Revision 1.4 2003/03/25 10:45:41 mattias + reduced focus handling and improved focus setting + Revision 1.3 2003/03/04 09:21:09 mattias added localization for env options from Olivier diff --git a/lcl/include/screen.inc b/lcl/include/screen.inc index 790b37a58c..cca1ba203a 100644 --- a/lcl/include/screen.inc +++ b/lcl/include/screen.inc @@ -31,6 +31,7 @@ begin FFonts := TStringlist.Create; TStringlist(FFonts).Sorted := True; FCustomForms:=TList.Create; + FCustomFormsZOrdered:=TList.Create; FFormList := TList.Create; FPixelsPerInch:= ScreenInfo.PixelsPerInchX; FHintFont := TFont.Create; @@ -54,6 +55,7 @@ begin FreeThenNil(FHintFont); FreeThenNil(FFormList); FreeThenNil(FCustomForms); + FreeThenNil(FCustomFormsZOrdered); FreeThenNil(FSaveFocusedList); FreeThenNil(FFonts); inherited Destroy; @@ -77,6 +79,15 @@ begin while (Result>=0) and (Forms[Result]<>AForm) do dec(Result); end; +{------------------------------------------------------------------------------ + function TScreen.CustomFormZIndex(AForm: TCustomForm): integer; + ------------------------------------------------------------------------------} +function TScreen.CustomFormZIndex(AForm: TCustomForm): integer; +begin + Result:=FCustomFormsZOrdered.Count-1; + while (Result>=0) and (CustomFormsZOrdered[Result]<>AForm) do dec(Result); +end; + {------------------------------------------------------------------------------ function TScreen.GetFonts : TStrings; ------------------------------------------------------------------------------} @@ -173,6 +184,14 @@ begin Result := TCustomForm(FCustomForms[Index]); end; +{------------------------------------------------------------------------------ + function TScreen.GetCustomFormsZOrdered(Index: Integer): TCustomForm; + ------------------------------------------------------------------------------} +function TScreen.GetCustomFormsZOrdered(Index: Integer): TCustomForm; +begin + Result := TCustomForm(FCustomFormsZOrdered[Index]); +end; + {------------------------------------------------------------------------------ Function: TScreen.AddForm Params: FForm: The form to be added @@ -183,6 +202,7 @@ end; procedure TScreen.AddForm(AForm: TCustomForm); begin FCustomForms.Add(AForm); + FCustomFormsZOrdered.Add(AForm); if AForm is TForm then begin FFormList.Add(AForm); @@ -249,6 +269,7 @@ end; procedure TScreen.RemoveForm(AForm: TCustomForm); begin FCustomForms.Remove(AForm); + FCustomFormsZOrdered.Remove(AForm); FFormList.Remove(AForm); Application.UpdateVisible; //if (FCustomForms.Count = 0) and (Application.FHintWindow <> nil) then diff --git a/lcl/lclstrconsts.pas b/lcl/lclstrconsts.pas index 6d4ea493b1..2f6805b6d0 100644 --- a/lcl/lclstrconsts.pas +++ b/lcl/lclstrconsts.pas @@ -168,6 +168,7 @@ ResourceString rsUnsupportedBitmapFormat = 'Unsupported bitmap format.'; rsNoInterfaceObject = 'No interface object. ' +'Plz check if the unit "interfaces" was added to the programs uses clause.'; + rsCanNotFocus = 'Can not focus';