{
===============================================================================
  Copyright (©) 2006. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 22-05-2006
  Versión actual: 1.0.0
  Fecha versión actual: 22-05-2006
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit uEditorObra;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorItem, ToolWin, ComCtrls, JvExControls, JvComponent,
  JvNavigationPane, ActnList, uEditorBase, StdActns, TB2Dock, TB2Toolbar,
  TBX, ImgList, PngImageList, TB2Item, uViewObra, uBizObra, uEditorDBItem,
  DB, uDADataTable, uViewGrid, uCustomView, uViewBase, Grids, DBGrids, StdCtrls, dxLayoutLookAndFeels,
  JvAppStorage, JvAppRegistryStorage, JvFormPlacement, ExtCtrls,
  uViewContactosObra, JvComponentBase, uViewPresupuestosObra,
  uViewTrabajosObra, uViewDocumentosAsociados, cxGridCustomTableView,
  dxLayoutControl, cxControls, Menus;

type
  IEditorObra = interface(IEditorDBItem)
  ['{5ED7D648-C211-48A3-AE53-4B3D925ADBC9}']
  end;

  TfEditorObra = class(TfEditorDBItem, IEditorObra)
    pagContactos: TTabSheet;
    frViewObra: TfrViewObra;
    pagPresupuestos: TTabSheet;
    pagTrabajos: TTabSheet;
    pagNormativas: TTabSheet;
    frViewDocumentosAsociados: TfrViewDocumentosAsociados;
    frViewPresupuestosObra: TfrViewPresupuestosObra;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item1: TdxLayoutItem;
    frViewContactosObra: TfrViewContactosObra;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl2Group_Root: TdxLayoutGroup;
    dxLayoutControl2: TdxLayoutControl;
    dxLayoutControl2Item1: TdxLayoutItem;
    frViewTrabajosObra: TfrViewTrabajosObra;
    dxLayoutControl2Group1: TdxLayoutGroup;
    MenuTrabajos: TPopupMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuContactos: TPopupMenu;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    MenuItem8: TMenuItem;
    MenuItem9: TMenuItem;
    MenuItem10: TMenuItem;
    dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel;
    procedure FormShow(Sender: TObject);
    procedure dsDataTableDataChange(Sender: TObject; Field: TField);

    procedure actEliminarExecute(Sender: TObject);

    procedure frViewContactosObraactAnadirExecute(Sender: TObject);
    procedure frViewContactosObraactEliminarExecute(Sender: TObject);
    procedure frViewContactosObraactEliminarTodoExecute(Sender: TObject);
    procedure frViewContactosObraactEditarExecute(Sender: TObject);

    procedure frViewPresupuestosObraactAnadirPreObrExecute(Sender: TObject);
    procedure frViewPresupuestosObraactAnadirPreDecExecute(Sender: TObject);
    procedure frViewPresupuestosObraactEditarPreObrExecute(Sender: TObject);
    procedure frViewPresupuestosObraactEditarPreDecExecute(Sender: TObject);

    procedure frViewTrabajosObraactEditarExecute(Sender: TObject);
    procedure frViewTrabajosObraactAnadirExecute(Sender: TObject);
    procedure pgPaginasChanging(Sender: TObject; var AllowChange: Boolean);

    //DOCUMENTOS ASOCIADOS
    procedure frViewDatosObraedtNombrePropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure frViewContactosObracxGridViewCellDblClick(Sender: TcxCustomGridTableView;
      ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
      AShift: TShiftState; var AHandled: Boolean);
    procedure frViewTrabajoscxGridViewCellDblClick(Sender: TcxCustomGridTableView;
      ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
      AShift: TShiftState; var AHandled: Boolean);

  private
    FViewObra: IViewObra;
    FViewContactosObra: IViewContactosObra;
    FViewPresupuestosObra: IViewPresupuestosObra;
    FViewTrabajosObra: IViewTrabajosObra;

    FObra: IBizObra;
    function GetObra: IBizObra; virtual;
    procedure SetObra(const Value: IBizObra); virtual;

  protected
    //DOCUMENTOS ASOCIADOS
    FViewNormativas : IViewDocumentosAsociados;
    function GetViewNormativas: IViewDocumentosAsociados;
    procedure SetViewNormativas(const Value: IViewDocumentosAsociados);
    property ViewNormativas: IViewDocumentosAsociados read GetViewNormativas write SetViewNormativas;

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

implementation

{$R *.dfm}

uses
  uCustomEditor, uDataModuleObras, uDataModuleBase,
  uEditorUtils, LiteralesObras, uDBSelectionList,
  uDataModuleContactos, uBizContacto, uBizDocumentosAsociados;

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 *******************************
}

