unit uViewDatosYSeleccionPaciente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, StdCtrls, cxControls, cxContainer, cxEdit, cxLabel,
  cxDBLabel, ExtCtrls, DB, uDADataTable, uBizContactos,
  ComCtrls, ToolWin, ActnList, ImgList, PngImageList, cxTextEdit, cxDBEdit,
  pngimage, JvExControls, JvComponent, JvButton, JvTransparentButton, Mask,
  DBCtrls,
  uPacientesController, dxLayoutControl, Buttons, uDAInterfaces;
  
type
  IViewDatosYSeleccionPaciente = interface(IViewBase)
    ['{EE8C51BD-618D-4211-A247-6FA9BD8EBFD9}']
    function GetController: IPacientesController;
    procedure SetController(Value: IPacientesController);
    property Controller: IPacientesController read GetController write SetController;

    function GetPaciente: IBizPaciente;
    procedure SetPaciente(Value: IBizPaciente);
    property Paciente: IBizPaciente read GetPaciente write SetPaciente;

    function GetID_Paciente: integer;
    procedure SetID_Paciente(const Value: integer);
    property ID_Paciente: integer read GetID_Paciente write SetID_Paciente;

    function GetOnPacienteChanged : TNotifyEvent;
    procedure SetOnPacienteChanged (const Value : TNotifyEvent);
    property OnPacienteChanged : TNotifyEvent read GetOnPacienteChanged
      write SetOnPacienteChanged;

    function GetMsgElegirPaciente: String;
    procedure SetMsgElegirPaciente(const Value: String);
    property MsgElegirPaciente : String read GetMsgElegirPaciente
      write SetMsgElegirPaciente;
  end;

  TfrViewDatosYSeleccionPaciente = class(TfrViewBase, IViewDatosYSeleccionPaciente)
    DADataSource: TDADataSource;
    ActionList1: TActionList;
    actElegirContacto: TAction;
    actAnadirContacto: TAction;
    actVerContacto: TAction;
    PngImageList: TPngImageList;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item1: TdxLayoutItem;
    edtlNombre: TcxDBTextEdit;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtNIFCIF: TcxDBTextEdit;
    dxLayoutControl1Item3: TdxLayoutItem;
    edtCalle: TcxDBTextEdit;
    dxLayoutControl1Item4: TdxLayoutItem;
    edtPoblacion: TcxDBTextEdit;
    dxLayoutControl1Item5: TdxLayoutItem;
    edtProvincia: TcxDBTextEdit;
    dxLayoutControl1Item6: TdxLayoutItem;
    edtCodigoPostal: TcxDBTextEdit;
    Button1: TBitBtn;
    dxLayoutControl1Item7: TdxLayoutItem;
    Button2: TBitBtn;
    dxLayoutControl1Item8: TdxLayoutItem;
    Button3: TBitBtn;
    dxLayoutControl1Item9: TdxLayoutItem;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    procedure actElegirContactoExecute(Sender: TObject);
    procedure actAnadirContactoExecute(Sender: TObject);
    procedure actVerContactoExecute(Sender: TObject);
    procedure actVerContactoUpdate(Sender: TObject);
  private
    FController : IPacientesController;
    FPaciente : IBizPaciente;
    FOnPacienteChanged : TNotifyEvent;
    FMsgElegirPaciente : String;
  protected
    function GetController: IPacientesController;
    procedure SetController(Value: IPacientesController);
    function GetPaciente: IBizPaciente;
    procedure SetPaciente(Value: IBizPaciente);
    function GetOnPacienteChanged : TNotifyEvent;
    procedure SetOnPacienteChanged (const Value : TNotifyEvent);
    function GetMsgElegirPaciente: String;
    procedure SetMsgElegirPaciente(const Value: String);
    procedure SetReadOnly(Value: Boolean); override;
    function GetID_Paciente: integer;
    procedure SetID_Paciente(const Value: integer);

    procedure ElegirPacienteInternal; virtual;
    procedure VerFichaPacienteInternal; virtual;
    procedure NuevoPacienteInternal; virtual;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property MsgElegirPaciente : String read GetMsgElegirPaciente write SetMsgElegirPaciente;
    property Controller: IPacientesController read GetController write SetController;
    property Paciente: IBizPaciente read GetPaciente write SetPaciente;
    property ID_Paciente: integer read GetID_Paciente write SetID_Paciente;
    property OnPacienteChanged : TNotifyEvent read GetOnPacienteChanged write SetOnPacienteChanged;
  end;

