{------------------------------------------------------------------------------}
{
   Unit Name: prgsetextra
   Purpose  : Set programs to extra components
   Author   : Vesa Lappalainen
   Date     : 24.08.00
   Changed  :

   ToDo     :
}
{------------------------------------------------------------------------------}

unit prgsetextra;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,PrgSteps, kExtraCtl,  kinicomp, ExtCtrls, kComp, KParam;

type

  TExtraCValue = class
    CompName:string;
    FormName:string;
//    fi,ci,
    FuncInd : integer;
    ProgName : string;
  private
  public
    constructor Create(); virtual;
    destructor Destroy; override;
    function ToStr : string; virtual;
    procedure FromStr(const s:string); virtual;
  end;

  TStepSetExtraProg = class (TStepBasic)
    Extra : TExtraCValue;
  public
    constructor Create; override;
    destructor Destroy; override;
    function Ask:boolean; override;
    function Name : string; override;
    function Expl : string; override;
    function GetStr : string; override;
    procedure SetStr(const s:string); override;
    procedure Init(var v:TStepValue); override;
    function DoJob(var v:TStepValue) : integer; override;
  end;


  TFormAskSetExtraProg = class(TForm)
    ButtonOK: TButton;
    ButtonCancel: TButton;
    CBForm: TComboBox;
    CBFunction: TComboBox;
    CBComp: TComboBox;
    LabelFunction: TLabel;
    LabelCurrentLabel: TLabel;
    LabelCurrent: TLabel;
    CBPrograms: TComboBox;
    LabelProgram: TLabel;
    procedure CBFormChange(Sender: TObject);
    procedure CBCompChange(Sender: TObject);
    procedure CBFunctionChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


implementation
{$R *.DFM}
uses KFormPrg,kstring,kdouble, prgparam, prgprog, findcomp;


function DoAskExtra(const q:string;c:TExtraCValue;p:TStepBasic):boolean;
var FormAsk: TFormAskSetExtraProg; i:integer;
begin
  FormAsk := TFormAskSetExtraProg.Create(NIL);
  FillComboWithForms(FormAsk.CBForm,TForm);
  i := FormAsk.CBForm.Items.IndexOf(c.FormName);
  FormAsk.CBForm.Text := c.FormName;
  FormAsk.CBForm.ItemIndex := i;
  FormAsk.CBFormChange(nil);

  i := FormAsk.CBComp.Items.IndexOf(c.CompName);
  FormAsk.CBComp.Text := c.CompName;
  FormAsk.CBComp.ItemIndex := i;
  FormAsk.CBCompChange(nil);

  if ( c.FuncInd <= FormAsk.CBFunction.Items.Count ) then
    FormAsk.CBFunction.ItemIndex := c.FuncInd;
  FormAsk.CBFunctionChange(nil);

  FormAsk.Caption := q;

  p.steps.FillCombo(FormAsk.CBPrograms,TStepProgram,['']);
  FormAsk.CBPrograms.Text := c.ProgName;

  Result := false;
  CenterForm(FormAsk,'ButtonOK');
  if ( FormAsk.ShowModal <> mrCancel ) then begin
    Result := true;
    c.FuncInd := FormAsk.CBFunction.ItemIndex;
    c.CompName := FormAsk.CBComp.Text;
    c.FormName := FormAsk.CBForm.Text;
    c.ProgName := FormAsk.CBPrograms.Text;
//    FindAppComponent(c.FormName+'.'+c.ParamName,c.fi,c.ci);
//    FindAppComponent(c.FormName,c.ParamName,c.fi,c.ci);
  end;
  FormAsk.Free;
end;

procedure TFormAskSetExtraProg.CBFormChange(Sender: TObject);
var form:TComponent;
begin
  form := Application.FindComponent(CBForm.Text);
  if not ( form is TForm ) then exit;
  FillExtraControls(TForm(form),CBComp.Items);
  if CBComp.Items.Count > 0 then
    CBComp.ItemIndex := 0;
  CbCompChange(nil);  
