unit uViewDocumentos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, cxControls,
  cxContainer, ActnList, TB2Item, TBX, TB2Dock, TB2Toolbar, StdCtrls,
  FileCtrl, cxGraphics, cxCustomData, cxStyles, cxInplaceContainer,
  cxTextEdit, ComCtrls, ImgList, PngImageList;

type
  TfrViewDocumentos = class(TfrViewBase)
    EditorActionList: TActionList;
    TBXDock: TTBXDock;
    tbxMain: TTBXToolbar;
    TBXItem2: TTBXItem;
    actAnadir: TAction;
    actModificar: TAction;
    actEliminar: TAction;
    TBXItem1: TTBXItem;
    TBXItem3: TTBXItem;
    actEliminarTodo: TAction;
    TBXItem4: TTBXItem;
    actActualizarServidor: TAction;
    TBXItem5: TTBXItem;
    ListView1: TListView;
    LargeImagesBrowser: TPngImageList;
    SmallImagesBrowser: TPngImageList;
    TBXSeparatorItem1: TTBXSeparatorItem;
    procedure actAnadirExecute(Sender: TObject);
    procedure actModificarExecute(Sender: TObject);
    procedure actEliminarExecute(Sender: TObject);
    procedure actEliminarTodoExecute(Sender: TObject);
    procedure actActualizarServidorExecute(Sender: TObject);
    procedure CustomViewCreate(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure actModificarUpdate(Sender: TObject);
    procedure actEliminarUpdate(Sender: TObject);
    procedure actEliminarTodoUpdate(Sender: TObject);
    procedure ListView1DblClick(Sender: TObject);

  private
    FDirectorio: Variant;
    function GetDirectorio: Variant;
    function DarFicherosSeleccionados: TStringList;
    function AsignarImagen(ANombreFichero: String): Integer;

  protected
    FHayModificaciones: Boolean;
    FListaFicheros: TStringList;
    property Directorio: Variant read GetDirectorio;
    property ListaFicheros: TStringList read FListaFicheros write FListaFicheros;

    function GetModified: Boolean; override;
    procedure SetModified(const Value : Boolean); override;

    //Son los metodos que se sobreescribiran en la vista hija
    procedure Sincronizar; virtual; abstract;
    function RecuperarFicheroServidor(const NombreFichero: String; const DirectorioDestino: String): Boolean; virtual; abstract;
    procedure RefrescarVisualizador; virtual;
  end;

var
  frViewDocumentos: TfrViewDocumentos;

implementation
{$R *.dfm}

uses
  uSistemaFunc, ShellAPI, uDialogUtils;

procedure TfrViewDocumentos.actActualizarServidorExecute(Sender: TObject);
begin
  inherited;
  Sincronizar;
end;

procedure TfrViewDocumentos.actAnadirExecute(Sender: TObject);
var
  openDialog : TOpenDialog;
  ANombreFichero : String;
  ANombreSeleccionado : String;
  BCopiar: Boolean;
  i, j : Integer;
begin
  openDialog := TOpenDialog.Create(self);
  try
  // Set up the starting directory to be the current one
//  openDialog.InitialDir := GetCurrentDir;
  // Only allow existing files to be selected
//  openDialog.Options := [ofFileMustExist];

    // Allow multiple files to be selected - of any type
    openDialog.Options := [ofAllowMultiSelect];

  // Allow only .dpr and .pas files to be selected
//  openDialog.Filter := 'Delphi project files|*.dpr|Delphi pascal files|*.pas';
  // Select pascal files as the starting filter type
//  openDialog.FilterIndex := 2;

    if openDialog.Execute then
    begin
      for i:=0 to openDialog.Files.Count - 1 do
      begin
        ANombreSeleccionado := openDialog.Files.Strings[i];
        if Length(ANombreSeleccionado) > 0 then
        begin
           BCopiar := True;
           ANombreFichero := ExtractFileName(ANombreSeleccionado);
           if FListaFicheros.Find(ANombreFichero, j) then
           begin
              ANombreFichero := 'Copia de ' + ANombreFichero;
              BCopiar := (Application.MessageBox(PChar('Ya existe un archivo con ese nombre, ¿Desea añadirlo con el nombre ' + ANombreFichero + '?'), 'Atención', MB_YESNO) = IDYES);
           end;

           if BCopiar then
           begin
             CopiarFichero(ANombreSeleccionado, (Directorio + ANombreFichero));
             //Lo añadimos a la lista de documentos local
             FListaFicheros.Add(ANombreFichero);
           end;
        end;
      end;
    end;

  finally
    openDialog.Free;
    //Now, We compact the process memory:
    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
    RefrescarVisualizador;
    FHayModificaciones := True;
  end;
end;

procedure TfrViewDocumentos.actEliminarExecute(Sender: TObject);
var
  i, j: Integer;
  FicherosSeleccionados: TStringList;
  ANombreFichero: String;

begin
  FicherosSeleccionados := DarFicherosSeleccionados;
  try
    for i := 0 to FicherosSeleccionados.Count - 1 do
    begin
      //Buscamos si existen fisicamente y si es así los eliminamos
      if FileExists(FicherosSeleccionados.Strings[i]) then
         if not DeleteFile(FicherosSeleccionados.Strings[i]) then
            Application.MessageBox('No se pudo borrar el fichero', 'Error', MB_ICONEXCLAMATION);

      //Lo quitamos de la propiedad donde guardamos lista de documentos
      ANombreFichero := ExtractFileName(FicherosSeleccionados.Strings[i]);
      if FListaFicheros.Find(ANombreFichero, j) then
         FListaFicheros.Delete(j);
    end;
  finally
    FreeAndNil(FicherosSeleccionados);
    RefrescarVisualizador;
    FHayModificaciones := True;    
  end;
end;

procedure TfrViewDocumentos.actEliminarTodoExecute(Sender: TObject);
begin
   if DirectoryExists(Directorio) then
      Deltree(Directorio, True);
   FListaFicheros.Clear;
   FDirectorio := Null;
   RefrescarVisualizador;
   FHayModificaciones := True;   
end;

procedure TfrViewDocumentos.actEliminarTodoUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (ListView1.Items.Count > 0)
end;

procedure TfrViewDocumentos.actEliminarUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := Assigned(ListView1.ItemFocused);
end;

procedure TfrViewDocumentos.actModificarExecute(Sender: TObject);
var
  i: Integer;
  FicherosSeleccionados: TStringList;
begin
  FicherosSeleccionados := DarFicherosSeleccionados;
  try
    for i := 0 to FicherosSeleccionados.Count - 1 do
        if FileExists(FicherosSeleccionados.Strings[i]) then
        begin
           if ShellExecute(Handle, nil,  pchar(FicherosSeleccionados.Strings[i]),
              nil, nil, SW_SHOWNORMAL) <= 32 then
              Application.MessageBox('No se pudo editar el fichero', 'Error', MB_ICONEXCLAMATION);
        end
        else
        begin
           if not RecuperarFicheroServidor(ExtractFileName(FicherosSeleccionados.Strings[i]), ExtractFilePath(FicherosSeleccionados.Strings[i])) then
              Application.MessageBox('No se pudo RecuperarFicheroServidor', 'Error', MB_ICONEXCLAMATION);

           if ShellExecute(Handle, nil,  pchar(FicherosSeleccionados.Strings[i]),
              nil, nil, SW_SHOWNORMAL) <= 32 then
              Application.MessageBox('No se pudo editar el fichero', 'Error', MB_ICONEXCLAMATION);
        end;
  finally
    FreeAndNil(FicherosSeleccionados);
    FHayModificaciones := True;
  end;
end;

procedure TfrViewDocumentos.actModificarUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := Assigned(ListView1.ItemFocused);
end;

function TfrViewDocumentos.AsignarImagen(ANombreFichero: String): Integer;
begin
  if (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.txt')
     or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.ini') 
     or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.sql') then     
     Result := 1
  else if (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.pdf') then
     Result := 3
  else if (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.doc')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.rtf') then
     Result := 2
  else if (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.ppt')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.pps')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.ppa') then
     Result := 7
  else if (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.mdb')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.adp')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.mde')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.ade')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.mda') then
     Result := 5
  else if (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.xls')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.xl')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.xlt')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.xla')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.xlc') then
     Result := 4

  else if (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.png')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.tif')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.pict')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.pct')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.bmp')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.gif')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.jpg')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.jpeg')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.jpe')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.png')
       or (LOWERCASE(ExtractFileExt(ANombreFichero)) = '.tiff') then
     Result := 6

  else Result := 0;