implementation

{$R *.dfm}

uses
  uDataModulePacientes, Math;

procedure TfrViewDatosYSeleccionPaciente.actElegirContactoExecute(Sender: TObject);
begin
  inherited;
  ElegirPacienteInternal;
end;

procedure TfrViewDatosYSeleccionPaciente.actAnadirContactoExecute(
  Sender: TObject);
begin
  inherited;
  NuevoPacienteInternal
end;

procedure TfrViewDatosYSeleccionPaciente.actVerContactoExecute(Sender: TObject);
begin
  inherited;
  VerFichaPacienteInternal;
end;

procedure TfrViewDatosYSeleccionPaciente.actVerContactoUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (Length(edtlNombre.Text) > 0);
end;

constructor TfrViewDatosYSeleccionPaciente.Create(AOwner: TComponent);
begin
  inherited;
  FMsgElegirPaciente := '';
  FController := NIL;  
end;

destructor TfrViewDatosYSeleccionPaciente.Destroy;
begin
  FController := NIL;
  inherited;
end;

procedure TfrViewDatosYSeleccionPaciente.ElegirPacienteInternal;
var
  APaciente : IBizPaciente;
begin
  inherited;
  APaciente := (Controller.ElegirContacto(Controller.BuscarTodos,
    FMsgElegirPaciente, False) as IBizPaciente);

  if Assigned(APaciente) then
  begin
    Self.Update;
    ShowHourglassCursor;
    try
      Paciente := APaciente;
    finally
      HideHourglassCursor;
    end;
  end;
end;

function TfrViewDatosYSeleccionPaciente.GetPaciente: IBizPaciente;
begin
  Result := FPaciente;
end;

procedure TfrViewDatosYSeleccionPaciente.NuevoPacienteInternal;
var
  APaciente : IBizPaciente;
begin
  inherited;
  APaciente := (Controller.Nuevo as IBizPaciente);
  Controller.Ver(APaciente);
  Paciente := APaciente;
end;

function TfrViewDatosYSeleccionPaciente.GetController: IPacientesController;
begin
  if not Assigned(FController) then
    FController := TPacientesController.Create;
  Result := FController;
end;

function TfrViewDatosYSeleccionPaciente.GetID_Paciente: integer;
begin
  Result := -1;
  if Assigned(FPaciente) then
    Result := FPaciente.ID;
end;

function TfrViewDatosYSeleccionPaciente.GetMsgElegirPaciente: String;
begin
  Result := FMsgElegirPaciente;
end;

procedure TfrViewDatosYSeleccionPaciente.SetPaciente(Value: IBizPaciente);
begin
  FPaciente := Value;
  if Assigned(FPaciente) then
  begin
    DADataSource.DataTable := FPaciente.DataTable;
    if not FPaciente.DataTable.Active then
      FPaciente.DataTable.Active := True;
  end
  else
    DADataSource.DataTable := NIL;

  if Assigned(FOnPacienteChanged) then
    FOnPacienteChanged(Self);
end;

procedure TfrViewDatosYSeleccionPaciente.SetReadOnly(Value: Boolean);
begin
  inherited;

  if (csLoading in Self.ComponentState) then
    Exit;

  actAnadirContacto.Enabled := not ReadOnly;
  actElegirContacto.Enabled := not ReadOnly;
end;

procedure TfrViewDatosYSeleccionPaciente.VerFichaPacienteInternal;
begin
  Controller.Ver(Paciente);
end;

procedure TfrViewDatosYSeleccionPaciente.SetController(Value: IPacientesController);
begin
  if Assigned(FController) then
    FController := NIL;

  FController := Value;
end;

procedure TfrViewDatosYSeleccionPaciente.SetID_Paciente(const Value: integer);
begin
  Self.Paciente := IBizPaciente(Controller.Buscar(Value));
end;

procedure TfrViewDatosYSeleccionPaciente.SetMsgElegirPaciente(
  const Value: String);
begin
  FMsgElegirPaciente := Value;
end;

function TfrViewDatosYSeleccionPaciente.GetOnPacienteChanged: TNotifyEvent;
begin
  Result := FOnPacienteChanged;
end;

procedure TfrViewDatosYSeleccionPaciente.SetOnPacienteChanged(
  const Value: TNotifyEvent);
begin
  FOnPacienteChanged := Value;
end;

end.
