Ver Fonte

Bug 1437: Opening several files in editor at once using their paths

https://winscp.net/tracker/1437

Source commit: 708b5910d810fe8986229944a3a7cde6a5f504c9
Martin Prikryl há 9 anos atrás
pai
commit
06cbecad7a
3 ficheiros alterados com 72 adições e 59 exclusões
  1. 1 1
      source/core/FileMasks.cpp
  2. 1 0
      source/core/FileMasks.h
  3. 70 58
      source/forms/CustomScpExplorer.cpp

+ 1 - 1
source/core/FileMasks.cpp

@@ -12,7 +12,7 @@
 #include <StrUtils.hpp>
 //---------------------------------------------------------------------------
 extern const wchar_t IncludeExcludeFileMasksDelimiter = L'|';
-static UnicodeString FileMasksDelimiters = L";,";
+UnicodeString FileMasksDelimiters = L";,";
 static UnicodeString AllFileMasksDelimiters = FileMasksDelimiters + IncludeExcludeFileMasksDelimiter;
 static UnicodeString DirectoryMaskDelimiters = L"/\\";
 static UnicodeString FileMasksDelimiterStr = UnicodeString(FileMasksDelimiters[1]) + L' ';

+ 1 - 0
source/core/FileMasks.h

@@ -231,5 +231,6 @@ private:
 };
 //---------------------------------------------------------------------------
 typedef TFileCustomCommand TRemoteCustomCommand;
+extern UnicodeString FileMasksDelimiters;
 //---------------------------------------------------------------------------
 #endif

+ 70 - 58
source/forms/CustomScpExplorer.cpp

@@ -2635,83 +2635,95 @@ void __fastcall TCustomScpExplorerForm::EditNew(TOperationSide Side)
   {
     Name = LoadStr(NEW_FILE);
   }
+  UnicodeString Names = Name;
   std::unique_ptr<TStrings> History(CloneStrings(CustomWinConfiguration->History[L"EditFile"]));
