{
===============================================================================
  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 uEditorCategoriasContacto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uDataModuleContactos, DB, StdCtrls, DBCtrls, uDADataTable, ActnList,
  uEditorUtils, uCustomEditor, uGUIBase, uBizContacto, cxControls,
  cxContainer, cxCheckListBox, cxCheckBox, ExtCtrls, ComCtrls;

type
  IEditorCategoriasContacto = interface(ICustomEditor)
  ['{A3C7EE1C-ECA0-4EA0-B154-51A041FF28ED}']
    function GetCategorias: IBizCategoria;
    procedure SetCategorias(const Value: IBizCategoria);
    property Categorias: IBizCategoria read GetCategorias write SetCategorias;
    function GetCategoriasContacto: IBizCategoriaContacto;
    procedure SetCategoriasContacto(const Value: IBizCategoriaContacto);
    property CategoriasContacto: IBizCategoriaContacto read GetCategoriasContacto write SetCategoriasContacto;
  end;

  TfEditorCategoriasContacto = class(TCustomEditor, IEditorCategoriasContacto)
    ActionList1: TActionList;
    DADataSource: TDADataSource;
    actAceptar: TAction;
    bAceptar: TButton;
    actCerrar: TAction;
    editCategoriasContacto: TMemo;
    ListaCategorias: TcxCheckListBox;
    actCategorias: TAction;
    Label5: TLabel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    bCategorias: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure actAceptarExecute(Sender: TObject);
    procedure actCerrarExecute(Sender: TObject);
    procedure ListaCategoriasClickCheck(Sender: TObject; AIndex: Integer;
      APrevState, ANewState: TcxCheckBoxState);
    procedure actCategoriasExecute(Sender: TObject);
    procedure FormShow(Sender: TObject);

  private
    FCategorias: IBizCategoria;
    FCategoriasContacto: IBizCategoriaContacto;
    FListaCodigoCategorias: TStringList;
    procedure RellenarLista;
    procedure RefrescarLista;
    procedure RefrescarListas;
    procedure SalvarDatos;
  protected
    function GetCategorias: IBizCategoria; virtual;
    procedure SetCategorias(const Value: IBizCategoria); virtual;
    function GetCategoriasContacto: IBizCategoriaContacto; virtual;
    procedure SetCategoriasContacto(const Value: IBizCategoriaContacto); virtual;
  public
    property Categorias: IBizCategoria read GetCategorias write SetCategorias;
    property CategoriasContacto: IBizCategoriaContacto read GetCategoriasContacto write SetCategoriasContacto;
  end;

var
  fEditorCategoriasContacto: TfEditorCategoriasContacto;

implementation

uses schContactosClient_Intf;

{$R *.dfm}

function ShowEditorCategoriasContacto (ABizObject : TDADataTableRules) : TModalResult;
var
  AEditor: TfEditorCategoriasContacto;
begin
  AEditor := TfEditorCategoriasContacto.Create(Application);
  try
    AEditor.CategoriasContacto := (ABizObject as IBizCategoriaContacto);
    Result := AEditor.ShowModal;
  finally
    AEditor.Release;
  end;
end;

{ TfEditorCategorias }

function TfEditorCategoriasContacto.GetCategorias: IBizCategoria;
begin
  Result := FCategorias;
end;

procedure TfEditorCategoriasContacto.SetCategorias(const Value: IBizCategoria);
begin
  if FCategorias <> Nil then
     FCategorias := Nil;

  FCategorias := Value;
  FCategorias.DataTable.Open;
end;

procedure TfEditorCategoriasContacto.FormCreate(Sender: TObject);
begin
  FListaCodigoCategorias := TStringList.Create;
  Categorias := dmContactos.GetCategorias;
end;

procedure TfEditorCategoriasContacto.actAceptarExecute(Sender: TObject);
begin
  SalvarDatos;
  actCerrar.Execute;
end;

procedure TfEditorCategoriasContacto.actCerrarExecute(Sender: TObject);
begin
  Close;
end;

function TfEditorCategoriasContacto.GetCategoriasContacto: IBizCategoriaContacto;
begin
  Result := FCategoriasContacto;
end;

procedure TfEditorCategoriasContacto.SetCategoriasContacto(const Value: IBizCategoriaContacto);
begin
  if FCategoriasContacto <> Nil then
     FCategoriasContacto := Nil;
  FCategoriasContacto := Value;
  RefrescarListas;
end;

procedure TfEditorCategoriasContacto.RellenarLista;
var
  i: Integer;
begin
  //Rellenamos la lista de codigos y descripciones de las categorias de la tabla
  FListaCodigoCategorias.Clear;
  ListaCategorias.Items.Clear;

  i := 0;
  FCategorias.First;
  while not FCategorias.EOF do
  begin
    FListaCodigoCategorias.Add(IntToStr(FCategorias.CODIGO));
    ListaCategorias.AddItem(FCategorias.DESCRIPCION);

    FCategoriasContacto.First;
    while (not FCategoriasContacto.EOF) and (FCategorias.CODIGO <> FCategoriasContacto.CODIGOCATEGORIA) do
      FCategoriasContacto.Next;
    if (FCategorias.CODIGO = FCategoriasContacto.CODIGOCATEGORIA) then
      ListaCategorias.Items[i].Checked := True;

    FCategorias.Next;
    Inc(i);
  end;
end;

procedure TfEditorCategoriasContacto.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FListaCodigoCategorias);
end;

procedure TfEditorCategoriasContacto.ListaCategoriasClickCheck(
  Sender: TObject; AIndex: Integer; APrevState,
  ANewState: TcxCheckBoxState);
begin
  RefrescarLista;
end;

procedure TfEditorCategoriasContacto.RefrescarLista;
var
i : Integer;
begin
  with editCategoriasContacto do
  begin
    Clear;
    for i := 0 to ListaCategorias.Items.Count-1 do
    begin
      if ListaCategorias.Items[i].Checked then
      begin
        if Text <> '' then
           Text := Text + ';';
        Text := Text + ListaCategorias.Items[i].Text;
      end;
    end;
  end;
end;

procedure TfEditorCategoriasContacto.actCategoriasExecute(Sender: TObject);
begin
  SalvarDatos;
  FCategorias.Show;
  Categorias := dmContactos.GetCategorias;
  RefrescarListas;
end;

procedure TfEditorCategoriasContacto.RefrescarListas;
begin
  RellenarLista;
  RefrescarLista;
end;

procedure TfEditorCategoriasContacto.SalvarDatos;
var
  i: Integer;
  existe: Boolean;
begin
  for i := 0 to ListaCategorias.Items.Count-1 do
  begin
    FCategoriasContacto.First;
    existe := FCategoriasContacto.DataTable.Locate(fld_CONTACTOSCATEGORIASCODIGOCATEGORIA, FListaCodigoCategorias.Strings[i], []);
    if ListaCategorias.Items[i].Checked then
    begin
      if not existe then
      begin
        FCategoriasContacto.Append;
        FCategoriasContacto.CODIGOCATEGORIA := StrToInt(FListaCodigoCategorias.Strings[i]);
        FCategoriasContacto.DESCRIPCION := ListaCategorias.Items[i].Text;
        FCategoriasContacto.Post;
      end;
    end
    else
      if existe then
         FCategoriasContacto.Delete;
  end;
end;

procedure TfEditorCategoriasContacto.FormShow(Sender: TObject);
begin
  ListaCategorias.SetFocus;
end;

initialization
  RegisterEditor(IBizCategoriaContacto, ShowEditorCategoriasContacto, etItems);

end.
