diff --git a/src/commands/CmdHistory.cpp b/src/commands/CmdHistory.cpp index 46c4e8049..319265f07 100644 --- a/src/commands/CmdHistory.cpp +++ b/src/commands/CmdHistory.cpp @@ -290,6 +290,50 @@ void CmdHistoryBase::outputTabular (std::string &output) output = out.str (); } +////////////////////////////////////////////////////////////////////////////i +class MonthlyHistoryStrategy +{ +public: + static Datetime getRelevantDate (const Datetime & dt) + { + return dt.startOfMonth (); + } + + static void setupTableDates (Table & view) + { + view.add (STRING_CMD_HISTORY_YEAR); + view.add (STRING_CMD_HISTORY_MONTH); + } + + static void insertRowDate ( + Table& view, + int row, + time_t rowTime, + time_t lastTime) + { + Datetime dt (rowTime); + int m, d, y; + dt.toYMD (y, m, d); + + Datetime last_dt (lastTime); + int last_m, last_d, last_y; + last_dt.toYMD (last_y, last_m, last_d); + + if (y != last_y) + { + view.set (row, 0, y); + } + + view.set (row, 1, Datetime::monthName (m)); + } + + static constexpr const char* keyword = "history.monthly"; + static constexpr const char* usage = "task history.monthly"; + static constexpr const char* description = STRING_CMD_HISTORY_USAGE_M; + static constexpr unsigned int dateFieldCount = 2; + static constexpr bool graphical = false; +}; + //////////////////////////////////////////////////////////////////////////////// template int CmdHistoryBase::execute (std::string& output) @@ -349,6 +393,132 @@ int CmdHistoryBase::execute (std::string& output) return rc; } +////////////////////////////////////////////////////////////////////////////i +class MonthlyGHistoryStrategy +{ +public: + static Datetime getRelevantDate (const Datetime & dt) + { + return dt.startOfMonth (); + } + + static void setupTableDates (Table & view) + { + view.add (STRING_CMD_HISTORY_YEAR); + view.add (STRING_CMD_HISTORY_MONTH); + } + + static void insertRowDate ( + Table& view, + int row, + time_t rowTime, + time_t lastTime) + { + Datetime dt (rowTime); + int m, d, y; + dt.toYMD (y, m, d); + + Datetime last_dt (lastTime); + int last_m, last_d, last_y; + last_dt.toYMD (last_y, last_m, last_d); + + if (y != last_y) + { + view.set (row, 0, y); + } + + view.set (row, 1, Datetime::monthName (m)); + } + + static constexpr const char* keyword = "ghistory.monthly"; + static constexpr const char* usage = "task ghistory.monthly"; + static constexpr const char* description = STRING_CMD_GHISTORY_USAGE_M; + static constexpr unsigned int dateFieldCount = 2; + static constexpr bool graphical = true; +}; + +////////////////////////////////////////////////////////////////////////////i +class AnnualGHistoryStrategy +{ +public: + static Datetime getRelevantDate (const Datetime & dt) + { + return dt.startOfYear (); + } + + static void setupTableDates (Table & view) + { + view.add (STRING_CMD_HISTORY_YEAR); + } + + static void insertRowDate ( + Table& view, + int row, + time_t rowTime, + time_t lastTime) + { + Datetime dt (rowTime); + int m, d, y; + dt.toYMD (y, m, d); + + Datetime last_dt (lastTime); + int last_m, last_d, last_y; + last_dt.toYMD (last_y, last_m, last_d); + + if (y != last_y) + { + view.set (row, 0, y); + } + } + + static constexpr const char* keyword = "ghistory.annual"; + static constexpr const char* usage = "task ghistory.annual"; + static constexpr const char* description = STRING_CMD_GHISTORY_USAGE_A; + static constexpr unsigned int dateFieldCount = 1; + static constexpr bool graphical = true; +}; + +////////////////////////////////////////////////////////////////////////////i +class AnnualHistoryStrategy +{ +public: + static Datetime getRelevantDate (const Datetime & dt) + { + return dt.startOfYear (); + } + + static void setupTableDates (Table & view) + { + view.add (STRING_CMD_HISTORY_YEAR); + } + + static void insertRowDate ( + Table& view, + int row, + time_t rowTime, + time_t lastTime) + { + Datetime dt (rowTime); + int m, d, y; + dt.toYMD (y, m, d); + + Datetime last_dt (lastTime); + int last_m, last_d, last_y; + last_dt.toYMD (last_y, last_m, last_d); + + if (y != last_y) + { + view.set (row, 0, y); + } + } + + static constexpr const char* keyword = "history.annual"; + static constexpr const char* usage = "task history.annual"; + static constexpr const char* description = STRING_CMD_HISTORY_USAGE_A; + static constexpr unsigned int dateFieldCount = 1; + static constexpr bool graphical = false; +}; + // Explicit instantiations, avoiding cpp-inclusion or implementation in header template class CmdHistoryBase; template class CmdHistoryBase; diff --git a/src/commands/CmdHistory.h b/src/commands/CmdHistory.h index 5fd4e25b3..10b7f5e11 100644 --- a/src/commands/CmdHistory.h +++ b/src/commands/CmdHistory.h @@ -51,185 +51,16 @@ private: void outputGraphical (std::string&); }; -////////////////////////////////////////////////////////////////////////////i -class MonthlyHistoryStrategy -{ -public: - static Datetime getRelevantDate (const Datetime & dt) - { - return dt.startOfMonth (); - } - - static void setupTableDates (Table & view) - { - view.add (STRING_CMD_HISTORY_YEAR); - view.add (STRING_CMD_HISTORY_MONTH); - } - - static void insertRowDate ( - Table& view, - int row, - time_t rowTime, - time_t lastTime) - { - Datetime dt (rowTime); - int m, d, y; - dt.toYMD (y, m, d); - - Datetime last_dt (lastTime); - int last_m, last_d, last_y; - last_dt.toYMD (last_y, last_m, last_d); - - if (y != last_y) - { - view.set (row, 0, y); - } - - view.set (row, 1, Datetime::monthName (m)); - } - - static constexpr const char* keyword = "history.monthly"; - static constexpr const char* usage = "task history.monthly"; - static constexpr const char* description = STRING_CMD_HISTORY_USAGE_M; - static constexpr unsigned int dateFieldCount = 2; - static constexpr bool graphical = false; -}; +// Forward-declare strategies implemented in CmdHistory.cpp +class MonthlyHistoryStrategy; +class MonthlyGHistoryStrategy; +class AnnualHistoryStrategy; +class AnnualGHistoryStrategy; +// typedef the templates to nice names to be used outside this class typedef CmdHistoryBase CmdHistoryMonthly; - - -////////////////////////////////////////////////////////////////////////////i -class MonthlyGHistoryStrategy -{ -public: - static Datetime getRelevantDate (const Datetime & dt) - { - return dt.startOfMonth (); - } - - static void setupTableDates (Table & view) - { - view.add (STRING_CMD_HISTORY_YEAR); - view.add (STRING_CMD_HISTORY_MONTH); - } - - static void insertRowDate ( - Table& view, - int row, - time_t rowTime, - time_t lastTime) - { - Datetime dt (rowTime); - int m, d, y; - dt.toYMD (y, m, d); - - Datetime last_dt (lastTime); - int last_m, last_d, last_y; - last_dt.toYMD (last_y, last_m, last_d); - - if (y != last_y) - { - view.set (row, 0, y); - } - - view.set (row, 1, Datetime::monthName (m)); - } - - static constexpr const char* keyword = "ghistory.monthly"; - static constexpr const char* usage = "task ghistory.monthly"; - static constexpr const char* description = STRING_CMD_GHISTORY_USAGE_M; - static constexpr unsigned int dateFieldCount = 2; - static constexpr bool graphical = true; -}; - typedef CmdHistoryBase CmdGHistoryMonthly; - - -////////////////////////////////////////////////////////////////////////////i -class AnnualHistoryStrategy -{ -public: - static Datetime getRelevantDate (const Datetime & dt) - { - return dt.startOfYear (); - } - - static void setupTableDates (Table & view) - { - view.add (STRING_CMD_HISTORY_YEAR); - } - - static void insertRowDate ( - Table& view, - int row, - time_t rowTime, - time_t lastTime) - { - Datetime dt (rowTime); - int m, d, y; - dt.toYMD (y, m, d); - - Datetime last_dt (lastTime); - int last_m, last_d, last_y; - last_dt.toYMD (last_y, last_m, last_d); - - if (y != last_y) - { - view.set (row, 0, y); - } - } - - static constexpr const char* keyword = "history.annual"; - static constexpr const char* usage = "task history.annual"; - static constexpr const char* description = STRING_CMD_HISTORY_USAGE_A; - static constexpr unsigned int dateFieldCount = 1; - static constexpr bool graphical = false; -}; - typedef CmdHistoryBase CmdHistoryAnnual; - - -////////////////////////////////////////////////////////////////////////////i -class AnnualGHistoryStrategy -{ -public: - static Datetime getRelevantDate (const Datetime & dt) - { - return dt.startOfYear (); - } - - static void setupTableDates (Table & view) - { - view.add (STRING_CMD_HISTORY_YEAR); - } - - static void insertRowDate ( - Table& view, - int row, - time_t rowTime, - time_t lastTime) - { - Datetime dt (rowTime); - int m, d, y; - dt.toYMD (y, m, d); - - Datetime last_dt (lastTime); - int last_m, last_d, last_y; - last_dt.toYMD (last_y, last_m, last_d); - - if (y != last_y) - { - view.set (row, 0, y); - } - } - - static constexpr const char* keyword = "ghistory.annual"; - static constexpr const char* usage = "task ghistory.annual"; - static constexpr const char* description = STRING_CMD_GHISTORY_USAGE_A; - static constexpr unsigned int dateFieldCount = 1; - static constexpr bool graphical = true; -}; - typedef CmdHistoryBase CmdGHistoryAnnual; #endif