unit MCKReport;

interface

uses KOL, Windows, Messages, Dialogs, Forms, Classes, Controls, Graphics, SysUtils,
     mirror, mckCtrls, KOLReport;

type
  TKOLReport = class( TKOLObj )
  private
    FOnNewBand: TOnEvent;
    FOnPrint: TOnEvent;
    FOnNewPage: TOnEvent;
    FDoubleBufferedPreview: Boolean;
    FDocumentName: String;
    procedure SetOnNewBand(const Value: TOnEvent);
    procedure SetOnNewPage(const Value: TOnEvent);
    procedure SetOnPrint(const Value: TOnEvent);
    procedure SetDoubleBufferedPreview(const Value: Boolean);
    procedure SetDocumentName(const Value: String);
  protected
    function AdditionalUnits: String; override;
    procedure AssignEvents( SL: TStringList; const AName: String ); override;
    procedure SetupFirst( SL: TStringList; const AName, AParent, Prefix: String ); override;
  published
    property OnPrint: TOnEvent read FOnPrint write SetOnPrint;
    property OnNewPage: TOnEvent read FOnNewPage write SetOnNewPage;
    property OnNewBand: TOnEvent read FOnNewBand write SetOnNewBand;
    property DoubleBufferedPreview: Boolean read FDoubleBufferedPreview write SetDoubleBufferedPreview;
    property DocumentName: String read FDocumentName write SetDocumentName;
  end;

  TKOLBand = class( TKOLPanel )
  private
    FFrames: TFrames;
    procedure SetFrames(const Value: TFrames);
  protected
    function SetupParams( const AName, AParent: String ): String; override;
    function AdditionalUnits: String; override;
    function NoDrawFrame: Boolean; override;
    procedure Set_VA(const Value: TVerticalAlign); override;
  public
    constructor Create( AOwner: TComponent ); override;
    procedure Paint; override;
  published
    property Frames: TFrames read FFrames write SetFrames;
  end;

  TKOLReportLabel = class( TKOLLabel )
  private
    FFrames: TFrames;
    procedure SetFrames(const Value: TFrames);
  protected
    function SetupParams( const AName, AParent: String ): String; override;
    function AdditionalUnits: String; override;
    function TypeName: String; override;
    function NoDrawFrame: Boolean; override;
    function AdjustVerticalAlign( Value: TVerticalAlign ): TVerticalAlign; override;
  public
    constructor Create( AOwner: TComponent ); override;
    procedure Paint; override;
    function BorderNeeded: Boolean; override;
  published
    property Frames: TFrames read FFrames write SetFrames;
    property Border;
  end;

procedure Register;

{$R KOLReport.dcr}

implementation

procedure Register;
begin
  RegisterComponents( 'KOLAddons', [ TKOLReport, TKOLBand, TKOLReportLabel ] );
end;

function CalcFrames( const Frames: TFrames ): String;
begin
  Result := '';
  if frLeft in Frames then
    Result := 'frLeft,';
  if frTop in Frames then
    Result := Result + 'frTop,';
  if frRight in Frames then
    Result := Result + 'frRight,';
  if frBottom in Frames then
    Result := Result + 'frBottom,';
  if Result <> '' then
    Delete( Result, Length( Result ), 1 );
  Result := '[' + Result + ']';
end;

type
  TFakeControl = class( TControl )
  public
    property Color;
  end;

{ TKOLReport }

function TKOLReport.AdditionalUnits: String;
begin
  Result := inherited AdditionalUnits + ', KOLReport';
end;

procedure TKOLReport.AssignEvents(SL: TStringList; const AName: String);
begin
  inherited;
  DoAssignEvents( SL, AName, [ 'OnPrint', 'OnNewPage', 'OnNewBand' ],
                             [ @ OnPrint, @ OnNewPage, @ OnNewBand ] );
end;

procedure TKOLReport.SetDocumentName(const Value: String);
begin
  FDocumentName := Value;
  Change;
end;

procedure TKOLReport.SetDoubleBufferedPreview(const Value: Boolean);
begin
  FDoubleBufferedPreview := Value;
  Change;
end;

procedure TKOLReport.SetOnNewBand(const Value: TOnEvent);
begin
  FOnNewBand := Value;
  Change;
end;

procedure TKOLReport.SetOnNewPage(const Value: TOnEvent);
begin
  FOnNewPage := Value;
  Change;
end;

procedure TKOLReport.SetOnPrint(const Value: TOnEvent);
begin
  FOnPrint := Value;
  Change;
end;

procedure TKOLReport.SetupFirst(SL: TStringList; const AName, AParent,
  Prefix: String);
