unit main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, EditBtn, StdCtrls,
  DBCtrls, DBGrids, ExtCtrls, Buttons, paradoxds, db;

type

  { TMainForm }

  TMainForm = class(TForm)
    Bevel1: TBevel;
    CbFilterField: TComboBox;
    CbFilterValues: TComboBox;
    DataSource: TDataSource;
    DBImage: TDBImage;
    DBMemo: TDBMemo;
    DBGrid: TDBGrid;
    DBNavigator: TDBNavigator;
    DBText: TDBText;
    CbFiltered: TCheckBox;
    LblEqual: TLabel;
    Paradox: TParadoxDataSet;
    BtnSetBookmark: TSpeedButton;
    BtnGotoBookmark: TSpeedButton;
    BtnFilter: TSpeedButton;
    procedure BtnFilterClick(Sender: TObject);
    procedure BtnGotoBookmarkClick(Sender: TObject);
    procedure BtnSetBookmarkClick(Sender: TObject);
    procedure CbFilteredChange(Sender: TObject);
    procedure CbFilterFieldChange(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ParadoxAfterOpen(DataSet: TDataSet);
  private
    FBookmark: TBookmark;
    procedure PopulatePickList;
    procedure UpdateControlStates;

  public

  end;

var
  MainForm: TMainForm;

implementation

{$R *.lfm}

{ TMainForm }

procedure TMainForm.BtnGotoBookmarkClick(Sender: TObject);
begin
  Paradox.GoToBookmark(FBookmark);
end;

procedure TMainForm.BtnFilterClick(Sender: TObject);
begin
  Paradox.Filtered := False;
  if CbFilterValues.Text <> '' then begin
    Paradox.Filter := CbFilterField.Items[CbFilterField.ItemIndex] + ' = ' + QuotedStr(CbFilterValues.Text);
    Paradox.Filtered := true;
  end;
end;

procedure TMainForm.BtnSetBookmarkClick(Sender: TObject);
begin
  FBookmark := Paradox.GetBookmark;
  UpdateControlStates;
end;

procedure TMainForm.CbFilteredChange(Sender: TObject);
begin
  Paradox.Filtered := CbFiltered.Checked;
  UpdateControlStates;
end;

procedure TMainForm.CbFilterFieldChange(Sender: TObject);
begin
  PopulatePickList;
end;

procedure TMainForm.FormActivate(Sender: TObject);
begin
  AutoSize := false;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Paradox.TableName := 'mushrooms.db';
  DBMemo.DataField := 'Notes';
  DBImage.DataField := 'Picture';
  DBText.DataField := 'CommonName';
  DBGrid.Columns[0].FieldName := 'ID';
  DBGrid.Columns[1].FieldName := 'CommonName';
  DBGrid.Columns[2].FieldName := 'ScientificName';
  DBGrid.Columns[3].FieldName := 'Order';
  DBGrid.Columns[4].FieldName := 'Genus';
  Paradox.Open;
end;

procedure TMainForm.ParadoxAfterOpen(DataSet: TDataSet);
begin
  PopulatePickList;
  FBookmark := nil;
  UpdateControlStates;
end;

procedure TMainForm.PopulatePickList;
var
  pdx: TParadoxDataset;
  L: TStrings;
  F: TField;
begin
  L := TStringList.Create;
  try
    pdx := TParadoxDataset.Create(nil);
    try
      pdx.Tablename := Paradox.TableName;
      pdx.Open;
      F := pdx.FieldByName(CbFilterField.Items[CbFilterField.ItemIndex]);
      while not pdx.EoF do begin
        if L.IndexOf(F.AsString) = -1 then
          L.Add(F.AsString);
        pdx.Next;
      end;
      (L as TStringList).Sort;
      CbFilterValues.Items.Assign(L);
      if CbFilterValues.Items.Count > 0 then begin
        if (CbFilterValues.ItemIndex = -1) then
          CbFilterValues.ItemIndex := 0
        else
        if (CbFiltervalues.ItemIndex >= CbFilterValues.Items.Count) then
          CbFilterValues.ItemIndex := CbFilterValues.Items.Count - 1;
      end;
    finally
      pdx.Free;
    end;
  finally
    L.Free;
  end;
end;

procedure TMainForm.UpdateControlStates;
begin
  CbFilterField.Enabled := Paradox.Filtered;
  LblEqual.Enabled := Paradox.Filtered;
  CbFilterValues.Enabled := Paradox.Filtered;
  BtnFilter.Enabled := Paradox.Filtered;
  BtnGotoBookmark.Enabled := Assigned(FBookmark) and Paradox.BookmarkValid(FBookmark);
end;

end.