{%MainUnit ../forms.pp}
{******************************************************************************
                          TApplicationProperties
 ******************************************************************************

 *****************************************************************************
  This file is part of the Lazarus Component Library (LCL)

  See the file COPYING.modifiedLGPL.txt, included in this distribution,
  for details about the license.
 *****************************************************************************
}

procedure TApplicationProperties.SetOnModalBegin(const AValue: TNotifyEvent);
begin
  if (TMethod(FOnModalBegin).Data = TMethod(AValue).Data) and
     (TMethod(FOnModalBegin).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnModalBegin) then
    Application.RemoveOnModalBeginHandler(FOnModalBegin);
  FOnModalBegin := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnModalBegin) then
    Application.AddOnModalBeginHandler(FOnModalBegin);
end;

procedure TApplicationProperties.SetOnModalEnd(const AValue: TNotifyEvent);
begin
  if (TMethod(FOnModalEnd).Data = TMethod(AValue).Data) and
     (TMethod(FOnModalEnd).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnModalEnd) then
    Application.RemoveOnModalEndHandler(FOnModalEnd);
  FOnModalEnd := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnModalEnd) then
    Application.AddOnModalEndHandler(FOnModalEnd);
end;

procedure TApplicationProperties.SetOnGetMainFormHandle(const AValue: TGetHandleEvent);
begin
  if (TMethod(FOnGetMainFormHandle).Data = TMethod(AValue).Data) and
     (TMethod(FOnGetMainFormHandle).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnGetMainFormHandle) then
    Application.RemoveOnGetMainFormHandleHandler(FOnGetMainFormHandle);
  FOnGetMainFormHandle := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnGetMainFormHandle) then
    Application.AddOnGetMainFormHandleHandler(FOnGetMainFormHandle);
end;

procedure TApplicationProperties.SetOnActivate(AValue: TNotifyEvent);
begin
  if (TMethod(FOnActivate).Data = TMethod(AValue).Data) and
     (TMethod(FOnActivate).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnActivate) then
    Application.RemoveOnActivateHandler(FOnActivate);
  FOnActivate := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnActivate) then
    Application.AddOnActivateHandler(FOnActivate);
end;

procedure TApplicationProperties.SetOnDeactivate(AValue: TNotifyEvent);
begin
  if (TMethod(FOnDeactivate).Data = TMethod(AValue).Data) and
     (TMethod(FOnDeactivate).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnDeactivate) then
    Application.RemoveOnDeactivateHandler(FOnDeactivate);
  FOnDeactivate := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnDeactivate) then
    Application.AddOnDeactivateHandler(FOnDeactivate);
end;

procedure TApplicationProperties.SetExceptionDialog(
  AValue: TApplicationExceptionDlg);
begin
  if FExceptionDialogType=AValue then
    Exit;
  if not (csDesigning in ComponentState) then
    Application.ExceptionDialog := AValue;
end;

procedure TApplicationProperties.SetCaptureExceptions(const AValue : boolean);
begin
  FCaptureExceptions := AValue;

  if not (csDesigning in ComponentState) then
    Application.CaptureExceptions := AValue;
end;

procedure TApplicationProperties.SetHelpFile(const AValue : string);
begin
  FHelpFile := AValue;

  if not (csDesigning in ComponentState) then
    Application.HelpFile := AValue;
end;

procedure TApplicationProperties.SetHint(const AValue : string);
begin
  FHint := AValue;

  if not (csDesigning in ComponentState) then
    Application.Hint := AValue;
end;

procedure TApplicationProperties.SetHintColor(const AValue : TColor);
begin
  FHintColor := AValue;

  if not (csDesigning in ComponentState) then
    Application.HintColor := AValue;
end;

procedure TApplicationProperties.SetHintHidePause(const AValue : Integer);
begin
  FHintHidePause := AValue;

  if not (csDesigning in ComponentState) then
    Application.HintHidePause := AValue;
end;

procedure TApplicationProperties.SetHintPause(const AValue : Integer);
begin
  FHintPause := AValue;

  if not (csDesigning in ComponentState) then
    Application.HintPause := AValue;
end;

procedure TApplicationProperties.SetHintShortCuts(const AValue : Boolean);
begin
  FHintShortCuts := AValue;

  if not (csDesigning in ComponentState) then
    Application.HintShortCuts := AValue;
end;

procedure TApplicationProperties.SetHintShortPause(const AValue : Integer);
begin
  FHintShortPause := AValue;

  if not (csDesigning in ComponentState) then
    Application.HintShortPause := AValue;
end;

procedure TApplicationProperties.SetShowHint(const AValue : Boolean);
begin
  FShowHint := AValue;

  if not (csDesigning in ComponentState) then
    Application.ShowHint := AValue;
end;

