From c5431e4d321dbf0152e6826841c1ef5c1291ba5b Mon Sep 17 00:00:00 2001 From: Syndamia Date: Tue, 14 Jun 2022 15:38:50 +0300 Subject: Added files from project 2 (mirror) --- .../Project 2/src/UserInterface/UserInterface.cpp | 148 +++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 Year 1/Object-oriented Programming/Project 2/src/UserInterface/UserInterface.cpp (limited to 'Year 1/Object-oriented Programming/Project 2/src/UserInterface/UserInterface.cpp') diff --git a/Year 1/Object-oriented Programming/Project 2/src/UserInterface/UserInterface.cpp b/Year 1/Object-oriented Programming/Project 2/src/UserInterface/UserInterface.cpp new file mode 100644 index 0000000..0fc9e96 --- /dev/null +++ b/Year 1/Object-oriented Programming/Project 2/src/UserInterface/UserInterface.cpp @@ -0,0 +1,148 @@ +#include "UserInterface.h" +#include "../Generic/List/List.hpp" +#include "../Generic/String/String.h" +#include "../Generic/ConsoleInterface/Toolbox.hpp" +#include + +/* Private (static) */ + +Table* UserInterface::table = nullptr; +String UserInterface::fileName = String(); +bool UserInterface::saved = false; + + +void UserInterface::com_open(const char* params) { + if (table != nullptr) { + printLine("A file has already been opened!"); + return; + } + + try { + table = new Table(params); + fileName = params; + saved = true; + printLine("Successfully opened file!"); + } + catch (std::logic_error err) { + printLine(err.what()); + } +} +void UserInterface::com_close(const char* params) { + if (table == nullptr) { + printLine("No file has been opened!"); + return; + } + + delete table; +} +void UserInterface::com_save(const char* params) { + com_saveas(fileName.get_cstr()); +} +void UserInterface::com_saveas(const char* params) { + if (table == nullptr) { + printLine("No file has been opened!"); + return; + } + + try { + table->saveToFile(params); + saved = true; + printLine("Successfully saved to file!"); + } + catch (std::logic_error err) { + printLine(err.what()); + } +} + +void UserInterface::com_help(const char* params) { + std::cout << "The following commands are supported:" << std::endl + << "print prints the whole table" << std::endl + << "edit RxCy Replaces the value on row x and column y with the given data" << std::endl + << "open opens " << std::endl + << "close closes currently opened file" << std::endl + << "save saves the currently open file" << std::endl + << "saveas saves the currently open file in " << std::endl + << "help prints this information" << std::endl + << "exit exists the program" << std::endl; +} + +void UserInterface::com_exit(const char* params) { + if (!saved && table != nullptr) { + printLine("You have an open file with unsaved changes, please select close or save first."); + return; + } + + throw std::logic_error("Exiting program..."); // stupid way of making the program stop +} + +void UserInterface::com_print(const char* params) { + if (table == nullptr) { + printLine("You need to open a file!"); + return; + } + + List cells = table->getAllCells(); + printTable(cells, table->get_cols()); +} + +#define isDigit(a) (a >= '0' && a <= '9') + +void UserInterface::com_edit(const char* params) { + if (*params != 'R') { + printLine("Error: Invalid cell position format! Expected RC"); + return; + } + + unsigned row = atoi(++params) - 1; + while (*params != 'C') { + if (*params == '\0') { + printLine("Error: End of line reached. Expected row number."); + return; + } + if (!isDigit(*params)) { + printLine("Error: Found a non-digit character. Exptected row number."); + return; + } + + params++; + } + unsigned col = atoi(++params) - 1; + while (*params != ' ') { + if (*params == '\0') { + printLine("Error: End of line reached. Expected columns number."); + return; + } + if (!isDigit(*params)) { + printLine("Error: Found a non-digit character. Exptected column number."); + return; + } + + params++; + } + + try { + table->putCell(row, col, params); + saved = false; + printLine("Successfully edited cell!"); + } + catch (std::logic_error err) { + printLine(err.what()); + } +} + +/* Public */ + +UserInterface::UserInterface() : menu() { + menu.addCommand(Command("open", com_open)); + menu.addCommand(Command("close", com_close)); + menu.addCommand(Command("save", com_save)); + menu.addCommand(Command("saveas", com_saveas)); + menu.addCommand(Command("help", com_help)); + menu.addCommand(Command("exit", com_exit)); + menu.addCommand(Command("print", com_print)); + menu.addCommand(Command("edit", com_edit)); +} + +void UserInterface::run() { + menu.navigate(); +} -- cgit v1.3.1-23-gd82d