1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#include "UserInterface.h"
#include "../Generic/List/List.hpp"
#include "../Generic/String/String.h"
#include "../Generic/ConsoleInterface/Toolbox.hpp"
#include <stdexcept>
/* 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 <data> Replaces the value on row x and column y with the given data" << std::endl
<< "open <file> opens <file>" << std::endl
<< "close closes currently opened file" << std::endl
<< "save saves the currently open file" << std::endl
<< "saveas <file> saves the currently open file in <file>" << 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<String> 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 R<number>C<number>");
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();
}
|