Attribute VB_Name = "Appfilesadm"
Option Explicit

Public Type FFFiltro
Tipo As Byte
MultiEntrada As Byte
Comandos As String
End Type

Public Type ECodecPar
Nombre As String
Tipo As Byte
ModificadorCmd As String
ValorDefault As String
ValoresSugeridos As String
SoloValoresSugeridos As Byte
Valor As String
End Type

Public Type ExternalCodec
AcercaDe As String
RutaExe As String
Parametros() As ECodecPar
CmdLffmpeg As String
ffFileExtension As String
ExtensionSalida As String
UserParCodecsffmpeg() As Byte
FFParUserValues() As String
End Type

Public Type FormatPerf
ContenedorE As String
CodecAudioE As String
CodecVideoE As String
CodecSubtituloE As String
PixelFormatE As String
ContenedorS As String
CodecAudioS As String
CodecVideoS As String
CodecSubtituloS As String
RelAspect As String
PixelFormatS As String
Objetivo As String
BitrateAudio As String
BitrateMinAudio As String
BitrateMaxAudio As String
SampleRate As String
Canales As String
AudioCalidad As String
EliminarAudio As Byte
BitrateVideo As String
BitrateMinVideo As String
BitrateMaxVideo As String
Videofps As String
VideoCalidad As String
CalidadMin As String
CalidadMax As String
TamanoCuadro As String
EliminarVideo As Byte
ExtensionS As String
ParAdicionalS As String
ParAdicionalE As String
Multisalida As Byte
InfoECodecA As ExternalCodec
InfoECodecV As ExternalCodec
EliminarSubtitulos As Byte
ECodecANombre As String
ECodecVNombre As String
BufferSize As String
ReadInputAtNFR As Byte
End Type

Public Type PerfEdit
RecSec_Inicio As String
RecSec_Opt As Byte
RecSec_Fin As String
RecSec_Duracion(1 To 3) As String
RecSec_DuracionU As Byte
RecCua_Ancho As String
RecCua_AnchoU As Byte
RecCua_Alto As String
RecCua_AltoU As Byte
RecCua_PosX As String
RecCua_PosXU As Byte
RecCua_PosY As String
RecCua_PosYU As Byte
CamTam_Ancho As String
CamTam_AnchoU As Byte
CamTam_Alto As String
CamTam_AltoU As Byte
CamTam_RelAspOp As Byte
CamTam_RelAspVal As String
CamVol_Val As String
ApFiltros() As String
AgBorde_Arriba As String
AgBorde_ArribaU As Byte
AgBorde_Abajo As String
AgBorde_AbajoU As Byte
AgBorde_Izquierda As String
AgBorde_IzquierdaU As Byte
AgBorde_Derecha As String
AgBorde_DerechaU As Byte
AgBorde_Color As String
ElimA_Val As Byte
ElimV_Val As Byte
ElimS_Val As Byte
Equ_Val(1 To 3, 1 To 10) As String
CmdL_Entrada As String
CmdL_Salida As String
GrabarSubtitulos As Byte
RutaSubtitulos As String
IndiceSubtitulos As Byte
UsarIndiceSubtitulos As Byte
AlgoritmoReescale As Byte
RellenoBordeOpt As Byte
RutaImagenBorde As String
EfectoRelleno As Byte
OverlayOpt As Byte
OverlayPath As String
OverlayPos As Byte
OverlayMargenSup As String
OverlayMargenInf As String
OverlayMargenIzq As String
OverlayMargenDer As String
OverlayMargenSupUnit As Byte
OverlayMargenInfUnit As Byte
OverlayMargenIzqUnit As Byte
OverlayMargenDerUnit As Byte
OverlayTrans As Byte
OverlayTransColorR As Byte
OverlayTransColorG As Byte
OverlayTransColorB As Byte
OVerlayRedim As Byte
OverlayRedimAncho As String
OverlayRedimAlto As String
OverlayRedimAnchoUnit As Byte
OverlayRedimAltoUnit As Byte
OVerlayOpacidadOpt As Byte
OverlayOpacidadPor As Byte
End Type

