unit uEditorObra;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorDBItem, ToolWin, ComCtrls, JvExControls, JvComponent,
  uViewObra, uBizObras, JvNavigationPane, ActnList,
  uEditorBase, StdActns, TB2Dock, TB2Toolbar, SpTBXItem, ImgList, PngImageList,
  TB2Item, uEditorItem, DB, uDADataTable, uEditorDBBase, JvFormAutoSize,
  uDAScriptingProvider, uDACDSDataTable, StdCtrls, pngimage, ExtCtrls,
  SpTBXDkPanels, JvButton, AppEvnts, uCustomView, uViewBase,
  JvAppStorage, JvAppRegistryStorage, JvFormPlacement, JvComponentBase,

  uViewObras, uIEditorObra, uObrasController, JvExComCtrls,
  JvStatusBar, dxLayoutLookAndFeels, uDAInterfaces, dxGDIPlusClasses,
  cxControls, cxContainer, cxEdit, cxLabel, uViewDetallesGenerico,
  uViewListaEjecucionesObra, uViewEjecucionObra, Grids, DBGrids;

type
  TfEditorObra = class(TfEditorDBItem, IEditorObra)
    dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList;
    dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel;
    pagEjecucionActual: TTabSheet;
    pagListaEjecuciones: TTabSheet;
    frViewListaEjecucionesObra1: TfrViewListaEjecucionesObra;
    actNuevaEjecucion: TAction;
    actFinalizarEjecucion: TAction;
    TBXSubmenuItem2: TSpTBXSubmenuItem;
    TBXItem7: TSpTBXItem;
    TBXItem33: TSpTBXItem;
    dsEjecucionActiva: TDADataSource;
    TBXItem34: TSpTBXItem;
    TBXItem35: TSpTBXItem;
    procedure FormShow(Sender: TObject);
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
    procedure actNuevaEjecucionExecute(Sender: TObject);
    procedure actNuevaEjecucionUpdate(Sender: TObject);
    procedure actFinalizarEjecucionExecute(Sender: TObject);
    procedure actFinalizarEjecucionUpdate(Sender: TObject);
    procedure pgPaginasChange(Sender: TObject);
  protected
    FController : IObrasController;
    FObra: IBizObra;
    FViewObra : IViewObra;
    FViewEjecucionActual: IViewEjecucionObra;

    function GetController : IObrasController;
    procedure SetController (const Value : IObrasController); virtual;
    function GetObra: IBizObra; virtual;
    procedure SetObra(const Value: IBizObra); virtual;
    function GetViewObra: IViewObra;
    procedure SetViewObra(const Value: IViewObra);
    property ViewObra: IViewObra read GetViewObra write SetViewObra;

    procedure GuardarInterno; override;
    procedure EliminarInterno; override;

    procedure PonerTitulos(const ATitulo: string = ''); override;
    procedure ActualizarPestanas;

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

  public
    property Obra: IBizObra read GetObra write SetObra;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

{$R *.dfm}

uses
  uCustomEditor, uDataModuleObras, uDataModuleBase, uDialogUtils;

function ShowEditorObra (ABizObject : TDADataTableRules): TModalResult;
var
  AEditor: TfEditorObra;
begin
  AEditor := TfEditorObra.Create(Application);
  try
    AEditor.Obra := (ABizObject as IBizObra);
    Result := AEditor.ShowModal;
  finally
    AEditor.Release;
  end;
end;

{
******************************* TfEditorObra *******************************
}
function TfEditorObra.GetObra: IBizObra;
begin
  Result := FObra;
end;

function TfEditorObra.GetController: IObrasController;
begin
  Result := FController;
end;

function TfEditorObra.GetViewObra: IViewObra;
begin
  Result := FViewObra;
end;

procedure TfEditorObra.GuardarInterno;
{var
  FPresupuestos : IBizEjecucionPresupuestos;}
begin
  inherited;

{  FPresupuestos := NIL;
  if Assigned(FViewEjecucionActual) then
    FPresupuestos := FViewEjecucionActual.Presupuestos;}

  FController.Guardar(FObra);
  Modified := False;
end;

procedure TfEditorObra.pgPaginasChange(Sender: TObject);
begin
  inherited;
  if pgPaginas.ActivePage = pagEjecucionActual then
  begin
    if FObra.Ejecuciones.State in dsEditModes then
      FObra.Ejecuciones.Post;

    FController.LocalizarEjecucionActiva(FObra.Ejecuciones)
  end
  else
    if pgPaginas.ActivePage = pagListaEjecuciones then
      FObra.Ejecuciones.First;
end;