-  if (InputDialog(LoadStr(EDIT_FILE_CAPTION), LoadStr(EDIT_FILE_PROMPT), Name,
+  if (InputDialog(LoadStr(EDIT_FILE_CAPTION), LoadStr(EDIT_FILE_PROMPT), Names,
         HELP_EDIT_NEW, History.get(), true))
   {
-    CustomWinConfiguration->History[L"EditFile"] = History.get();
-    UnicodeString TargetFileName;
-    UnicodeString LocalFileName;
-    UnicodeString RootTempDir;
-    UnicodeString TempDir;
-    UnicodeString RemoteDirectory;
-    if (Side == osRemote)
+    while (!Names.IsEmpty())
     {
-      Name = AbsolutePath(FTerminal->CurrentDirectory, Name);
-
-      TRemoteFile * File = NULL;
-      if (FTerminal->FileExists(Name, &File))
+      Name = CutToChar(Names, FileMasksDelimiters[1], false);
+      CustomWinConfiguration->History[L"EditFile"] = History.get();
+      UnicodeString TargetFileName;
+      UnicodeString LocalFileName;
+      UnicodeString RootTempDir;
+      UnicodeString TempDir;
+      UnicodeString RemoteDirectory;
+      bool ExistingFile = false;
+      if (Side == osRemote)
       {
-        try
+        Name = AbsolutePath(FTerminal->CurrentDirectory, Name);
+
+        TRemoteFile * File = NULL;
+        if (FTerminal->FileExists(Name, &File))
         {
-          ExecuteRemoteFile(Name, File, efDefaultEditor);
-          return;
+          try
+          {
+            ExecuteRemoteFile(Name, File, efDefaultEditor);
+            ExistingFile = true;
+          }
+          __finally
+          {
+            delete File;
+          }
         }
-        __finally
+
+        if (!ExistingFile)
         {
-          delete File;
+          RemoteDirectory = UnixExtractFilePath(Name);
+          TemporaryDirectoryForRemoteFiles(
+            RemoteDirectory, GUIConfiguration->CurrentCopyParam, TempDir, RootTempDir);
+
+          TargetFileName = UnixExtractFileName(Name);
+          TCopyParamType CopyParam = GUIConfiguration->CurrentCopyParam;
+          LocalFileName = TempDir +
+            // We probably do not want to trim the VMS version here
+            FTerminal->ChangeFileName(&CopyParam, TargetFileName, osRemote, false);
         }
       }
-
-      RemoteDirectory = UnixExtractFilePath(Name);
-      TemporaryDirectoryForRemoteFiles(
-        RemoteDirectory, GUIConfiguration->CurrentCopyParam, TempDir, RootTempDir);
-
-      TargetFileName = UnixExtractFileName(Name);
-      TCopyParamType CopyParam = GUIConfiguration->CurrentCopyParam;
-      LocalFileName = TempDir +
-        // We probably do not want to trim the VMS version here
-        FTerminal->ChangeFileName(&CopyParam, TargetFileName, osRemote, false);
-    }
-    else
-    {
-      if (ExtractFilePath(Name).IsEmpty())
-      {
-        LocalFileName = IncludeTrailingBackslash(DirView(Side)->PathName) + Name;
-      }
       else
       {
-        LocalFileName = ExpandFileName(Name);
-      }
+        if (ExtractFilePath(Name).IsEmpty())
+        {
+          LocalFileName = IncludeTrailingBackslash(DirView(Side)->PathName) + Name;
+        }
+        else
+        {
+          LocalFileName = ExpandFileName(Name);
+        }
 
-      TargetFileName = ExtractFileName(Name);
-    }
+        TargetFileName = ExtractFileName(Name);
+      }
 
-    if (!FileExists(ApiPath(LocalFileName)))
-    {
-      int File = FileCreate(ApiPath(LocalFileName));
-      if (File < 0)
+      if (!ExistingFile)
       {
-        if (!RootTempDir.IsEmpty())
+        if (!FileExists(ApiPath(LocalFileName)))
         {
-          RecursiveDeleteFile(ExcludeTrailingBackslash(RootTempDir), false);
+          int File = FileCreate(ApiPath(LocalFileName));
+          if (File < 0)
+          {
+            if (!RootTempDir.IsEmpty())
+            {
+              RecursiveDeleteFile(ExcludeTrailingBackslash(RootTempDir), false);
+            }
+            throw Exception(FMTLOAD(CREATE_FILE_ERROR, (LocalFileName)));
+          }
+          else
+          {
+            FileClose(File);
+          }
         }
-        throw Exception(FMTLOAD(CREATE_FILE_ERROR, (LocalFileName)));
-      }
-      else
-      {
-        FileClose(File);
-      }
-    }
 
-    TExecuteFileBy ExecuteFileBy = efDefaultEditor;
-    const TEditorData * ExternalEditor = NULL;
-    TFileMasks::TParams MaskParams; // size not known
-    ExecuteFileNormalize(ExecuteFileBy, ExternalEditor, TargetFileName,
-      false, MaskParams);
+        TExecuteFileBy ExecuteFileBy = efDefaultEditor;
+        const TEditorData * ExternalEditor = NULL;
+        TFileMasks::TParams MaskParams; // size not known
+        ExecuteFileNormalize(ExecuteFileBy, ExternalEditor, TargetFileName,
+          false, MaskParams);
 
-    CustomExecuteFile(Side, ExecuteFileBy, LocalFileName, TargetFileName,
-      ExternalEditor, RootTempDir, RemoteDirectory);
+        CustomExecuteFile(Side, ExecuteFileBy, LocalFileName, TargetFileName,
+          ExternalEditor, RootTempDir, RemoteDirectory);
+      }
+    }
   }
 }
 //---------------------------------------------------------------------------