Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
#include "EditorDataController.h"
#include <fstream>
#include <iostream>
using namespace std;
EditorDataController :: EditorDataController()
{
ClearBuffer();
buffer.push_back(new string());
}
EditorDataController :: ~EditorDataController()
{
ClearBuffer();
}
void EditorDataController :: ResetBuffer()
{
ClearBuffer();
buffer.push_back(new string());
}
void EditorDataController :: DeleteCharacter(int row, int column)
{
string error("Attempted to delete character at invalid index");
if (row >= GetNumLines()) { throw error; }
string *line = buffer[row];
if (column > line->length()) { throw error; }
if (column == line->length()) {
DeleteNewLine(row+1);
} else {
line->erase(line->begin()+column);
}
}
void EditorDataController :: DeleteNewLine(int row) {
if (row == 0 || row >= GetNumLines()) {
throw string("Invalid index to delete new lines");
}
string *line = buffer[row];
string *prevLine = buffer[row-1];
for (char c : *line) {
prevLine->push_back(c);
}
buffer.erase(buffer.begin()+row);
delete line;
}
char EditorDataController :: GetCharAt(int row, int col)
{
if (row >= GetNumLines()) { throw string("Invalid index"); }
string *line = buffer[row];
if (col >= line->length()) { throw string ("Invalid index"); }
return *(line->begin()+col);
}
std::string EditorDataController :: GetLine(int row)
{
if (row >= GetNumLines()) { throw string("Attempted to get invalid row!"); }
return *(buffer[row]);
}
int EditorDataController :: GetLineLength(int row)
{
if (row >= GetNumLines()) { throw string("GetLineLength: Invalid row index: " + to_string(row)); }
return buffer[row]->length();
}
std::string EditorDataController :: GetLineSegment(int row, int x0, int x1)
{
string error("Attempted to get invalid index, or invalid slice");
if (row >= GetNumLines()) { throw error; }
string *line = buffer[row];
x1 = x1 <= line->length() ? x1 : line->length();
x0 = x1 < x0 ? x1 : x0;
return string(line->begin()+x0,line->begin()+x1);
}
void EditorDataController :: InsertCharacter(char c, int row, int column)
{
string error("Attempted to insert character at invalid index");
if (row >= GetNumLines()) { throw error; }
string *line = buffer[row];
if (column > line->length()) { throw error; }
line->insert(line->begin()+column,c);
}
void EditorDataController :: InsertNewLine(int row, int column)
{
string error("Attempted to insert new line at invalid index");
if (row > GetNumLines() || (row == GetNumLines() && column != 0)) {
throw error;
} else if (row == GetNumLines()) {
buffer.push_back(new string());
return;
}
string *line = buffer[row];
if (column > line->length()) {
throw error;
}
string *left = new string(line->begin(), line->begin()+column);
string *right = new string(line->begin()+column,line->end());
buffer[row] = left;
buffer.insert(buffer.begin()+row+1,right);
delete line;
}
int EditorDataController :: SaveFile (string fname)
{
ofstream file;
file.open(fname);
if (!file.is_open()) {
return -1;
}
for (string *line : buffer) {
file << *line << endl;
}
file.close();
return 0;
}
int EditorDataController :: LoadFile (string fname)
{
ifstream file;
file.open(fname);
if (!file.is_open()) {
return -1;
}
ClearBuffer();
string line;
while (getline(file,line)) {
buffer.push_back(new string(line));
}
if (!GetNumLines()) { buffer.push_back(new string()); }
file.close();
return 0;
}
// Private Methods
void EditorDataController :: ClearBuffer()
{
for (string *s : buffer) {
delete s;
}
buffer.clear();
}