{%MainUnit ../comctrls.pp}
{******************************************************************************
                                  TCustomProgressBar
 ******************************************************************************

 *****************************************************************************
  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.
 *****************************************************************************
 
  current design flaws:

  - I decided to support some gtk-specific properties in this class. This
    won't break Delphi compatibility but for 100% Delphi compatibility
    a better approach would be to derive another class.
    BTW: When porting to another widget library you can safely ignore

           FBarShowText 
           FBarTextFormat

  - FBarTextFormat is a fixed string by now, hard-coded in the gtk-interface
  - lot's of properties are missing
  - I spend no thought on the usage of type integer for the range for the bar,
    maybe this can cause trouble some day (and already will when FMin < 0!)
}


{------------------------------------------------------------------------------
  Method: TCustomProgressBar.Create
  Params:  AOwner: the owner of the class
  Returns: Nothing

  Constructor for the progressbar.
 ------------------------------------------------------------------------------}
constructor TCustomProgressBar.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  fCompStyle := csProgressBar;
  FPosition  := 0;
  FStep := 10;
  FMin := 0;
  FMax := 100;
  FSmooth := False;
  FOrientation := pbHorizontal;
  FBarShowText := False;
  FBarTextFormat := '%v from [%l-%u] (=%p%%)';
  FStyle := pbstNormal;
  with GetControlClassDefaultSize do
    SetInitialBounds(0, 0, CX, CY);
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.InitializeWnd
  Params: none
  Returns: Nothing

  Set all properties after visual component has been created. Will be called
  from TWinControl.
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.InitializeWnd;
begin
  inherited InitializeWnd;
  ApplyChanges;
end;

procedure TCustomProgressBar.Loaded;
begin
  inherited Loaded;
  ApplyChanges;
end;

class function TCustomProgressBar.GetControlClassDefaultSize: TSize;
begin
  Result.CX := 100;
  Result.CY := 20;
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.GetMin
  Params:  Nothing
  Returns: actual minimum value of the progressbar

  Retrieve the actual minimum value of the progressbar.
 ------------------------------------------------------------------------------}
function TCustomProgressBar.GetMin: Integer;
begin
  Result := FMin;
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.GetMax
  Params:  Nothing
  Returns: actual maximum value of the progressbar

  Retrieve the actual maximum value of the progressbar.
 ------------------------------------------------------------------------------}
function TCustomProgressBar.GetMax: Integer;
begin
  Result := FMax;
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.GetPosition
  Params:  Nothing
  Returns: actual position of the progressbar

  Retrieve the position of the progressbar.
 ------------------------------------------------------------------------------}
function TCustomProgressBar.GetPosition: Integer;
begin
  Result := FPosition;
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetParams
  Params:  Min & Max for the progressbar
  Returns: Nothing

  Set new minimum and maximum values for the progressbar.
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetParams(AMin, AMax: Integer);
begin
  SetMax(AMax);
  SetMin(AMin);
end;


{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetMin
  Params:  Minimum value for the progressbar
  Returns: Nothing

  Set new minimum value for the progressbar.
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetMin(Value: Integer);
begin
  if FMin <> Value then
  begin
    FMin := Value;
    ApplyChanges;
  end;
end;


{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetMax
  Params:  Maximum value for the progressbar
  Returns: Nothing

  Set new maximum value for the progressbar.
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetMax(Value: Integer);
begin
  if FMax <> Value then
  begin
    FMax := Value;
    ApplyChanges;
  end;
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetPosition
  Params:  New acutal position for the progressbar
  Returns: Nothing

  Set new new acutal position for the progressbar
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetPosition(Value: Integer);
begin
  if FPosition <> Value then
  begin
    FPosition := Value;
    ApplyChanges;
  end;
end;


{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetPosition
  Params:  New stepping value for the progressbar
  Returns: Nothing

  Set new stepping value for the progressbar
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetStep(Value: Integer);
begin
  if FStep <> Value then
  begin
    FStep := Value;
    ApplyChanges;
  end;
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetPosition
  Params:  New orientation of the progressbar
  Returns: Nothing

  Set new orientation.
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetOrientation (Value : TProgressBarOrientation);
begin
  if FOrientation <> Value then
  begin
    Forientation := Value;
    ApplyChanges;
  end;
end;

procedure TCustomProgressBar.SetStyle(const AValue: TProgressBarStyle);
begin
  if FStyle <> AValue then
  begin
    FStyle := AValue;
    if HandleAllocated then
      TWSProgressBarClass(WidgetSetClass).SetStyle(Self, AValue);
  end;
end;

class procedure TCustomProgressBar.WSRegisterClass;
begin
  inherited WSRegisterClass;
  RegisterCustomProgressBar;
end;
 
{------------------------------------------------------------------------------
  Method: TCustomProgressBar.StepIt
  Params:  Nothing
  Returns: Nothing

  Let the progressbar proceed from actual position to actualposition + Step
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.StepIt;
begin
  inc(FPosition, FStep);
  if FPosition > FMax then FPosition := FMax;
  if FPosition < FMin then FPosition := FMin;
  if HandleAllocated then
    TWSProgressBarClass(WidgetSetClass).SetPosition(Self, FPosition);
end;


{------------------------------------------------------------------------------
  Method: TCustomProgressBar.StepIt
  Params:  Delta : the value to add to actual position
  Returns: Nothing

  Let the progressbar proceed from actual position to actualposition + Delta

  Implementation detail:
   StepBy is realized by faking the current position to get a solution
   which is independant from the widget set in use.
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.StepBy(Delta: Integer);
begin
  FPosition := FPosition + Delta - FStep;
  StepIt;
end;

{------------------------------------------------------------------------------
  Method: TCustomProgressBar.ApplyChanges
  Params:  Nothing
  Returns: Nothing

  Apply the current parameters to the object
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.ApplyChanges;
begin
  if not (csLoading in ComponentState) then
  begin
    if FMin > Max then FMin := Max;
    if Position < Min then FPosition := Min;
    if Position > Max then FPosition := Max;
    if HandleAllocated then
      TWSProgressBarClass(WidgetSetClass).ApplyChanges(Self);
  end;
end;


{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetSmooth
  Params:  Value : Smoothing on or off
  Returns: Nothing

  Set the style of the progressbar
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetSmooth (Value : boolean);
begin
  if FSmooth <> value then
  begin
    FSmooth := value;
    ApplyChanges;
  end;
end;


{------------------------------------------------------------------------------
  Method: TCustomProgressBar.SetBarShowText
  Params:  Value : ShowText on or off
  Returns: Nothing

  Some widget sets can put a label on the progressbar which shows the
  current position

  Implementation detail:
   This functionality is not Delphi-compatible
 ------------------------------------------------------------------------------}
procedure TCustomProgressBar.SetBarShowText (Value : boolean);
begin
  if FBarShowText <> Value then
  begin
    FBarShowText := Value;
    ApplyChanges;
  end;
end;

// included by comctrls.pp