Private RutaExploracion As String
Private FiltroExt As String
Private NombresReservados() As String
Private ModoExploracion As Byte
Public Retorno As String
Private CerrarParaEditar As Byte

Public Function IniciarAdministrador(Directorio As String, Extension As String, Optional Modo As Byte, Optional HideForms As Boolean) As String
'Modo
'0 = administrar archivos
'1 = seleccionar un archivo
'2 = escribir un archivo confirmar reemplazo
'3 = escribir un archivo no confirmar reemplazo

Dim FormsState() As Boolean, y As Integer, EnEjecucion As Boolean, OpenFileName As String
If HideForms Then
ReDim FormsState(0 To Forms.Count - 1)
Dim i As Byte
ReDim FormsState(0 To Forms.Count - 1)
For i = 0 To Forms.Count - 1
FormsState(i) = Forms(i).Visible
Forms(i).Visible = False
Next
End If

Iniciar:
Load Form3

APIS.AddHScroll_listbox Form3.List1, 1800
Retorno = ""
ModoExploracion = Modo
RutaExploracion = Directorio
FiltroExt = Extension
ListarNombresReservados
RefreshFileList

Select Case LCase(FiltroExt)
    Case Is = "lfm": Form3.Caption = Form1.Herramientas_AdminF.Caption
    Case Is = "lfl": Form3.Caption = Form1.Herramientas_AdminFiltro.Caption
    Case Is = "lca": Form3.Caption = Form1.Herramientas_CodecExtA.Caption
    Case Is = "lcv": Form3.Caption = Form1.Herramientas_CodecExtV.Caption
    Case Is = "lep": Form3.Caption = Form1.Tools_AdmPEdit.Caption
    Case Is = "fca": Form3.Caption = Form1.Herramientas_CodecFFA.Caption
    Case Is = "fcv": Form3.Caption = Form1.Herramientas_CodecFFV.Caption
End Select

If Modo = 0 Then
Form3.Frame1.Visible = False
Form3.Height = 4725
Form3.Command7.Enabled = True
Form3.IconoCtrl1.Visible = Form3.Command7.Enabled
Form3.IconoCtrl8.Visible = Not Form3.Command7.Enabled
End If

If Modo = 1 Then
If Form3.List1.ListCount = 0 Then
Lang.MsgNoFilesFound
Unload Form3
GoTo Finaliza
End If
Lang.AdmFilesCaptionSelectFile
Form3.Text1.Locked = True
Form3.Label1.Caption = Form3.Label1.Tag
End If

If Modo = 2 Or Modo = 3 Then Lang.AdmFilesCaptionSaveAs

EnEjecucion = True
CerrarParaEditar = 0
Form3.Show

If HideForms Then
While EnEjecucion
DoEvents
EnEjecucion = False
For y = 0 To Forms.Count - 1
If Forms(y) Is Form3 Then
EnEjecucion = True
Exit For
End If
Next
If CerrarParaEditar = 1 Then
OpenFileName = Form3.List1.List(Form3.List1.ListIndex)
If EsNombreReservado(OpenFileName) = True Then OpenFileName = "*"
Unload Form3
Select Case FiltroExt
Case Is = "lfl"
Call FilterEditor.IniciarEditorFiltros(OpenFileName)
Case Is = "lca"
Call ECodecEdit.IniciarEditorCodec(OpenFileName, 0)
Case Is = "lcv"
Call ECodecEdit.IniciarEditorCodec(OpenFileName, 1)
Case Is = "lfm"
Call FormatEdit.IniciarFormatE(OpenFileName)
Case Is = "lep"
Call MediaEdit.IniciarMediaEdit(OpenFileName)
Case Is = "fca"
Call ECodecEdit.IniciarEditorCodec(OpenFileName, 2)
Case Is = "fcv"
Call ECodecEdit.IniciarEditorCodec(OpenFileName, 3)
End Select
GoTo Iniciar
End If
Wend
End If

