unit uViewDocumentosAsociados; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uViewBase, ComCtrls, ShlObj, cxShellCommon, Menus, cxControls, DB, cxContainer, cxShellListView, ExtCtrls, ActnList, StdCtrls, JvComponent, JvChangeNotify, uBizDocumentosAsociados, JvComponentBase, cxShellTreeView, ToolWin, dxLayoutControl, cxEdit, cxTextEdit, cxDBEdit; type IViewDocumentosAsociados = interface(IViewBase) ['{3FB01C62-1D0C-446E-B5DE-9A10F7B14F20}'] function GetGestorDocumentos: TGestorDocumentos; procedure SetGestorDocumentos(const Value: TGestorDocumentos); property GestorDocumentos: TGestorDocumentos read GetGestorDocumentos write SetGestorDocumentos; end; TfrViewDocumentosAsociados = class(TfrViewBase, IViewDocumentosAsociados) Panel10: TPanel; Panel11: TPanel; explo: TcxShellListView; OpenDialog1: TOpenDialog; ActionList1: TActionList; actAnadirDocumento: TAction; actEliminarDocumento: TAction; actAbrirDocumento: TAction; GridPopupMenu: TPopupMenu; Modificar1: TMenuItem; N1: TMenuItem; Nuevo1: TMenuItem; Previsualizar1: TMenuItem; TreeExplo: TcxShellTreeView; Panel1: TPanel; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton5: TToolButton; ToolBar2: TToolBar; ToolButton6: TToolButton; ToolButton7: TToolButton; Splitter1: TSplitter; actAnadirDir: TAction; actEliminarDir: TAction; PopupMenuDir: TPopupMenu; MenuItem1: TMenuItem; MenuItem3: TMenuItem; dxLayoutControl1Group_Root: TdxLayoutGroup; dxLayoutControl1: TdxLayoutControl; dxLayoutControl1Item1: TdxLayoutItem; dxLayoutControl1Item2: TdxLayoutItem; edtlDirectorio: TcxTextEdit; dxLayoutControl1Group1: TdxLayoutGroup; Button1: TButton; dxLayoutControl1Item3: TdxLayoutItem; dxLayoutControl1Group2: TdxLayoutGroup; actCopiarDocumento: TAction; Copiar1: TMenuItem; ToolButton4: TToolButton; procedure actAnadirDocumentoExecute(Sender: TObject); procedure actAnadirDocumentoUpdate(Sender: TObject); procedure actEliminarDocumentoExecute(Sender: TObject); procedure actEliminarDocumentoUpdate(Sender: TObject); procedure actAbrirDocumentoExecute(Sender: TObject); procedure actAbrirDocumentoUpdate(Sender: TObject); procedure actCopiarDocumentoExecute(Sender: TObject); procedure actCopiarDocumentoUpdate(Sender: TObject); procedure actAnadirDirExecute(Sender: TObject); procedure actEliminarDirExecute(Sender: TObject); procedure actEliminarDirUpdate(Sender: TObject); procedure CustomViewShow(Sender: TObject); procedure CustomViewDestroy(Sender: TObject); procedure exploDblClick(Sender: TObject); procedure OnEliminarDirDocumentos(Sender : TObject); procedure OnBeforeDirectorioChanged(Sender : TObject); procedure OnAfterDirectorioChanged(Sender : TObject); procedure Button1Click(Sender: TObject); private FGestorDocumentos: TGestorDocumentos; function GetGestorDocumentos: TGestorDocumentos; procedure SetGestorDocumentos(const Value: TGestorDocumentos); public property GestorDocumentos: TGestorDocumentos read GetGestorDocumentos write SetGestorDocumentos; procedure HabilitarDocumentos; procedure DeshabilitarDocumentos; procedure refrescarTree; end; var frViewDocumentosAsociados: TfrViewDocumentosAsociados; implementation {$R *.dfm} uses ShellApi, JclShell, uEditorNombreDirectorio, uCustomView; procedure TfrViewDocumentosAsociados.actAnadirDocumentoExecute(Sender: TObject); var ACursor: TCursor; FicheroOrigen : String; i : Integer; begin if OpenDialog1.Execute then begin try ACursor := Screen.Cursor; Screen.Cursor := crHourGlass; for i:=0 to OpenDialog1.Files.Count - 1 do begin FicheroOrigen := OpenDialog1.Files.Strings[i]; if not (length(trim(FicheroOrigen))=0) then if not FGestorDocumentos.AnadirDocumento(FicheroOrigen, TreeExplo.Path) then raise Exception.Create('Error al añadir el documento'); end; finally Screen.Cursor := ACursor; end; end; refrescarTree; end; procedure TfrViewDocumentosAsociados.actEliminarDocumentoExecute(Sender: TObject); var ACursor: TCursor; i : Integer; begin if (Application.MessageBox('¿Desea eliminar los documentos seleccionados?', 'Atención', MB_YESNO) = IDYES) then begin try ACursor := Screen.Cursor; Screen.Cursor := crHourGlass; for i:=0 to explo.InnerListView.Items.Count - 1 do begin if explo.InnerListView.Items[i].Selected then begin if not SysUtils.DeleteFile(GetPidlName(explo.GetItemAbsolutePIDL(i))) then raise Exception.Create('Error al eliminar el documento'); end; end; finally Screen.Cursor := ACursor; end; end; refrescarTree; end; procedure TfrViewDocumentosAsociados.actAbrirDocumentoExecute(Sender: TObject); var FileHandle : Integer; cadena : String; begin if explo.InnerListView.SelCount <> 0 then begin cadena := GetPidlName(explo.GetItemAbsolutePIDL(explo.InnerListView.ItemFocused.Index)); ShellExecute(Handle, 'open', PAnsiChar(cadena), nil, nil, SW_SHOWNORMAL); end; end; procedure TfrViewDocumentosAsociados.actAbrirDocumentoUpdate(Sender: TObject); begin (Sender as TAction).Enabled := explo.InnerListView.SelCount <> 0; end; procedure TfrViewDocumentosAsociados.actEliminarDocumentoUpdate(Sender: TObject); begin (Sender as TAction).Enabled := explo.InnerListView.SelCount <> 0; end; function TfrViewDocumentosAsociados.GetGestorDocumentos: TGestorDocumentos; begin Result := FGestorDocumentos; end; procedure TfrViewDocumentosAsociados.SetGestorDocumentos(const Value: TGestorDocumentos); begin FGestorDocumentos := Value; if Assigned(FGestorDocumentos) then begin DeshabilitarDocumentos; FGestorDocumentos.HabilitarDirectorio; HabilitarDocumentos; end; end; procedure TfrViewDocumentosAsociados.DeshabilitarDocumentos; begin TreeExplo.Root.CustomPath := FGestorDocumentos.RootDocumentos; Explo.Root.CustomPath := TreeExplo.Root.CustomPath; Explo.Enabled := False; TreeExplo.Enabled := False; end; procedure TfrViewDocumentosAsociados.HabilitarDocumentos; begin TreeExplo.Root.CustomPath := FGestorDocumentos.darRutaDocumentos; explo.Root.CustomPath := TreeExplo.Root.CustomPath; explo.Enabled := True; TreeExplo.Enabled := True; end; procedure TfrViewDocumentosAsociados.CustomViewDestroy(Sender: TObject); begin //Eliminaremos el directorio si no tiene documentos, solo tendremos direcctorios //en el caso que el presupuesto tenga documentos asociados // RemoveDir(FGestorDocumentos.darRutaDocumentos); FGestorDocumentos.OnEliminarDirDocumentos := Nil; FGestorDocumentos.OnBeforeDirectorioChanged := Nil; FGestorDocumentos.OnAfterDirectorioChanged := Nil; FGestorDocumentos.Directorio := Null; FGestorDocumentos := NIL; inherited; end; procedure TfrViewDocumentosAsociados.exploDblClick(Sender: TObject); begin inherited; actAbrirDocumento.Execute; end; procedure TfrViewDocumentosAsociados.CustomViewShow(Sender: TObject); begin inherited; edtlDirectorio.Text := GestorDocumentos.darRutaDocumentos; FGestorDocumentos.OnEliminarDirDocumentos := OnEliminarDirDocumentos; FGestorDocumentos.OnBeforeDirectorioChanged := OnBeforeDirectorioChanged; FGestorDocumentos.OnAfterDirectorioChanged := OnAfterDirectorioChanged; refrescarTree; end; procedure TfrViewDocumentosAsociados.actAnadirDocumentoUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := (TreeExplo.Root.CustomPath <> TreeExplo.Path); end; procedure TfrViewDocumentosAsociados.refrescarTree; var Cadena : String; begin //Cuando hacemos algo con documentos es necesario consultar esta propiedad Cadena := TreeExplo.Path; if (Length(Cadena) = 0) then Cadena := TreeExplo.Root.CustomPath; TreeExplo.Root.Update(TreeExplo.Root); TreeExplo.SetFocus; TreeExplo.Path := Cadena; TreeExplo.InnerTreeView.Selected.Expand(True); TreeExplo.ShellListView := Nil; Explo.Root.CustomPath := Cadena; TreeExplo.ShellListView := Explo; end; procedure TfrViewDocumentosAsociados.actEliminarDirUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := (TreeExplo.Root.CustomPath <> TreeExplo.Path); end; procedure TfrViewDocumentosAsociados.actEliminarDirExecute(Sender: TObject); var ACursor: TCursor; begin try ACursor := Screen.Cursor; Screen.Cursor := crHourGlass; if FGestorDocumentos.EliminarDirectorio(TreeExplo.Path) then begin TreeExplo.Root.Update(TreeExplo.Root); //No tocar, el refresco no funciona bien en este caso refrescarTree; end; finally Screen.Cursor := ACursor; end; end; procedure TfrViewDocumentosAsociados.actAnadirDirExecute(Sender: TObject); var AEditor: TEditorNombreDirectorio; Cadena: String; ACursor: TCursor; begin try AEditor := TEditorNombreDirectorio.Create(Self); if AEditor.ShowModal = mrOk then begin ACursor := Screen.Cursor; Screen.Cursor := crHourGlass; Cadena := TreeExplo.Path + PathDelim + AEditor.darNombre; if FGestorDocumentos.AnadirDirectorio(Cadena) then begin TreeExplo.Root.Update(TreeExplo.Root); //No tocar, el refresco no funciona bien en este caso refrescarTree; //Posiciono en nueva carpeta TreeExplo.Path := Cadena; end; end; finally FreeAndNil(AEditor); Screen.Cursor := ACursor; end; end; procedure TfrViewDocumentosAsociados.OnAfterDirectorioChanged(Sender: TObject); begin HabilitarDocumentos; edtlDirectorio.Text := GestorDocumentos.darRutaDocumentos; end; procedure TfrViewDocumentosAsociados.OnBeforeDirectorioChanged(Sender: TObject); begin DeshabilitarDocumentos; end; procedure TfrViewDocumentosAsociados.OnEliminarDirDocumentos(Sender: TObject); begin DeshabilitarDocumentos; end; procedure TfrViewDocumentosAsociados.Button1Click(Sender: TObject); begin inherited; OpenFolder(edtlDirectorio.Text); end; procedure TfrViewDocumentosAsociados.actCopiarDocumentoExecute(Sender: TObject); var ACursor: TCursor; i,a : Integer; CadenaAux : String; begin try ACursor := Screen.Cursor; Screen.Cursor := crHourGlass; for i:=0 to explo.InnerListView.Items.Count - 1 do begin if explo.InnerListView.Items[i].Selected then begin CadenaAux := ExtractFilePath(GetPIDLDisplayName(explo.GetItemAbsolutePIDL(i), True)); CadenaAux := CadenaAux + 'Copia de ' + GetPIDLDisplayName(explo.GetItemAbsolutePIDL(i)); if not CopyFile(PChar(GetPIDLDisplayName(explo.GetItemAbsolutePIDL(i), True)), pChar(CadenaAux), False) then raise Exception.Create('Error al copiar el documento'); end; end; finally Screen.Cursor := ACursor; end; refrescarTree; end; procedure TfrViewDocumentosAsociados.actCopiarDocumentoUpdate(Sender: TObject); begin (Sender as TAction).Enabled := explo.InnerListView.SelCount <> 0; end; end.