unit filemgru;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, Buttons;

type
  TProcessingType = (tptBefore, tptDuring, tptAfter);
  TFileManageForm = class(TForm)
    btnDone: TButton;
    OpenDialog1: TOpenDialog;
    ProgressBar1: TProgressBar;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    cbAddWords: TComboBox;
    cbDelWords: TComboBox;
    btnAdd: TButton;
    btnDel: TButton;
    btnClear: TButton;
    btnFile: TButton;
    btnModify: TBitBtn;
    btnImport: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure cbAddRemWordsKeyPress(Sender: TObject; var Key: Char);
    procedure cbAddRemWordsExit(Sender: TObject);
    procedure cbAddRemWordsEnter(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure btnFileClick(Sender: TObject);
    procedure NotBtnsEnter(Sender: TObject);
  private
    { Private declarations }
    WordLen      : Integer;
    Processing   : TProcessingType;
    RecentCB     : TComboBox;
    procedure EnDisProc;
    function GetRecentCB : Boolean;
  public
    { Public declarations }
    procedure SetWordLength(Value : Integer);
  end;

var
  FileManageForm: TFileManageForm;

implementation

CONST C : Char = #13;
{$R *.DFM}

procedure TFileManageForm.SetWordLength(Value : Integer);
begin
  WordLen := Value;
  Caption := Format('Ladder - %d-letter words', [WordLen]);
  cbAddWords.MaxLength := Value;
  cbDelWords.MaxLength := Value;
end;

procedure TFileManageForm.FormCreate(Sender: TObject);
begin
  cbAddWords.Tag := LongInt(cbDelWords);
  cbDelWords.Tag := LongInt(cbAddWords);
  RecentCB       := cbAddWords;
end;

procedure TFileManageForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := Processing <> tptDuring;
end;

procedure TFileManageForm.cbAddRemWordsKeyPress(Sender: TObject;
  var Key: Char);
// Handle keypresses in the two combo boxes
VAR Idx : Integer;
begin
  CASE Key OF
    #8 : btnAdd.Enabled :=
           Length((Sender AS TComboBox).Text)=WordLen+1;
    #32..#255 : begin
      CASE Key OF
        'A'..'Z' : btnAdd.Enabled :=
          Length((Sender AS TComboBox).Text)=WordLen-1;
        'a'..'z' : begin
          Key := UpCase(Key);
          btnAdd.Enabled :=
            Length((Sender AS TComboBox).Text)=WordLen-1;;
        end;
        ELSE Key := #0;
      END;
    end;
  END;
  IF Key = #13 THEN
    WITH Sender AS TComboBox DO
      begin
        IF Length(Text) = WordLen THEN
          begin
            IF Items.IndexOf(Text)=-1 THEN
              begin
                Items.Add(Text);
                btnClear.Enabled := True;
                Idx := TComboBox(Tag).Items.IndexOf(Text);
                IF Idx <> -1 THEN
                  TComboBox(Tag).Items.Delete(Idx);
              end;
            Text := '';
            btnAdd.Enabled := False;
            EnDisProc;
          end;
      end;
end;

procedure TFileManageForm.cbAddRemWordsExit(Sender: TObject);
begin
  btnAdd.Caption   := '&Add';
  btnDel.Caption   := '&Del';
  btnClear.Caption := '&Clear';
  btnFile.Caption  := '&File';
  EnDisProc;
end;

procedure TFileManageForm.cbAddRemWordsEnter(Sender: TObject);
const
  IsAdd : ARRAY[Boolean] OF String = ('','< ');
  IsDel : ARRAY[Boolean] OF String = (' >','');
VAR
  B : Boolean;
begin
  // Next line MAY be superfluous...
  RecentCB         := Sender AS TComboBox;
  B                := Sender = cbAddWords;
  btnAdd.Caption   := IsAdd[B] + '&Add'   + IsDel[B];
  btnDel.Caption   := IsAdd[B] + '&Del'   + IsDel[B];
  btnClear.Caption := IsAdd[B] + '&Clear' + IsDel[B];
  btnFile.Caption  := IsAdd[B] + '&File'  + IsDel[B];
  EnDisProc;
end;

function TFileManageForm.GetRecentCB : Boolean;
begin
  IF ActiveControl IS TComboBox THEN
    RecentCB := TComboBox(ActiveControl);
  Result := RecentCB <> NIL;
end;

procedure TFileManageForm.btnAddClick(Sender: TObject);
begin
  IF GetRecentCB THEN
    begin
      cbAddRemWordsKeyPress(RecentCB, C);
      RecentCB.SetFocus;
    end;
end;

procedure TFileManageForm.btnDelClick(Sender: TObject);
// Remove highlighted word from active combo box
begin
  IF GetRecentCB THEN
    WITH RecentCB DO
      IF ItemIndex > -1 THEN
        begin
          Items.Delete(ItemIndex);
          EnDisProc;
          SetFocus;
        end;
end;

procedure TFileManageForm.btnClearClick(Sender: TObject);
begin
  IF GetRecentCB THEN
    WITH RecentCB DO
      begin
        Clear;
        EnDisProc;
        SetFocus;
      end;
end;

procedure TFileManageForm.btnFileClick(Sender: TObject);
// Add a file of words to active combo box
VAR
  T : TextFile;
  S : String;
  N : Integer;
begin
  IF NOT GetRecentCB THEN Exit;
  IF RecentCB=cbAddWords THEN
    OpenDialog1.Title := 'File of words to Insert'
  ELSE IF RecentCB=cbDelWords THEN
    OpenDialog1.Title := 'File of words to Remove'
  ELSE Exit;
  WITH OpenDialog1 DO
    IF Execute THEN
      begin
        Application.ProcessMessages;
        AssignFile(T, Filename);
        Reset(T);
        WHILE NOT EoF(T) DO
          begin
            ReadLn(T, S);
            FOR N := Length(S) DOWNTO 1 DO
              CASE S[N] OF
                'A'..'Z' : ;
                'a'..'z' : S[N] := UpCase(S[N]);
                ELSE System.Delete(S, N, 1);
              END;
            IF (Length(S) > 0) AND (Length(S) < 32) THEN
              WITH RecentCB DO
                begin
                  Items.Add(S);
                  N := TComboBox(Tag).Items.IndexOf(S);
                  IF N <> -1 THEN
                    TComboBox(Tag).Items.Delete(N);
                end;
          end;
        EnDisProc;
      end;
end;

procedure TFileManageForm.EnDisProc;
begin
  // Process button is enabled if it has not yet been pressed AND
  // there is something to be processed
(*  btnProc.Enabled := (Processing < tptDuring) AND
    (True OR (cbAddWords.Items.Count > 0)
    OR (cbDelWords.Items.Count > 0));*)
  // Done button is enabled except during processing
  btnDone.Enabled := Processing <> tptDuring;
  // Reset button is enabled only after processing
(*  btnReset.Enabled := Processing = tptAfter;*)
  // The four speed buttons are disabled during and after processing,
  // and any time the active controls NOT a TComboBox. Otherwise,
  // each has its own criteria for being enabled
  IF (Processing = tptBefore) AND GetRecentCB THEN
    WITH RecentCB DO
      begin
        btnAdd.Enabled   := Length(Text) > 0;
        btnDel.Enabled   := ItemIndex <> -1;
        btnClear.Enabled := Items.Count > 0;
        btnFile.Enabled  := True;
      end
  ELSE
    begin
      btnAdd.Enabled   := False;
      btnDel.Enabled   := False;
      btnClear.Enabled := False;
      btnFile.Enabled  := False;
    end;
end;

procedure TFileManageForm.NotBtnsEnter(Sender: TObject);
begin
  RecentCB := NIL;
end;


end.
