unit uEditorMontaje;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorDBItem, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TBX, TB2Item, TB2Dock,
  TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane,
  uViewMontaje, uCustomView, uViewBase, uViewTotales,
  StdCtrls, pngimage, AppEvnts, JvComponentBase,
  uBizMontajes,


  uIEditorMontaje, uMontajesController,
  dxLayoutLookAndFeels, JvExComCtrls, JvStatusBar;


type
  TfEditorMontaje = class(TfEditorDBItem, IEditorMontaje)
    TBXSubmenuItem2: TTBXSubmenuItem;
    TBXItem33: TTBXItem;
    dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList;
    dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel;
    procedure FormShow(Sender: TObject);
    procedure actGuardarExecute(Sender: TObject);
    procedure actEliminarExecute(Sender: TObject);
    procedure frViewMontaje1edtlNombrePropertiesEditValueChanged(
      Sender: TObject);
    procedure dsDataTableDataChange(Sender: TObject; Field: TField);
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
    procedure actPrevisualizarExecute(Sender: TObject);
    procedure actImprimirExecute(Sender: TObject);
    procedure frViewMontajeedtlNombrePropertiesChange(Sender: TObject);

  protected
    FController : IMontajesController;
    FMontaje: IBizMontaje;
    FViewMontaje: IViewMontaje;

    function GetController : IMontajesController;
    procedure SetController (const Value : IMontajesController); virtual;
    function GetMontaje: IBizMontaje;
    procedure SetMontaje(const Value: IBizMontaje); virtual;

    function GetViewMontaje: IViewMontaje;
    procedure SetViewMontaje(const Value: IViewMontaje);
    property ViewMontaje: IViewMontaje read GetViewMontaje write SetViewMontaje;

    procedure OnClienteChanged(Sender : TObject);

    //Si queremos crear otra vista para el editor heredado solo tendriamos que
    //sobreescribir este metodo
    procedure AsignarVista; virtual;

  public
    procedure PonerTitulos(const ATitulo: string = ''); override;
    property Controller : IMontajesController read GetController write SetController;
    property Montaje: IBizMontaje read GetMontaje write SetMontaje;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation
{$R *.dfm}

uses
  cxDBEdit, uBizContactos, uDataModuleUsuarios;


{ TfEditorMontaje }

{
**************************** TfEditorMontaje ****************************
}
constructor TfEditorMontaje.Create(AOwner: TComponent);
begin
  inherited;
  pgPaginas.ActivePageIndex := 0;
  AsignarVista;
end;

procedure TfEditorMontaje.CustomEditorClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  dsDataTable.DataTable := NIL;
  FViewMontaje := NIL;
  FMontaje := NIL;
end;

destructor TfEditorMontaje.Destroy;
begin
  // Utilizar mejor OnClose;
  inherited;
end;

procedure TfEditorMontaje.dsDataTableDataChange(Sender: TObject;
  Field: TField);
begin
  inherited;
  if Assigned(FMontaje) and (not (FMontaje.DataTable.Fetching) or
    not (FMontaje.DataTable.Opening) or not (FMontaje.DataTable.Closing)) then
    PonerTitulos;
end;

procedure TfEditorMontaje.actEliminarExecute(Sender: TObject);
begin
  if (Application.MessageBox('¿Desea borrar este montaje de cliente?', 'Atención', MB_YESNO) = IDYES) then
  begin
    FController.Eliminar(Montaje);
    inherited;
  end;
end;

procedure TfEditorMontaje.actGuardarExecute(Sender: TObject);
begin
  inherited;
  FController.Guardar(FMontaje);
  Modified := False;
end;

procedure TfEditorMontaje.actImprimirExecute(Sender: TObject);
begin
  inherited;
//  FController.Print(FMontaje);
end;

procedure TfEditorMontaje.actPrevisualizarExecute(Sender: TObject);
begin
  inherited;
//  FController.Preview(FMontaje);
end;

procedure TfEditorMontaje.AsignarVista;
var
  AViewMontaje: TfrViewMontaje;
begin
  AViewMontaje := TfrViewMontaje.create(Self);
  with AViewMontaje do
  begin
    Parent := pagGeneral;
    Align := alClient;
    dxLayoutControlMontaje.LookAndFeel := dxLayoutOfficeLookAndFeel1;
  end;
  ViewMontaje := AViewMontaje;
end;

procedure TfEditorMontaje.FormShow(Sender: TObject);
begin
  inherited;

  if not Assigned(FViewMontaje) then
    raise Exception.Create('No hay ninguna vista asignada');

  if not Assigned(Montaje) then
    raise Exception.Create('No hay ningún albarán asignado');

  Montaje.DataTable.Active := True;
end;

procedure TfEditorMontaje.frViewMontaje1edtlNombrePropertiesEditValueChanged(Sender: TObject);
begin
  inherited;
  with (Sender as TcxDBTextEdit) do
    Enabled := (FMontaje.ID <> 0)
end;

procedure TfEditorMontaje.frViewMontajeedtlNombrePropertiesChange(
  Sender: TObject);
begin
  inherited;
  PonerTitulos;
end;

function TfEditorMontaje.GetController: IMontajesController;
begin
  Result := FController;
end;

function TfEditorMontaje.GetMontaje: IBizMontaje;
begin
  Result := FMontaje;
end;

function TfEditorMontaje.GetViewMontaje: IViewMontaje;
begin
  Result := FViewMontaje;
end;

procedure TfEditorMontaje.OnClienteChanged(Sender: TObject);
begin
  FMontaje.Cliente := ViewMontaje.ViewClienteMontaje.Cliente;
end;

procedure TfEditorMontaje.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := ATitulo;
  if (FTitulo = '') and Assigned(Montaje) then
  begin
    if Montaje.EsNuevo then
      FTitulo := 'Nueva Montaje'
    else
      FTitulo := 'Montaje'  + ' - ' + FMontaje.Cliente.Nombre
  end;

  inherited PonerTitulos(FTitulo);

  Self.Caption := FTitulo + ' (' + dmUsuarios.EmpresaActual.NOMBRE + ')';
end;

procedure TfEditorMontaje.SetController(const Value: IMontajesController);
begin
  FController := Value;

  if Assigned(FController) then
     ViewMontaje.ViewClienteMontaje.Controller := Controller.ClienteController;
end;

procedure TfEditorMontaje.SetMontaje(const Value: IBizMontaje);
begin
  FMontaje := Value;

  if Assigned(FMontaje) then
  begin
    dsDataTable.DataTable := FMontaje.DataTable;

    if Assigned(FViewMontaje) then
    begin
      ViewMontaje.ViewClienteMontaje.Cliente := FMontaje.Cliente;
      ViewMontaje.ViewClienteMontaje.OnClienteChanged := OnClienteChanged;
      FViewMontaje.Montaje := FMontaje;
    end;

    Montaje.DataTable.Active := True;
  end;
end;

procedure TfEditorMontaje.SetViewMontaje(const Value: IViewMontaje);
begin
  FViewMontaje := Value;

  if Assigned(FViewMontaje) and Assigned(Montaje) then
    FViewMontaje.Montaje := Montaje;
end;

end.
