OSDN Git Service

Resume implementing 3-way folder compare
authorsdottaka <sdottaka@users.sourceforge.net>
Sun, 6 Sep 2015 15:14:39 +0000 (00:14 +0900)
committersdottaka <sdottaka@users.sourceforge.net>
Sun, 6 Sep 2015 15:14:39 +0000 (00:14 +0900)
21 files changed:
Src/7zCommon.cpp
Src/7zCommon.h
Src/DirActions.cpp
Src/DirActions.h
Src/DirItemIterator.h
Src/DirView.cpp
Src/DirView.h
Src/MainFrm.cpp
Src/Merge.rc
Src/Merge2.rc
Src/OptionsDef.h
Src/OptionsInit.cpp
Src/res/all.bmp [new file with mode: 0644]
Src/res/left_to_middle.bmp [new file with mode: 0644]
Src/res/middle.bmp [new file with mode: 0644]
Src/res/middle_to_browse.bmp [new file with mode: 0644]
Src/res/middle_to_left.bmp [new file with mode: 0644]
Src/res/middle_to_right.bmp [new file with mode: 0644]
Src/res/move_middle_to_browse.bmp [new file with mode: 0644]
Src/res/right_to_middle.bmp [new file with mode: 0644]
Src/resource.h

index 0ab7eaa..26b9425 100644 (file)
@@ -389,7 +389,10 @@ UINT DirItemEnumerator::Open()
 {\r
        m_nIndex = -1;\r
        m_curFolderPrefix = m_rgFolderPrefix.begin();\r
-       m_index = (m_nFlags & Right) != 0 ? 1 : 0;\r
+       if (m_pView->GetDocument()->m_nDirs < 3)\r
+               m_index = (m_nFlags & Right) != 0 ? 1 : 0;\r
+       else\r
+               m_index = ((m_nFlags & Right) != 0) ? 2 : ((m_nFlags & Middle) != 0 ? 1 : 0);\r
        size_t nrgFolderPrefix = m_rgFolderPrefix.size();\r
        if (nrgFolderPrefix)\r
        {\r
index bf68c5f..754aad5 100644 (file)
@@ -74,11 +74,12 @@ public:
        enum
        {
                Left = 0x00,
-               Right = 0x10,
-               Original = 0x20,
-               Altered = 0x40,
-               DiffsOnly = 0x80,
-               BalanceFolders = 0x100
+               Middle = 0x10,
+               Right = 0x20,
+               Original = 0x40,
+               Altered = 0x80,
+               DiffsOnly = 0x100,
+               BalanceFolders = 0x200
        };
        DirItemEnumerator(CDirView *, int);
        virtual UINT Open();
index b248339..880915a 100644 (file)
@@ -252,7 +252,7 @@ UPDATEITEM_TYPE UpdateDiffAfterOperation(const FileActionItem & act, CDiffContex
                bUpdateSrc = true;
                bUpdateDest = true;
                di.diffcode.setSideFlag(act.UIDestination);
-               if (act.dirflag)
+               if (act.dirflag || ctxt.GetCompareDirs() > 2)
                        SetDiffCompare(di, DIFFCODE::NOCMP);
                else
                        SetDiffCompare(di, DIFFCODE::SAME);
@@ -585,8 +585,18 @@ bool IsShowable(const CDiffContext& ctxt, const DIFFITEM & di, const DirViewFilt
                        // left/right filters
                        if (di.diffcode.isSideFirstOnly() && !filter.show_unique_left)
                                return false;
-                       if (di.diffcode.isSideSecondOnly() && !filter.show_unique_right)
-                               return false;
+                       if (ctxt.GetCompareDirs() < 3)
+                       {
+                               if (di.diffcode.isSideSecondOnly() && !filter.show_unique_right)
+                                       return false;
+                       }
+                       else
+                       {
+                               if (di.diffcode.isSideSecondOnly() && !filter.show_unique_middle)
+                                       return false;
+                               if (di.diffcode.isSideThirdOnly() && !filter.show_unique_right)
+                                       return false;
+                       }
 
                        // result filters
                        if (di.diffcode.isResultError() && FALSE/* !GetMainFrame()->m_bShowErrors FIXME:*/)
@@ -597,8 +607,18 @@ bool IsShowable(const CDiffContext& ctxt, const DIFFITEM & di, const DirViewFilt
                        // left/right filters
                        if (di.diffcode.isSideFirstOnly() && !filter.show_unique_left)
                                return false;
-                       if (di.diffcode.isSideSecondOnly() && !filter.show_unique_right)
-                               return false;
+                       if (ctxt.GetCompareDirs() < 3)
+                       {
+                               if (di.diffcode.isSideSecondOnly() && !filter.show_unique_right)
+                                       return false;
+                       }
+                       else
+                       {
+                               if (di.diffcode.isSideSecondOnly() && !filter.show_unique_middle)
+                                       return false;
+                               if (di.diffcode.isSideThirdOnly() && !filter.show_unique_right)
+                                       return false;
+                       }
 
                        // ONLY filter folders by result (identical/different) for tree-view.
                        // In the tree-view we show subfolders with identical/different
@@ -1121,7 +1141,7 @@ String FormatMenuItemString(SIDE_TYPE src, SIDE_TYPE dst, int count, int total)
        else if (src == SIDE_LEFT && dst == SIDE_MIDDLE)
        {
                fmt1 = _("Left to Middle (%1)");
-               fmt2 = _("Left to middle (%1 of %2)");
+               fmt2 = _("Left to Middle (%1 of %2)");
        }
        else if (src == SIDE_MIDDLE && dst == SIDE_LEFT)
        {
@@ -1167,9 +1187,12 @@ String FormatMenuItemString(SIDE_TYPE src, int count, int total)
        return FormatMenuItemString(fmt1, fmt2, count, total);
 }
 
-String FormatMenuItemStringBoth(int count, int total)
+String FormatMenuItemStringAll(int nDirs, int count, int total)
 {
-       return FormatMenuItemString(_("Both (%1)"), _("Both (%1 of %2)"), count, total);
+       if (nDirs < 3)
+               return FormatMenuItemString(_("Both (%1)"), _("Both (%1 of %2)"), count, total);
+       else
+               return FormatMenuItemString(_("All (%1)"), _("All (%1 of %2)"), count, total);
 }
 
 String FormatMenuItemStringTo(SIDE_TYPE src, int count, int total)
@@ -1193,6 +1216,19 @@ String FormatMenuItemStringTo(SIDE_TYPE src, int count, int total)
        return FormatMenuItemString(fmt1, fmt2, count, total);
 }
 
+String FormatMenuItemStringAllTo(int nDirs, int count, int total)
+{
+       if (nDirs < 3)
+               return FormatMenuItemString(_("Both to... (%1)"), _("Both to... (%1 of %2)"), count, total);
+       else
+               return FormatMenuItemString(_("All to... (%1)"), _("All to... (%1 of %2)"), count, total);
+}
+
+String FormatMenuItemStringDifferencesTo(int count, int total)
+{
+       return FormatMenuItemString(_("Differences to... (%1)"), _("Differences to... (%1 of %2)"), count, total);
+}
+
 /**
  * @brief Rename a file without moving it to different directory.
  *
index 4aa4167..514b756 100644 (file)
@@ -103,6 +103,7 @@ struct DirViewFilterSettings
        {
                show_skipped = getoptbool(OPT_SHOW_SKIPPED);
                show_unique_left = getoptbool(OPT_SHOW_UNIQUE_LEFT);
+               show_unique_middle = getoptbool(OPT_SHOW_UNIQUE_MIDDLE);
                show_unique_right = getoptbool(OPT_SHOW_UNIQUE_RIGHT);
                show_binaries = getoptbool(OPT_SHOW_BINARIES);
                show_identical = getoptbool(OPT_SHOW_IDENTICAL);
@@ -111,6 +112,7 @@ struct DirViewFilterSettings
        };
        bool show_skipped;
        bool show_unique_left;
+       bool show_unique_middle;
        bool show_unique_right;
        bool show_binaries;
        bool show_identical;
@@ -124,9 +126,11 @@ String NumToStr(int n);
 String FormatFilesAffectedString(int nFilesAffected, int nFilesTotal);
 String FormatMenuItemString(SIDE_TYPE src, int count, int total);
 String FormatMenuItemString(SIDE_TYPE src, SIDE_TYPE dst, int count, int total);
-String FormatMenuItemStringBoth(int count, int total);
+String FormatMenuItemStringAll(int nDirs, int count, int total);
 String FormatMenuItemString(const String& fmt1, const String& fmt2, int count, int total);
 String FormatMenuItemStringTo(SIDE_TYPE src, int count, int total);
+String FormatMenuItemStringAllTo(int nDirs, int count, int total);
+String FormatMenuItemStringDifferencesTo(int count, int total);
 
 void ConfirmActionList(const CDiffContext& ctxt, const FileActionScript & actionList);
 UPDATEITEM_TYPE UpdateDiffAfterOperation(const FileActionItem & act, CDiffContext& ctxt, DIFFITEM &di);
@@ -223,6 +227,21 @@ struct DirActions
                return (di.diffcode.diffcode != 0 && ::IsItemCopyableToOn(di, SideToIndex(m_ctxt, src)));
        }
 
+       bool IsItemCopyableBothToOn(const DIFFITEM& di) const
+       {
+               if (di.diffcode.diffcode != 0)
+               {
+                       int i;
+                       for (i = 0; i < m_ctxt.GetCompareDirs(); ++i)
+                       {
+                               if (!::IsItemCopyableToOn(di, i))
+                                       break;
+                       }
+                       return (i == m_ctxt.GetCompareDirs());
+               }
+               return false;
+       }
+
        template <SIDE_TYPE src>
        bool IsItemMovableToOn(const DIFFITEM& di) const
        {
@@ -236,6 +255,7 @@ struct DirActions
                const int idx = SideToIndex(m_ctxt, src);
                return (di.diffcode.diffcode != 0 && !m_RO[idx] && IsItemDeletable(di, idx));
        }
+
        bool IsItemDeletableOnBoth(const DIFFITEM& di) const
        {
                if (di.diffcode.diffcode != 0)
@@ -266,15 +286,15 @@ struct DirActions
        }
 
        template <SIDE_TYPE src>
-       bool IsItemOpenanbleOn(const DIFFITEM& di) const
+       bool IsItemOpenableOn(const DIFFITEM& di) const
        {
-               return (di.diffcode.diffcode != 0 && IsItemOpenableOn(di, SideToIndex(m_ctxt, src)));
+               return (di.diffcode.diffcode != 0 && ::IsItemOpenableOn(di, SideToIndex(m_ctxt, src)));
        }
 
        template <SIDE_TYPE src>
-       bool IsItemOpenanbleOnWith(const DIFFITEM& di) const
+       bool IsItemOpenableOnWith(const DIFFITEM& di) const
        {
-               return (di.diffcode.diffcode != 0 && IsItemOpenableOnWith(di, SideToIndex(m_ctxt, src)));
+               return (di.diffcode.diffcode != 0 && ::IsItemOpenableOnWith(di, SideToIndex(m_ctxt, src)));
        }
 
        bool IsItemFile(const DIFFITEM& di) const
@@ -483,57 +503,6 @@ Counts Count(const InputIterator& begin, const InputIterator& end, const Predica
        return Counts(count, total);
 }
 
-struct ContextMenuCounts {
-       int nTotal; // total #items (includes files & directories, either side)
-       int nCopyable[3];
-       int nDeletable[3];
-       int nDeletableOnBoth;
-       int nOpenable[3];
-       int nOpenableOnBoth;
-       int nOpenableOnWith[3];
-       int nDiffItems;
-};
-
-template<class InputIterator>
-ContextMenuCounts CountForContextMenu(const InputIterator& begin, const InputIterator& end, const CDiffContext& ctxt)
-{
-       ContextMenuCounts counts = {0};
-       int nDirs = ctxt.GetCompareDirs();
-       for (InputIterator it = begin; it != end; ++it)
-       {
-               const DIFFITEM& di = *it;
-               if (di.diffcode.diffcode == 0) // Invalid value, this must be special item
-                       continue;
-               int nOpenablePerItem = 0;
-               for (int j = 0; j < nDirs; ++j)
-               {
-                       if (IsItemCopyable(di, j))
-                               ++counts.nCopyable[j];
-                       if (IsItemDeletable(di, j))
-                               ++counts.nDeletable[j];         
-                       if (IsItemOpenableOn(di, j))
-                       {
-                               ++nOpenablePerItem;
-                               ++counts.nOpenable[j];
-                       }
-                       if (IsItemOpenableOnWith(di, j))
-                               ++counts.nOpenableOnWith[j];
-               }
-               if (IsItemDeletableOnBoth(ctxt, di))
-                       ++counts.nDeletableOnBoth;
-
-               if (IsItemNavigableDiff(ctxt, di))
-                       ++counts.nDiffItems;
-
-               if (nOpenablePerItem == nDirs)
-                       ++counts.nOpenableOnBoth;
-
-               ++counts.nTotal;
-       }
-       return counts;
-}
-
-
 /**
  * @brief Rename selected item on both left and right sides.
  *
index 9467ee0..2c96453 100644 (file)
@@ -122,6 +122,7 @@ public:
        {
                m_sel = it.m_sel;
                m_pList = it.m_pList;
+               m_pdi = it.m_pdi;
                return *this;
        }
 
index e181432..1c0ce7c 100644 (file)
@@ -142,20 +142,36 @@ BEGIN_MESSAGE_MAP(CDirView, CListView)
        ON_UPDATE_COMMAND_UI(ID_L2R, (OnUpdateDirCopy<SIDE_LEFT, SIDE_RIGHT>))
        ON_COMMAND(ID_DIR_COPY_LEFT_TO_RIGHT, (OnCtxtDirCopy<SIDE_LEFT, SIDE_RIGHT>))
        ON_UPDATE_COMMAND_UI(ID_DIR_COPY_LEFT_TO_RIGHT, (OnUpdateCtxtDirCopy<SIDE_LEFT, SIDE_RIGHT>))
+       ON_COMMAND(ID_DIR_COPY_LEFT_TO_MIDDLE, (OnCtxtDirCopy<SIDE_LEFT, SIDE_MIDDLE>))
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_LEFT_TO_MIDDLE, (OnUpdateCtxtDirCopy<SIDE_LEFT, SIDE_MIDDLE>))
        ON_COMMAND(ID_R2L, (OnDirCopy<SIDE_RIGHT, SIDE_LEFT>))
        ON_UPDATE_COMMAND_UI(ID_R2L, (OnUpdateDirCopy<SIDE_RIGHT, SIDE_LEFT>))
        ON_COMMAND(ID_DIR_COPY_RIGHT_TO_LEFT, (OnCtxtDirCopy<SIDE_RIGHT, SIDE_LEFT>))
        ON_UPDATE_COMMAND_UI(ID_DIR_COPY_RIGHT_TO_LEFT, (OnUpdateCtxtDirCopy<SIDE_RIGHT, SIDE_LEFT>))
+       ON_COMMAND(ID_DIR_COPY_RIGHT_TO_MIDDLE, (OnCtxtDirCopy<SIDE_RIGHT, SIDE_MIDDLE>))
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_RIGHT_TO_MIDDLE, (OnUpdateCtxtDirCopy<SIDE_RIGHT, SIDE_MIDDLE>))
+       ON_COMMAND(ID_DIR_COPY_MIDDLE_TO_LEFT, (OnCtxtDirCopy<SIDE_MIDDLE, SIDE_LEFT>))
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_MIDDLE_TO_LEFT, (OnUpdateCtxtDirCopy<SIDE_MIDDLE, SIDE_LEFT>))
+       ON_COMMAND(ID_DIR_COPY_MIDDLE_TO_RIGHT, (OnCtxtDirCopy<SIDE_MIDDLE, SIDE_RIGHT>))
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_MIDDLE_TO_RIGHT, (OnUpdateCtxtDirCopy<SIDE_MIDDLE, SIDE_RIGHT>))
        ON_COMMAND(ID_DIR_DEL_LEFT, OnCtxtDirDel<SIDE_LEFT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_DEL_LEFT, OnUpdateCtxtDirDel<SIDE_LEFT>)
        ON_COMMAND(ID_DIR_DEL_RIGHT, OnCtxtDirDel<SIDE_RIGHT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_DEL_MIDDLE, OnUpdateCtxtDirDel<SIDE_MIDDLE>)
+       ON_COMMAND(ID_DIR_DEL_MIDDLE, OnCtxtDirDel<SIDE_MIDDLE>)
        ON_UPDATE_COMMAND_UI(ID_DIR_DEL_RIGHT, OnUpdateCtxtDirDel<SIDE_RIGHT>)
        ON_COMMAND(ID_DIR_DEL_BOTH, OnCtxtDirDelBoth)
        ON_UPDATE_COMMAND_UI(ID_DIR_DEL_BOTH, OnUpdateCtxtDirDelBoth)
+       ON_COMMAND(ID_DIR_DEL_ALL, OnCtxtDirDelBoth)
+       ON_UPDATE_COMMAND_UI(ID_DIR_DEL_ALL, OnUpdateCtxtDirDelBoth)
        ON_COMMAND(ID_DIR_OPEN_LEFT, OnCtxtDirOpen<SIDE_LEFT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_LEFT, OnUpdateCtxtDirOpen<SIDE_LEFT>)
        ON_COMMAND(ID_DIR_OPEN_LEFT_WITH, OnCtxtDirOpenWith<SIDE_LEFT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_LEFT_WITH, OnUpdateCtxtDirOpenWith<SIDE_LEFT>)
+       ON_COMMAND(ID_DIR_OPEN_MIDDLE, OnCtxtDirOpen<SIDE_MIDDLE>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_MIDDLE, OnUpdateCtxtDirOpen<SIDE_MIDDLE>)
+       ON_COMMAND(ID_DIR_OPEN_MIDDLE_WITH, OnCtxtDirOpenWith<SIDE_MIDDLE>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_MIDDLE_WITH, OnUpdateCtxtDirOpenWith<SIDE_MIDDLE>)
        ON_COMMAND(ID_DIR_OPEN_RIGHT, OnCtxtDirOpen<SIDE_RIGHT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_RIGHT, OnUpdateCtxtDirOpen<SIDE_RIGHT>)
        ON_COMMAND(ID_DIR_OPEN_RIGHT_WITH, OnCtxtDirOpenWith<SIDE_RIGHT>)
@@ -164,11 +180,15 @@ BEGIN_MESSAGE_MAP(CDirView, CListView)
        ON_UPDATE_COMMAND_UI(ID_POPUP_OPEN_WITH_UNPACKER, OnUpdateCtxtOpenWithUnpacker)
        ON_COMMAND(ID_DIR_OPEN_LEFT_WITHEDITOR, OnCtxtDirOpenWithEditor<SIDE_LEFT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_LEFT_WITHEDITOR, OnUpdateCtxtDirOpenWithEditor<SIDE_LEFT>)
+       ON_COMMAND(ID_DIR_OPEN_MIDDLE_WITHEDITOR, OnCtxtDirOpenWithEditor<SIDE_MIDDLE>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_MIDDLE_WITHEDITOR, OnUpdateCtxtDirOpenWithEditor<SIDE_MIDDLE>)
        ON_COMMAND(ID_DIR_OPEN_RIGHT_WITHEDITOR, OnCtxtDirOpenWithEditor<SIDE_RIGHT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_OPEN_RIGHT_WITHEDITOR, OnUpdateCtxtDirOpenWithEditor<SIDE_RIGHT>)
        ON_COMMAND(ID_DIR_COPY_LEFT_TO_BROWSE, OnCtxtDirCopyTo<SIDE_LEFT>)
+       ON_COMMAND(ID_DIR_COPY_MIDDLE_TO_BROWSE, OnCtxtDirCopyTo<SIDE_MIDDLE>)
        ON_COMMAND(ID_DIR_COPY_RIGHT_TO_BROWSE, OnCtxtDirCopyTo<SIDE_RIGHT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_COPY_LEFT_TO_BROWSE, OnUpdateCtxtDirCopyTo<SIDE_LEFT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_MIDDLE_TO_BROWSE, OnUpdateCtxtDirCopyTo<SIDE_MIDDLE>)
        ON_UPDATE_COMMAND_UI(ID_DIR_COPY_RIGHT_TO_BROWSE, OnUpdateCtxtDirCopyTo<SIDE_RIGHT>)
        ON_WM_DESTROY()
        ON_WM_CHAR()
@@ -199,10 +219,18 @@ BEGIN_MESSAGE_MAP(CDirView, CListView)
        ON_UPDATE_COMMAND_UI(ID_FILE_RIGHT_READONLY, OnUpdateReadOnly<SIDE_RIGHT>)
        ON_COMMAND(ID_TOOLS_CUSTOMIZECOLUMNS, OnCustomizeColumns)
        ON_COMMAND(ID_TOOLS_GENERATEREPORT, OnToolsGenerateReport)
-       ON_COMMAND(ID_DIR_ZIP_LEFT, OnCtxtDirZipLeft)
-       ON_COMMAND(ID_DIR_ZIP_RIGHT, OnCtxtDirZipRight)
-       ON_COMMAND(ID_DIR_ZIP_BOTH, OnCtxtDirZipBoth)
-       ON_COMMAND(ID_DIR_ZIP_BOTH_DIFFS_ONLY, OnCtxtDirZipBothDiffsOnly)
+       ON_COMMAND(ID_DIR_ZIP_LEFT, OnCtxtDirZip<DirItemEnumerator::Left>)
+       ON_COMMAND(ID_DIR_ZIP_MIDDLE, OnCtxtDirZip<DirItemEnumerator::Middle>)
+       ON_COMMAND(ID_DIR_ZIP_RIGHT, OnCtxtDirZip<DirItemEnumerator::Right>)
+       ON_COMMAND(ID_DIR_ZIP_BOTH, OnCtxtDirZip<DirItemEnumerator::Original | DirItemEnumerator::Altered | DirItemEnumerator::BalanceFolders>)
+       ON_COMMAND(ID_DIR_ZIP_ALL, OnCtxtDirZip<DirItemEnumerator::Original | DirItemEnumerator::Altered | DirItemEnumerator::BalanceFolders>)
+       ON_COMMAND(ID_DIR_ZIP_BOTH_DIFFS_ONLY, OnCtxtDirZip<DirItemEnumerator::Original | DirItemEnumerator::Altered | DirItemEnumerator::BalanceFolders | DirItemEnumerator::DiffsOnly>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_ZIP_LEFT, OnUpdateCtxtDirCopyTo<SIDE_LEFT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_ZIP_MIDDLE, OnUpdateCtxtDirCopyTo<SIDE_MIDDLE>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_ZIP_RIGHT, OnUpdateCtxtDirCopyTo<SIDE_RIGHT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_ZIP_BOTH, OnUpdateCtxtDirCopyBothTo)
+       ON_UPDATE_COMMAND_UI(ID_DIR_ZIP_ALL, OnUpdateCtxtDirCopyBothTo)
+       ON_UPDATE_COMMAND_UI(ID_DIR_ZIP_BOTH_DIFFS_ONLY, OnUpdateCtxtDirCopyBothDiffsOnlyTo)
        ON_COMMAND(ID_DIR_SHELL_CONTEXT_MENU_LEFT, OnCtxtDirShellContextMenu<SIDE_LEFT>)
        ON_COMMAND(ID_DIR_SHELL_CONTEXT_MENU_MIDDLE, OnCtxtDirShellContextMenu<SIDE_MIDDLE>)
        ON_COMMAND(ID_DIR_SHELL_CONTEXT_MENU_RIGHT, OnCtxtDirShellContextMenu<SIDE_RIGHT>)
@@ -211,18 +239,34 @@ BEGIN_MESSAGE_MAP(CDirView, CListView)
        ON_COMMAND_RANGE(ID_PREDIFF_MANUAL, ID_PREDIFF_AUTO, OnPluginPredifferMode)
        ON_UPDATE_COMMAND_UI_RANGE(ID_PREDIFF_MANUAL, ID_PREDIFF_AUTO, OnUpdatePluginPredifferMode)
        ON_COMMAND(ID_DIR_COPY_PATHNAMES_LEFT, OnCopyPathnames<SIDE_LEFT>)
+       ON_COMMAND(ID_DIR_COPY_PATHNAMES_MIDDLE, OnCopyPathnames<SIDE_MIDDLE>)
        ON_COMMAND(ID_DIR_COPY_PATHNAMES_RIGHT, OnCopyPathnames<SIDE_RIGHT>)
        ON_COMMAND(ID_DIR_COPY_PATHNAMES_BOTH, OnCopyBothPathnames)
+       ON_COMMAND(ID_DIR_COPY_PATHNAMES_ALL, OnCopyBothPathnames)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_PATHNAMES_LEFT, OnUpdateCtxtDirCopyTo<SIDE_LEFT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_PATHNAMES_MIDDLE, OnUpdateCtxtDirCopyTo<SIDE_MIDDLE>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_PATHNAMES_RIGHT, OnUpdateCtxtDirCopyTo<SIDE_RIGHT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_PATHNAMES_BOTH, OnUpdateCtxtDirCopyBothTo)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_PATHNAMES_ALL, OnUpdateCtxtDirCopyBothTo)
        ON_COMMAND(ID_DIR_COPY_FILENAMES, OnCopyFilenames)
        ON_UPDATE_COMMAND_UI(ID_DIR_COPY_FILENAMES, OnUpdateCopyFilenames)
        ON_COMMAND(ID_DIR_COPY_LEFT_TO_CLIPBOARD, OnCopyToClipboard<SIDE_LEFT>)
+       ON_COMMAND(ID_DIR_COPY_MIDDLE_TO_CLIPBOARD, OnCopyToClipboard<SIDE_MIDDLE>)
        ON_COMMAND(ID_DIR_COPY_RIGHT_TO_CLIPBOARD, OnCopyToClipboard<SIDE_RIGHT>)
        ON_COMMAND(ID_DIR_COPY_BOTH_TO_CLIPBOARD, OnCopyBothToClipboard)
+       ON_COMMAND(ID_DIR_COPY_ALL_TO_CLIPBOARD, OnCopyBothToClipboard)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_LEFT_TO_CLIPBOARD, OnUpdateCtxtDirCopyTo<SIDE_LEFT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_MIDDLE_TO_CLIPBOARD, OnUpdateCtxtDirCopyTo<SIDE_MIDDLE>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_RIGHT_TO_CLIPBOARD, OnUpdateCtxtDirCopyTo<SIDE_RIGHT>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_BOTH_TO_CLIPBOARD, OnUpdateCtxtDirCopyBothTo)
+       ON_UPDATE_COMMAND_UI(ID_DIR_COPY_ALL_TO_CLIPBOARD, OnUpdateCtxtDirCopyBothTo)
        ON_COMMAND(ID_DIR_ITEM_RENAME, OnItemRename)
        ON_UPDATE_COMMAND_UI(ID_DIR_ITEM_RENAME, OnUpdateItemRename)
        ON_COMMAND(ID_DIR_HIDE_FILENAMES, OnHideFilenames)
        ON_COMMAND(ID_DIR_MOVE_LEFT_TO_BROWSE, OnCtxtDirMoveTo<SIDE_LEFT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_LEFT_TO_BROWSE, OnUpdateCtxtDirMoveTo<SIDE_LEFT>)
+       ON_COMMAND(ID_DIR_MOVE_MIDDLE_TO_BROWSE, OnCtxtDirMoveTo<SIDE_MIDDLE>)
+       ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_MIDDLE_TO_BROWSE, OnUpdateCtxtDirMoveTo<SIDE_MIDDLE>)
        ON_COMMAND(ID_DIR_MOVE_RIGHT_TO_BROWSE, OnCtxtDirMoveTo<SIDE_RIGHT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_RIGHT_TO_BROWSE, OnUpdateCtxtDirMoveTo<SIDE_RIGHT>)
        ON_UPDATE_COMMAND_UI(ID_DIR_HIDE_FILENAMES, OnUpdateHideFilenames)
@@ -257,12 +301,14 @@ BEGIN_MESSAGE_MAP(CDirView, CListView)
        ON_COMMAND(ID_OPTIONS_SHOWDIFFERENT, OnOptionsShowDifferent)
        ON_COMMAND(ID_OPTIONS_SHOWIDENTICAL, OnOptionsShowIdentical)
        ON_COMMAND(ID_OPTIONS_SHOWUNIQUELEFT, OnOptionsShowUniqueLeft)
+       ON_COMMAND(ID_OPTIONS_SHOWUNIQUEMIDDLE, OnOptionsShowUniqueMiddle)
        ON_COMMAND(ID_OPTIONS_SHOWUNIQUERIGHT, OnOptionsShowUniqueRight)
        ON_COMMAND(ID_OPTIONS_SHOWBINARIES, OnOptionsShowBinaries)
        ON_COMMAND(ID_OPTIONS_SHOWSKIPPED, OnOptionsShowSkipped)
        ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWDIFFERENT, OnUpdateOptionsShowdifferent)
        ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWIDENTICAL, OnUpdateOptionsShowidentical)
        ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWUNIQUELEFT, OnUpdateOptionsShowuniqueleft)
+       ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWUNIQUEMIDDLE, OnUpdateOptionsShowuniquemiddle)
        ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWUNIQUERIGHT, OnUpdateOptionsShowuniqueright)
        ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWBINARIES, OnUpdateOptionsShowBinaries)
        ON_UPDATE_COMMAND_UI(ID_OPTIONS_SHOWSKIPPED, OnUpdateOptionsShowSkipped)
@@ -623,8 +669,42 @@ void CDirView::ListContextMenu(CPoint point, int /*i*/)
        ASSERT(pPopup != NULL);
 
        if (pDoc->m_nDirs < 3)
+       {
+               pPopup->RemoveMenu(ID_DIR_COPY_LEFT_TO_MIDDLE, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_MIDDLE_TO_LEFT, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_MIDDLE_TO_RIGHT, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_MIDDLE_TO_BROWSE, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_RIGHT_TO_MIDDLE, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_MOVE_MIDDLE_TO_BROWSE, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_DEL_MIDDLE, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_DEL_ALL, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_OPEN_MIDDLE, MF_BYCOMMAND);
+
+               for (int i = 0; i < pPopup->GetMenuItemCount(); ++i)
+               {
+                       if (pPopup->GetMenuItemID(i) == ID_DIR_HIDE_FILENAMES)
+                               pPopup->RemoveMenu(i + 3, MF_BYPOSITION);
+               }
+
+               pPopup->RemoveMenu(ID_DIR_OPEN_MIDDLE_WITHEDITOR, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_OPEN_MIDDLE_WITH, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_PATHNAMES_MIDDLE, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_PATHNAMES_ALL, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_MIDDLE_TO_CLIPBOARD, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_ALL_TO_CLIPBOARD, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_ZIP_MIDDLE, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_ZIP_ALL, MF_BYCOMMAND);
                pPopup->RemoveMenu(ID_DIR_SHELL_CONTEXT_MENU_MIDDLE, MF_BYCOMMAND);
 
+       }
+       else
+       {
+               pPopup->RemoveMenu(ID_DIR_COPY_PATHNAMES_BOTH, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_COPY_BOTH_TO_CLIPBOARD, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_ZIP_BOTH, MF_BYCOMMAND);
+               pPopup->RemoveMenu(ID_DIR_DEL_BOTH, MF_BYCOMMAND);
+       }
+
        CMenu menuPluginsHolder;
        menuPluginsHolder.LoadMenu(IDR_POPUP_PLUGINS_SETTINGS);
        theApp.TranslateMenu(menuPluginsHolder.m_hMenu);
@@ -632,31 +712,6 @@ void CDirView::ListContextMenu(CPoint point, int /*i*/)
        pPopup->AppendMenu(MF_SEPARATOR);
        pPopup->AppendMenu(MF_POPUP, (int)menuPluginsHolder.m_hMenu, s.c_str());
 
-
-       // TODO: It would be more efficient to set
-       // all the popup items now with one traverse over selected items
-       // instead of using updates, in which we make a traverse for every item
-       // Perry, 2002-12-04
-
-       //2003/12/17 Jochen:
-       //-     Archive related menu items follow the above suggestion.
-       //-     For disabling to work properly, the tracking frame's m_bAutoMenuEnable
-       //      member has to temporarily be turned off.
-       ContextMenuCounts counts = CountForContextMenu(SelBegin(), SelEnd(), GetDiffContext());
-
-       FormatContextMenu(pPopup, ID_DIR_COPY_PATHNAMES_LEFT, counts.nOpenable[0], counts.nTotal);
-       FormatContextMenu(pPopup, ID_DIR_COPY_PATHNAMES_RIGHT, counts.nOpenable[GetDocument()->m_nDirs - 1], counts.nTotal);
-       FormatContextMenu(pPopup, ID_DIR_COPY_PATHNAMES_BOTH, counts.nOpenableOnBoth, counts.nTotal);
-
-       FormatContextMenu(pPopup, ID_DIR_COPY_LEFT_TO_CLIPBOARD, counts.nOpenable[0], counts.nTotal);
-       FormatContextMenu(pPopup, ID_DIR_COPY_RIGHT_TO_CLIPBOARD, counts.nOpenable[GetDocument()->m_nDirs - 1], counts.nTotal);
-       FormatContextMenu(pPopup, ID_DIR_COPY_BOTH_TO_CLIPBOARD, counts.nOpenableOnBoth, counts.nTotal);
-
-       FormatContextMenu(pPopup, ID_DIR_ZIP_LEFT, counts.nOpenable[0], counts.nTotal);
-       FormatContextMenu(pPopup, ID_DIR_ZIP_RIGHT, counts.nOpenable[GetDocument()->m_nDirs - 1], counts.nTotal);
-       FormatContextMenu(pPopup, ID_DIR_ZIP_BOTH, counts.nOpenableOnBoth, counts.nTotal);
-       FormatContextMenu(pPopup, ID_DIR_ZIP_BOTH_DIFFS_ONLY, counts.nDiffItems, counts.nTotal);
-
        CFrameWnd *pFrame = GetTopLevelFrame();
        ASSERT(pFrame != NULL);
        pFrame->m_bAutoMenuEnable = FALSE;
@@ -1419,7 +1474,7 @@ void CDirView::OnUpdateCtxtDirDelBoth(CCmdUI* pCmdUI)
 {
        Counts counts = Count(&DirActions::IsItemDeletableOnBoth);
        pCmdUI->Enable(counts.count > 0);
-       pCmdUI->SetText(FormatMenuItemStringBoth(counts.count, counts.total).c_str());
+       pCmdUI->SetText(FormatMenuItemStringAll(GetDocument()->m_nDirs, counts.count, counts.total).c_str());
 }
 
 /**
@@ -1433,6 +1488,20 @@ void CDirView::OnUpdateCtxtDirCopyTo(CCmdUI* pCmdUI)
        pCmdUI->SetText(FormatMenuItemStringTo(stype, counts.count, counts.total).c_str());
 }
 
+void CDirView::OnUpdateCtxtDirCopyBothTo(CCmdUI* pCmdUI)
+{
+       Counts counts = Count(&DirActions::IsItemCopyableBothToOn);
+       pCmdUI->Enable(counts.count > 0);
+       pCmdUI->SetText(FormatMenuItemStringAllTo(GetDocument()->m_nDirs, counts.count, counts.total).c_str());
+}
+
+void CDirView::OnUpdateCtxtDirCopyBothDiffsOnlyTo(CCmdUI* pCmdUI)
+{
+       Counts counts = Count(&DirActions::IsItemNavigableDiff);
+       pCmdUI->Enable(counts.count > 0);
+       pCmdUI->SetText(FormatMenuItemStringDifferencesTo(counts.count, counts.total).c_str());
+}
+       
 /**
  * @brief Get keydata associated with item in given index.
  * @param [in] idx Item's index to list in UI.
@@ -1614,7 +1683,7 @@ void CDirView::OnCtxtDirOpenWithEditor()
 template<SIDE_TYPE stype>
 void CDirView::OnUpdateCtxtDirOpenWithEditor(CCmdUI* pCmdUI)
 {
-       Counts counts = Count(&DirActions::IsItemOpenanbleOnWith<stype>);
+       Counts counts = Count(&DirActions::IsItemOpenableOnWith<stype>);
        pCmdUI->Enable(counts.count > 0 && counts.total == 1);
 }
 
@@ -1632,7 +1701,7 @@ int CDirView::GetSingleSelectedItem() const
 template<SIDE_TYPE stype>
 void CDirView::OnUpdateCtxtDirOpen(CCmdUI* pCmdUI)
 {
-       Counts counts = Count(&DirActions::IsItemOpenanbleOn<stype>);
+       Counts counts = Count(&DirActions::IsItemOpenableOn<stype>);
        pCmdUI->Enable(counts.count > 0 && counts.total == 1);
 }
 
@@ -1640,7 +1709,7 @@ void CDirView::OnUpdateCtxtDirOpen(CCmdUI* pCmdUI)
 template<SIDE_TYPE stype>
 void CDirView::OnUpdateCtxtDirOpenWith(CCmdUI* pCmdUI)
 {
-       Counts counts = Count(&DirActions::IsItemOpenanbleOnWith<stype>);
+       Counts counts = Count(&DirActions::IsItemOpenableOnWith<stype>);
        pCmdUI->Enable(counts.count > 0 && counts.total == 1);
 }
 
@@ -2456,66 +2525,8 @@ void CDirView::AddParentFolderItem(bool bEnable)
        AddNewItem(0, SPECIAL_ITEM_POS, bEnable ? DIFFIMG_DIRUP : DIFFIMG_DIRUP_DISABLE, 0);
 }
 
-/**
- * @brief Zip selected files from left side.
- */
-void CDirView::OnCtxtDirZipLeft()
-{
-       if (!HasZipSupport())
-       {
-               LangMessageBox(IDS_NO_ZIP_SUPPORT, MB_ICONINFORMATION);
-               return;
-       }
-
-       DirItemEnumerator
-       (
-               this, LVNI_SELECTED
-               |       DirItemEnumerator::Left
-       ).CompressArchive();
-}
-
-/**
- * @brief Zip selected files from right side.
- */
-void CDirView::OnCtxtDirZipRight()
-{
-       if (!HasZipSupport())
-       {
-               LangMessageBox(IDS_NO_ZIP_SUPPORT, MB_ICONINFORMATION);
-               return;
-       }
-
-       DirItemEnumerator
-       (
-               this, LVNI_SELECTED
-               |       DirItemEnumerator::Right
-       ).CompressArchive();
-}
-
-/**
- * @brief Zip selected files from both sides, using original/altered format.
- */
-void CDirView::OnCtxtDirZipBoth()
-{
-       if (!HasZipSupport())
-       {
-               LangMessageBox(IDS_NO_ZIP_SUPPORT, MB_ICONINFORMATION);
-               return;
-       }
-
-       DirItemEnumerator
-       (
-               this, LVNI_SELECTED
-               |       DirItemEnumerator::Original
-               |       DirItemEnumerator::Altered
-               |       DirItemEnumerator::BalanceFolders
-       ).CompressArchive();
-}
-
-/**
- * @brief Zip selected diffs from both sides, using original/altered format.
- */
-void CDirView::OnCtxtDirZipBothDiffsOnly()
+template <int flag>
+void CDirView::OnCtxtDirZip()
 {
        if (!HasZipSupport())
        {
@@ -2525,11 +2536,7 @@ void CDirView::OnCtxtDirZipBothDiffsOnly()
 
        DirItemEnumerator
        (
-               this, LVNI_SELECTED
-               |       DirItemEnumerator::Original
-               |       DirItemEnumerator::Altered
-               |       DirItemEnumerator::BalanceFolders
-               |       DirItemEnumerator::DiffsOnly
+               this, LVNI_SELECTED | flag
        ).CompressArchive();
 }
 
@@ -3047,6 +3054,16 @@ void CDirView::OnOptionsShowUniqueLeft()
 }
 
 /**
+ * @brief Show/Hide middle-only files/directories
+ */
+void CDirView::OnOptionsShowUniqueMiddle() 
+{
+       m_dirfilter.show_unique_middle = !m_dirfilter.show_unique_middle;
+       GetOptionsMgr()->SaveOption(OPT_SHOW_UNIQUE_MIDDLE, m_dirfilter.show_unique_middle);
+       Redisplay();
+}
+
+/**
  * @brief Show/Hide right-only files/directories
  */
 void CDirView::OnOptionsShowUniqueRight() 
@@ -3091,6 +3108,12 @@ void CDirView::OnUpdateOptionsShowuniqueleft(CCmdUI* pCmdUI)
        pCmdUI->SetCheck(m_dirfilter.show_unique_left);
 }
 
+void CDirView::OnUpdateOptionsShowuniquemiddle(CCmdUI* pCmdUI) 
+{
+       pCmdUI->Enable(GetDocument()->m_nDirs > 2);
+       pCmdUI->SetCheck(m_dirfilter.show_unique_middle);
+}
+
 void CDirView::OnUpdateOptionsShowuniqueright(CCmdUI* pCmdUI) 
 {
        pCmdUI->SetCheck(m_dirfilter.show_unique_right);
index d530b84..546a456 100644 (file)
@@ -258,6 +258,8 @@ protected:
        afx_msg void OnCtxtDirCopyTo();
        template<SIDE_TYPE stype>
        afx_msg void OnUpdateCtxtDirCopyTo(CCmdUI* pCmdUI);
+       afx_msg void OnUpdateCtxtDirCopyBothTo(CCmdUI* pCmdUI);
+       afx_msg void OnUpdateCtxtDirCopyBothDiffsOnlyTo(CCmdUI* pCmdUI);
        afx_msg void OnDestroy();
        afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
        afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
@@ -288,10 +290,8 @@ protected:
        afx_msg void OnCtxtOpenWithUnpacker();
        afx_msg void OnUpdateCtxtOpenWithUnpacker(CCmdUI* pCmdUI);
        afx_msg void OnToolsGenerateReport();
-       afx_msg void OnCtxtDirZipLeft();
-       afx_msg void OnCtxtDirZipRight();
-       afx_msg void OnCtxtDirZipBoth();
-       afx_msg void OnCtxtDirZipBothDiffsOnly();
+       template<int flag>
+       afx_msg void OnCtxtDirZip();
        template<SIDE_TYPE stype>
        afx_msg void OnCtxtDirShellContextMenu();
        afx_msg void OnUpdateCtxtDir(CCmdUI* pCmdUI);
@@ -331,12 +331,14 @@ protected:
        afx_msg void OnOptionsShowDifferent();
        afx_msg void OnOptionsShowIdentical();
        afx_msg void OnOptionsShowUniqueLeft();
+       afx_msg void OnOptionsShowUniqueMiddle();
        afx_msg void OnOptionsShowUniqueRight();
        afx_msg void OnOptionsShowBinaries();
        afx_msg void OnOptionsShowSkipped();
        afx_msg void OnUpdateOptionsShowdifferent(CCmdUI* pCmdUI);
        afx_msg void OnUpdateOptionsShowidentical(CCmdUI* pCmdUI);
        afx_msg void OnUpdateOptionsShowuniqueleft(CCmdUI* pCmdUI);
+       afx_msg void OnUpdateOptionsShowuniquemiddle(CCmdUI* pCmdUI);
        afx_msg void OnUpdateOptionsShowuniqueright(CCmdUI* pCmdUI);
        afx_msg void OnUpdateOptionsShowBinaries(CCmdUI* pCmdUI);
        afx_msg void OnUpdateOptionsShowSkipped(CCmdUI* pCmdUI);
index 980a2f6..b0a0922 100644 (file)
@@ -144,23 +144,37 @@ const CMainFrame::MENUITEM_ICON CMainFrame::m_MenuIcons[] = {
        { ID_MERGE_DELETE,                              IDB_MERGE_DELETE,                               CMainFrame::MENU_FOLDERCMP },
        { ID_TOOLS_GENERATEREPORT,              IDB_TOOLS_GENERATEREPORT,               CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_LEFT_TO_RIGHT,    IDB_LEFT_TO_RIGHT,                              CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_LEFT_TO_MIDDLE,   IDB_LEFT_TO_MIDDLE,                             CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_RIGHT_TO_LEFT,    IDB_RIGHT_TO_LEFT,                              CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_RIGHT_TO_MIDDLE,  IDB_RIGHT_TO_MIDDLE,                    CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_MIDDLE_TO_LEFT,   IDB_MIDDLE_TO_LEFT,                             CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_MIDDLE_TO_RIGHT,  IDB_MIDDLE_TO_RIGHT,                    CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_LEFT_TO_BROWSE,   IDB_LEFT_TO_BROWSE,                             CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_MIDDLE_TO_BROWSE, IDB_MIDDLE_TO_BROWSE,                   CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_RIGHT_TO_BROWSE,  IDB_RIGHT_TO_BROWSE,                    CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_MOVE_LEFT_TO_BROWSE,   IDB_MOVE_LEFT_TO_BROWSE,                CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_MOVE_MIDDLE_TO_BROWSE, IDB_MOVE_MIDDLE_TO_BROWSE,              CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_MOVE_RIGHT_TO_BROWSE,  IDB_MOVE_RIGHT_TO_BROWSE,               CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_DEL_LEFT,                              IDB_LEFT,                                               CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_DEL_MIDDLE,                    IDB_MIDDLE,                                             CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_DEL_RIGHT,                             IDB_RIGHT,                                              CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_DEL_BOTH,                              IDB_BOTH,                                               CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_DEL_ALL,                               IDB_ALL,                                                CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_PATHNAMES_LEFT,   IDB_LEFT,                                               CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_PATHNAMES_MIDDLE, IDB_MIDDLE,                                             CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_PATHNAMES_RIGHT,  IDB_RIGHT,                                              CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_PATHNAMES_BOTH,   IDB_BOTH,                                               CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_PATHNAMES_ALL,    IDB_ALL,                                                CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_LEFT_TO_CLIPBOARD, IDB_LEFT,                                              CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_MIDDLE_TO_CLIPBOARD, IDB_MIDDLE,                                  CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_RIGHT_TO_CLIPBOARD, IDB_RIGHT,                                    CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_COPY_BOTH_TO_CLIPBOARD, IDB_BOTH,                                              CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_COPY_ALL_TO_CLIPBOARD, IDB_ALL,                                                CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_ZIP_LEFT,                              IDB_LEFT,                                               CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_ZIP_MIDDLE,                    IDB_MIDDLE,                                             CMainFrame::MENU_FOLDERCMP },
        { ID_DIR_ZIP_RIGHT,                             IDB_RIGHT,                                              CMainFrame::MENU_FOLDERCMP },
-       { ID_DIR_ZIP_BOTH,                              IDB_BOTH,                                               CMainFrame::MENU_FOLDERCMP }
+       { ID_DIR_ZIP_BOTH,                              IDB_BOTH,                                               CMainFrame::MENU_FOLDERCMP },
+       { ID_DIR_ZIP_ALL,                               IDB_ALL,                                                CMainFrame::MENU_FOLDERCMP }
 };
 
 
index 977cd44..faffa89 100644 (file)
@@ -264,6 +264,7 @@ BEGIN
         MENUITEM "Show &Identical Items",       ID_OPTIONS_SHOWIDENTICAL
         MENUITEM "Show &Different Items",       ID_OPTIONS_SHOWDIFFERENT
         MENUITEM "Show L&eft Unique Items",     ID_OPTIONS_SHOWUNIQUELEFT
+        MENUITEM "Show Midd&le Unique Items",   ID_OPTIONS_SHOWUNIQUEMIDDLE
         MENUITEM "Show Ri&ght Unique Items",    ID_OPTIONS_SHOWUNIQUERIGHT
         MENUITEM "Show S&kipped Items",         ID_OPTIONS_SHOWSKIPPED
         MENUITEM "S&how Binary Files",          ID_OPTIONS_SHOWBINARIES
@@ -615,21 +616,29 @@ BEGIN
         MENUITEM SEPARATOR
         POPUP "&Copy"
         BEGIN
-            MENUITEM "&Left to Right",              ID_DIR_COPY_LEFT_TO_RIGHT
-            MENUITEM "L&eft to...",                 ID_DIR_COPY_LEFT_TO_BROWSE
-            MENUITEM "&Right to Left",              ID_DIR_COPY_RIGHT_TO_LEFT
-            MENUITEM "R&ight to...",                ID_DIR_COPY_RIGHT_TO_BROWSE
+            MENUITEM "Left to Middle (%1 of %2)",   ID_DIR_COPY_LEFT_TO_MIDDLE
+            MENUITEM "Left to Right (%1 of %2)",    ID_DIR_COPY_LEFT_TO_RIGHT
+            MENUITEM "Left to... (%1 of %2)",       ID_DIR_COPY_LEFT_TO_BROWSE
+            MENUITEM "Middle to Left (%1 of %2)",   ID_DIR_COPY_MIDDLE_TO_LEFT
+            MENUITEM "Middle to Right (%1 of %2)",  ID_DIR_COPY_MIDDLE_TO_RIGHT
+            MENUITEM "Middle to... (%1 of %2)",     ID_DIR_COPY_MIDDLE_TO_BROWSE
+            MENUITEM "Right to Middle (%1 of %2)",  ID_DIR_COPY_RIGHT_TO_MIDDLE
+            MENUITEM "Right to Left (%1 of %2)",    ID_DIR_COPY_RIGHT_TO_LEFT
+            MENUITEM "Right to... (%1 of %2)",      ID_DIR_COPY_RIGHT_TO_BROWSE
         END
         POPUP "&Move"
         BEGIN
-            MENUITEM "&Left to...",                 ID_DIR_MOVE_LEFT_TO_BROWSE
-            MENUITEM "&Right to...",                ID_DIR_MOVE_RIGHT_TO_BROWSE
+            MENUITEM "Left to... (%1 of %2)",       ID_DIR_MOVE_LEFT_TO_BROWSE
+            MENUITEM "Middle to... (%1 of %2)",     ID_DIR_MOVE_MIDDLE_TO_BROWSE
+            MENUITEM "Right to... (%1 of %2)",      ID_DIR_MOVE_RIGHT_TO_BROWSE
         END
         POPUP "&Delete"
         BEGIN
             MENUITEM "&Left",                       ID_DIR_DEL_LEFT
+            MENUITEM "&Middle",                     ID_DIR_DEL_MIDDLE
             MENUITEM "&Right",                      ID_DIR_DEL_RIGHT
             MENUITEM "&Both",                       ID_DIR_DEL_BOTH
+            MENUITEM "&All",                        ID_DIR_DEL_ALL
         END
         MENUITEM "Re&name",                         ID_DIR_ITEM_RENAME
         MENUITEM "&Hide Items",                     ID_DIR_HIDE_FILENAMES
@@ -640,6 +649,12 @@ BEGIN
             MENUITEM "with &External Editor",       ID_DIR_OPEN_LEFT_WITHEDITOR
             MENUITEM "&with...",                    ID_DIR_OPEN_LEFT_WITH
         END
+        POPUP "Open Midd&le"
+        BEGIN
+            MENUITEM "with &Registered Application", ID_DIR_OPEN_MIDDLE
+            MENUITEM "with &External Editor",       ID_DIR_OPEN_MIDDLE_WITHEDITOR
+            MENUITEM "&with...",                    ID_DIR_OPEN_MIDDLE_WITH
+        END
         POPUP "O&pen Right"
         BEGIN
             MENUITEM "with &Registered Application", ID_DIR_OPEN_RIGHT
@@ -649,24 +664,30 @@ BEGIN
         MENUITEM SEPARATOR
         POPUP "Cop&y Pathnames"
         BEGIN
-            MENUITEM "&Left (%1 of %2)",            ID_DIR_COPY_PATHNAMES_LEFT
-            MENUITEM "&Right (%1 of %2)",           ID_DIR_COPY_PATHNAMES_RIGHT
-            MENUITEM "&Both (%1 of %2)",            ID_DIR_COPY_PATHNAMES_BOTH
+            MENUITEM "Left (%1 of %2)",            ID_DIR_COPY_PATHNAMES_LEFT
+            MENUITEM "Middle (%1 of %2)",          ID_DIR_COPY_PATHNAMES_MIDDLE
+            MENUITEM "Right (%1 of %2)",           ID_DIR_COPY_PATHNAMES_RIGHT
+            MENUITEM "Both (%1 of %2)",            ID_DIR_COPY_PATHNAMES_BOTH
+            MENUITEM "All (%1 of %2)",             ID_DIR_COPY_PATHNAMES_ALL
         END
         MENUITEM "Copy &Filenames",                 ID_DIR_COPY_FILENAMES
         POPUP "Copy Items To Clip&board"
         BEGIN
-            MENUITEM "&Left (%1 of %2)",            ID_DIR_COPY_LEFT_TO_CLIPBOARD
-            MENUITEM "&Right (%1 of %2)",           ID_DIR_COPY_RIGHT_TO_CLIPBOARD
-            MENUITEM "&Both (%1 of %2)",            ID_DIR_COPY_BOTH_TO_CLIPBOARD
+            MENUITEM "Left (%1 of %2)",            ID_DIR_COPY_LEFT_TO_CLIPBOARD
+            MENUITEM "Middle (%1 of %2)",          ID_DIR_COPY_MIDDLE_TO_CLIPBOARD
+            MENUITEM "Right (%1 of %2)",           ID_DIR_COPY_RIGHT_TO_CLIPBOARD
+            MENUITEM "Both (%1 of %2)",            ID_DIR_COPY_BOTH_TO_CLIPBOARD
+            MENUITEM "All (%1 of %2)",             ID_DIR_COPY_ALL_TO_CLIPBOARD
         END
         MENUITEM SEPARATOR
         POPUP "&Zip"
         BEGIN
-            MENUITEM "&Left... (%1 of %2)",         ID_DIR_ZIP_LEFT
-            MENUITEM "&Right... (%1 of %2)",        ID_DIR_ZIP_RIGHT
-            MENUITEM "&Both... (%1 of %2)",         ID_DIR_ZIP_BOTH
-            MENUITEM "&Differences... (%1 of %2)",  ID_DIR_ZIP_BOTH_DIFFS_ONLY
+            MENUITEM "Left to... (%1 of %2)",         ID_DIR_ZIP_LEFT
+            MENUITEM "Middle to... (%1 of %2)",       ID_DIR_ZIP_MIDDLE
+            MENUITEM "Right to... (%1 of %2)",        ID_DIR_ZIP_RIGHT
+            MENUITEM "Both to... (%1 of %2)",         ID_DIR_ZIP_BOTH
+            MENUITEM "All to... (%1 of %2)",          ID_DIR_ZIP_ALL
+            MENUITEM "Differences to... (%1 of %2)",  ID_DIR_ZIP_BOTH_DIFFS_ONLY
         END
         MENUITEM SEPARATOR
         MENUITEM "&Refresh",                        ID_RESCAN
@@ -2273,30 +2294,53 @@ END
 // DIRECTORY DIFFING : FILE COPY/DELETE (WITHOUT/WITH NUMBER MARK)
 STRINGTABLE
 BEGIN
-    IDS_COPY_TO_LEFT        "Right to Left (%1)"
-    IDS_COPY_TO_RIGHT       "Left to Right (%1)"
-    IDS_COPY_TO_LEFT2       "Right to Left (%1 of %2)"
-    IDS_COPY_TO_RIGHT2      "Left to Right (%1 of %2)"
+    IDS_COPY_RIGHT_TO_LEFT   "Right to Left (%1)"
+    IDS_COPY_RIGHT_TO_MIDDLE "Right to Middle (%1)"
+    IDS_COPY_MIDDLE_TO_LEFT  "Middle to Left (%1)"
+    IDS_COPY_MIDDLE_TO_RIGHT "Middle to Right (%1)"
+    IDS_COPY_LEFT_TO_RIGHT   "Left to Right (%1)"
+    IDS_COPY_LEFT_TO_MIDDLE  "Left to Middle (%1)"
+    IDS_COPY_RIGHT_TO_LEFT2  "Right to Left (%1 of %2)"
+    IDS_COPY_RIGHT_TO_MIDDLE2 "Right to Middle (%1 of %2)"
+    IDS_COPY_MIDDLE_TO_LEFT2 "Middle to Left (%1 of %2)"
+    IDS_COPY_MIDDLE_TO_RIGHT2 "Middle to Right (%1 of %2)"
+    IDS_COPY_LEFT_TO_RIGHT2  "Left to Right (%1 of %2)"
+    IDS_COPY_LEFT_TO_MIDDLE2 "Left to Middle (%1 of %2)"
     IDS_COPY_LEFT_TO        "Left to... (%1)"
+    IDS_COPY_MIDDLE_TO      "Middle to... (%1)"
     IDS_COPY_RIGHT_TO       "Right to... (%1)"
+    IDS_COPY_BOTH_TO        "Both to... (%1)"
+    IDS_COPY_ALL_TO         "All to... (%1)"
+    IDS_COPY_DIFFERENCES_TO "Differences to... (%1)"
     IDS_COPY_LEFT_TO2       "Left to... (%1 of %2)"
+    IDS_COPY_MIDDLE_TO2     "Middle to... (%1 of %2)"
     IDS_COPY_RIGHT_TO2      "Right to... (%1 of %2)"
+    IDS_COPY_BOTH_TO2       "Both to... (%1 of %2)"
+    IDS_COPY_ALL_TO2        "All to... (%1 of %2)"
+    IDS_COPY_DIFFERENCES_TO2 "Differences to... (%1 of %2)"
 END
 
 // DIRECTORY DIFFING : FILE COPY/DELETE (WITHOUT/WITH NUMBER MARK)  (2)
 STRINGTABLE
 BEGIN
     IDS_DEL_LEFT_FMT        "Left (%1)"
+    IDS_DEL_MIDDLE_FMT      "Middle (%1)"
     IDS_DEL_RIGHT_FMT       "Right (%1)"
     IDS_DEL_BOTH_FMT        "Both (%1)"
+    IDS_DEL_ALL_FMT         "All (%1)"
     IDS_DEL_LEFT_FMT2       "Left (%1 of %2)"
+    IDS_DEL_MIDDLE_FMT2     "Middle (%1 of %2)"
     IDS_DEL_RIGHT_FMT2      "Right (%1 of %2)"
     IDS_DEL_BOTH_FMT2       "Both (%1 of %2)"
+    IDS_DEL_ALL_FMT2        "All (%1 of %2)"
     IDS_MOVE_LEFT_TO        "Left to... (%1)"
+    IDS_MOVE_MIDDLE_TO      "Middle to... (%1)"
     IDS_MOVE_RIGHT_TO       "Right to... (%1)"
     IDS_MOVE_LEFT_TO2       "Left to... (%1 of %2)"
+    IDS_MOVE_MIDDLE_TO2     "Middle to... (%1 of %2)"
     IDS_MOVE_RIGHT_TO2      "Right to... (%1 of %2)"
     IDS_SELECT_DEST_LEFT    "Left side - select destination folder:"
+    IDS_SELECT_DEST_MIDDLE  "Middle side - select destination folder:"
     IDS_SELECT_DEST_RIGHT   "Right side - select destination folder:"
     IDS_FILES_AFFECTED_FMT  "(%1 Files Affected)"
     IDS_FILES_AFFECTED_FMT2 "(%1 of %2 Files Affected)"
index 7fe5390..47e98bb 100644 (file)
@@ -136,15 +136,23 @@ IDB_EDIT_GOTO_NEXT_BOOKMARK BITMAP              "res\\next_bookmark.bmp"
 IDB_EDIT_GOTO_PREV_BOOKMARK BITMAP              "res\\prev_bookmark.bmp"
 IDB_EDIT_CLEAR_ALL_BOOKMARKS BITMAP             "res\\clear_bookmarks.bmp"
 IDB_LEFT                BITMAP                  "res\\left.bmp"
+IDB_MIDDLE              BITMAP                  "res\\middle.bmp"
 IDB_RIGHT               BITMAP                  "res\\right.bmp"
 IDB_BOTH                BITMAP                  "res\\both.bmp"
+IDB_ALL                 BITMAP                  "res\\all.bmp"
 IDB_LEFT_TO_RIGHT       BITMAP                  "res\\left_to_right.bmp"
+IDB_LEFT_TO_MIDDLE      BITMAP                  "res\\left_to_middle.bmp"
 IDB_RIGHT_TO_LEFT       BITMAP                  "res\\right_to_left.bmp"
+IDB_RIGHT_TO_MIDDLE     BITMAP                  "res\\right_to_middle.bmp"
+IDB_MIDDLE_TO_LEFT      BITMAP                  "res\\middle_to_left.bmp"
+IDB_MIDDLE_TO_RIGHT     BITMAP                  "res\\middle_to_right.bmp"
 IDB_COPY_FROM_LEFT      BITMAP                  "res\\from_left.bmp"
 IDB_COPY_FROM_RIGHT     BITMAP                  "res\\from_right.bmp"
 IDB_LEFT_TO_BROWSE      BITMAP                  "res\\left_to_browse.bmp"
+IDB_MIDDLE_TO_BROWSE    BITMAP                  "res\\middle_to_browse.bmp"
 IDB_RIGHT_TO_BROWSE     BITMAP                  "res\\right_to_browse.bmp"
 IDB_MOVE_LEFT_TO_BROWSE BITMAP                  "res\\move_left_to_browse.bmp"
+IDB_MOVE_MIDDLE_TO_BROWSE BITMAP                "res\\move_middle_to_browse.bmp"
 IDB_MOVE_RIGHT_TO_BROWSE BITMAP                 "res\\move_right_to_browse.bmp"
 IDB_TOOLBAR_DISABLED32  BITMAP                  "res\\ToolbarDisabled32.bmp"
 IDB_TOOLBAR_ENABLED32   BITMAP                  "res\\ToolbarEnabled32.bmp"
index 18056cf..45a3124 100644 (file)
@@ -16,6 +16,7 @@ extern const String OPT_SELECTED_LANGUAGE OP("Locale/LanguageId");
 
 // View-menu
 extern const String OPT_SHOW_UNIQUE_LEFT OP("Settings/ShowUniqueLeft");
+extern const String OPT_SHOW_UNIQUE_MIDDLE OP("Settings/ShowUniqueMiddle");
 extern const String OPT_SHOW_UNIQUE_RIGHT OP("Settings/ShowUniqueRight");
 extern const String OPT_SHOW_DIFFERENT OP("Settings/ShowDifferent");
 extern const String OPT_SHOW_IDENTICAL OP("Settings/ShowIdentical");
index 8101f25..57041ee 100644 (file)
@@ -57,6 +57,7 @@ void Init(COptionsMgr *pOptions)
 
        // Initialise options (name, default value)
        pOptions->InitOption(OPT_SHOW_UNIQUE_LEFT, true);
+       pOptions->InitOption(OPT_SHOW_UNIQUE_MIDDLE, true);
        pOptions->InitOption(OPT_SHOW_UNIQUE_RIGHT, true);
        pOptions->InitOption(OPT_SHOW_DIFFERENT, true);
        pOptions->InitOption(OPT_SHOW_IDENTICAL, true);
diff --git a/Src/res/all.bmp b/Src/res/all.bmp
new file mode 100644 (file)
index 0000000..c5cb5d7
Binary files /dev/null and b/Src/res/all.bmp differ
diff --git a/Src/res/left_to_middle.bmp b/Src/res/left_to_middle.bmp
new file mode 100644 (file)
index 0000000..ed7317b
Binary files /dev/null and b/Src/res/left_to_middle.bmp differ
diff --git a/Src/res/middle.bmp b/Src/res/middle.bmp
new file mode 100644 (file)
index 0000000..43e1190
Binary files /dev/null and b/Src/res/middle.bmp differ
diff --git a/Src/res/middle_to_browse.bmp b/Src/res/middle_to_browse.bmp
new file mode 100644 (file)
index 0000000..3d3e30a
Binary files /dev/null and b/Src/res/middle_to_browse.bmp differ
diff --git a/Src/res/middle_to_left.bmp b/Src/res/middle_to_left.bmp
new file mode 100644 (file)
index 0000000..d61e334
Binary files /dev/null and b/Src/res/middle_to_left.bmp differ
diff --git a/Src/res/middle_to_right.bmp b/Src/res/middle_to_right.bmp
new file mode 100644 (file)
index 0000000..2c604bb
Binary files /dev/null and b/Src/res/middle_to_right.bmp differ
diff --git a/Src/res/move_middle_to_browse.bmp b/Src/res/move_middle_to_browse.bmp
new file mode 100644 (file)
index 0000000..499e56a
Binary files /dev/null and b/Src/res/move_middle_to_browse.bmp differ
diff --git a/Src/res/right_to_middle.bmp b/Src/res/right_to_middle.bmp
new file mode 100644 (file)
index 0000000..3984ab7
Binary files /dev/null and b/Src/res/right_to_middle.bmp differ
index bda3b95..6563314 100644 (file)
 #define IDB_EDIT_CLEAR_ALL_BOOKMARKS    345
 #define IDB_TOOLBAR_DISABLED            346
 #define IDB_LEFT                        347
+#define IDB_MIDDLE                      747
 #define IDB_RIGHT                       348
 #define IDB_BOTH                        349
+#define IDB_ALL                         749
 #define IDB_LEFT_TO_RIGHT               350
+#define IDB_LEFT_TO_MIDDLE              750
 #define IDB_RIGHT_TO_LEFT               351
+#define IDB_RIGHT_TO_MIDDLE             751
+#define IDB_MIDDLE_TO_LEFT              851
+#define IDB_MIDDLE_TO_RIGHT             951
 #define IDB_LEFT_TO_BROWSE              352
+#define IDB_MIDDLE_TO_BROWSE            752
 #define IDB_RIGHT_TO_BROWSE             353
 #define IDB_MOVE_LEFT_TO_BROWSE         354
+#define IDB_MOVE_MIDDLE_TO_BROWSE       754
 #define IDB_MOVE_RIGHT_TO_BROWSE        355
 #define IDB_TOOLBAR_DISABLED32          356
 #define IDB_TOOLBAR_ENABLED32           357
 #define IDS_VSS_UNCOERROR               17272
 #define IDS_VIEWS_OUTOFSYNC             17300
 #define ID_DIR_COPY_LEFT_TO_RIGHT       17600
+#define ID_DIR_COPY_LEFT_TO_MIDDLE      27600
 #define ID_DIR_COPY_LEFT_TO_BROWSE      17601
+#define ID_DIR_COPY_MIDDLE_TO_LEFT      27601
+#define ID_DIR_COPY_MIDDLE_TO_RIGHT     37601
+#define ID_DIR_COPY_MIDDLE_TO_BROWSE    47601
 #define ID_DIR_COPY_RIGHT_TO_LEFT       17602
+#define ID_DIR_COPY_RIGHT_TO_MIDDLE     27602
 #define ID_DIR_COPY_RIGHT_TO_BROWSE     17603
-#define ID_DIR_COPY_LEFT_TO_CLIPBOARD   27602
-#define ID_DIR_COPY_RIGHT_TO_CLIPBOARD  27603
-#define ID_DIR_COPY_BOTH_TO_CLIPBOARD   27604
+#define ID_DIR_COPY_LEFT_TO_CLIPBOARD   37602
+#define ID_DIR_COPY_MIDDLE_TO_CLIPBOARD 27603
+#define ID_DIR_COPY_RIGHT_TO_CLIPBOARD  37603
+#define ID_DIR_COPY_BOTH_TO_CLIPBOARD   47603
+#define ID_DIR_COPY_ALL_TO_CLIPBOARD    48603
 #define ID_DIR_DEL_LEFT                 17604
+#define ID_DIR_DEL_MIDDLE               27604
 #define ID_DIR_DEL_RIGHT                17605
 #define ID_DIR_DEL_BOTH                 17606
-#define IDS_COPY_TO_LEFT                17607
-#define IDS_COPY_TO_RIGHT               17608
-#define IDS_COPY_TO_LEFT2               17609
-#define IDS_COPY_TO_RIGHT2              17610
+#define ID_DIR_DEL_ALL                  18606
+#define IDS_COPY_RIGHT_TO_LEFT          17607
+#define IDS_COPY_RIGHT_TO_MIDDLE        27607
+#define IDS_COPY_MIDDLE_TO_LEFT         17608
+#define IDS_COPY_MIDDLE_TO_RIGHT        27608
+#define IDS_COPY_LEFT_TO_RIGHT          17609
+#define IDS_COPY_LEFT_TO_MIDDLE         27609
+#define IDS_COPY_RIGHT_TO_LEFT2         17610
+#define IDS_COPY_RIGHT_TO_MIDDLE2       28610
+#define IDS_COPY_MIDDLE_TO_LEFT2        37610
+#define IDS_COPY_MIDDLE_TO_RIGHT2       38610
+#define IDS_COPY_LEFT_TO_RIGHT2         47610
+#define IDS_COPY_LEFT_TO_MIDDLE2        48610
 #define IDS_COPY_LEFT_TO                17611
+#define IDS_COPY_MIDDLE_TO              27611
 #define IDS_COPY_RIGHT_TO               17612
+#define IDS_COPY_BOTH_TO                27612
+#define IDS_COPY_ALL_TO                 28612
+#define IDS_COPY_DIFFERENCES_TO         38612
 #define IDS_COPY_LEFT_TO2               17613
+#define IDS_COPY_MIDDLE_TO2             27613
 #define IDS_COPY_RIGHT_TO2              17614
+#define IDS_COPY_BOTH_TO2               27614
+#define IDS_COPY_ALL_TO2                28614
+#define IDS_COPY_DIFFERENCES_TO2        38614
 #define IDS_DEL_LEFT_FMT                17615
+#define IDS_DEL_MIDDLE_FMT              27615
 #define IDS_DEL_RIGHT_FMT               17616
 #define IDS_DEL_BOTH_FMT                17617
+#define IDS_DEL_ALL_FMT                 27617
 #define IDS_DEL_LEFT_FMT2               17618
+#define IDS_DEL_MIDDLE_FMT2             27618
 #define IDS_DEL_RIGHT_FMT2              17619
 #define IDS_DEL_BOTH_FMT2               17620
+#define IDS_DEL_ALL_FMT2                27620
 #define IDS_MOVE_LEFT_TO                17622
+#define IDS_MOVE_MIDDLE_TO              27622
 #define IDS_MOVE_RIGHT_TO               17623
 #define IDS_MOVE_LEFT_TO2               17624
+#define IDS_MOVE_MIDDLE_TO2             27624
 #define IDS_MOVE_RIGHT_TO2              17625
 #define IDS_SELECT_DEST_LEFT            17626
+#define IDS_SELECT_DEST_MIDDLE          27626
 #define IDS_SELECT_DEST_RIGHT           17627
 #define IDS_CONFIRM_DELETE_SINGLE       17638
 #define IDS_CONFIRM_SINGLE_COPY         17639
 #define ID_DIR_OPEN_LEFT                17648
 #define ID_DIR_OPEN_LEFT_WITHEDITOR     17649
 #define ID_DIR_OPEN_LEFT_WITH           17650
+#define ID_DIR_OPEN_MIDDLE              27651
+#define ID_DIR_OPEN_MIDDLE_WITHEDITOR   27652
+#define ID_DIR_OPEN_MIDDLE_WITH         27653
 #define ID_DIR_OPEN_RIGHT               17651
 #define ID_DIR_OPEN_RIGHT_WITHEDITOR    17652
 #define ID_DIR_OPEN_RIGHT_WITH          17653
 #define ID_DIR_COPY_FILENAMES           17655
 #define ID_DIR_COPY_PATHNAMES_LEFT      17656
+#define ID_DIR_COPY_PATHNAMES_MIDDLE    27656
 #define ID_DIR_COPY_PATHNAMES_RIGHT     17657
 #define ID_DIR_COPY_PATHNAMES_BOTH      17658
+#define ID_DIR_COPY_PATHNAMES_ALL       27658
 #define IDS_ERROR_EXECUTE_FILE          17659
 #define IDS_UNKNOWN_ARCHIVE_FORMAT      17664
 #define IDS_COLHDR_FILENAME             17696
 #define ID_OPTIONS_SHOWIDENTICAL        32800
 #define ID_OPTIONS_SHOWDIFFERENT        32801
 #define ID_OPTIONS_SHOWUNIQUELEFT       32802
+#define ID_OPTIONS_SHOWUNIQUEMIDDLE     42802
 #define ID_OPTIONS_SHOWUNIQUERIGHT      32803
 #define ID_OPTIONS_SHOWBINARIES         32804
 #define ID_OPTIONS_SHOWSKIPPED          32805
 #define ID_STATUS_FILTER                32970
 #define ID_STATUS_PLUGIN                32971
 #define ID_DIR_ZIP_LEFT                 32976
+#define ID_DIR_ZIP_MIDDLE               42976
 #define ID_DIR_ZIP_RIGHT                32977
 #define ID_DIR_ZIP_BOTH                 32978
+#define ID_DIR_ZIP_ALL                  42978
 #define ID_DIR_ZIP_BOTH_DIFFS_ONLY      32979
 #define ID_DIR_MOVE_LEFT_TO_BROWSE      32980
+#define ID_DIR_MOVE_MIDDLE_TO_BROWSE    42980
 #define ID_DIR_MOVE_RIGHT_TO_BROWSE     32981
 #define ID_DIR_HIDE_FILENAMES           32982
 #define ID_DIR_ITEM_RENAME              32983