void TestChangeTrackedDelete::testPrefixMerge() { TextTool *textTool = new TextTool(new MockCanvas); KoTextEditor *textEditor = textTool->textEditor(); QVERIFY(textEditor); QTextDocument *document = textEditor->document(); KTextDocumentLayout *layout = qobject_cast<KTextDocumentLayout*>(document->documentLayout()); QTextCursor *cursor = textEditor->cursor(); cursor->insertText("Hello World"); cursor->setPosition(3); ChangeTrackedDeleteCommand *delCommand = new ChangeTrackedDeleteCommand(ChangeTrackedDeleteCommand::NextChar, textTool); textEditor->addCommand(delCommand); QCOMPARE(document->characterAt(3).unicode(), (ushort)(QChar::ObjectReplacementCharacter)); cursor->setPosition(4); delCommand = new ChangeTrackedDeleteCommand(ChangeTrackedDeleteCommand::NextChar, textTool); textEditor->addCommand(delCommand); // This is wierd. Without this loop present the succeeding call to inlineTextObject returs NULL. Why ?????? for (int i=0; i<document->characterCount(); i++) { cursor->setPosition(i); } cursor->setPosition(4); KDeleteChangeMarker *testMarker = dynamic_cast<KDeleteChangeMarker*>(layout->inlineTextObjectManager()->inlineTextObject(*cursor)); QTextDocumentFragment deleteData = KTextDocument(document).changeTracker()->elementById(testMarker->changeId())->deleteData(); QCOMPARE(deleteData.toPlainText(), QString("lo")); delete textTool; }
void TestChangeTrackedDelete::testListDelete() { TextTool *textTool = new TextTool(new MockCanvas); KoTextEditor *textEditor = textTool->textEditor(); QVERIFY(textEditor); QTextDocument *document = textEditor->document(); KTextDocumentLayout *layout = qobject_cast<KTextDocumentLayout*>(document->documentLayout()); QTextCursor *cursor = textEditor->cursor(); insertSampleList(document); cursor->setPosition(16); cursor->setPosition(152, QTextCursor::KeepAnchor); ChangeTrackedDeleteCommand *delCommand = new ChangeTrackedDeleteCommand(ChangeTrackedDeleteCommand::NextChar, textTool); textEditor->addCommand(delCommand); QCOMPARE(document->characterAt(16).unicode(), (ushort)(QChar::ObjectReplacementCharacter)); // This is wierd. Without this loop present the succeeding call to inlineTextObject returs NULL. Why ?????? for (int i=0; i<document->characterCount(); i++) { cursor->setPosition(i); } cursor->setPosition(17); KDeleteChangeMarker *testMarker = dynamic_cast<KDeleteChangeMarker*>(layout->inlineTextObjectManager()->inlineTextObject(*cursor)); QTextDocumentFragment deleteData = KTextDocument(document).changeTracker()->elementById(testMarker->changeId())->deleteData(); QTextDocument deleteDocument; QTextCursor deleteCursor(&deleteDocument); deleteCursor.insertFragment(deleteData); bool listFound = false; for (int i=0; i < deleteDocument.characterCount(); i++) { deleteCursor.setPosition(i); if (deleteCursor.currentList()) { listFound = true; continue; } } QVERIFY(listFound == true); QTextList *deletedList = deleteCursor.currentList(); bool deletedListStatus = deletedList->format().boolProperty(KDeleteChangeMarker::DeletedList); QVERIFY (deletedListStatus == true); bool deletedListItemStatus; deletedListItemStatus = deletedList->item(0).blockFormat().boolProperty(KDeleteChangeMarker::DeletedListItem); QVERIFY(deletedListItemStatus == true); deletedListItemStatus = deletedList->item(1).blockFormat().boolProperty(KDeleteChangeMarker::DeletedListItem); QVERIFY(deletedListItemStatus == true); deletedListItemStatus = deletedList->item(2).blockFormat().boolProperty(KDeleteChangeMarker::DeletedListItem); QVERIFY(deletedListItemStatus == true); deletedListItemStatus = deletedList->item(3).blockFormat().boolProperty(KDeleteChangeMarker::DeletedListItem); QVERIFY(deletedListItemStatus == true); deletedListItemStatus = deletedList->item(4).blockFormat().boolProperty(KDeleteChangeMarker::DeletedListItem); QVERIFY(deletedListItemStatus == true); delete textTool; }
void TestChangeTrackedDelete::testDeleteNextChar() { TextTool *textTool = new TextTool(new MockCanvas); KoTextEditor *textEditor = textTool->textEditor(); QVERIFY(textEditor); QTextDocument *document = textEditor->document(); QTextCursor *cursor = textEditor->cursor(); cursor->insertText("Hello World"); cursor->setPosition(4); ChangeTrackedDeleteCommand *delCommand = new ChangeTrackedDeleteCommand(ChangeTrackedDeleteCommand::NextChar, textTool); textEditor->addCommand(delCommand); QCOMPARE(document->characterAt(4).unicode(), (ushort)(QChar::ObjectReplacementCharacter)); delCommand->undo(); QCOMPARE(document->characterAt(4), QChar('o')); delete textTool; }
void TestChangeTrackedDelete::testTableDelete() { TextTool *textTool = new TextTool(new MockCanvas); KoTextEditor *textEditor = textTool->textEditor(); QVERIFY(textEditor); QTextDocument *document = textEditor->document(); KTextDocumentLayout *layout = qobject_cast<KTextDocumentLayout*>(document->documentLayout()); QTextCursor *cursor = textEditor->cursor(); insertSampleTable(document); cursor->setPosition(13); cursor->setPosition(102, QTextCursor::KeepAnchor); ChangeTrackedDeleteCommand *delCommand = new ChangeTrackedDeleteCommand(ChangeTrackedDeleteCommand::NextChar, textTool); textEditor->addCommand(delCommand); QCOMPARE(document->characterAt(13).unicode(), (ushort)(QChar::ObjectReplacementCharacter)); // This is wierd. Without this loop present the succeeding call to inlineTextObject returs NULL. Why ?????? for (int i=0; i<document->characterCount(); i++) { cursor->setPosition(i); } cursor->setPosition(14); KDeleteChangeMarker *testMarker = dynamic_cast<KDeleteChangeMarker*>(layout->inlineTextObjectManager()->inlineTextObject(*cursor)); QTextDocumentFragment deleteData = KTextDocument(document).changeTracker()->elementById(testMarker->changeId())->deleteData(); QTextDocument deleteDocument; QTextCursor deleteCursor(&deleteDocument); deleteCursor.insertFragment(deleteData); bool tableFound = false; for (int i=0; i < deleteDocument.characterCount(); i++) { deleteCursor.setPosition(i); if (deleteCursor.currentTable()) { tableFound = true; break; } } QVERIFY(tableFound == true); QTextTable *table = deleteCursor.currentTable(); QVERIFY(table->rows() == 3); QVERIFY(table->columns() == 3); tableFound = false; for (int i=0; i < document->characterCount(); i++) { deleteCursor.setPosition(i); if (deleteCursor.currentTable()) { tableFound = true; break; } } QVERIFY(tableFound == false); delCommand->undo(); tableFound = false; for (int i=0; i < document->characterCount(); i++) { deleteCursor.setPosition(i); if (deleteCursor.currentTable()) { tableFound = true; break; } } QVERIFY(tableFound == true); delete textTool; }
void TextPasteCommand::redo() { KoTextEditor *editor = KoTextDocument(m_tool->m_textShapeData->document()).textEditor(); if (!m_first) { QUndoCommand::redo(); } else { //kDebug() << "begin paste command"; editor->cursor()->beginEditBlock(); m_first = false; if (editor->hasSelection()) { //TODO if (m_tool->m_actionShowChanges->isChecked()) editor->addCommand(new ChangeTrackedDeleteCommand(ChangeTrackedDeleteCommand::NextChar, m_tool)); else editor->addCommand(new DeleteCommand(DeleteCommand::NextChar, m_tool)); } // check for mime type const QMimeData *data = QApplication::clipboard()->mimeData(m_mode); if (data->hasFormat("application/vnd.oasis.opendocument.text")) { bool weOwnRdfModel = true; Soprano::Model *rdfModel = 0; #ifdef SHOULD_BUILD_RDF rdfModel = Soprano::createModel(); if (KoDocumentRdf *rdf = KoDocumentRdf::fromResourceManager(m_tool->canvas())) { if (rdfModel) { delete rdfModel; } rdfModel = rdf->model(); weOwnRdfModel = false; } #endif //kDebug() << "pasting odf text"; KoTextPaste paste(m_tool->m_textShapeData, *editor->cursor(), m_tool->canvas(), rdfModel); paste.paste(KoOdf::Text, data); //kDebug() << "done with pasting odf"; #ifdef SHOULD_BUILD_RDF if (KoDocumentRdf *rdf = KoDocumentRdf::fromResourceManager(m_tool->canvas())) { KoTextEditor *e = KoDocumentRdf::ensureTextTool(m_tool->canvas()); rdf->updateInlineRdfStatements(e->document()); } if (weOwnRdfModel && rdfModel) { delete rdfModel; } #endif } else if (data->hasHtml()) { //kDebug() << "pasting html"; editor->cursor()->insertHtml(data->html()); //kDebug() << "done with pasting"; } else if (data->hasText()) { //kDebug() << "pasting text"; editor->cursor()->insertText(data->text()); //kDebug() << "done with pasting"; } editor->cursor()->endEditBlock(); } }