From fbe76102e941b9f1edaf236788e42678f05fdf9a Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 17:08:06 +0200 Subject: 3.9 --- ui/grid_view.h | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 ui/grid_view.h (limited to 'ui/grid_view.h') diff --git a/ui/grid_view.h b/ui/grid_view.h new file mode 100644 index 00000000..0307d758 --- /dev/null +++ b/ui/grid_view.h @@ -0,0 +1,237 @@ +// ************************************************************************** +// * 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) * +// ************************************************************************** +// +#ifndef GRIDVIEW_H_INCLUDED +#define GRIDVIEW_H_INCLUDED + +#include "../file_hierarchy.h" + + +namespace ffs3 +{ +//gui view of FolderComparison +class GridView +{ +public: + //direct data access via row number + const FileSystemObject* getObject(size_t row) const; //returns NULL if object is not found; logarithmic complexity + FileSystemObject* getObject(size_t row); // + size_t rowsOnView() const; //only the currently visible elements + size_t rowsTotal() const; //total number of rows available + + //get references to FileSystemObject: no NULL-check needed! Everything's bound. + void getAllFileRef(const std::set& guiRows, std::vector& output); + + struct StatusCmpResult + { + StatusCmpResult(); + + bool existsLeftOnly; + bool existsRightOnly; + bool existsLeftNewer; + bool existsRightNewer; + bool existsDifferent; + bool existsEqual; + bool existsConflict; + + unsigned int filesOnLeftView; + unsigned int foldersOnLeftView; + unsigned int filesOnRightView; + unsigned int foldersOnRightView; + + wxULongLong filesizeLeftView; + wxULongLong filesizeRightView; + }; + + //comparison results view + StatusCmpResult updateCmpResult(bool hideFiltered, + bool leftOnlyFilesActive, + bool rightOnlyFilesActive, + bool leftNewerFilesActive, + bool rightNewerFilesActive, + bool differentFilesActive, + bool equalFilesActive, + bool conflictFilesActive); + + struct StatusSyncPreview + { + StatusSyncPreview(); + + bool existsSyncCreateLeft; + bool existsSyncCreateRight; + bool existsSyncDeleteLeft; + bool existsSyncDeleteRight; + bool existsSyncDirLeft; + bool existsSyncDirRight; + bool existsSyncDirNone; + bool existsSyncEqual; + bool existsConflict; + + unsigned int filesOnLeftView; + unsigned int foldersOnLeftView; + unsigned int filesOnRightView; + unsigned int foldersOnRightView; + + wxULongLong filesizeLeftView; + wxULongLong filesizeRightView; + }; + + //synchronization preview + StatusSyncPreview updateSyncPreview(bool hideFiltered, + bool syncCreateLeftActive, + bool syncCreateRightActive, + bool syncDeleteLeftActive, + bool syncDeleteRightActive, + bool syncDirOverwLeftActive, + bool syncDirOverwRightActive, + bool syncDirNoneActive, + bool syncEqualActive, + bool conflictFilesActive); + + + + FolderComparison& getDataTentative(); //get data for operation that does NOT add or reorder rows! (deletion is okay) + void setData(FolderComparison& newData); //set data, taking ownership: warning std::swap() is used!!! + void removeInvalidRows(); //remove rows that have been deleted meanwhile: call after manual deletion and synchronization! + void clearAllRows(); //clears everything + + //sorting... + enum SortType + { + SORT_BY_REL_NAME, + SORT_BY_FILENAME, + SORT_BY_FILESIZE, + SORT_BY_DATE, + SORT_BY_EXTENSION, + SORT_BY_CMP_RESULT, + SORT_BY_DIRECTORY, + SORT_BY_SYNC_DIRECTION + }; + + bool static getDefaultDirection(SortType type); //true: ascending; false: descending + + void sortView(SortType type, bool onLeft, bool ascending); //always call this method for sorting, never sort externally! + +private: + class SerializeHierarchy; + + struct RefIndex + { + RefIndex(size_t folderInd, HierarchyObject::ObjectID id) : + folderIndex(folderInd), + objId(id) {} + size_t folderIndex; + HierarchyObject::ObjectID objId; + }; + + FileSystemObject* getReferencedRow(const RefIndex ref); //returns NULL if not found + const FileSystemObject* getReferencedRow(const RefIndex ref) const; //returns NULL if not found + bool isInvalidRow(const RefIndex& ref) const; + + + std::vector viewRef; //partial view on sortedRef + // | + // | (update...) + // \|/ + std::vector sortedRef; //equivalent to folderCmp, but may be sorted + // | + // | (setData) + // \|/ + FolderComparison folderCmp; //actual comparison data: owned by GridView! + + + //sorting classes + template + class SortByDirectory; + + template + class SortByRelName; + + template + class SortByFileName; + + template + class SortByFileSize; + + template + class SortByDate; + + template + class SortByExtension; + + template + class SortByCmpResult; + + template + class SortBySyncDirection; +}; + + + + + + + + + + +//############################################################################ +//inline implementation + +inline +const FileSystemObject* GridView::getObject(size_t row) const +{ + if (row < rowsOnView()) + return getReferencedRow(viewRef[row]); + else + return NULL; +} + +inline +FileSystemObject* GridView::getObject(size_t row) +{ + //code re-use of const method: see Meyers Effective C++ + return const_cast(static_cast(*this).getObject(row)); +} + + +inline +size_t GridView::rowsOnView() const +{ + return viewRef.size(); +} + + +inline +FolderComparison& GridView::getDataTentative() +{ + return folderCmp; +} + +inline +size_t GridView::rowsTotal() const //total number of rows available +{ + return sortedRef.size(); +} + + +inline +const ffs3::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) const +{ + return folderCmp[ref.folderIndex].retrieveById(ref.objId); +} + + +inline +ffs3::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) +{ + //code re-use of const method: see Meyers Effective C++ + return const_cast(static_cast(*this).getReferencedRow(ref)); +} +} + + +#endif // GRIDVIEW_H_INCLUDED -- cgit