unit uDialogElegirEMail;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uDialogBase, ActnList, StdCtrls, ExtCtrls, cxControls, cxContainer,
  cxEdit, cxTextEdit, cxHyperLinkEdit;

type
  TfDialogElegirEMail = class(TfDialogBase)
    Panel1: TPanel;
    rbCombo: TRadioButton;
    cbEMail: TComboBox;
    rbEdit: TRadioButton;
    edtEMail: TcxHyperLinkEdit;
    procedure rbComboClick(Sender: TObject);
    procedure rbEditClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure actAceptarExecute(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
  private
    FListaDirecciones: TStringList;
    function GetEMailElegido: String;
    procedure ActualizarOpciones;
    procedure SetListaDirecciones(ALista : TStringList);
  public
    property EMailElegido: String read GetEMailElegido;
    property ListaDirecciones : TStringList read FListaDirecciones write SetListaDirecciones;
  end;


  function ElegirEMail(const AListaEMails : TStringList; var AEMailElegido : String): Boolean;

implementation

{$R *.dfm}

uses
  uStringsUtils, uDialogUtils, uEMailUtils;

function ElegirEMail(const AListaEMails : TStringList; var AEMailElegido : String): Boolean;
var
  AEditor : TfDialogElegirEMail;
begin
  AEditor := TfDialogElegirEMail.Create(NIL);
  try
    AEditor.ListaDirecciones := AListaEMails;
    Result := (AEditor.ShowModal = mrOk);
    if Result then
      AEMailElegido := AEditor.EMailElegido;
  finally
    AEditor.Release;
  end;
end;


{ TfDialogElegirEMail }

procedure TfDialogElegirEMail.actAceptarExecute(Sender: TObject);
begin
  inherited;
  ModalResult := mrOk
end;

procedure TfDialogElegirEMail.actCancelarExecute(Sender: TObject);
begin
  inherited;
  ModalResult := mrCancel;
end;

procedure TfDialogElegirEMail.ActualizarOpciones;
begin
  if rbEdit.Checked then
  begin
    rbCombo.Checked := False;
    cbEMail.Enabled := False;
    edtEMail.Enabled := True;
    edtEMail.SetFocus;
  end
  else begin
    if rbCombo.Enabled then
    begin
      edtEMail.Enabled := False;
      rbEdit.Checked := False;
      cbEMail.Enabled := True;
      cbEMail.ItemIndex := 0;
      cbEMail.SetFocus;      
    end
    else
      rbEdit.Checked := True;
  end;
end;

procedure TfDialogElegirEMail.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  inherited;

  if (ModalResult = mrOk) and rbEdit.Checked then
  begin
    if not EsCadenaVacia(edtEMail.Text) then
    begin
      if not IsValidEmail(edtEMail.Text) then
      begin
        ShowErrorMessage('La dirección de correo electrónica no es válida', 'Para poder continuar, compruebe que ha indicado una dirección de correo y que está bien escrita.');
        edtEMail.SetFocus;
        CanClose := False;
      end;
    end
    else begin
      ShowErrorMessage('Debe indicar una dirección de correo electrónico.', 'Para poder continuar debe elegir o indicar una dirección de correo electrónico.');
      edtEMail.SetFocus;
      CanClose := False;
    end;
  end;
end;

procedure TfDialogElegirEMail.FormCreate(Sender: TObject);
begin
  inherited;
  //FListaDirecciones := TStringList.Create; <- La lista se da mediante la propiedad.
end;

procedure TfDialogElegirEMail.FormDestroy(Sender: TObject);
begin
  inherited;
  //FreeAndNIL(FListaDirecciones) <- La lista se da mediante la propiedad.
end;

procedure TfDialogElegirEMail.FormShow(Sender: TObject);
begin
  inherited;
  cbEMail.Items.Clear;
  cbEMail.Items := FListaDirecciones;

  if cbEMail.Items.Count = 0 then
  begin
    rbCombo.Enabled := False;
    rbEdit.Checked := True
  end
  else
    rbCombo.Checked := True;

  ActualizarOpciones;
end;

function TfDialogElegirEMail.GetEMailElegido: String;
begin
  if rbCombo.Checked then
    Result := cbEMail.Text
  else
    Result := edtEMail.Text;
end;

procedure TfDialogElegirEMail.rbComboClick(Sender: TObject);
begin
  inherited;
  rbEdit.Checked := False;
  ActualizarOpciones;
end;

procedure TfDialogElegirEMail.rbEditClick(Sender: TObject);
begin
  inherited;
  rbEdit.Checked := True;
  ActualizarOpciones;
end;

procedure TfDialogElegirEMail.SetListaDirecciones(ALista: TStringList);
var
  i : integer;
begin
  FListaDirecciones := ALista;
  for i := FListaDirecciones.count - 1 downto 0 do
  begin
    if Trim(FListaDirecciones[i]) = '' then
      FListaDirecciones.Delete(i);
  end;
end;

end.