end;

procedure TFormAskSetExtraProg.CBCompChange(Sender: TObject);
begin
  if ( CbComp.ItemIndex < 0 ) then begin
    CbFunction.Text := '';
    Exit;
  end;

  FillExtraExplanations(CbComp.Items.Objects[CbComp.ItemIndex],CbFunction.Items);
  if CbFunction.Items.Count > 0 then
    CbFunction.ItemIndex := 0
  else
    CbFunction.Text := '';
  CbFunctionChange(nil);  
end;

procedure TFormAskSetExtraProg.CBFunctionChange(Sender: TObject);
var c : TObject;
begin
  LabelCurrent.Caption := '';
  if ( CbComp.ItemIndex < 0 ) then begin
    CbFunction.Text := '';
    Exit;
  end;

  c := CbComp.Items.Objects[CbComp.ItemIndex];
  LabelCurrent.Caption := GetCurrentExtraProgram(c,CbFunction.ItemIndex);

end;

//-----------------------------------------------------------------------------
// TExtraCValue
//-----------------------------------------------------------------------------

destructor TExtraCValue.Destroy;
begin
  inherited;
end;

function TExtraCValue.ToStr : string;
begin
  Result := FormName + '.' + CompName + '.' + IntToStr(FuncInd) + ' ' + ProgName;
end;

//-----------------------------------------------------------------------------
procedure TExtraCValue.FromStr(const s:string);
// FormK2000.CBRearCut.1 RearCutChecked
var n : string;
begin
  Split2Trim(s,' ',n,ProgName);
  FormName := Separate(n,'.');
  CompName := SeparateLast(n,'.');
  FuncInd := StrToIntDef(n,0);
//  FindAppComponent(n,fi,ci);
//  FindAppComponent(FormName,CompName,fi,ci);
end;

//-----------------------------------------------------------------------------
constructor TExtraCValue.Create(); //  virtual;
begin
  inherited Create;
end;


//-----------------------------------------------------------------------------
// TStepCalcParam:
//-----------------------------------------------------------------------------
function TStepSetExtraProg.Ask:boolean; //  override;
begin Result := DoAskExtra('Choose component and program',Extra,self); end;

//-----------------------------------------------------------------------------
function TStepSetExtraProg.Name : string; //  override;
begin Result := 'SetExtraProg'; end;

//-----------------------------------------------------------------------------
function TStepSetExtraProg.Expl : string; //  override;
begin Result := 'Set program to component'; end;

//-----------------------------------------------------------------------------
function TStepSetExtraProg.GetStr : string; //  override;
begin Result := Extra.ToStr(); end;

//-----------------------------------------------------------------------------
procedure TStepSetExtraProg.SetStr(const s:string); //  override;
begin Extra.FromStr(s); end;

//-----------------------------------------------------------------------------
constructor TStepSetExtraProg.Create; //  override;
begin inherited; Extra := TExtraCValue.Create; end;

//-----------------------------------------------------------------------------
destructor TStepSetExtraProg.Destroy; //  override;
begin Extra.Free; inherited; end;

//-----------------------------------------------------------------------------
function TStepSetExtraProg.DoJob(var v:TStepValue) : integer; //  override;
//var s:TCounterLike; r,o1,o2:double;  doset : boolean;
var c : TObject;
begin
  Result := StepOne;
  c := FindAppComponent(Extra.FormName,Extra.CompName);
  if ( c = nil ) then exit;
  SetCurrentExtraProgram(c,Extra.FuncInd,Extra.ProgName,Steps.Form);
end;


//-----------------------------------------------------------------------------
procedure TStepSetExtraProg.Init(var v:TStepValue); //  override;
begin
  inherited;
//  v.ptr := Calc.Counter;
end;



//-----------------------------------------------------------------------------





initialization begin
  StepAdd(TStepSetExtraProg.Create);
end;


end.