begin
  inherited;
  if DoubleBufferedPreview then
    SL.Add( Prefix + AName + '.DoubleBufferedPreview := TRUE;' );
  if Trim( DocumentName ) <> '' then
    SL.Add( Prefix + AName + '.DocumentName := ' + String2PascalStrExpr( DocumentName ) + ';' );
end;

{ TKOLBand }

function TKOLBand.AdditionalUnits: String;
begin
  Result := inherited AdditionalUnits + ', KOLReport';
end;

constructor TKOLBand.Create(AOwner: TComponent);
begin
  inherited;
  EdgeStyle := esNone;
  if (AOwner <> nil) and (AOwner is TControl) and
     (TFakeControl(AOwner).Color = clWhite) then
  else
  begin
    ParentColor := FALSE;
    Color := clWhite;
  end;
  if (AOwner <> nil) and (AOwner is TControl) and
     (TFakeControl(AOwner).Font.Color = clBlack) and
     (TFakeControl(AOwner).Font.Name = 'Arial') then
  else
  begin
    ParentFont := FALSE;
    Font.Color := clBlack;
    Font.FontName := 'Arial';
  end;
  Width := 400;
  Height := 40;
  Border := 1;
end;

function TKOLBand.NoDrawFrame: Boolean;
begin
  Result := TRUE;
end;

procedure TKOLBand.Paint;
var W, H, B: Integer;
begin
  inherited;
  Canvas.Brush.Color := Font.Color;
  W := ClientWidth;
  H := ClientHeight;
  B := Border;
  if frLeft in Frames then
    Canvas.FillRect( Rect( 0, 0, B, H ) );
  if frTop in Frames then
    Canvas.FillRect( Rect( 0, 0, W, B ) );
  if frRight in Frames then
    Canvas.FillRect( Rect( W - B, 0, W, H ) );
  if frBottom in Frames then
    Canvas.FillRect( Rect( 0, H - B, W, H ) );
end;

procedure TKOLBand.SetFrames(const Value: TFrames);
begin
  FFrames := Value;
  Change;
  Invalidate;
end;

function TKOLBand.SetupParams(const AName, AParent: String): String;
begin
  Result := AParent + ', ' + CalcFrames( Frames );
end;

procedure TKOLBand.Set_VA(const Value: TVerticalAlign);
begin
  fVerticalAlign := Value;
  Change;
  Invalidate;
end;

{ TKOLReportLabel }

function TKOLReportLabel.AdditionalUnits: String;
begin
  Result := inherited AdditionalUnits + ', KOLReport';
end;

function TKOLReportLabel.AdjustVerticalAlign(
  Value: TVerticalAlign): TVerticalAlign;
begin
  Result := Value;
end;

function TKOLReportLabel.BorderNeeded: Boolean;
begin
  Result := TRUE;
end;

constructor TKOLReportLabel.Create(AOwner: TComponent);
begin
  inherited;
  if (AOwner <> nil) and (AOwner is TControl) and
     (TFakeControl(AOwner).Color = clWhite) then
  else
  begin
    ParentColor := FALSE;
    Color := clWhite;
  end;
  if (AOwner <> nil) and (AOwner is TControl) and
     (TFakeControl(AOwner).Font.Color = clBlack) and
     (TFakeControl(AOwner).Font.Name = 'Arial') then
  else
  begin
    ParentFont := FALSE;
    Font.Color := clBlack;
    Font.FontName := 'Arial';
  end;
  Border := 1;
  DefaultAutoSize := TRUE;
  AutoSize := TRUE;
end;

function TKOLReportLabel.NoDrawFrame: Boolean;
begin
  Result := TRUE;
end;

procedure TKOLReportLabel.Paint;
var W, H, B: Integer;
begin
  inherited;
  Canvas.Brush.Color := Font.Color;
  W := ClientWidth;
  H := ClientHeight;
  B := Border;
  if frLeft in Frames then
    Canvas.FillRect( Rect( 0, 0, B, H ) );
  if frTop in Frames then
    Canvas.FillRect( Rect( 0, 0, W, B ) );
  if frRight in Frames then
    Canvas.FillRect( Rect( W - B, 0, W, H ) );
  if frBottom in Frames then
    Canvas.FillRect( Rect( 0, H - B, W, H ) );
end;

procedure TKOLReportLabel.SetFrames(const Value: TFrames);
begin
  FFrames := Value;
  Change;
  Invalidate;
end;

function TKOLReportLabel.SetupParams(const AName, AParent: String): String;
begin
  Result := inherited SetupParams( AName, AParent ) + ', ' + CalcFrames( Frames );
end;

function TKOLReportLabel.TypeName: String;
begin
  if WordWrap then
    Result := 'WordWrapReportLabel'
  else
    Result := 'ReportLabel';
end;

end.