procedure TApplicationProperties.SetShowMainForm(const AValue: Boolean);
begin
  FShowMainForm:=AValue;

  if not (csDesigning in ComponentState) then
    Application.ShowMainForm := AValue;
end;

procedure TApplicationProperties.SetShowButtonGlyphs(const AValue: TApplicationShowGlyphs);
begin
  FShowButtonGlyphs := AValue;

  if not (csDesigning in ComponentState) then
    Application.ShowButtonGlyphs := AValue;
end;

procedure TApplicationProperties.SetShowMenuGlyphs(const AValue: TApplicationShowGlyphs);
begin
  FShowMenuGlyphs := AValue;

  if not (csDesigning in ComponentState) then
    Application.ShowMenuGlyphs := AValue;
end;

procedure TApplicationProperties.SetTitle(const AValue : String);
begin
  FTitle := AValue;

  if not (csDesigning in ComponentState) then
    Application.Title := AValue;
end;

procedure TApplicationProperties.SetOnException(const AValue : TExceptionEvent);
begin
  if (TMethod(FOnException).Data = TMethod(AValue).Data) and
     (TMethod(FOnException).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnException) then
    Application.RemoveOnExceptionHandler(FOnException);
  FOnException := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnException) then
    Application.AddOnExceptionHandler(FOnException);
end;

procedure TApplicationProperties.SetOnIdle(const AValue : TIdleEvent);
begin
  if (TMethod(FOnIdle).Data = TMethod(AValue).Data) and
     (TMethod(FOnIdle).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnIdle) then
    Application.RemoveOnIdleHandler(FOnIdle);
  FOnIdle := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnIdle) then
    Application.AddOnIdleHandler(FOnIdle);
end;

procedure TApplicationProperties.SetOnIdleEnd(const AValue : TNotifyEvent);
begin
  if (TMethod(FOnIdleEnd).Data = TMethod(AValue).Data) and
     (TMethod(FOnIdleEnd).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnIdleEnd) then
    Application.RemoveOnIdleEndHandler(FOnIdleEnd);
  FOnIdleEnd := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnIdleEnd) then
    Application.AddOnIdleEndHandler(FOnIdleEnd);
end;


procedure TApplicationProperties.SetOnEndSession(const AValue : TNotifyEvent);
begin
  if (TMethod(FOnEndSession).Data = TMethod(AValue).Data) and
     (TMethod(FOnEndSession).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnEndSession) then
    Application.RemoveOnEndSessionHandler(FOnEndSession);
  FOnEndSession := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnEndSession) then
    Application.AddOnEndSessionHandler(FOnEndSession);
end;


procedure TApplicationProperties.SetOnQueryEndSession(const AValue : TQueryEndSessionEvent);
begin
  if (TMethod(FOnQueryEndSession).Data = TMethod(AValue).Data) and
     (TMethod(FOnQueryEndSession).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnQueryEndSession) then
    Application.RemoveOnQueryEndSessionHandler(FOnQueryEndSession);
  FOnQueryEndSession := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnQueryEndSession) then
    Application.AddOnQueryEndSessionHandler(FOnQueryEndSession);
end;

procedure TApplicationProperties.SetOnMinimize(const AValue: TNotifyEvent);
begin
  if (TMethod(FOnMinimize).Data = TMethod(AValue).Data) and
     (TMethod(FOnMinimize).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnMinimize) then
    Application.RemoveOnMinimizeHandler(FOnMinimize);
  FOnMinimize := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnMinimize) then
    Application.AddOnMinimizeHandler(FOnMinimize);
end;

procedure TApplicationProperties.SetOnRestore(const AValue: TNotifyEvent);
begin
  if (TMethod(FOnRestore).Data = TMethod(AValue).Data) and
     (TMethod(FOnRestore).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnRestore) then
    Application.RemoveOnRestoreHandler(FOnRestore);
  FOnRestore := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnRestore) then
    Application.AddOnRestoreHandler(FOnRestore);
end;

procedure TApplicationProperties.SetOnDropFiles(const AValue: TDropFilesEvent);
begin
  if (TMethod(FOnDropFiles).Data = TMethod(AValue).Data) and
     (TMethod(FOnDropFiles).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnDropFiles) then
    Application.RemoveOnDropFilesHandler(FOnDropFiles);
  FOnDropFiles := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnDropFiles) then
    Application.AddOnDropFilesHandler(FOnDropFiles);
end;

procedure TApplicationProperties.SetOnHelp(const AValue : THelpEvent);
begin
  if (TMethod(FOnHelp).Data = TMethod(AValue).Data) and
     (TMethod(FOnHelp).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnHelp) then
    Application.RemoveOnHelpHandler(FOnHelp);
  FOnHelp := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnHelp) then
    Application.AddOnHelpHandler(FOnHelp);