procedure TfEditorObra.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  if Assigned(Obra) then
  begin
    if Obra.EsNuevo then
      FTitulo := 'Nueva obra'
    else
      FTitulo := 'Obra'  + ' - ' + Obra.NOMBRE;
  end;

  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorObra.SetObra(const Value: IBizObra);
begin
  FObra := Value;
  dsDataTable.DataTable := FObra.DataTable;

  if Assigned(FViewObra) and Assigned(FObra) then
  begin
    FViewObra.Obra := FObra;
    dsEjecucionActiva.DataTable := FObra.Ejecuciones.DataTable;
    frViewListaEjecucionesObra1.Obra := FObra;
    frViewListaEjecucionesObra1.Controller := FController;

    if FController.LocalizarEjecucionActiva(FObra.Ejecuciones) then
      AsignarVistaEjecucion
  end
  else begin
    FViewObra.Obra := NIL;
    dsEjecucionActiva.DataTable := NIL;
    frViewListaEjecucionesObra1.Obra := NIL;
  end;
  ActualizarPestanas;
end;

procedure TfEditorObra.SetController(const Value: IObrasController);
begin
  FController := Value;
  if Assigned(FViewObra) and Assigned(FController) then
     FViewObra.Controller := FController;
end;

procedure TfEditorObra.SetViewObra(const Value: IViewObra);
begin
  FViewObra := Value;

  if Assigned(FViewObra) and Assigned(Obra) then
    FViewObra.Obra := Obra;
end;

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

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

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

  Obra.DataTable.Active := True;
end;

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

procedure TfEditorObra.DestruirVistaEjecucion;
begin
  FViewEjecucionActual := NIL;
end;

procedure TfEditorObra.actFinalizarEjecucionExecute(Sender: TObject);
begin
  if (ShowConfirmMessage('Finalizar la ejecución en curso', 'La ejecución actual pasará a ser histórica. ¿Desea cerrar la ejecución actual de la obra?') = IDYES) then
  begin
    ShowHourglassCursor;
    try
      FController.CerrarEjecucionActiva(FObra, Now);
      DestruirVistaEjecucion;
      ActualizarPestanas;
      pgPaginas.ActivePageIndex := pagListaEjecuciones.PageIndex;
    finally
      HideHourglassCursor;
    end;
  end;
end;

procedure TfEditorObra.actFinalizarEjecucionUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := not actNuevaEjecucion.Enabled;
end;

procedure TfEditorObra.actNuevaEjecucionExecute(Sender: TObject);
begin
  inherited;

  ShowHourglassCursor;
  try
    FObra.Ejecuciones.Insert;
    AsignarVistaEjecucion;
    ActualizarPestanas;
    pgPaginas.ActivePageIndex := pagEjecucionActual.PageIndex;
  finally
    HideHourglassCursor;
  end;
end;


procedure TfEditorObra.actNuevaEjecucionUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := not pagEjecucionActual.TabVisible;
end;

procedure TfEditorObra.ActualizarPestanas;
begin
  if Assigned(FViewEjecucionActual) then
    pagEjecucionActual.TabVisible := True
  else
    pagEjecucionActual.TabVisible := False;
end;

procedure TfEditorObra.AsignarVista;
var
  AViewObra: TfrViewObra;
begin
  AViewObra := TfrViewObra.Create(Self);
  with AViewObra do
  begin
    Parent := pagGeneral;
    Align := alClient;
    dxLayoutControlObra.LookAndFeel := dxLayoutOfficeLookAndFeel1;
  end;
  ViewObra := AViewObra;
end;

procedure TfEditorObra.AsignarVistaEjecucion;
var
  AViewEjecucion: TfrViewEjecucionObra;
begin
  AViewEjecucion := TfrViewEjecucionObra.Create(NIL);

  with AViewEjecucion do
  begin
    Parent := pagEjecucionActual;
    Align := alClient;
    dxLayoutControlEjecucionObra.LookAndFeel := dxLayoutOfficeLookAndFeel1;
    Controller := FController;
    Obra := FObra;
  end;
  FViewEjecucionActual := AViewEjecucion;
end;

constructor TfEditorObra.Create(AOwner: TComponent);
begin
  inherited;
  pgPaginas.ActivePage := pagGeneral;
  FViewEjecucionActual := NIL;
  AsignarVista;
end;

procedure TfEditorObra.CustomEditorClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  dsDataTable.DataTable := NIL;
  FViewObra := NIL;
  FObra := NIL;
end;

procedure TfEditorObra.EliminarInterno;
begin
  if (ShowConfirmMessage('Eliminar la obra', '¿Desea eliminar esta obra?') = IDYES) then
  begin
    inherited;
    if not FController.Eliminar(FObra) then
      actRefrescar.Execute;
  end;
end;

end.

