예제 #1
0
void DeleteLine::execute(EditorModel& model){
	
	// Obtain previous values of pre-deletion for line
	oldString = model.line(model.cursorLine());
	lineNumber = model.cursorLine();
	cursorPos = model.cursorColumn();
	lineCount = model.lineCount();

	// Throw error if text is empty
	if (lineNumber == firstLine && model.line(lineNumber) == emptyString && model.lineCount() == 1){
		model.setErrorMessage( deleteLineError.getReason() );
		throw deleteLineError;
	}

	// Empty the first line if that is the only line in the text (there should be at least one line in the text)
	if (model.lineCount() == firstLine){
		model.setLineString(firstLine, emptyString);
		model.setCursorColumn(1);
	}

	// Delete the line and move the curser up if you are at the end of the page
	else{
		// Set boolean variables for cursor line placement
		const bool atBeginningOfPage = model.cursorAtBeginningOfPage();
		const bool atEndOfPage = model.cursorAtEndOfPage();
		const bool previousColumnPlacementTooFar = model.cursorColumn() > model.line(model.cursorLine()).length();

		// Only initialize this boolean if you are not at the end of the page
		const bool nextColumnPlacementTooFar = !atEndOfPage ? model.cursorColumn() > model.line(model.cursorLine()+1).length() : false;

		// Deletes current line from text
		model.deleteLine(model.cursorLine());

		// Move cursor up if at the end of the page
		if (atEndOfPage){
			CursorUp c;
			c.execute(model);
		}

		// Fix cursor column placement if cursor is at the beginning of text, 
		else if (atBeginningOfPage && previousColumnPlacementTooFar){
			model.setCursorColumn(model.line(model.cursorLine()).length()+1);
		}
		else if (nextColumnPlacementTooFar){
			model.setCursorColumn(model.line(model.cursorLine()).length()+1);
		}
		// Decrement the current line count
		model.decrementLineCount();
	}
}
예제 #2
0
void DeleteLine::execute(EditorModel& model)
{
    row_ = model.cursorLine();
    col_ = model.cursorColumn();
    lines_ = model.lineCount();

    deletedLine_ = model.line(row_);

    if (model.lineCount() == 1)
    {
        if (model.line(1) == "")
        {
            throw EditorException("Already Empty");
        }
        else
        {
            model.line(1) = "";
            model.setCursorHome();
        }
        return;
    }

    model.deleteLine();
    setCursorAfterDelete(model, col_);
}
예제 #3
0
void CursorEnd::execute(EditorModel& model){
	// Set old column position to be current position
	oldCursorColumnPosition = model.cursorColumn();
	const std::string& currentString = model.line(model.cursorLine());

	// Move cursor to the end of the line
	model.setCursorColumn(currentString.length()+1);
}
예제 #4
0
void DeleteLine::execute(EditorModel& model)
{
    backup_line = model.cursorLine();
    backup_column = model.cursorColumn();

    model.deleteLine();

    backup_text = model.getBackupText();
}
예제 #5
0
void InsertChar::execute(EditorModel& model)
{   
    RightCtrl right;
    int insertCol = model.cursorColumn() - 1;

    std::string& temp = model.line(model.cursorLine());
    temp = temp.substr(0, insertCol) + character + temp.substr(insertCol);

    right.execute(model);
}
예제 #6
0
void RightCtrl::execute(EditorModel& model)
{
    int max = model.line(model.cursorLine()).size();

    if (model.cursorColumn() <= max)
    {
        model.moveCursorRight();
    }
    else if (model.cursorColumn() == max + 1)
    {
        if (model.cursorLine() != model.lineCount())
        {    
            model.moveCursorDown();
            model.setCursorHome(); 
        }
        else
        {
            throw EditorException("Already at end");
        }
    }
}
예제 #7
0
void HomeCtrl::execute(EditorModel& model)
{
    col_ = model.cursorColumn();

    model.setCursorHome();
}
예제 #8
0
 virtual void execute(EditorModel& editor)
 {
     editor.moveColumn(editor.cursorColumn() + 1);
 }
예제 #9
0
 virtual void undo(EditorModel& editor)
 {
     editor.moveColumn(editor.cursorColumn() - 1);
 }