end;

procedure TfrViewDocumentos.CustomViewCreate(Sender: TObject);
begin
  inherited;
  FDirectorio := Null;
  FListaFicheros := Nil;
  FHayModificaciones:= False;
end;

procedure TfrViewDocumentos.CustomViewDestroy(Sender: TObject);
begin
  FDirectorio := Null;
  FreeAndNil(FListaFicheros);
  inherited;
end;

function TfrViewDocumentos.DarFicherosSeleccionados: TStringList;
var
  i: Integer;
begin
  Result := TStringList.Create;
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    if ListView1.Items[i].Selected then
       Result.Add(Directorio + ListView1.Items[i].Caption);
  end;
end;

function TfrViewDocumentos.GetDirectorio: Variant;
begin
  if VarIsNull(FDirectorio) then
  begin
    FDirectorio := DarDirectorioTemporal;
    if not CreateDir(FDirectorio) then
      raise Exception.Create('ERROR: No se ha podido crear el fichero temporal (GetDirectorio)');
  end;
  Result := FDirectorio;
end;

function TfrViewDocumentos.GetModified: Boolean;
begin
  Result := FHayModificaciones;
end;

procedure TfrViewDocumentos.ListView1DblClick(Sender: TObject);
begin
  inherited;
  if Assigned(ListView1.ItemFocused) then
    actModificar.Execute;
end;

procedure TfrViewDocumentos.RefrescarVisualizador;
var
  i: Integer;
  AItem: TListItem;

begin
  ListView1.Clear;
  for i := 0 to FListaFicheros.Count - 1 do
  begin
    AItem := ListView1.Items.Add;
    AItem.Caption := FListaFicheros.Strings[i];
    AItem.ImageIndex := AsignarImagen(FListaFicheros.Strings[i]);
  end;
end;

procedure TfrViewDocumentos.SetModified(const Value: Boolean);
begin
  inherited;
  FHayModificaciones := Value;
end;

end.
