{----------------------------------------------------------------------------- The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/MPL-1.1.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is: JvAppEvent.PAS, released on 2002-07-04. The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev Copyright (c) 2001,2002 SGB Software All Rights Reserved. Contributor(s): Hofi Last Modified: 2004-10-07 Changes: 2004-10-07: * Added by Hofi TJvAppEvents property CancelDispatch gives a chance to break event dispatching in a particular event handler. You may retrieve the latest version of this file at the Project JEDI's JVCL home page, located at http://jvcl.sourceforge.net Known Issues: -----------------------------------------------------------------------------} // $Id: JvAppEvent.pas 10612 2006-05-19 19:04:09Z jfudickar $ unit JvAppEvent; {$I jvcl.inc} interface uses {$IFDEF UNITVERSIONING} JclUnitVersioning, {$ENDIF UNITVERSIONING} Windows, Messages, {$IFDEF VisualCLX} Qt, {$ENDIF VisualCLX} SysUtils, Classes, Controls, Graphics, Forms, ActnList, JvTypes, JvComponentBase; const DefHintColor = clInfoBk; DefHintPause = 500; DefHintShortPause = DefHintPause div 10; DefHintHidePause = DefHintPause * 5; {$IFDEF VisualCLX} type { short names } TUIEffect = ( General, AnimateMenu, FadeMenu, AnimateCombo, AnimateTooltip, FadeTooltip ); TUIEffects = set of TUIEffect; {$ENDIF VisualCLX} type TJvAppEvents = class(TJvComponent) private FChained: Boolean; FHintColor: TColor; FHintPause: Integer; FShowHint: Boolean; FCanvas: TCanvas; FUpdateFormatSettings: Boolean; FCancelDispatch: Boolean; FHintShortPause: Integer; FHintHidePause: Integer; FShowMainForm: Boolean; FHintShortCuts: Boolean; FMouseDragImmediate: Boolean; FMouseDragThreshold: Integer; FOnActionExecute: TActionEvent; FOnActionUpdate: TActionEvent; FOnShortCut: TShortCutEvent; {$IFDEF VCL} FUpdateMetricSettings: Boolean; FBiDiMode: TBiDiMode; FBiDiKeyboard: string; FNonBiDiKeyboard: string; {$ENDIF VCL} FOnPaintIcon: TNotifyEvent; FOnActivate: TNotifyEvent; FOnDeactivate: TNotifyEvent; FOnException: TExceptionEvent; FOnIdle: TIdleEvent; FOnHelp: THelpEvent; FOnHint: TNotifyEvent; {$IFDEF VCL} FOnMessage: TMessageEvent; {$ENDIF VCL} {$IFDEF VisualCLX} FOnEvent: TEventEvent; {$ENDIF VisualCLX} FOnMinimize: TNotifyEvent; FOnRestore: TNotifyEvent; FOnShowHint: TShowHintEvent; {$IFDEF VCL} FOnSettingsChanged: TNotifyEvent; {$ENDIF VCL} FOnActiveControlChange: TNotifyEvent; FOnActiveFormChange: TNotifyEvent; procedure UpdateAppProps; function GetCanvas: TCanvas; function GetHintColor: TColor; function GetHintPause: Integer; function GetShowHint: Boolean; procedure SetHintColor(Value: TColor); procedure SetHintPause(Value: Integer); procedure SetShowHint(Value: Boolean); function GetUpdateFormatSettings: Boolean; procedure SetUpdateFormatSettings(Value: Boolean); function GetHintShortPause: Integer; function GetHintHidePause: Integer; function GetShowMainForm: Boolean; procedure SetHintShortPause(Value: Integer); procedure SetHintHidePause(Value: Integer); procedure SetShowMainForm(Value: Boolean); function GetHintShortCuts: Boolean; procedure SetHintShortCuts(Value: Boolean); function GetMouseDragImmediate: Boolean; function GetMouseDragThreshold: Integer; procedure SetMouseDragImmediate(Value: Boolean); procedure SetMouseDragThreshold(Value: Integer); {$IFDEF VCL} function GetUpdateMetricSettings: Boolean; procedure SetUpdateMetricSettings(Value: Boolean); function GetBiDiMode: TBiDiMode; procedure SetBiDiMode(Value: TBiDiMode); function GetBiDiKeyboard: string; function GetNonBiDiKeyboard: string; procedure SetBiDiKeyboard(const Value: string); procedure SetNonBiDiKeyboard(const Value: string); {$ENDIF VCL} {$IFDEF VisualCLX} function GetEffects: TUIEffects; function GetHintFont: TFont; procedure SetEffects(Value: TUIEffects); procedure SetHintFont(Value: TFont); {$ENDIF VisualCLX} protected procedure Loaded; override; {$IFDEF VCL} procedure PaintIcon; virtual; procedure SettingsChanged; dynamic; function MessageHook(var Msg: TMessage): Boolean; virtual; {$ENDIF VCL} public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Canvas: TCanvas read GetCanvas; { for painting the icon } procedure CancelDispatch; published property Chained: Boolean read FChained write FChained default True; property HintColor: TColor read GetHintColor write SetHintColor default DefHintColor; {$IFDEF VisualCLX} property HintFont: TFont read GetHintFont write SetHintFont; {$ENDIF VisualCLX} property HintPause: Integer read GetHintPause write SetHintPause default DefHintPause; property ShowHint: Boolean read GetShowHint write SetShowHint default True; property UpdateFormatSettings: Boolean read GetUpdateFormatSettings write SetUpdateFormatSettings default True; property HintShortPause: Integer read GetHintShortPause write SetHintShortPause default DefHintShortPause; property HintHidePause: Integer read GetHintHidePause write SetHintHidePause default DefHintHidePause; property ShowMainForm: Boolean read GetShowMainForm write SetShowMainForm default True; property HintShortCuts: Boolean read GetHintShortCuts write SetHintShortCuts default True; {$IFDEF VisualCLX} property Effects: TUIEffects read GetEffects write SetEffects; {$ENDIF VisualCLX} {$IFDEF VCL} property UpdateMetricSettings: Boolean read GetUpdateMetricSettings write SetUpdateMetricSettings default True; property BiDiMode: TBiDiMode read GetBiDiMode write SetBiDiMode default bdLeftToRight; property BiDiKeyboard: string read GetBiDiKeyboard write SetBiDiKeyboard; property NonBiDiKeyboard: string read GetNonBiDiKeyboard write SetNonBiDiKeyboard; {$ENDIF VCL} property MouseDragImmediate: Boolean read GetMouseDragImmediate write SetMouseDragImmediate default True; property MouseDragThreshold: Integer read GetMouseDragThreshold write SetMouseDragThreshold default 5; property OnActionExecute: TActionEvent read FOnActionExecute write FOnActionExecute; property OnActionUpdate: TActionEvent read FOnActionUpdate write FOnActionUpdate; property OnShortCut: TShortCutEvent read FOnShortCut write FOnShortCut; property OnActivate: TNotifyEvent read FOnActivate write FOnActivate; property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate; property OnException: TExceptionEvent read FOnException write FOnException; property OnIdle: TIdleEvent read FOnIdle write FOnIdle; property OnHelp: THelpEvent read FOnHelp write FOnHelp; property OnHint: TNotifyEvent read FOnHint write FOnHint; property OnMinimize: TNotifyEvent read FOnMinimize write FOnMinimize; property OnPaintIcon: TNotifyEvent read FOnPaintIcon write FOnPaintIcon; property OnRestore: TNotifyEvent read FOnRestore write FOnRestore; property OnShowHint: TShowHintEvent read FOnShowHint write FOnShowHint; {$IFDEF VCL} property OnMessage: TMessageEvent read FOnMessage write FOnMessage; property OnSettingsChanged: TNotifyEvent read FOnSettingsChanged write FOnSettingsChanged; {$ENDIF VCL} property OnActiveControlChange: TNotifyEvent read FOnActiveControlChange write FOnActiveControlChange; property OnActiveFormChange: TNotifyEvent read FOnActiveFormChange write FOnActiveFormChange; {$IFDEF VisualCLX} property OnEvent: TEventEvent read FOnEvent write FOnEvent; {$ENDIF VisualCLX} end; {$IFDEF UNITVERSIONING} const UnitVersioning: TUnitVersionInfo = ( RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvAppEvent.pas $'; Revision: '$Revision: 10612 $'; Date: '$Date: 2006-05-19 21:04:09 +0200 (ven., 19 mai 2006) $'; LogPath: 'JVCL\run' ); {$ENDIF UNITVERSIONING} implementation type TJvAppEventList = class(TObject) private FAppEvents: TList; FHooked: Boolean; FOnActivate: TNotifyEvent; FOnDeactivate: TNotifyEvent; FOnException: TExceptionEvent; FOnIdle: TIdleEvent; FOnHelp: THelpEvent; FOnHint: TNotifyEvent; {$IFDEF VCL} FOnMessage: TMessageEvent; {$ENDIF VCL} {$IFDEF VisualCLX} FOnEvent: TEventEvent; {$ENDIF VisualCLX} FOnMinimize: TNotifyEvent; FOnRestore: TNotifyEvent; FOnShowHint: TShowHintEvent; FOnActiveControlChange: TNotifyEvent; FOnActiveFormChange: TNotifyEvent; FOnActionExecute: TActionEvent; FOnActionUpdate: TActionEvent; FOnShortCut: TShortCutEvent; procedure AddEvents(App: TJvAppEvents); procedure RemoveEvents(App: TJvAppEvents); procedure ClearEvents; protected procedure DoActivate(Sender: TObject); procedure DoDeactivate(Sender: TObject); procedure DoException(Sender: TObject; E: Exception); procedure DoIdle(Sender: TObject; var Done: Boolean); procedure DoHint(Sender: TObject); procedure DoMinimize(Sender: TObject); procedure DoRestore(Sender: TObject); {$IFDEF VCL} function DoHelp(Command: Word; Data: {$IFDEF CLR} TObject {$ELSE} Longint {$ENDIF}; var CallHelp: Boolean): Boolean; procedure DoMessage(var Msg: TMsg; var Handled: Boolean); procedure DoShortCut(var Msg: TWMKey; var Handled: Boolean); {$ENDIF VCL} {$IFDEF VisualCLX} function DoHelp(HelpType: THelpType; HelpContext: THelpContext; const HelpKeyword: string; const HelpFile: string; var Handled: Boolean): Boolean; procedure DoShortCut(Key: Integer; Shift: TShiftState; var Handled: Boolean); procedure DoEvent(Sender: QObjectH; Event: QEventH; var Handled: Boolean); {$ENDIF VisualCLX} procedure DoShowHint(var HintStr: THintString; var CanShow: Boolean; var HintInfo: THintInfo); procedure DoActiveControlChange(Sender: TObject); procedure DoActiveFormChange(Sender: TObject); procedure DoActionExecute(Action: TBasicAction; var Handled: Boolean); procedure DoActionUpdate(Action: TBasicAction; var Handled: Boolean); public constructor Create; destructor Destroy; override; end; //=== { TJvAppEventList } ==================================================== constructor TJvAppEventList.Create; begin inherited Create; FAppEvents := TList.Create; end; destructor TJvAppEventList.Destroy; begin ClearEvents; FAppEvents.Free; inherited Destroy; end; procedure TJvAppEventList.ClearEvents; begin if FHooked then begin // Application might get destroyed and set to nil before our finalization is called if Assigned(Application) then begin Application.OnActivate := nil; Application.OnDeactivate := nil; Application.OnException := nil; {$IFDEF VisualCLX} Application.OnEvent := nil; {$ENDIF VisualCLX} Application.OnIdle := nil; Application.OnHelp := nil; Application.OnHint := nil; {$IFDEF VCL} Application.OnMessage := nil; {$ENDIF VCL} Application.OnMinimize := nil; Application.OnRestore := nil; Application.OnShowHint := nil; Application.OnActionExecute := nil; Application.OnActionUpdate := nil; Application.OnShortCut := nil; end; // Screen might get destroyed and set to nil before our finalization is called if Assigned(Screen) then begin Screen.OnActiveControlChange := nil; Screen.OnActiveFormChange := nil; end; end; end; procedure TJvAppEventList.AddEvents(App: TJvAppEvents); begin if (App <> nil) and (FAppEvents.IndexOf(App) = -1) then begin FAppEvents.Add(App); if not (csDesigning in App.ComponentState) and (FAppEvents.Count = 1) then begin FOnActivate := Application.OnActivate; FOnDeactivate := Application.OnDeactivate; FOnException := Application.OnException; FOnIdle := Application.OnIdle; FOnHelp := Application.OnHelp; FOnHint := Application.OnHint; {$IFDEF VCL} FOnMessage := Application.OnMessage; {$ENDIF VCL} {$IFDEF VisualCLX} FOnEvent := Application.OnEvent; {$ENDIF VisualCLX} FOnMinimize := Application.OnMinimize; FOnRestore := Application.OnRestore; FOnShowHint := Application.OnShowHint; FOnActionExecute := Application.OnActionExecute; FOnActionUpdate := Application.OnActionUpdate; FOnShortCut := Application.OnShortCut; Application.OnActionExecute := DoActionExecute; Application.OnActionUpdate := DoActionUpdate; Application.OnShortCut := DoShortCut; Application.OnActivate := DoActivate; Application.OnDeactivate := DoDeactivate; Application.OnException := DoException; Application.OnIdle := DoIdle; Application.OnHelp := DoHelp; Application.OnHint := DoHint; {$IFDEF VCL} Application.OnMessage := DoMessage; {$ENDIF VCL} {$IFDEF VisualCLX} Application.OnEvent := DoEvent; {$ENDIF VisualCLX} Application.OnMinimize := DoMinimize; Application.OnRestore := DoRestore; Application.OnShowHint := DoShowHint; if Screen <> nil then begin FOnActiveControlChange := Screen.OnActiveControlChange; FOnActiveFormChange := Screen.OnActiveFormChange; Screen.OnActiveControlChange := DoActiveControlChange; Screen.OnActiveFormChange := DoActiveFormChange; end; FHooked := True; end; end; end; procedure TJvAppEventList.RemoveEvents(App: TJvAppEvents); begin if FAppEvents.IndexOf(App) >= 0 then FAppEvents.Remove(App); if not (csDesigning in App.ComponentState) and (FAppEvents.Count = 0) then ClearEvents; end; procedure TJvAppEventList.DoActivate(Sender: TObject); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnActivate) then TJvAppEvents(FAppEvents[I]).FOnActivate(Sender); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnActivate) then FOnActivate(Sender); end; procedure TJvAppEventList.DoDeactivate(Sender: TObject); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnDeactivate) then TJvAppEvents(FAppEvents[I]).FOnDeactivate(Sender); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnDeactivate) then FOnDeactivate(Sender); end; procedure TJvAppEventList.DoException(Sender: TObject; E: Exception); var I: Integer; Handled: Boolean; begin Handled := False; for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnException) then begin TJvAppEvents(FAppEvents[I]).FOnException(Sender, E); Handled := True; end; if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then begin if not Handled then Application.ShowException(E); Exit; end; end; if Assigned(FOnException) then begin FOnException(Sender, E); Handled := True; end; if not Handled then Application.ShowException(E); end; procedure TJvAppEventList.DoIdle(Sender: TObject; var Done: Boolean); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnIdle) then TJvAppEvents(FAppEvents[I]).FOnIdle(Sender, Done); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnIdle) then FOnIdle(Sender, Done); end; {$IFDEF VCL} function TJvAppEventList.DoHelp(Command: Word; Data: {$IFDEF CLR} TObject {$ELSE} Longint {$ENDIF}; var CallHelp: Boolean): Boolean; var I: Integer; begin Result := False; for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnHelp) then Result := TJvAppEvents(FAppEvents[I]).FOnHelp(Command, Data, CallHelp); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnHelp) then Result := FOnHelp(Command, Data, CallHelp); end; {$ENDIF VCL} {$IFDEF VisualCLX} function TJvAppEventList.DoHelp(HelpType: THelpType; HelpContext: THelpContext; const HelpKeyword: string; const HelpFile: string; var Handled: Boolean): Boolean; var I: Integer; begin Result := False; for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnHelp) then Result := TJvAppEvents(FAppEvents[I]).FOnHelp(HelpType, HelpContext, HelpKeyword, HelpFile, Handled); if not TJvAppEvents(FAppEvents[I]).Chained or Handled or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnHelp) then Result := FOnHelp(HelpType, HelpContext, HelpKeyword, HelpFile, Handled); end; {$ENDIF VisualCLX} procedure TJvAppEventList.DoHint(Sender: TObject); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnHint) then TJvAppEvents(FAppEvents[I]).FOnHint(Sender); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnHint) then FOnHint(Sender); end; {$IFDEF VCL} procedure TJvAppEventList.DoMessage(var Msg: TMsg; var Handled: Boolean); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnMessage) then TJvAppEvents(FAppEvents[I]).FOnMessage(Msg, Handled); if not TJvAppEvents(FAppEvents[I]).Chained or Handled or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnMessage) then FOnMessage(Msg, Handled); end; {$ENDIF VCL} {$IFDEF VisualCLX} procedure TJvAppEventList.DoEvent(Sender: QObjectH; Event: QEventH; var Handled: Boolean); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnEvent) then TJvAppEvents(FAppEvents[I]).FOnEvent(Sender, Event, Handled); if not TJvAppEvents(FAppEvents[I]).Chained or Handled or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnEvent) then FOnEvent(Sender, Event, Handled); end; {$ENDIF VisualCLX} procedure TJvAppEventList.DoMinimize(Sender: TObject); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnMinimize) then TJvAppEvents(FAppEvents[I]).FOnMinimize(Sender); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnMinimize) then FOnMinimize(Sender); end; procedure TJvAppEventList.DoRestore(Sender: TObject); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnRestore) then TJvAppEvents(FAppEvents[I]).FOnRestore(Sender); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnRestore) then FOnRestore(Sender); end; procedure TJvAppEventList.DoShowHint(var HintStr: THintString; var CanShow: Boolean; var HintInfo: THintInfo); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnShowHint) then TJvAppEvents(FAppEvents[I]).FOnShowHint(HintStr, CanShow, HintInfo); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnShowHint) then FOnShowHint(HintStr, CanShow, HintInfo); end; procedure TJvAppEventList.DoActiveControlChange(Sender: TObject); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnActiveControlChange) then TJvAppEvents(FAppEvents[I]).FOnActiveControlChange(Sender); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnActiveControlChange) then FOnActiveControlChange(Sender); end; procedure TJvAppEventList.DoActiveFormChange(Sender: TObject); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnActiveFormChange) then TJvAppEvents(FAppEvents[I]).FOnActiveFormChange(Sender); if not TJvAppEvents(FAppEvents[I]).Chained or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnActiveFormChange) then FOnActiveFormChange(Sender); end; procedure TJvAppEventList.DoActionExecute(Action: TBasicAction; var Handled: Boolean); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnActionExecute) then TJvAppEvents(FAppEvents[I]).FOnActionExecute(Action, Handled); if not TJvAppEvents(FAppEvents[I]).Chained or Handled or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnActionExecute) then FOnActionExecute(Action, Handled); end; procedure TJvAppEventList.DoActionUpdate(Action: TBasicAction; var Handled: Boolean); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnActionUpdate) then TJvAppEvents(FAppEvents[I]).FOnActionUpdate(Action, Handled); if not TJvAppEvents(FAppEvents[I]).Chained or Handled or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnActionUpdate) then FOnActionUpdate(Action, Handled); end; {$IFDEF VCL} procedure TJvAppEventList.DoShortCut(var Msg: TWMKey; var Handled: Boolean); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnShortCut) then TJvAppEvents(FAppEvents[I]).FOnShortCut(Msg, Handled); if not TJvAppEvents(FAppEvents[I]).Chained or Handled or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnShortCut) then FOnShortCut(Msg, Handled); end; {$ENDIF VCL} {$IFDEF VisualCLX} procedure TJvAppEventList.DoShortCut(Key: Integer; Shift: TShiftState; var Handled: Boolean); var I: Integer; begin for I := FAppEvents.Count - 1 downto 0 do begin TJvAppEvents(FAppEvents[I]).FCancelDispatch := False; if Assigned(TJvAppEvents(FAppEvents[I]).FOnShortCut) then TJvAppEvents(FAppEvents[I]).FOnShortCut(Key, Shift, Handled); if not TJvAppEvents(FAppEvents[I]).Chained or Handled or TJvAppEvents(FAppEvents[I]).FCancelDispatch then Exit; end; if Assigned(FOnShortCut) then FOnShortCut(Key, Shift, Handled); end; {$ENDIF VisualCLX} //=== { TJvAppEvents } ======================================================= var AppList: TJvAppEventList = nil; constructor TJvAppEvents.Create(AOwner: TComponent); begin inherited Create(AOwner); if AppList = nil then AppList := TJvAppEventList.Create; FChained := True; FHintColor := DefHintColor; FHintPause := DefHintPause; FShowHint := True; FCancelDispatch := False; FHintShortPause := DefHintShortPause; FHintHidePause := DefHintHidePause; FShowMainForm := True; FHintShortCuts := True; FMouseDragImmediate := True; FMouseDragThreshold := 5; FUpdateFormatSettings := True; {$IFDEF VCL} FUpdateMetricSettings := True; FBiDiMode := bdLeftToRight; if not (csDesigning in ComponentState) then Application.HookMainWindow(MessageHook); {$ENDIF VCL} AppList.AddEvents(Self); end; destructor TJvAppEvents.Destroy; begin {$IFDEF VCL} if not (csDesigning in ComponentState) then Application.UnhookMainWindow(MessageHook); {$ENDIF VCL} if (Self <> nil) and (AppList <> nil) then AppList.RemoveEvents(Self); inherited Destroy; // (rom) destroy Canvas AFTER inherited Destroy FCanvas.Free; end; procedure TJvAppEvents.Loaded; begin inherited Loaded; UpdateAppProps; end; function TJvAppEvents.GetCanvas: TCanvas; begin if FCanvas = nil then FCanvas := TCanvas.Create; Result := FCanvas; end; procedure TJvAppEvents.CancelDispatch; begin FCancelDispatch := True; end; {$IFDEF VCL} procedure TJvAppEvents.PaintIcon; var PS: TPaintStruct; begin BeginPaint(Application.Handle, PS); try FreeAndNil(FCanvas); FCanvas := TCanvas.Create; try Canvas.Handle := PS.hDC; Canvas.Brush.Color := clBackground; if PS.fErase then Canvas.FillRect(PS.rcPaint); if Assigned(FOnPaintIcon) then FOnPaintIcon(Self); finally FreeAndNil(FCanvas); end; finally EndPaint(Application.Handle, PS); end; end; procedure TJvAppEvents.SettingsChanged; begin if Assigned(FOnSettingsChanged) then FOnSettingsChanged(Self); end; function TJvAppEvents.MessageHook(var Msg: TMessage): Boolean; begin Result := False; case Msg.Msg of WM_WININICHANGE: begin try SettingsChanged; except Application.HandleException(Self); end; end; WM_PAINT: if Assigned(FOnPaintIcon) and IsIconic(Application.Handle) then begin PaintIcon; Result := True; end; end; end; {$ENDIF VCL} function TJvAppEvents.GetHintColor: TColor; begin if csDesigning in ComponentState then Result := FHintColor else Result := Application.HintColor; end; function TJvAppEvents.GetHintPause: Integer; begin if csDesigning in ComponentState then Result := FHintPause else Result := Application.HintPause; end; function TJvAppEvents.GetShowHint: Boolean; begin if csDesigning in ComponentState then Result := FShowHint else Result := Application.ShowHint; end; procedure TJvAppEvents.SetHintColor(Value: TColor); begin FHintColor := Value; if not (csDesigning in ComponentState) then Application.HintColor := Value; end; procedure TJvAppEvents.SetHintPause(Value: Integer); begin FHintPause := Value; if not (csDesigning in ComponentState) then Application.HintPause := Value; end; procedure TJvAppEvents.SetShowHint(Value: Boolean); begin FShowHint := Value; if not (csDesigning in ComponentState) then Application.ShowHint := Value; end; function TJvAppEvents.GetUpdateFormatSettings: Boolean; begin {$IFDEF VCL} if not (csDesigning in ComponentState) then Result := Application.UpdateFormatSettings else {$ENDIF VCL} Result := FUpdateFormatSettings; end; procedure TJvAppEvents.SetUpdateFormatSettings(Value: Boolean); begin FUpdateFormatSettings := Value; {$IFDEF VCL} if not (csDesigning in ComponentState) then Application.UpdateFormatSettings := Value; {$ENDIF VCL} end; function TJvAppEvents.GetHintShortPause: Integer; begin if csDesigning in ComponentState then Result := FHintShortPause else Result := Application.HintShortPause; end; function TJvAppEvents.GetHintHidePause: Integer; begin if csDesigning in ComponentState then Result := FHintHidePause else Result := Application.HintHidePause; end; function TJvAppEvents.GetShowMainForm: Boolean; begin if csDesigning in ComponentState then Result := FShowMainForm else Result := Application.ShowMainForm; end; procedure TJvAppEvents.SetHintShortPause(Value: Integer); begin FHintShortPause := Value; if not (csDesigning in ComponentState) then Application.HintShortPause := Value; end; procedure TJvAppEvents.SetHintHidePause(Value: Integer); begin FHintHidePause := Value; if not (csDesigning in ComponentState) then Application.HintHidePause := Value; end; procedure TJvAppEvents.SetShowMainForm(Value: Boolean); begin FShowMainForm := Value; if not (csDesigning in ComponentState) then Application.ShowMainForm := Value; end; {$IFDEF VisualCLX} function TJvAppEvents.GetEffects: TUIEffects; begin Result := TUIEffects(Application.Effects); end; procedure TJvAppEvents.SetEffects(Value: TUIEffects); begin Application.Effects := TAppEffects(Value); end; function TJvAppEvents.GetHintFont: TFont; begin Result := Screen.HintFont; end; procedure TJvAppEvents.SetHintFont(Value: TFont); begin Screen.HintFont := Value; end; {$ENDIF VisualCLX} {$IFDEF VCL} function TJvAppEvents.GetUpdateMetricSettings: Boolean; begin if csDesigning in ComponentState then Result := FUpdateMetricSettings else Result := Application.UpdateMetricSettings; end; procedure TJvAppEvents.SetUpdateMetricSettings(Value: Boolean); begin FUpdateMetricSettings := Value; if not (csDesigning in ComponentState) then Application.UpdateMetricSettings := Value; end; {$ENDIF VCL} function TJvAppEvents.GetHintShortCuts: Boolean; begin if csDesigning in ComponentState then Result := FHintShortCuts else Result := Application.HintShortCuts; end; function TJvAppEvents.GetMouseDragImmediate: Boolean; begin if (csDesigning in ComponentState) or (Mouse = nil) then Result := FMouseDragImmediate else Result := Mouse.DragImmediate; end; function TJvAppEvents.GetMouseDragThreshold: Integer; begin if (csDesigning in ComponentState) or (Mouse = nil) then Result := FMouseDragThreshold else Result := Mouse.DragThreshold; end; procedure TJvAppEvents.SetMouseDragImmediate(Value: Boolean); begin FMouseDragImmediate := Value; if not (csDesigning in ComponentState) and (Mouse <> nil) then Mouse.DragImmediate := Value; end; procedure TJvAppEvents.SetMouseDragThreshold(Value: Integer); begin FMouseDragThreshold := Value; if not (csDesigning in ComponentState) and (Mouse <> nil) then Mouse.DragThreshold := Value; end; procedure TJvAppEvents.SetHintShortCuts(Value: Boolean); begin FHintShortCuts := Value; if not (csDesigning in ComponentState) then Application.HintShortCuts := Value; end; {$IFDEF VCL} function TJvAppEvents.GetBiDiMode: TBiDiMode; begin if csDesigning in ComponentState then Result := FBiDiMode else Result := Application.BiDiMode; end; procedure TJvAppEvents.SetBiDiMode(Value: TBiDiMode); begin FBiDiMode := Value; if not (csDesigning in ComponentState) then Application.BiDiMode := Value; end; function TJvAppEvents.GetBiDiKeyboard: string; begin if csDesigning in ComponentState then Result := FBiDiKeyboard else Result := Application.BiDiKeyboard; end; function TJvAppEvents.GetNonBiDiKeyboard: string; begin if csDesigning in ComponentState then Result := FNonBiDiKeyboard else Result := Application.NonBiDiKeyboard; end; procedure TJvAppEvents.SetBiDiKeyboard(const Value: string); begin FBiDiKeyboard := Value; if not (csDesigning in ComponentState) then Application.BiDiKeyboard := Value; end; procedure TJvAppEvents.SetNonBiDiKeyboard(const Value: string); begin FNonBiDiKeyboard := Value; if not (csDesigning in ComponentState) then Application.NonBiDiKeyboard := Value; end; {$ENDIF VCL} procedure TJvAppEvents.UpdateAppProps; begin if not (csDesigning in ComponentState) then begin with Application do begin HintColor := FHintColor; HintPause := FHintPause; ShowHint := FShowHint; HintShortPause := FHintShortPause; HintHidePause := FHintHidePause; ShowMainForm := FShowMainForm; HintShortCuts := FHintShortCuts; UpdateFormatSettings := FUpdateFormatSettings; {$IFDEF VCL} UpdateMetricSettings := FUpdateMetricSettings; BiDiMode := FBiDiMode; BiDiKeyboard := FBiDiKeyboard; NonBiDiKeyboard := FNonBiDiKeyboard; {$ENDIF VCL} with Mouse do begin DragImmediate := FMouseDragImmediate; DragThreshold := FMouseDragThreshold; end; end; end; end; initialization {$IFDEF UNITVERSIONING} RegisterUnitVersion(HInstance, UnitVersioning); {$ENDIF UNITVERSIONING} finalization AppList.Free; {$IFDEF UNITVERSIONING} UnregisterUnitVersion(HInstance); {$ENDIF UNITVERSIONING} end.