示例#1
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_);
}
示例#2
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();
	}
}
示例#3
0
void DeleteLine::undo(EditorModel& model){

	// Handling deletion of line if cursor is not in the first line
	if(lineNumber != firstLine){
		model.insertString(lineNumber, oldString);
		model.incrementLineCount();	

		// If previous line was at the end of the text
		if(lineNumber == model.lineCount()){
			model.incrementCursorLine();
		}
	}

	// Handling deletion of first line of text
	else{

		// If first line contained either empty string or was not the last line of text
		if (oldString == emptyString || lineCount != 1){
			model.incrementLineCount();
			model.insertString(lineNumber, oldString);
		} 

		// Initializes first line of text if it was the only line left
		else{
			model.setLineString(lineNumber, oldString);
		}
	}

	// Fix cursor positioning
	model.setCursorColumn(cursorPos);
}
示例#4
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");
        }
    }
}