Finaliza:
If HideForms Then
For i = 0 To Forms.Count - 1
Forms(i).Visible = FormsState(i)
Next
End If
IniciarAdministrador = Retorno
End Function

Private Sub ListarReservados()
On Error GoTo Salir
Dim i As Byte
For i = 1 To UBound(NombresReservados)
Form3.List1.AddItem "<" & NombresReservados(i) & ">"
Next
Salir:
End Sub

Public Sub RefreshFileList()
Dim i As Integer, Archivos() As String, IndiceSel As Integer
Dim Nombre As String
IndiceSel = Form3.List1.ListIndex
Form3.List1.Clear
ListarReservados
Archivos = ScriptObj.ListarArchivosDeDir(RutaExploracion, FiltroExt & ":")
If Archivos(1) <> "" Then
For i = 1 To UBound(Archivos)
Nombre = ScriptObj.NombreBase(Archivos(i))
If Nombre <> "" Then Form3.List1.AddItem Nombre
Next
End If
If IndiceSel > -1 And Form3.List1.ListCount > 0 Then
If IndiceSel < Form3.List1.ListCount Then Form3.List1.ListIndex = IndiceSel Else Form3.List1.ListIndex = Form3.List1.ListCount - 1
End If
End Sub

Public Function CrearNuevoArchivo(Optional Nombre As String) As Boolean
Dim NumArchivo As Integer, Buffer As FormatPerf
Dim Buffer2 As FFFiltro, Buffer3 As ExternalCodec, Buffer4 As PerfEdit, i As Byte
On Error GoTo ErrH
If Nombre = "" Then 'Pedir nombre para el archivo
If Form3.List1.ListIndex > -1 Then
Nombre = Replace(Replace(Form3.List1.List(Form3.List1.ListIndex), "<", ""), ">", "")
Nombre = ScriptObj.NombreBase(ScriptObj.ResolverConflictoDeNombres(RutaExploracion & "\" & Nombre & "." & FiltroExt))
End If
Nombre = Lang.InputFileName(Nombre)
If Nombre = "" Then Exit Function
If ScriptObj.ExisteArchivo(RutaExploracion & "\" & Nombre & "." & FiltroExt) = True Then
Lang.MsgFileNameConflict
Exit Function
End If
End If
If ScriptObj.CrearArbol(RutaExploracion) = False Then 'Crear el directorio de trabajo si es que no existe
Lang.MsgCanotCreateDir (RutaExploracion)
Exit Function
End If
NumArchivo = FreeFile 'Escribir archivo
Open RutaExploracion & "\" & Nombre & "." & FiltroExt For Binary As NumArchivo
Select Case LCase(FiltroExt)
Case Is = "lfm"
Put NumArchivo, , Buffer
Case Is = "lfl"
Put NumArchivo, , Buffer2
Case Is = "lca"
Put NumArchivo, , Buffer3
Case Is = "lcv"
Put NumArchivo, , Buffer3
Case Is = "lep"
Put NumArchivo, , Buffer4
Case Is = "fca"
Buffer3.RutaExe = "<ffmpeg.exe>"
ReDim Buffer3.UserParCodecsffmpeg(1 To 6)
For i = 1 To 6: Buffer3.UserParCodecsffmpeg(i) = 1: Next
Put NumArchivo, , Buffer3
Case Is = "fcv"
Buffer3.RutaExe = "<ffmpeg.exe>"
ReDim Buffer3.UserParCodecsffmpeg(1 To 10)
For i = 1 To 6: Buffer3.UserParCodecsffmpeg(i) = 1: Next
Put NumArchivo, , Buffer3
End Select
Close NumArchivo
RefreshFileList
CrearNuevoArchivo = True
Exit Function
ErrH:
Lang.MsgCanotCreateFile (Nombre)
End Function

Private Sub ListarNombresReservados()
Erase NombresReservados
Select Case LCase(FiltroExt)
Case Is = "lfm"
ReDim NombresReservados(1 To 1)
NombresReservados(1) = Lang.PerfilName_Manual
Case Is = "lep"
ReDim NombresReservados(1 To 1)
NombresReservados(1) = Lang.PerfilName_Manual
End Select
End Sub

Public Sub RenombrarArchivoSeleccionado()
Dim Nombre As String
If Form3.List1.ListIndex = -1 Then Exit Sub
If Left(Form3.List1.List(Form3.List1.ListIndex), 1) = "<" Then Exit Sub
Nombre = Lang.InputFileName(Form3.List1.List(Form3.List1.ListIndex))
If Nombre = "" Then Exit Sub
If Nombre = Form3.List1.List(Form3.List1.ListIndex) Then Exit Sub
If ScriptObj.ExisteArchivo(RutaExploracion & "\" & Nombre & "." & FiltroExt) = True Then
Lang.MsgFileNameConflict
Exit Sub
End If
If ScriptObj.CambiarNombreBaseArchivo(RutaExploracion & "\" & Form3.List1.List(Form3.List1.ListIndex) & "." & FiltroExt, Nombre) = False Then
Lang.MsgCanotRenameFile
Exit Sub
End If
RefreshFileList
End Sub

Public Sub CrearCopiaArchivoSeleccionado()
Dim RutaOrigen As String, NombreCopia As String
If Form3.List1.ListIndex = -1 Then Exit Sub
If Left(Form3.List1.List(Form3.List1.ListIndex), 1) = "<" Then
RutaOrigen = RutaExploracion & "\." & FiltroExt
NombreCopia = Mid(Form3.List1.List(Form3.List1.ListIndex), 2, Len(Form3.List1.List(Form3.List1.ListIndex)) - 2)
Else
RutaOrigen = RutaExploracion & "\" & Form3.List1.List(Form3.List1.ListIndex) & "." & FiltroExt
NombreCopia = Form3.List1.List(Form3.List1.ListIndex)
End If
NombreCopia = ScriptObj.NombreBase(ScriptObj.ResolverConflictoDeNombres(RutaExploracion & "\" & NombreCopia & "." & FiltroExt))
NombreCopia = Lang.InputFileName(NombreCopia)
If NombreCopia = "" Then Exit Sub
If ScriptObj.ExisteArchivo(RutaExploracion & "\" & NombreCopia & "." & FiltroExt) Then
Lang.MsgFileNameConflict
Exit Sub
End If
If Left(Form3.List1.List(Form3.List1.ListIndex), 1) = "<" Then
If ScriptObj.ExisteArchivo(RutaOrigen) = False Then
Call CrearNuevoArchivo(NombreCopia)
Exit Sub
End If
End If
If ScriptObj.CopiarArchivo(RutaOrigen, RutaExploracion & "\" & NombreCopia & "." & FiltroExt, False) = False Then
Lang.MsgCanotCopyFile
Else
RefreshFileList
End If
End Sub

Public Sub EliminarArchivoSeleccionado()
Dim Cancelado As Boolean
If Form3.List1.ListIndex = -1 Then Exit Sub
If Left(Form3.List1.List(Form3.List1.ListIndex), 1) = "<" Then Exit Sub
If APIS.APIDeletePath(RutaExploracion & "\" & Form3.List1.List(Form3.List1.ListIndex) & "." & FiltroExt, , Cancelado) = False Then
    Lang.MsgCanotDelFile
Else
    If Cancelado = False Then
        While ScriptObj.ExisteArchivo(RutaExploracion & "\" & Form3.List1.List(Form3.List1.ListIndex) & "." & FiltroExt): DoEvents: Wend
        RefreshFileList
    End If
End If
End Sub

Public Sub SeleccionarArchivo()
Dim RutaRet As String
If EsNombreReservado(Form3.Text1.Text) = True Then RutaRet = RutaExploracion & "\." & FiltroExt Else RutaRet = RutaExploracion & "\" & Form3.Text1.Text & "." & FiltroExt
If ModoExploracion = 1 Then
If ScriptObj.ExisteArchivo(RutaRet) = False And Left(Form3.Text1.Text, 1) <> "<" Then
Lang.MsgFileNotFound
Exit Sub
End If
End If
If ModoExploracion > 1 Then
If Form3.Text1.Text = "" Then
Beep
Exit Sub
End If
If ScriptObj.FilenameIsValid(Form3.Text1.Text) = False And EsNombreReservado(Form3.Text1.Text) = False Then
Lang.MsgFileNameNoValid (Form3.Text1.Text)
Exit Sub
End If
End If
If ModoExploracion = 2 Then
If ScriptObj.ExisteArchivo(RutaRet) = True Then
If Lang.QuestionReplaceFile <> vbYes Then Exit Sub
End If
End If
Retorno = RutaRet
Unload Form3
End Sub

Public Sub EditarArchivo()
If Form3.List1.ListIndex = -1 Then Exit Sub
CerrarParaEditar = 1
End Sub

Private Function EsNombreReservado(Nombre) As Boolean
Dim i As Integer, FName As String
FName = LCase(Nombre)
EsNombreReservado = False
If Len(Join(NombresReservados, ":")) = 0 Then Exit Function
For i = LBound(NombresReservados) To UBound(NombresReservados)
If "<" & LCase(NombresReservados(i)) & ">" = FName Then
EsNombreReservado = True
Exit For
End If
Next
End Function

Private Function AdmAddFile(Ruta As String, OldV() As String) As Byte
'Agrega un archivo
'Ruta: la ruta del archivo
'OldV: lista donde se anexará el nuevo nombre del archivo que entró en conflicto de
'       nombres (si es que se presentó dicha situación)
'       Debe estar inicializada con índice menor 0
'Devuelve:
'   0: el archivo fue agregado
'   1: no se pudo agregar el archivo (error)
'   2: el archivo no se agregó porque no es válido:
'        -no tiene la extensión
'        -su nombre base es nulo
'        -está contenido en el directorio actual RutaExploracion
Dim Destino As String, i As Integer, NombreBase, DirDestino As String
AdmAddFile = 2
If LCase(ScriptObj.DevolverExtension(Ruta)) <> FiltroExt Then Exit Function
DirDestino = RutaExploracion & "\"
If LCase(DirDestino) = LCase(ScriptObj.DirectorioPadre(Ruta)) & "\" Then Exit Function
NombreBase = ScriptObj.NombreBase(Ruta)
If NombreBase = "" Then Exit Function
AdmAddFile = 1
Destino = DirDestino & NombreBase & "." & FiltroExt
i = 1
While ScriptObj.ExisteArchivo(Destino) = True
    Destino = DirDestino & NombreBase & " (old v" & CStr(i) & ")." & FiltroExt
    i = i + 1
Wend
If Destino <> DirDestino & NombreBase & "." & FiltroExt Then
    If ScriptObj.CambiarNombreBaseArchivo(DirDestino & NombreBase & "." & FiltroExt, ScriptObj.NombreBase(Destino)) = False Then Exit Function
    ReDim Preserve OldV(0 To UBound(OldV) + 1)
    OldV(UBound(OldV)) = Destino
End If
Destino = DirDestino & NombreBase & "." & FiltroExt
If APIS.APICopyPath(Ruta, Destino) = True Then
    Call APIS.APIDeletePath(Ruta, 3)
    AdmAddFile = 0
End If
End Function

Private Sub AdmAgregarArchivos(RutasA() As String, nRutas As Long)
'Agrega archivos siguiendo el siguiente procedimiento
'1-Copia los archivos al directorio actual (RutaExploracion)
'   -Si es una carpeta la que se agrega, ejecuta la operación sobre todos los archivos contenidos
'   en su raíz
'   -Si existe conflicto de nombre cambia el nombre del archivo en el directorio actual
'    agregando el sufijo (old v#)
'   -No se pueden agregar archivos cuyo nombre base es una cadena nula
'2-Elimina los archivos originales
'   -Si es una carpeta la que se agregó verifica si quedó vacía, si es así la elimina
'3-Si se presentó conflicto de nombres pregunta al usuario si desea conservar los archivos
'4-Actualiza la lista de archivos y selecciona el último agregado
'5-Muestra los archivos que no se agregaron debido a errores

Call APIDragDropPaths.DragDropMatarTimer
On Error GoTo ErrH
Dim Rutas() As String, i As Integer, Ruta As String
Dim Errores() As String, nerr As Integer
Dim j As Integer
Dim Ultimo As String
Dim OldV() As String

ReDim OldV(0 To 0)
For i = 1 To nRutas
    Ruta = RutasA(i)
    If ScriptObj.ExisteArchivo(Ruta) = True Then
        Select Case AdmAddFile(Ruta, OldV)
        Case 0
            Ultimo = ScriptObj.NombreBase(Ruta)
        Case 1
            nerr = nerr + 1
            ReDim Preserve Errores(1 To nerr)
            Errores(nerr) = Ruta
        End Select
    Else
        Rutas = ScriptObj.ListarArchivosDeDir(Ruta, FiltroExt)
        If Rutas(1) <> "" Then
            For j = 1 To UBound(Rutas)
                Select Case AdmAddFile(Rutas(j), OldV)
                Case 0
                    Ultimo = ScriptObj.NombreBase(Rutas(j))
                Case 1
                    nerr = nerr + 1
                    ReDim Preserve Errores(1 To nerr)
                    Errores(nerr) = Rutas(j)
                End Select
            Next
            If ScriptObj.DirectorioEstaVacio(Ruta) = True Then Call APIS.APIDeletePath(Ruta, 3)
        End If
    End If
Next

If UBound(OldV) > 0 Then
    If Lang.MsgQstConservarArchivos = vbYes Then
        For i = 1 To UBound(OldV): Call APIS.APIDeletePath(OldV(i), 3): Next
    End If
End If
If Ultimo <> "" Then
    Call RefreshFileList
    For i = 0 To Form3.List1.ListCount - 1
        If Form3.List1.List(i) = Ultimo Then
            Form3.List1.ListIndex = i
            Exit For
        End If
    Next
End If
If nerr > 0 Then
    Load Form22
    Form22.Text1.Text = Join(Errores, vbCrLf)
    Form22.Show vbModal, Form3
End If
Exit Sub
ErrH:
MsgBox "Error " & Err.Number & vbCrLf & Err.Description, vbCritical, Form1.Caption
End Sub

Public Sub AgregarArchivosConDialogo()
Dim Rutas() As String
Rutas = APIS.OpenFileDialog("*." & FiltroExt & Chr(0) & "*." & FiltroExt, Form3.hWnd, , Form1.Caption, True, 4096&)
If Rutas(1) = "" Then Exit Sub
Call AdmAgregarArchivos(Rutas, UBound(Rutas))
End Sub

Public Sub AdmAgregarArchivosDragAndDrop()
Call APIDragDropPaths.DragDropMatarTimer
Call AdmAgregarArchivos(APIDragDropPaths.DragDropRutas, APIDragDropPaths.nDragDropRutas)
Erase APIDragDropPaths.DragDropRutas
APIDragDropPaths.nDragDropRutas = 0
End Sub

Public Sub IrADirectorioDeExploracion()
Call APIS.APIAbrirArchivo(RutaExploracion, Form3.hWnd)
End Sub
