break;
case FileAction::ACT_MOVE:
- bDestIsSide = false;
+ if (item.UIResult == FileActionItem::UI_DEL)
+ bDestIsSide = false;
if (actionList.GetActionItemCount() == 1)
{
ThrowConfirmMove(ctxt, item.UIOrigin, item.UIDestination,
SetDiffCounts(di, 0, 0);
break;
+ case FileActionItem::UI_MOVE:
+ bUpdateSrc = true;
+ bUpdateDest = true;
+ CopyDiffSideAndProperties(di, act.UIOrigin, act.UIDestination);
+ UnsetDiffSide(di, act.UIOrigin);
+ SetDiffCompare(di, DIFFCODE::NOCMP);
+ break;
+
case FileActionItem::UI_DEL:
if (di.diffcode.isSideOnly(act.UIOrigin))
{
return true;
}
+/// is it possible to move item to left ?
+bool IsItemMovable(const DIFFITEM &di, int index)
+{
+ // don't let them mess with error items
+ if (di.diffcode.isResultError()) return false;
+ // impossible if not existing
+ if (!di.diffcode.exists(index)) return false;
+ // everything else can be copied to other side
+ return true;
+}
+
/// is it possible to delete item ?
bool IsItemDeletable(const DIFFITEM &di, int index)
{
DIFFITEM *FindItemFromPaths(const CDiffContext& ctxt, const PathContext& paths);
bool IsItemCopyable(const DIFFITEM &di, int index);
+bool IsItemMovable(const DIFFITEM &di, int index);
bool IsItemDeletable(const DIFFITEM &di, int index);
bool IsItemDeletableOnBoth(const CDiffContext& ctxt, const DIFFITEM &di);
bool AreItemsOpenable(const CDiffContext& ctxt, SELECTIONTYPE selectionType, const DIFFITEM &di1, const DIFFITEM &di2, bool openableForDir = true);
return true;
}
+ template <SIDE_TYPE src, SIDE_TYPE dst>
+ bool IsItemMovableOnTo(const DIFFITEM& di) const
+ {
+ const int idx = SideToIndex(m_ctxt, src);
+ return (di.diffcode.diffcode != 0 && !m_RO[idx] && !m_RO[SideToIndex(m_ctxt, dst)] && ::IsItemMovable(di, idx));
+ }
+
template <SIDE_TYPE src>
bool IsItemMovableToOn(const DIFFITEM& di) const
{
return CopyItem(pscript, it, src, to);
}
+ FileActionScript *MoveItem(FileActionScript *pscript, const std::pair<int, const DIFFITEM *>& it, SIDE_TYPE src, SIDE_TYPE dst) const
+ {
+ const DIFFITEM& di = *it.second;
+ const int srcidx = SideToIndex(m_ctxt, src);
+ const int dstidx = SideToIndex(m_ctxt, dst);
+ if (di.diffcode.diffcode != 0 && !m_RO[dstidx] && IsItemMovable(di, srcidx))
+ {
+ FileActionItem act;
+ act.src = GetItemFileName(m_ctxt, di, srcidx);
+ act.dest = GetItemFileName(m_ctxt, di, dstidx);
+
+ // We must check that paths still exists
+ if (paths::DoesPathExist(act.src) == paths::DOES_NOT_EXIST)
+ throw ContentsChangedException(act.src);
+
+ act.context = it.first;
+ act.dirflag = di.diffcode.isDirectory();
+ act.atype = FileAction::ACT_MOVE;
+ act.UIResult = FileActionItem::UI_MOVE;
+ act.UIOrigin = srcidx;
+ act.UIDestination = dstidx;
+ pscript->AddActionItem(act);
+ }
+ return pscript;
+ }
+
+ template<SIDE_TYPE src, SIDE_TYPE to>
+ FileActionScript *Move(FileActionScript *pscript, const std::pair<int, const DIFFITEM *>& it) const
+ {
+ return MoveItem(pscript, it, src, to);
+ }
+
FileActionScript *DeleteItem(FileActionScript *pscript, const std::pair<int, const DIFFITEM *>& it, SIDE_TYPE src) const
{
const DIFFITEM& di = *it.second;
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>)
// Context menu -> Move
+ ON_COMMAND(ID_DIR_MOVE_LEFT_TO_RIGHT, (OnCtxtDirMove<SIDE_LEFT, SIDE_RIGHT>))
+ ON_COMMAND(ID_DIR_MOVE_LEFT_TO_MIDDLE, (OnCtxtDirMove<SIDE_LEFT, SIDE_MIDDLE>))
+ ON_COMMAND(ID_DIR_MOVE_RIGHT_TO_LEFT, (OnCtxtDirMove<SIDE_RIGHT, SIDE_LEFT>))
+ ON_COMMAND(ID_DIR_MOVE_RIGHT_TO_MIDDLE, (OnCtxtDirMove<SIDE_RIGHT, SIDE_MIDDLE>))
+ ON_COMMAND(ID_DIR_MOVE_MIDDLE_TO_LEFT, (OnCtxtDirMove<SIDE_MIDDLE, SIDE_LEFT>))
+ ON_COMMAND(ID_DIR_MOVE_MIDDLE_TO_RIGHT, (OnCtxtDirMove<SIDE_MIDDLE, SIDE_RIGHT>))
+ ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_LEFT_TO_RIGHT, (OnUpdateCtxtDirMove<SIDE_LEFT, SIDE_RIGHT>))
+ ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_LEFT_TO_MIDDLE, (OnUpdateCtxtDirMove<SIDE_LEFT, SIDE_MIDDLE>))
+ ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_RIGHT_TO_LEFT, (OnUpdateCtxtDirMove<SIDE_RIGHT, SIDE_LEFT>))
+ ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_RIGHT_TO_MIDDLE, (OnUpdateCtxtDirMove<SIDE_RIGHT, SIDE_MIDDLE>))
+ ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_MIDDLE_TO_LEFT, (OnUpdateCtxtDirMove<SIDE_MIDDLE, SIDE_LEFT>))
+ ON_UPDATE_COMMAND_UI(ID_DIR_MOVE_MIDDLE_TO_RIGHT, (OnUpdateCtxtDirMove<SIDE_MIDDLE, SIDE_RIGHT>))
ON_COMMAND(ID_DIR_MOVE_LEFT_TO_BROWSE, OnCtxtDirMoveTo<SIDE_LEFT>)
ON_COMMAND(ID_DIR_MOVE_MIDDLE_TO_BROWSE, OnCtxtDirMoveTo<SIDE_MIDDLE>)
ON_COMMAND(ID_DIR_MOVE_RIGHT_TO_BROWSE, OnCtxtDirMoveTo<SIDE_RIGHT>)
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_LEFT_TO_MIDDLE, MF_BYCOMMAND);
+ pPopup->RemoveMenu(ID_DIR_MOVE_MIDDLE_TO_LEFT, MF_BYCOMMAND);
+ pPopup->RemoveMenu(ID_DIR_MOVE_MIDDLE_TO_RIGHT, MF_BYCOMMAND);
pPopup->RemoveMenu(ID_DIR_MOVE_MIDDLE_TO_BROWSE, MF_BYCOMMAND);
+ pPopup->RemoveMenu(ID_DIR_MOVE_RIGHT_TO_MIDDLE, 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);
pCmdUI->SetText(FormatMenuItemString(srctype, dsttype, counts.count, counts.total).c_str());
}
+/// Should Move to Left be enabled or disabled ? (both main menu & context menu use this)
+template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
+void CDirView::DoUpdateDirMove(CCmdUI* pCmdUI, eMenuType menuType)
+{
+ Counts counts = Count(&DirActions::IsItemMovableOnTo<srctype, dsttype>);
+ pCmdUI->Enable(counts.count > 0);
+ if (menuType == eContext)
+ pCmdUI->SetText(FormatMenuItemString(srctype, dsttype, counts.count, counts.total).c_str());
+}
+
/**
* @brief Update any resources necessary after a GUI language change
*/
pCmdUI->Enable(m_pList->GetSelectedCount() != 0);
}
+/// User chose (context men) Move from right to left
+template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
+void CDirView::OnCtxtDirMove()
+{
+ DoDirAction(&DirActions::Move<srctype, dsttype>, _("Moveing files..."));
+}
+
/// User chose (context menu) Move left to...
template<SIDE_TYPE stype>
void CDirView::OnCtxtDirMoveTo()
DoDirActionTo(stype, &DirActions::MoveTo<stype>, _("Moving files..."));
}
+/// Update context menu Move Right to Left item
+template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
+void CDirView::OnUpdateCtxtDirMove(CCmdUI* pCmdUI)
+{
+ DoUpdateDirMove<srctype, dsttype>(pCmdUI, eContext);
+}
+
/**
* @brief Update "Move | Left to..." item
*/
afx_msg void OnUpdateDirCopy(CCmdUI* pCmdUI);
template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
afx_msg void OnUpdateCtxtDirCopy(CCmdUI* pCmdUI);
+ template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
+ afx_msg void OnCtxtDirMove();
+ template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
+ afx_msg void OnUpdateCtxtDirMove(CCmdUI* pCmdUI);
template<SIDE_TYPE stype>
afx_msg void OnCtxtDirDel();
template<SIDE_TYPE stype>
void OpenParentDirectory(CDirDoc *pDocOpen);
template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
void DoUpdateDirCopy(CCmdUI* pCmdUI, eMenuType menuType);
+ template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
+ void DoUpdateDirMove(CCmdUI* pCmdUI, eMenuType menuType);
const DIFFITEM &GetDiffItem(int sel) const;
DIFFITEM &GetDiffItem(int sel);
int GetSingleSelectedItem() const;
enum UI_RESULT
{
UI_SYNC = 1, /**< Make items identical (synchronized). */
- UI_DESYNC, /**< Make items different. */
+ UI_MOVE, /**< Move items. */
UI_DEL, /**< Remove left item. */
UI_DONT_CARE, /**< Ignore the GUI change. */
UI_RENAME /**< Rename item. */
{ 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_RIGHT, IDB_MOVE_LEFT_TO_RIGHT, CMainFrame::MENU_FOLDERCMP },
+ { ID_DIR_MOVE_LEFT_TO_MIDDLE, IDB_MOVE_LEFT_TO_MIDDLE, CMainFrame::MENU_FOLDERCMP },
+ { ID_DIR_MOVE_RIGHT_TO_LEFT, IDB_MOVE_RIGHT_TO_LEFT, CMainFrame::MENU_FOLDERCMP },
+ { ID_DIR_MOVE_RIGHT_TO_MIDDLE, IDB_MOVE_RIGHT_TO_MIDDLE, CMainFrame::MENU_FOLDERCMP },
+ { ID_DIR_MOVE_MIDDLE_TO_LEFT, IDB_MOVE_MIDDLE_TO_LEFT, CMainFrame::MENU_FOLDERCMP },
+ { ID_DIR_MOVE_MIDDLE_TO_RIGHT, IDB_MOVE_MIDDLE_TO_RIGHT, 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 },
for (auto& menu_icon: m_MenuIcons)
{
if (menu_view == (menu_icon.menusToApply & menu_view))
- {
m_pMenus[view]->ModifyODMenu(nullptr, menu_icon.menuitemID, menu_icon.iconResID);
- }
}
m_pMenus[view]->LoadToolbar(IDR_MAINFRAME, &m_wndToolBar);
END\r
POPUP "&Move"\r
BEGIN\r
+ MENUITEM "Left to Middle (%1 of %2)", ID_DIR_MOVE_LEFT_TO_MIDDLE\r
+ MENUITEM "Left to Right (%1 of %2)", ID_DIR_MOVE_LEFT_TO_RIGHT\r
MENUITEM "Left to... (%1 of %2)", ID_DIR_MOVE_LEFT_TO_BROWSE\r
+ MENUITEM "Middle to Left (%1 of %2)", ID_DIR_MOVE_MIDDLE_TO_LEFT\r
+ MENUITEM "Middle to Right (%1 of %2)", ID_DIR_MOVE_MIDDLE_TO_RIGHT\r
MENUITEM "Middle to... (%1 of %2)", ID_DIR_MOVE_MIDDLE_TO_BROWSE\r
+ MENUITEM "Right to Middle (%1 of %2)", ID_DIR_MOVE_RIGHT_TO_MIDDLE\r
+ MENUITEM "Right to Left (%1 of %2)", ID_DIR_MOVE_RIGHT_TO_LEFT\r
MENUITEM "Right to... (%1 of %2)", ID_DIR_MOVE_RIGHT_TO_BROWSE\r
END\r
POPUP "&Delete"\r
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_MOVE_LEFT_TO_RIGHT BITMAP "res\\move_left_to_right.bmp"
+IDB_MOVE_LEFT_TO_MIDDLE BITMAP "res\\move_left_to_middle.bmp"
+IDB_MOVE_RIGHT_TO_LEFT BITMAP "res\\move_right_to_left.bmp"
+IDB_MOVE_RIGHT_TO_MIDDLE BITMAP "res\\move_right_to_middle.bmp"
+IDB_MOVE_MIDDLE_TO_LEFT BITMAP "res\\move_middle_to_left.bmp"
+IDB_MOVE_MIDDLE_TO_RIGHT BITMAP "res\\move_middle_to_right.bmp"
IDB_COPY_FROM_LEFT BITMAP "res\\from_left.bmp"
IDB_COPY_FROM_RIGHT BITMAP "res\\from_right.bmp"
IDB_COPY_SELECTED_LINES_FROM_LEFT BITMAP "res\\selected_lines_from_left.bmp"
#define IDB_LEFT_TO_BROWSE 358\r
#define IDB_MIDDLE_TO_BROWSE 359\r
#define IDB_RIGHT_TO_BROWSE 360\r
-#define IDB_MOVE_LEFT_TO_BROWSE 361\r
-#define IDB_MOVE_MIDDLE_TO_BROWSE 362\r
-#define IDB_MOVE_RIGHT_TO_BROWSE 363\r
-#define IDB_TOOLBAR_ENABLED32 365\r
-#define IDB_VIEW_ZOOMIN 366\r
-#define IDB_VIEW_ZOOMOUT 367\r
-#define IDB_FILE_NEW3 368\r
-#define IDB_FILE_OPENCONFLICT 369\r
-#define IDB_PLUGINS_LIST 370\r
-#define IDB_MERGE_COMPARE 371\r
-#define IDB_MERGE_COMPARE_LEFT1_LEFT2 372\r
-#define IDB_MERGE_COMPARE_RIGHT1_RIGHT2 373\r
-#define IDB_MERGE_COMPARE_LEFT1_RIGHT2 374\r
-#define IDB_MERGE_COMPARE_LEFT2_RIGHT1 375\r
-#define IDB_COPY_FROM_LEFT 376\r
-#define IDB_COPY_FROM_RIGHT 377\r
-#define IDB_TOOLBAR_ENABLED 378\r
-#define IDB_FILE_NEW_TABLE 379\r
-#define IDB_FILE_NEW_HEX 380\r
-#define IDB_FILE_NEW_IMAGE 381\r
-#define IDB_FILE_NEW_WEBPAGE 382\r
-#define IDB_FILE_NEW3_TABLE 383\r
-#define IDB_FILE_NEW3_HEX 384\r
-#define IDB_FILE_NEW3_IMAGE 385\r
-#define IDB_FILE_NEW3_WEBPAGE 386\r
-#define IDB_COPY_SELECTED_LINES_FROM_LEFT 387\r
-#define IDB_COPY_SELECTED_LINES_FROM_RIGHT 388\r
-#define IDB_COPY_SELECTED_LINES_LEFT_TO_RIGHT 389\r
-#define IDB_COPY_SELECTED_LINES_LEFT_TO_MIDDLE 390\r
-#define IDB_COPY_SELECTED_LINES_MIDDLE_TO_LEFT 391\r
-#define IDB_COPY_SELECTED_LINES_MIDDLE_TO_RIGHT 392\r
-#define IDB_COPY_SELECTED_LINES_RIGHT_TO_MIDDLE 393\r
-#define IDB_COPY_SELECTED_LINES_RIGHT_TO_LEFT 394\r
+#define IDB_MOVE_LEFT_TO_RIGHT 361\r
+#define IDB_MOVE_LEFT_TO_MIDDLE 362\r
+#define IDB_MOVE_RIGHT_TO_LEFT 363\r
+#define IDB_MOVE_RIGHT_TO_MIDDLE 364\r
+#define IDB_MOVE_MIDDLE_TO_LEFT 365\r
+#define IDB_MOVE_MIDDLE_TO_RIGHT 366\r
+#define IDB_MOVE_LEFT_TO_BROWSE 367\r
+#define IDB_MOVE_MIDDLE_TO_BROWSE 368\r
+#define IDB_MOVE_RIGHT_TO_BROWSE 369\r
+#define IDB_TOOLBAR_ENABLED32 370\r
+#define IDB_VIEW_ZOOMIN 371\r
+#define IDB_VIEW_ZOOMOUT 372\r
+#define IDB_FILE_NEW3 373\r
+#define IDB_FILE_OPENCONFLICT 374\r
+#define IDB_PLUGINS_LIST 375\r
+#define IDB_MERGE_COMPARE 376\r
+#define IDB_MERGE_COMPARE_LEFT1_LEFT2 377\r
+#define IDB_MERGE_COMPARE_RIGHT1_RIGHT2 378\r
+#define IDB_MERGE_COMPARE_LEFT1_RIGHT2 379\r
+#define IDB_MERGE_COMPARE_LEFT2_RIGHT1 380\r
+#define IDB_COPY_FROM_LEFT 381\r
+#define IDB_COPY_FROM_RIGHT 382\r
+#define IDB_TOOLBAR_ENABLED 383\r
+#define IDB_FILE_NEW_TABLE 384\r
+#define IDB_FILE_NEW_HEX 385\r
+#define IDB_FILE_NEW_IMAGE 386\r
+#define IDB_FILE_NEW_WEBPAGE 387\r
+#define IDB_FILE_NEW3_TABLE 388\r
+#define IDB_FILE_NEW3_HEX 389\r
+#define IDB_FILE_NEW3_IMAGE 390\r
+#define IDB_FILE_NEW3_WEBPAGE 391\r
+#define IDB_COPY_SELECTED_LINES_FROM_LEFT 392\r
+#define IDB_COPY_SELECTED_LINES_FROM_RIGHT 393\r
+#define IDB_COPY_SELECTED_LINES_LEFT_TO_RIGHT 394\r
+#define IDB_COPY_SELECTED_LINES_LEFT_TO_MIDDLE 395\r
+#define IDB_COPY_SELECTED_LINES_MIDDLE_TO_LEFT 396\r
+#define IDB_COPY_SELECTED_LINES_MIDDLE_TO_RIGHT 397\r
+#define IDB_COPY_SELECTED_LINES_RIGHT_TO_MIDDLE 398\r
+#define IDB_COPY_SELECTED_LINES_RIGHT_TO_LEFT 399\r
#define IDI_FOLDER 500\r
#define IDI_LFOLDER 501\r
#define IDI_MFOLDER 502\r
#define ID_DIR_ZIP_BOTH 32994\r
#define ID_DIR_ZIP_ALL 32995\r
#define ID_DIR_ZIP_BOTH_DIFFS_ONLY 32996\r
-#define ID_DIR_MOVE_LEFT_TO_BROWSE 32997\r
-#define ID_DIR_MOVE_MIDDLE_TO_BROWSE 32998\r
-#define ID_DIR_MOVE_RIGHT_TO_BROWSE 32999\r
-#define ID_DIR_HIDE_FILENAMES 33000\r
-#define ID_DIR_ITEM_RENAME 33001\r
-#define ID_DIR_SHELL_CONTEXT_MENU_LEFT 33002\r
-#define ID_DIR_SHELL_CONTEXT_MENU_MIDDLE 33003\r
-#define ID_DIR_SHELL_CONTEXT_MENU_RIGHT 33004\r
+#define ID_DIR_MOVE_LEFT_TO_RIGHT 32997\r
+#define ID_DIR_MOVE_LEFT_TO_MIDDLE 32998\r
+#define ID_DIR_MOVE_LEFT_TO_BROWSE 32999\r
+#define ID_DIR_MOVE_MIDDLE_TO_LEFT 33000\r
+#define ID_DIR_MOVE_MIDDLE_TO_RIGHT 33001\r
+#define ID_DIR_MOVE_MIDDLE_TO_BROWSE 33002\r
+#define ID_DIR_MOVE_RIGHT_TO_LEFT 33003\r
+#define ID_DIR_MOVE_RIGHT_TO_MIDDLE 33004\r
+#define ID_DIR_MOVE_RIGHT_TO_BROWSE 33005\r
+#define ID_DIR_HIDE_FILENAMES 33006\r
+#define ID_DIR_ITEM_RENAME 33007\r
+#define ID_DIR_SHELL_CONTEXT_MENU_LEFT 33008\r
+#define ID_DIR_SHELL_CONTEXT_MENU_MIDDLE 33009\r
+#define ID_DIR_SHELL_CONTEXT_MENU_RIGHT 33010\r
#define ID_DISPLAY_MOVED_NONE 33111\r
#define ID_DISPLAY_MOVED_ALL 33112\r
#define ID_LOCBAR_GOTODIFF 33114\r