unit AppDocument;

{ V této unitě je implementována třída TAppDocument, odvozená ze třídy
  TDocument. Ani jedna z těchto tříd čistě teoreticky není vůbec potřeba, ale
  jsou zde z historických a osobních důvodů -- celý projekt je totiž
  odvozen z obecné šablony programu pracujícího s dokumenty, kterou jsem si
  napsal už někdy dávno.

  Tato šablona obsahuje právě třídy Document, AppDocument a hlavní formulář
  s obsluhou všech základních událostí (uložení/otevření souboru apod.).
  V typické aplikaci založené na mé šabloně je v této unitě výkonná část
  programu.

  Celý kód The Life! je jen velkým rozšířením této šablony. Proto jsou zde
  možná trochu matoucí kusy kódu, které skoro nic nedělají, jako třeba tato
  unita. Jejich účel je především v tom, aby všechny mé apliakce pracující se
  soubory vypadaly v zásadě velmi podobně a lépe jsem se v nich vyznal. }

interface

uses
  Document, Graphics, VLFObjects, Classes;

type
  TAppDocument = class(TDocument)
  private
    FEnv: TEnv;
  public
    property Env: TEnv read FEnv;

    procedure New; override;
    procedure Load; override;
    procedure Save; override;
    procedure Print; override;

    constructor Create;
    destructor Destroy; override;
  end;

implementation

uses
  Windows, Forms, SysUtils, VLFSplashScreen, VLFNewForm;

const
  DefaultEnvWidth  = 256; // defautlní šířka prostředí
  DefaultEnvHeight = 256; // defautlní výška prostředí

procedure TAppDocument.New;
var
  Width, Height: Integer;
begin
  Width := NewForm.WidthUpDown.Position;
  Height := NewForm.HeightUpDown.Position;
  FEnv.Reset(Width, Height);
end;

procedure TAppDocument.Load;
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead);
  try
    FEnv.UnSerialize(Stream,filename);
  finally
    Stream.Free;
  end;
end;

procedure TAppDocument.Save;
var
  Stream: TFileStream;
begin
  if not fileexists(filename) then
    FileClose(FileCreate(filename));
  Stream := TFileStream.Create(FileName, fmOpenWrite);
  try
    stream.size:=0;
    FEnv.Serialize(Stream,filename);
  finally
    Stream.Free;
  end;
end;

procedure TAppDocument.Print;
begin
  // neumíme
end;

constructor TAppDocument.Create;
begin
  inherited Create;
  FEnv := TEnv.Create(DefaultEnvWidth, DefaultEnvHeight, SplashScreen.EnvLoadPlugin);
end;

destructor TAppDocument.Destroy;
begin
  FEnv.Free;
  inherited Destroy;
end;

end.