end;

procedure TApplicationProperties.SetOnHint(const AValue : TNotifyEvent);
begin
  if (TMethod(FOnHint).Data = TMethod(AValue).Data) and
     (TMethod(FOnHint).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnHint) then
    Application.RemoveOnHintHandler(FOnHint);
  FOnHint := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnHint) then
    Application.AddOnHintHandler(FOnHint);
end;

procedure TApplicationProperties.SetOnShowHint(const AValue : TShowHintEvent);
begin
  if (TMethod(FOnShowHint).Data = TMethod(AValue).Data) and
     (TMethod(FOnShowHint).Code = TMethod(AValue).Code) then Exit;
  if not (csDesigning in ComponentState) and Assigned(FOnShowHint) then
    Application.RemoveOnShowHintHandler(FOnShowHint);
  FOnShowHint := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnShowHint) then
    Application.AddOnShowHintHandler(FOnShowHint);
end;

procedure TApplicationProperties.SetOnUserInput(const AValue : TOnUserInputEvent);
begin
  if (TMethod(FOnUserInput).Data = TMethod(AValue).Data) and
     (TMethod(FOnUserInput).Code = TMethod(AValue).Code) then exit;
  if not (csDesigning in ComponentState) and Assigned(FOnUserInput) then
    Application.RemoveOnUserInputHandler(FOnUserInput);
  FOnUserInput := AValue;
  if not (csDesigning in ComponentState) and Assigned(FOnUserInput) then
    Application.AddOnUserInputHandler(FOnUserInput);
end;

constructor TApplicationProperties.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  if (csDesigning in ComponentState) then
  begin
    FCaptureExceptions := True;
    FHintColor := DefHintColor;
    FHintPause := DefHintPause;
    FHintShortCuts := True;
    FHintShortPause := DefHintShortPause;
    FHintHidePause := DefHintHidePause;
    FShowButtonGlyphs := sbgAlways;
    FShowMenuGlyphs := sbgAlways;
    FShowHint := True;
  end
  else
  begin
    FCaptureExceptions := Application.CaptureExceptions;
    FHelpFile := Application.HelpFile;
    FHint := Application.Hint;
    FHintColor := Application.HintColor;
    FHintHidePause := Application.HintHidePause;
    FHintPause := Application.HintPause;
    FHintShortCuts := Application.HintShortCuts;
    FHintShortPause := Application.HintShortPause;
    FShowButtonGlyphs := Application.ShowButtonGlyphs;
    FShowMenuGlyphs := Application.ShowMenuGlyphs;
    FShowHint := Application.ShowHint;
    FTitle := Application.Title;
  end;
  FShowMainForm := True;

  FOnActivate := nil;
  FOnDeactivate := nil;
  FOnException := nil;
  FOnGetMainFormHandle := nil;
  FOnIdle := nil;
  FOnIdleEnd := nil;
  FOnHelp := nil;
  FOnHint := nil;
  FOnShowHint := nil;
  FOnUserInput := nil;
  FOnEndSession := nil;
  FOnQueryEndSession := nil;
  FOnMinimize := nil;
  FOnModalBegin := nil;
  FOnModalEnd := nil;
  FOnRestore := nil;
  FOnDropFiles := nil;
end;

destructor TApplicationProperties.Destroy;
begin
  if not (csDesigning in ComponentState) then
  begin
    Application.RemoveOnActivateHandler(FOnActivate);
    Application.RemoveOnDeactivateHandler(FOnDeactivate);
    Application.RemoveOnExceptionHandler(FOnException);
    Application.RemoveOnGetMainFormHandleHandler(FOnGetMainFormHandle);
    Application.RemoveOnIdleHandler(FOnIdle);
    Application.RemoveOnIdleEndHandler(FOnIdleEnd);
    Application.RemoveOnEndSessionHandler(FOnEndSession);
    Application.RemoveOnQueryEndSessionHandler(FOnQueryEndSession);
    Application.RemoveOnMinimizeHandler(FOnMinimize);
    Application.RemoveOnModalBeginHandler(FOnModalBegin);
    Application.RemoveOnModalEndHandler(FOnModalEnd);
    Application.RemoveOnRestoreHandler(FOnRestore);
    Application.RemoveOnDropFilesHandler(FOnDropFiles);
    Application.RemoveOnHelpHandler(FOnHelp);
    Application.RemoveOnHintHandler(FOnHint);
    Application.RemoveOnShowHintHandler(FOnShowHint);
    Application.RemoveOnUserInputHandler(FOnUserInput);
  end;
//AG Application.RemoveAllHandlersOfObject(Self); "Self" is wrong, because Events is owner's methods
  inherited Destroy;
end;

// included by forms.pp
