unit uViewDetallesPresupuesto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewDetallesBase, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxDataStorage, cxEdit, DB, cxDBData, ImgList, PngImageList,
  uDADataTable, ActnList, ComCtrls, ToolWin, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGrid, cxImageComboBox, cxTextEdit, cxMaskEdit, cxCheckBox, cxCurrencyEdit,
  Grids, DBGrids, StdCtrls, ExtCtrls, cxRichEdit, StdActns, ExtActns,
  JvExStdCtrls, JvCombobox, JvColorCombo, TB2Item, TBX, TB2Dock, TB2Toolbar,
  cxSpinEdit, Menus;

type
  TfrViewDetallesPresupuesto = class(TfrViewDetallesBase)
    cxGridViewDESCUENTO: TcxGridDBColumn;
    actAnadirCapitulo: TAction;
    TBXItem12: TTBXItem;
    procedure cxGridViewTIPOPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure actSubirUpdate(Sender: TObject);
    procedure actBajarUpdate(Sender: TObject);
    procedure actAnadirCapituloExecute(Sender: TObject);
  protected
    function HayQueRecalcular(AItem: TcxCustomGridTableItem): Boolean; override;
    function EsTipoEditable(AItem: TcxCustomGridTableItem): Boolean; override;
  end;

implementation
{$R *.dfm}

uses uControllerDetallesBase, uDetallesPresupuestoController;

procedure TfrViewDetallesPresupuesto.actAnadirCapituloExecute(Sender: TObject);
begin
  cxGridView.BeginUpdate;
  try
    if cxGridView.Controller.EditingController.IsEditing then
       cxGridView.Controller.EditingController.Edit.PostEditValue;

    if Assigned(Controller)
    and Assigned(Detalles) then
        (Controller as IDetallesPresupuestoController).addCapitulo(Detalles);
  finally
    cxGridView.EndUpdate;
  end;
end;

procedure TfrViewDetallesPresupuesto.actBajarUpdate(Sender: TObject);
begin
  inherited;

  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := ((cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_DTO)
                                 and (cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_SUBTOTAL));
end;

procedure TfrViewDetallesPresupuesto.actSubirUpdate(Sender: TObject);
begin
  inherited;

  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := ((cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_DTO)
                                 and (cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_SUBTOTAL));
end;

procedure TfrViewDetallesPresupuesto.cxGridViewTIPOPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  liPosicion: Integer;
begin
  inherited;
  //Recogemos la posición del registro que cambia su tipo y
  //validamos que si es de tipo Descuento el registro inmediatamente
  //anterior debe ser de tipo subtotal
  if (DisplayValue = TIPO_DETALLE_DTO) then
  begin
    liPosicion := cxGridViewPOSICION.DataBinding.Field.Value;
    Dec(liPosicion);
    if (Controller.getTipo(Detalles, liPosicion) <> TIPO_DETALLE_SUBTOTAL) then
    begin
       ErrorText := 'Una linea de descuento solo puede ir despues de un final de capítulo';
       Error := True
    end;
  end;
end;

function TfrViewDetallesPresupuesto.EsTipoEditable(AItem: TcxCustomGridTableItem): Boolean;
var
  IndiceColTipo : Integer;
  IndiceColDto : Integer;
  IndiceColConcepto : Integer;
begin
  Result := inherited EsTipoEditable(AItem);

  if Result then
  begin
    IndiceColTipo := cxGridView.GetColumnByFieldName(CAMPO_TIPO).Index;
    IndiceColDto := cxGridView.GetColumnByFieldName(CAMPO_DESCUENTO).Index;
    IndiceColConcepto := cxGridView.GetColumnByFieldName(CAMPO_CONCEPTO).Index;

    if (AItem.GridView.Items[IndiceColTipo].EditValue = TIPO_DETALLE_DTO) then
    begin
      if (AItem.Index > IndiceColConcepto)
      and (AItem.Index <> IndiceColDto) then
         Result := False;
    end
    else
    begin
      if (AItem.Index = IndiceColDto) then
         Result := False;
    end;
  end;
end;

function TfrViewDetallesPresupuesto.HayQueRecalcular(AItem: TcxCustomGridTableItem): Boolean;
begin
  Result := inherited HayQueRecalcular(AItem);
  Result := Result or (AItem = cxGridViewDESCUENTO);
end;

end.