procedure TfEditorObra.actEliminarExecute(Sender: TObject);
begin
  if (MessageDlg(msgLitBorrar, mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
     inherited;
end;

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

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

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

    FViewObra.Obra := Obra;
    FViewContactosObra.ContactosObra := Obra.Contactos;
    FViewPresupuestosObra.Presupuestos := Obra.Presupuestos;
    FViewTrabajosObra.Presupuestos := Obra.Presupuestos;

    //DOCUMENTOS ASOCIADOS
    if Assigned(FViewNormativas) then
    begin
       FViewNormativas.GestorDocumentos := (Obra as IBizDocumentosAsociados).GestorDocumentos;
       FViewNormativas.GestorDocumentos.ModoInsert := (Obra.DataTable.State = dsInsert);
    end;
  end
  else
    dsDataTable.DataTable := Nil;
end;

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

  if not Assigned(Obra) then
    raise Exception.Create(msgErrorNoObra);

  if not Obra.DataTable.Active then
     Obra.DataTable.Active := True;

  pgPaginas.ActivePageIndex := 0;
end;

constructor TfEditorObra.Create(AOwner: TComponent);
begin
  inherited;
  FViewObra := frViewObra;
  FViewContactosObra := frViewContactosObra;
  FViewPresupuestosObra := frViewPresupuestosObra;
  FViewTrabajosObra := frViewTrabajosObra;

  //DOCUMENTOS ASOCIADOS
  ViewNormativas := frViewDocumentosAsociados;
end;

procedure TfEditorObra.dsDataTableDataChange(Sender: TObject; Field: TField);
begin
  inherited;
  if Assigned(FObra) and (not (FObra.DataTable.Fetching) or
    not (FObra.DataTable.Opening) or not (FObra.DataTable.Closing)) then
  begin
    if Length(FObra.NOMBRE) = 0 then
      JvNavPanelHeader.Caption := msgLitObraNuv
    else
      JvNavPanelHeader.Caption := msgObras + FObra.NOMBRE;
    Self.Caption := JvNavPanelHeader.Caption;
  end;
end;

procedure TfEditorObra.frViewPresupuestosObraactAnadirPreObrExecute(Sender: TObject);
begin
  inherited;
  Obra.Presupuestos.Insert;
  Obra.Presupuestos.CLASE := CLASE_PRESUPUESTO;
  Obra.Presupuestos.TIPO := TIPO_OBRA;
  Obra.Presupuestos.Show;
end;

procedure TfEditorObra.frViewContactosObraactEliminarExecute(Sender: TObject);
begin
  if (MessageDlg(msgLitBorrarContacto, mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
     Obra.Contactos.Delete;
end;

procedure TfEditorObra.frViewContactosObraactEliminarTodoExecute(Sender: TObject);
begin
  inherited;
  if (MessageDlg(msgLitBorrarTContacto, mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
     Obra.Contactos.DataTable.ClearRows;
end;

procedure TfEditorObra.frViewContactosObraactAnadirExecute(Sender: TObject);
var
  AContacto : IBizContacto;

begin
  inherited;
  AContacto := dmContactos.GetContactos;

  try
    if AContacto.ShowForMultiSelect = mrOK then
    begin
      AContacto := dmContactos.GetItemsSeleccionados(AContacto);
      Obra.Contactos.AppendContactos(AContacto);
    end;
  finally
    AContacto := NIL;
  end;
end;

procedure TfEditorObra.frViewContactosObraactEditarExecute(Sender: TObject);
begin
  inherited;
  Obra.Contactos.Show;
end;

destructor TfEditorObra.Destroy;
begin
  FViewObra := Nil;
  FViewContactosObra := Nil;
  FViewPresupuestosObra := Nil;
  FViewTrabajosObra := Nil;

  //DOCUMENTOS ASOCIADOS
  FViewNormativas := NIL;
  
  inherited;
end;

procedure TfEditorObra.frViewPresupuestosObraactAnadirPreDecExecute(Sender: TObject);
begin
  inherited;
  Obra.Presupuestos.Insert;
  Obra.Presupuestos.CLASE := CLASE_PRESUPUESTO;
  Obra.Presupuestos.TIPO := TIPO_DECORACION;
  Obra.Presupuestos.Show;
end;

procedure TfEditorObra.frViewPresupuestosObraactEditarPreObrExecute(Sender: TObject);
begin
  inherited;
  Obra.Presupuestos.Show;
end;

procedure TfEditorObra.frViewPresupuestosObraactEditarPreDecExecute(Sender: TObject);
begin
  inherited;
  Obra.Presupuestos.Show;
end;

procedure TfEditorObra.frViewTrabajosObraactEditarExecute(Sender: TObject);
begin
  inherited;
  Obra.Presupuestos.Show;
end;

procedure TfEditorObra.frViewTrabajosObraactAnadirExecute(Sender: TObject);
begin
  inherited;
  Obra.Presupuestos.Insert;
  Obra.Presupuestos.CLASE := CLASE_TRABAJO;
  Obra.Presupuestos.Show;
end;

procedure TfEditorObra.pgPaginasChanging(Sender: TObject;
  var AllowChange: Boolean);
begin
  inherited;

  //No se ha asignado aún el cliente
  if Obra.Cliente.CODIGO = 0 then
  begin
    MessageBox(0, PChar(msgLitClienteObligatorio), 'Atención', MB_ICONWARNING or MB_OK);
    AllowChange := False;
  end;
end;

function TfEditorObra.GetViewNormativas: IViewDocumentosAsociados;
begin
  Result := FViewNormativas;
end;

procedure TfEditorObra.SetViewNormativas(const Value: IViewDocumentosAsociados);
begin
  FViewNormativas := Value;

  if Assigned(FViewNormativas) and Assigned(Obra) then
     FViewNormativas.GestorDocumentos := (Obra as IBizDocumentosASociados).GestorDocumentos;
end;

procedure TfEditorObra.frViewDatosObraedtNombrePropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
//Si cambia el nombre de la obra debe cambiar el nombre del directorio raiz de la estructura

  if (frViewObra.frViewDatosObra.edtNombre.EditValue <> DisplayValue) then
  begin
    frViewDocumentosAsociados.DeshabilitarDocumentos;

    if Length(DisplayValue)=0 then
    begin
      Error := True;
      ErrorText := msgLitNombreObligatorio;
      DisplayValue := frViewObra.frViewDatosObra.edtNombre.EditValue;
    end
    else
    begin
      try
        frViewDocumentosAsociados.GestorDocumentos.Directorio := DisplayValue;
      except
      on E: Exception do
        begin
          Error := True;
          ErrorText := E.Message;
          DisplayValue := frViewObra.frViewDatosObra.edtNombre.EditValue;
        end;
      end;
    end;

    frViewDocumentosAsociados.HabilitarDocumentos;
  end;
end;

procedure TfEditorObra.frViewContactosObracxGridViewCellDblClick(
  Sender: TcxCustomGridTableView;
  ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
  AShift: TShiftState; var AHandled: Boolean);
begin
  inherited;
  frViewContactosObraactEditarExecute(Self);
end;

procedure TfEditorObra.frViewTrabajoscxGridViewCellDblClick(
  Sender: TcxCustomGridTableView;
  ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
  AShift: TShiftState; var AHandled: Boolean);
begin
  inherited;
  frViewTrabajosObraactEditarExecute(Self);
end;

initialization
  RegisterEditor(IBizObra, ShowEditorObra, etItem);

end.

