Quellcode durchsuchen

Bug 1705: Command to un/check all files in a folder on Synchronization checklist window

https://winscp.net/tracker/1705

Source commit: 177f36aad7442e4fb7759d9fb28fa86d5e927ae9
Martin Prikryl vor 7 Jahren
Ursprung
Commit
4d3225fe9b

+ 43 - 0
source/forms/SynchronizeChecklist.cpp

@@ -19,6 +19,7 @@
 #include <GUITools.h>
 #include <TerminalManager.h>
 #include <System.IOUtils.hpp>
+#include <System.StrUtils.hpp>
 //---------------------------------------------------------------------
 #pragma link "IEListView"
 #pragma link "NortonLikeListView"
@@ -182,6 +183,8 @@ void __fastcall TSynchronizeChecklistDialog::UpdateControls()
   UncheckAction->Enabled = !AllUnchecked && !FSynchronizing;
   CheckAllAction->Enabled = (FChecked[0] < FTotals[0]) && !FSynchronizing;
   UncheckAllAction->Enabled = (FChecked[0] > 0) && !FSynchronizing;
+  CheckDirectoryAction->Enabled = CheckAllAction->Enabled; // sic
+  UncheckDirectoryAction->Enabled = UncheckAllAction->Enabled; // sic
   CustomCommandsAction->Enabled = AnyBoth && !AnyNonBoth && DebugAlwaysTrue(!FSynchronizing);
   ReverseAction->Enabled = (ListView->SelCount > 0) && DebugAlwaysTrue(!FSynchronizing);
   MoveAction->Enabled = (GetMoveItems() != TSynchronizeMoveItems());
@@ -1266,3 +1269,43 @@ void __fastcall TSynchronizeChecklistDialog::MoveActionExecute(TObject *)
   DeleteItem(Item2);
 }
 //---------------------------------------------------------------------------
+void __fastcall TSynchronizeChecklistDialog::CheckDirectory(bool Check)
+{
+  std::unique_ptr<TStringList> Directories(new TStringList());
+  TListItem * Item = ListView->Selected;
+  while (Item != NULL)
+  {
+    const TSynchronizeChecklist::TItem * ChecklistItem = GetChecklistItem(Item);
+    // It does not matter if we use local or remote directory
+    Directories->Add(IncludeTrailingBackslash(ChecklistItem->Local.Directory));
+    Item = ListView->GetNextItem(Item, sdAll, TItemStates() << isSelected);
+  }
+
+  TAutoFlag ChangingItemMassSwitch(FChangingItemMass);
+  for (int Index = 0; Index < ListView->Items->Count; Index++)
+  {
+    TListItem * Item = ListView->Items->Item[Index];
+    const TSynchronizeChecklist::TItem * ChecklistItem = GetChecklistItem(Item);
+    UnicodeString Directory = IncludeTrailingBackslash(ChecklistItem->Local.Directory);
+    for (int Index2 = 0; Index2 < Directories->Count; Index2++)
+    {
+      if (StartsText(Directories->Strings[Index2], Directory))
+      {
+        Item->Checked = Check;
+      }
+    }
+  }
+  ChangingItemMassSwitch.Release();
+  UpdateControls();
+}
+//---------------------------------------------------------------------------
+void __fastcall TSynchronizeChecklistDialog::CheckDirectoryActionExecute(TObject *)
+{
+  CheckDirectory(true);
+}
+//---------------------------------------------------------------------------
+void __fastcall TSynchronizeChecklistDialog::UncheckDirectoryActionExecute(TObject *)
+{
+  CheckDirectory(false);
+}
+//---------------------------------------------------------------------------

+ 17 - 0
source/forms/SynchronizeChecklist.dfm

@@ -2337,6 +2337,15 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
     object UncheckItem: TMenuItem
       Action = UncheckAction
     end
+    object N3: TMenuItem
+      Caption = '-'
+    end
+    object CheckAllFilesinThisDirectory1: TMenuItem
+      Action = CheckDirectoryAction
+    end
+    object UncheckAllActionsinThisDirectory1: TMenuItem
+      Action = UncheckDirectoryAction
+    end
     object N1: TMenuItem
       Caption = '-'
     end
@@ -2413,6 +2422,14 @@ object SynchronizeChecklistDialog: TSynchronizeChecklistDialog
       ShortCut = 117
       OnExecute = MoveActionExecute
     end
+    object CheckDirectoryAction: TAction
+      Caption = 'Check All Actions in &This Directory'
+      OnExecute = CheckDirectoryActionExecute
+    end
+    object UncheckDirectoryAction: TAction
+      Caption = 'Uncheck All Actions in This &Directory'
+      OnExecute = UncheckDirectoryActionExecute
+    end
   end
   object ActionImages120: TPngImageList
     Height = 20

+ 8 - 0
source/forms/SynchronizeChecklist.h

@@ -59,6 +59,11 @@ __published:
   TAction *MoveAction;
   TButton *MoveButton;
   TMenuItem *MoveItem;
+  TAction *CheckDirectoryAction;
+  TAction *UncheckDirectoryAction;
+  TMenuItem *N3;
+  TMenuItem *CheckAllFilesinThisDirectory1;
+  TMenuItem *UncheckAllActionsinThisDirectory1;
   void __fastcall HelpButtonClick(TObject * Sender);
   void __fastcall FormShow(TObject * Sender);
   void __fastcall StatusBarDrawPanel(TStatusBar *StatusBar,
@@ -95,6 +100,8 @@ __published:
   void __fastcall CalculateSizeActionExecute(TObject *Sender);
   void __fastcall CalculateSizeAllActionExecute(TObject *Sender);
   void __fastcall MoveActionExecute(TObject *Sender);
+  void __fastcall CheckDirectoryActionExecute(TObject *Sender);
+  void __fastcall UncheckDirectoryActionExecute(TObject *Sender);
 
 public:
   __fastcall TSynchronizeChecklistDialog(
@@ -164,6 +171,7 @@ protected:
   typedef std::pair<const TSynchronizeChecklist::TItem *, const TSynchronizeChecklist::TItem *> TSynchronizeMoveItems;
   TSynchronizeMoveItems __fastcall GetMoveItems();
   void __fastcall DeleteItem(TListItem * Item);
+  void __fastcall CheckDirectory(bool Check);
   static int __fastcall CompareNumber(__int64 Value1, __int64 Value2);
 };
 //----------------------------------------------------------------------------