diff options
Diffstat (limited to 'ui/gridView.cpp')
-rw-r--r-- | ui/gridView.cpp | 570 |
1 files changed, 0 insertions, 570 deletions
diff --git a/ui/gridView.cpp b/ui/gridView.cpp deleted file mode 100644 index b3b1f2ae..00000000 --- a/ui/gridView.cpp +++ /dev/null @@ -1,570 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// -#include "gridView.h" -#include "sorting.h" -#include "../synchronization.h" -#include <boost/bind.hpp> - -using namespace FreeFileSync; - - -GridView::StatusCmpResult::StatusCmpResult() : - existsLeftOnly(false), - existsRightOnly(false), - existsLeftNewer(false), - existsRightNewer(false), - existsDifferent(false), - existsEqual(false), - existsConflict(false), - - filesOnLeftView(0), - foldersOnLeftView(0), - filesOnRightView(0), - foldersOnRightView(0) {} - - -template <class StatusResult> -void getNumbers(const FileSystemObject& fsObj, StatusResult& result) -{ - struct GetValues : public FSObjectVisitor - { - GetValues(StatusResult& res) : result_(res) {} - - virtual void visit(const FileMapping& fileObj) - { - if (!fileObj.isEmpty<LEFT_SIDE>()) - { - result_.filesizeLeftView += fileObj.getFileSize<LEFT_SIDE>(); - ++result_.filesOnLeftView; - } - if (!fileObj.isEmpty<RIGHT_SIDE>()) - { - result_.filesizeRightView += fileObj.getFileSize<RIGHT_SIDE>(); - ++result_.filesOnRightView; - } - } - - virtual void visit(const SymLinkMapping& linkObj) - { - if (!linkObj.isEmpty<LEFT_SIDE>()) - ++result_.filesOnLeftView; - - if (!linkObj.isEmpty<RIGHT_SIDE>()) - ++result_.filesOnRightView; - } - - virtual void visit(const DirMapping& dirObj) - { - if (!dirObj.isEmpty<LEFT_SIDE>()) - ++result_.foldersOnLeftView; - - if (!dirObj.isEmpty<RIGHT_SIDE>()) - ++result_.foldersOnRightView; - } - StatusResult& result_; - } getVal(result); - fsObj.accept(getVal); -} - - -GridView::StatusCmpResult GridView::updateCmpResult(bool hideFiltered, //maps sortedRef to viewRef - bool leftOnlyFilesActive, - bool rightOnlyFilesActive, - bool leftNewerFilesActive, - bool rightNewerFilesActive, - bool differentFilesActive, - bool equalFilesActive, - bool conflictFilesActive) -{ - StatusCmpResult output; - - viewRef.clear(); - - for (std::vector<RefIndex>::const_iterator j = sortedRef.begin(); j != sortedRef.end(); ++j) - { - const FileSystemObject* fsObj = getReferencedRow(*j); - if (fsObj) - { - //hide filtered row, if corresponding option is set - if (hideFiltered && !fsObj->isActive()) - continue; - - switch (fsObj->getCategory()) - { - case FILE_LEFT_SIDE_ONLY: - output.existsLeftOnly = true; - if (!leftOnlyFilesActive) continue; - break; - case FILE_RIGHT_SIDE_ONLY: - output.existsRightOnly = true; - if (!rightOnlyFilesActive) continue; - break; - case FILE_LEFT_NEWER: - output.existsLeftNewer = true; - if (!leftNewerFilesActive) continue; - break; - case FILE_RIGHT_NEWER: - output.existsRightNewer = true; - if (!rightNewerFilesActive) continue; - break; - case FILE_DIFFERENT: - output.existsDifferent = true; - if (!differentFilesActive) continue; - break; - case FILE_EQUAL: - output.existsEqual = true; - if (!equalFilesActive) continue; - break; - case FILE_CONFLICT: - output.existsConflict = true; - if (!conflictFilesActive) continue; - break; - } - - //calculate total number of bytes for each side - getNumbers(*fsObj, output); - - viewRef.push_back(*j); - } - } - - return output; -} - - -GridView::StatusSyncPreview::StatusSyncPreview() : - existsSyncCreateLeft(false), - existsSyncCreateRight(false), - existsSyncDeleteLeft(false), - existsSyncDeleteRight(false), - existsSyncDirLeft(false), - existsSyncDirRight(false), - existsSyncDirNone(false), - existsSyncEqual(false), - existsConflict(false), - - filesOnLeftView(0), - foldersOnLeftView(0), - filesOnRightView(0), - foldersOnRightView(0) {} - - -GridView::StatusSyncPreview GridView::updateSyncPreview(bool hideFiltered, //maps sortedRef to viewRef - bool syncCreateLeftActive, - bool syncCreateRightActive, - bool syncDeleteLeftActive, - bool syncDeleteRightActive, - bool syncDirOverwLeftActive, - bool syncDirOverwRightActive, - bool syncDirNoneActive, - bool syncEqualActive, - bool conflictFilesActive) -{ - StatusSyncPreview output; - - viewRef.clear(); - - for (std::vector<RefIndex>::const_iterator j = sortedRef.begin(); j != sortedRef.end(); ++j) - { - const FileSystemObject* fsObj = getReferencedRow(*j); - if (fsObj) - { - //hide filtered row, if corresponding option is set - if (hideFiltered && !fsObj->isActive()) - continue; - - - switch (fsObj->getSyncOperation()) //evaluate comparison result and sync direction - { - case SO_CREATE_NEW_LEFT: - output.existsSyncCreateLeft = true; - if (!syncCreateLeftActive) continue; - break; - case SO_CREATE_NEW_RIGHT: - output.existsSyncCreateRight = true; - if (!syncCreateRightActive) continue; - break; - case SO_DELETE_LEFT: - output.existsSyncDeleteLeft = true; - if (!syncDeleteLeftActive) continue; - break; - case SO_DELETE_RIGHT: - output.existsSyncDeleteRight = true; - if (!syncDeleteRightActive) continue; - break; - case SO_OVERWRITE_RIGHT: - output.existsSyncDirRight = true; - if (!syncDirOverwRightActive) continue; - break; - case SO_OVERWRITE_LEFT: - output.existsSyncDirLeft = true; - if (!syncDirOverwLeftActive) continue; - break; - case SO_DO_NOTHING: - output.existsSyncDirNone = true; - if (!syncDirNoneActive) continue; - break; - case SO_EQUAL: - output.existsSyncEqual = true; - if (!syncEqualActive) continue; - break; - case SO_UNRESOLVED_CONFLICT: - output.existsConflict = true; - if (!conflictFilesActive) continue; - break; - } - - //calculate total number of bytes for each side - getNumbers(*fsObj, output); - - viewRef.push_back(*j); - } - } - - return output; -} - - -void GridView::getAllFileRef(const std::set<size_t>& guiRows, std::vector<FileSystemObject*>& output) -{ - std::set<size_t>::const_iterator upperEnd = guiRows.lower_bound(rowsOnView()); //loop over valid rows only! - - output.clear(); - output.reserve(guiRows.size()); - for (std::set<size_t>::const_iterator i = guiRows.begin(); i != upperEnd; ++i) - { - FileSystemObject* fsObj = getReferencedRow(viewRef[*i]); - if (fsObj) - output.push_back(fsObj); - } -} - - -inline -bool GridView::isInvalidRow(const RefIndex& ref) const -{ - return getReferencedRow(ref) == NULL; -} - - -void GridView::removeInvalidRows() -{ - viewRef.clear(); - - //remove rows that have been deleted meanwhile - sortedRef.erase(std::remove_if(sortedRef.begin(), sortedRef.end(), - boost::bind(&GridView::isInvalidRow, this, _1)), sortedRef.end()); -} - - -void GridView::clearAllRows() -{ - viewRef.clear(); - sortedRef.clear(); - folderCmp.clear(); -} - - -class GridView::SerializeHierarchy -{ -public: - SerializeHierarchy(std::vector<GridView::RefIndex>& sortedRef, size_t index) : - index_(index), - sortedRef_(sortedRef) {} - - void execute(const HierarchyObject& hierObj) - { - //add file references - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), *this); - - //add symlink references - std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), *this); - - //add dir references - std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), *this); - } - - void operator()(const FileMapping& fileObj) - { - sortedRef_.push_back(RefIndex(index_, fileObj.getId())); - } - - void operator()(const SymLinkMapping& linkObj) - { - sortedRef_.push_back(RefIndex(index_, linkObj.getId())); - } - - void operator()(const DirMapping& dirObj) - { - sortedRef_.push_back(RefIndex(index_, dirObj.getId())); - execute(dirObj); //add recursion here to list sub-objects directly below parent! - } - -private: - size_t index_; - std::vector<GridView::RefIndex>& sortedRef_; -}; - - -void GridView::setData(FolderComparison& newData) -{ - viewRef.clear(); - sortedRef.clear(); - folderCmp.swap(newData); - - //fill sortedRef - for (FolderComparison::const_iterator j = folderCmp.begin(); j != folderCmp.end(); ++j) - SerializeHierarchy(sortedRef, j - folderCmp.begin()).execute(*j); -} - - -//------------------------------------ SORTING TEMPLATES ------------------------------------------------ -template <bool ascending> -class GridView::SortByDirectory : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - bool operator()(const RefIndex a, const RefIndex b) const - { - return ascending ? - a.folderIndex < b.folderIndex : - a.folderIndex > b.folderIndex; - } -}; - - -template <bool ascending, FreeFileSync::SelectedSide side> -class GridView::SortByRelName : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - SortByRelName(const GridView& view) : m_view(view) {} - - bool operator()(const RefIndex a, const RefIndex b) const - { - //presort by folder pair - if (a.folderIndex != b.folderIndex) - return ascending ? - a.folderIndex < b.folderIndex : - a.folderIndex > b.folderIndex; - - const FileSystemObject* fsObjA = m_view.getReferencedRow(a); - const FileSystemObject* fsObjB = m_view.getReferencedRow(b); - if (fsObjA == NULL) //invalid rows shall appear at the end - return false; - else if (fsObjB == NULL) - return true; - - return sortByRelativeName<ascending, side>(*fsObjA, *fsObjB); - } -private: - const GridView& m_view; -}; - - -template <bool ascending, FreeFileSync::SelectedSide side> -class GridView::SortByFileName : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - SortByFileName(const GridView& view) : m_view(view) {} - - bool operator()(const RefIndex a, const RefIndex b) const - { - const FileSystemObject* fsObjA = m_view.getReferencedRow(a); - const FileSystemObject* fsObjB = m_view.getReferencedRow(b); - if (fsObjA == NULL) //invalid rows shall appear at the end - return false; - else if (fsObjB == NULL) - return true; - - return sortByFileName<ascending, side>(*fsObjA, *fsObjB); - } -private: - const GridView& m_view; -}; - - -template <bool ascending, FreeFileSync::SelectedSide side> -class GridView::SortByFileSize : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - SortByFileSize(const GridView& view) : m_view(view) {} - - bool operator()(const RefIndex a, const RefIndex b) const - { - const FileSystemObject* fsObjA = m_view.getReferencedRow(a); - const FileSystemObject* fsObjB = m_view.getReferencedRow(b); - if (fsObjA == NULL) //invalid rows shall appear at the end - return false; - else if (fsObjB == NULL) - return true; - - return sortByFileSize<ascending, side>(*fsObjA, *fsObjB); - } -private: - const GridView& m_view; -}; - - -template <bool ascending, FreeFileSync::SelectedSide side> -class GridView::SortByDate : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - SortByDate(const GridView& view) : m_view(view) {} - - bool operator()(const RefIndex a, const RefIndex b) const - { - const FileSystemObject* fsObjA = m_view.getReferencedRow(a); - const FileSystemObject* fsObjB = m_view.getReferencedRow(b); - if (fsObjA == NULL) //invalid rows shall appear at the end - return false; - else if (fsObjB == NULL) - return true; - - return sortByDate<ascending, side>(*fsObjA, *fsObjB); - } -private: - const GridView& m_view; -}; - - -template <bool ascending, FreeFileSync::SelectedSide side> -class GridView::SortByExtension : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - SortByExtension(const GridView& view) : m_view(view) {} - - bool operator()(const RefIndex a, const RefIndex b) const - { - const FileSystemObject* fsObjA = m_view.getReferencedRow(a); - const FileSystemObject* fsObjB = m_view.getReferencedRow(b); - if (fsObjA == NULL) //invalid rows shall appear at the end - return false; - else if (fsObjB == NULL) - return true; - - return sortByExtension<ascending, side>(*fsObjA, *fsObjB); - } -private: - const GridView& m_view; -}; - - -template <bool ascending> -class GridView::SortByCmpResult : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - SortByCmpResult(const GridView& view) : m_view(view) {} - - bool operator()(const RefIndex a, const RefIndex b) const - { - const FileSystemObject* fsObjA = m_view.getReferencedRow(a); - const FileSystemObject* fsObjB = m_view.getReferencedRow(b); - if (fsObjA == NULL) //invalid rows shall appear at the end - return false; - else if (fsObjB == NULL) - return true; - - return sortByCmpResult<ascending>(*fsObjA, *fsObjB); - } -private: - const GridView& m_view; -}; - - -template <bool ascending> -class GridView::SortBySyncDirection : public std::binary_function<RefIndex, RefIndex, bool> -{ -public: - SortBySyncDirection(const GridView& view) : m_view(view) {} - - bool operator()(const RefIndex a, const RefIndex b) const - { - const FileSystemObject* fsObjA = m_view.getReferencedRow(a); - const FileSystemObject* fsObjB = m_view.getReferencedRow(b); - if (fsObjA == NULL) //invalid rows shall appear at the end - return false; - else if (fsObjB == NULL) - return true; - - return sortBySyncDirection<ascending>(*fsObjA, *fsObjB); - } -private: - const GridView& m_view; -}; - -//------------------------------------------------------------------------------------------------------- -bool GridView::getDefaultDirection(SortType type) //true: ascending; false: descending -{ - switch (type) - { - case SORT_BY_FILESIZE: - case SORT_BY_DATE: - return false; - - case SORT_BY_REL_NAME: - case SORT_BY_FILENAME: - case SORT_BY_EXTENSION: - case SORT_BY_CMP_RESULT: - case SORT_BY_DIRECTORY: - case SORT_BY_SYNC_DIRECTION: - return true; - } - assert(false); - return true; -} - - -void GridView::sortView(SortType type, bool onLeft, bool ascending) -{ - viewRef.clear(); - - switch (type) - { - case SORT_BY_REL_NAME: - if ( ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByRelName<true, LEFT_SIDE>(*this)); - else if ( ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByRelName<true, RIGHT_SIDE>(*this)); - else if (!ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByRelName<false, LEFT_SIDE >(*this)); - else if (!ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByRelName<false, RIGHT_SIDE>(*this)); - break; - case SORT_BY_FILENAME: - if ( ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileName<true, LEFT_SIDE >(*this)); - else if ( ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileName<true, RIGHT_SIDE>(*this)); - else if (!ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileName<false, LEFT_SIDE >(*this)); - else if (!ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileName<false, RIGHT_SIDE>(*this)); - break; - case SORT_BY_FILESIZE: - if ( ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileSize<true, LEFT_SIDE >(*this)); - else if ( ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileSize<true, RIGHT_SIDE>(*this)); - else if (!ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileSize<false, LEFT_SIDE >(*this)); - else if (!ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByFileSize<false, RIGHT_SIDE>(*this)); - break; - case SORT_BY_DATE: - if ( ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByDate<true, LEFT_SIDE >(*this)); - else if ( ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByDate<true, RIGHT_SIDE>(*this)); - else if (!ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByDate<false, LEFT_SIDE >(*this)); - else if (!ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), SortByDate<false, RIGHT_SIDE>(*this)); - break; - case SORT_BY_EXTENSION: - if ( ascending && onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<true, LEFT_SIDE >(*this)); - else if ( ascending && !onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<true, RIGHT_SIDE>(*this)); - else if (!ascending && onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<false, LEFT_SIDE >(*this)); - else if (!ascending && !onLeft) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByExtension<false, RIGHT_SIDE>(*this)); - break; - case SORT_BY_CMP_RESULT: - if ( ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByCmpResult<true >(*this)); - else if (!ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByCmpResult<false>(*this)); - break; - case SORT_BY_SYNC_DIRECTION: - if ( ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortBySyncDirection<true >(*this)); - else if (!ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortBySyncDirection<false>(*this)); - break; - case SORT_BY_DIRECTORY: - if ( ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByDirectory<true>()); - else if (!ascending) std::stable_sort(sortedRef.begin(), sortedRef.end(), SortByDirectory<false>()); - break; - } -} - |