void TestClipToPage::testClipToPage() { KWDocument doc; KWPage page1 = doc.appendPage("Standard"); KOdfPageLayoutData layout = page1.pageStyle().pageLayout(); layout.width = 300; layout.height = 410; page1.pageStyle().setPageLayout(layout); KWCanvas canvas("bla", &doc, 0, 0); MockShape shape; shape.setPosition(QPointF(50, 50)); shape.setSize(QSizeF(100, 100)); QPointF distance(0, 0); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(0, 0)); distance = QPointF(-200, -500); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(-145, -145)); distance = QPointF(1000, 2000); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(245, 355)); distance = QPointF(50, 50); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(50, 50)); // test when we start outside the page shape.setPosition(QPointF(-200, -100)); distance = QPointF(0, 0); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(105, 5)); distance = QPointF(120, 120); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(120, 120)); shape.setPosition(QPointF(400, 200)); distance = QPointF(0, 0); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(-105, 0)); distance = QPointF(-110, -50); canvas.clipToDocument(&shape, distance); QCOMPARE(distance, QPointF(-110, -50)); }
void TestPageCommands::documentPages() { KWDocument document; QCOMPARE(document.pageCount(), 0); KWPage page1 = document.appendPage("pagestyle1"); QVERIFY(page1.isValid()); QCOMPARE(page1.pageStyle().name(), QString("Standard")); // doesn't auto-create styles QCOMPARE(page1.pageNumber(), 1); KWPage page2 = document.appendPage("pagestyle1"); QVERIFY(page2.isValid()); QCOMPARE(page2.pageStyle().name(), QString("Standard")); QCOMPARE(page2.pageNumber(), 2); KWPage page3 = document.appendPage("pagestyle2"); QCOMPARE(page3.pageStyle().name(), QString("Standard")); QCOMPARE(page3.pageNumber(), 3); KWPage page4 = document.appendPage("pagestyle2"); QCOMPARE(page4.pageStyle().name(), QString("Standard")); QCOMPARE(page4.pageNumber(), 4); KWPage page5 = document.insertPage(-99); QVERIFY(page5.isValid()); QCOMPARE(page5.pageNumber(), 5); KWPage page6 = document.insertPage(99); QVERIFY(page6.isValid()); QCOMPARE(page6.pageNumber(), 6); KWPage page7 = document.appendPage("pagestyle2"); QVERIFY(page7.isValid()); QCOMPARE(page7.pageNumber(), 7); KWPage page8 = document.appendPage("pagestyle1"); QVERIFY(page8.isValid()); QCOMPARE(page8.pageNumber(), 8); KWPage page9 = document.appendPage(); QCOMPARE(page9.pageNumber(), 9); QCOMPARE(document.pageCount(), 9); document.removePage(3); QCOMPARE(document.pageCount(), 8); QVERIFY(! page3.isValid()); QCOMPARE(document.pageManager()->page(2), page2); QCOMPARE(document.pageManager()->page(5), page6); document.removePage(3); QVERIFY(! page3.isValid()); QVERIFY(! page4.isValid()); QCOMPARE(document.pageCount(), 7); QCOMPARE(document.pageManager()->page(2), page2); QCOMPARE(document.pageManager()->page(4), page6); page4 = document.insertPage(2); // kwdocument uses 'after' instead of 'as' that the pageManager uses QCOMPARE(page4.pageNumber(), 3); page3 = document.insertPage(2); QCOMPARE(page3.pageNumber(), 3); QCOMPARE(page4.pageNumber(), 4); QCOMPARE(document.pageManager()->page(2), page2); QCOMPARE(document.pageManager()->page(3), page3); QCOMPARE(document.pageManager()->page(4), page4); QCOMPARE(document.pageManager()->page(5), page5); document.removePage(-16); document.removePage(16); QCOMPARE(document.pageCount(), 9); for (int i = document.pageCount() - 1; i >= 1; --i) document.removePage(1); QCOMPARE(document.pageCount(), 1); QCOMPARE(document.pageManager()->page(1), page9); QCOMPARE(document.pageCount(), 1); document.removePage(1); //we can't remove the last page QCOMPARE(document.pageCount(), 1); }
KoFilter::ConversionStatus AsciiImport::convert(const QByteArray& from, const QByteArray& to) { // check for proper conversion if (to != "application/vnd.oasis.opendocument.text" || from != "text/plain") { return KoFilter::NotImplemented; } QFile in(m_chain->inputFile()); if (!in.open(QIODevice::ReadOnly)) { kError(30502) << "Unable to open input file!" << endl; in.close(); return KoFilter::FileNotFound; } #ifdef OUTPUT_AS_ODT_FILE #else KoDocument* document = m_chain->outputDocument(); if (!document) return KoFilter::StupidError; KWDocument *outputDoc = qobject_cast<KWDocument*>(document); outputDoc->setOutputMimeType(to); //outputDoc->setSaveInBatchMode(true); QPointer<KoUpdater> loadUpdater = outputDoc->progressUpdater()->startSubtask(2, "load"); loadUpdater->setRange(0, in.size()); QPointer<KoUpdater> layoutUpdater = outputDoc->progressUpdater()->startSubtask(3, "layout"); #endif // try to read 100000 bytes so we can be quite sure the guessed encoding is correct. // this code is inspired by the kate encoding guessing first try UTF-8 QByteArray data = in.read(100000); in.seek(0); QTextCodec *codec = QTextCodec::codecForName("UTF-8"); if (!checkEncoding(codec, data)) { KEncodingProber prober(KEncodingProber::Universal); prober.feed(data); kDebug(30502) << "guessed" << prober.encoding() << prober.confidence(); if (prober.confidence() > 0.5) codec = QTextCodec::codecForName(prober.encoding()); if (!codec || !checkEncoding(codec, data )) { codec = QTextCodec::codecForName("ISO 8859-15"); if (!checkEncoding(codec, data)) codec = QTextCodec::codecForName("UTF-8"); } } int paragraphStrategy = 0; if (!m_chain->manager()->getBatchMode()) { QPointer<AsciiImportDialog> dialog = new AsciiImportDialog(codec->name(), QApplication::activeWindow()); if (!dialog) { in.close(); return KoFilter::StupidError; } if (!dialog->exec()) { in.close(); return KoFilter::UserCancelled; } codec = dialog->getCodec(); paragraphStrategy = dialog->getParagraphStrategy(); } if (!codec) return KoFilter::StupidError; kDebug(30502) << "Charset used:" << codec->name(); #ifdef OUTPUT_AS_ODT_FILE KoStore *store = KoStore::createStore(m_chain->outputFile(), KoStore::Write, to, KoStore::Zip); if (!store || store->bad()) { kWarning(30502) << "Unable to open output file!"; delete store; return KoFilter::FileNotFound; } store->disallowNameExpansion(); kDebug(30502) << "created store."; KoOdfWriteStore odfStore(store); odfStore.manifestWriter(to); KoXmlWriter* contentWriter = odfStore.contentWriter(); if (!contentWriter) { delete store; return KoFilter::CreationError; } KoGenStyles mainStyles; KoXmlWriter *bodyWriter = odfStore.bodyWriter(); bodyWriter->startElement("office:body"); bodyWriter->startElement("office:text"); QString styleName("txt"); KoGenStyle style(KoGenStyle::ParagraphStyle, "paragraph"); style.addAttribute("style:display-name", styleName); style.addProperty("fo:font-family", "dejavu sans mono", KoGenStyle::TextType); style.addProperty("fo:font-family-generic", "modern", KoGenStyle::TextType); style.addProperty("fo:font-size", "10pt", KoGenStyle::TextType); style.addProperty("fo:font-weight", "normal", KoGenStyle::TextType); QString name(QString(QUrl::toPercentEncoding(styleName, "", " ")).replace('%', '_')); name = mainStyles.insert(style, name, KoGenStyles::DontAddNumberToName); #else KoStyleManager *styleManager = outputDoc->resourceManager()->resource(KoText::StyleManager).value<KoStyleManager*>(); KoParagraphStyle *p = styleManager->defaultParagraphStyle(); p->setFontFamily("dejavu sans mono"); p->setFontPointSize(10); p->setFontStyleHint(QFont::TypeWriter); outputDoc->appendPage(); QTextDocument *doc = outputDoc->mainFrameSet()->document(); //doc->setDefaultFont(p->font()); KoTextDocumentLayout *lay = dynamic_cast<KoTextDocumentLayout*>(doc->documentLayout()); Q_ASSERT(lay); lay->setBlockLayout(true); connect(lay, SIGNAL(layoutProgressChanged(int)), layoutUpdater, SLOT(setProgress(int))); QTextCursor cursor(doc); cursor.beginEditBlock(); QTextCharFormat charFormat; ((KoCharacterStyle*)p)->applyStyle(charFormat); cursor.setCharFormat(charFormat); #endif QTextStream stream(&in); Q_ASSERT(codec); stream.setCodec(codec); switch (paragraphStrategy) { case 1: { // Sentence: Line-break at the end of a sentence. QString stoppingPunctuation(".!?"); QString skippingEnd(" \"')"); while (!stream.atEnd()) { QString paragraph; for (;;) { const QString line = stream.readLine(); if (line.isEmpty()) break; paragraph += line + ' '; int lastPos = line.length() - 1; int maxCheck = lastPos >= 10 ? 10: lastPos + 1; QChar lastChar; // Skip a maximum of 10 quotes (or similar) at the end of the line for (int i = 0; i < maxCheck; ++i, --lastPos) { lastChar = line[lastPos]; if (lastPos == 0 || lastChar.isNull() || skippingEnd.indexOf(lastChar) == -1) break; } lastChar = line[lastPos]; if (lastChar.isNull()) continue; if (stoppingPunctuation.indexOf(lastChar) != -1) break; } if (!paragraph.isNull()) { QString s = paragraph.simplified(); #ifdef OUTPUT_AS_ODT_FILE bodyWriter->startElement("text:p"); bodyWriter->addAttribute("text:style-name", styleName); if (!s.isEmpty()) bodyWriter->addTextSpan(s); bodyWriter->endElement(); #else if (!s.isEmpty()) cursor.insertText(s /*, charFormat*/); cursor.insertBlock(); loadUpdater->setValue(stream.device()->pos()); #endif } } } break; case 2: { // Empty Line: Line-break if the line is empty. while (!stream.atEnd()) { QString paragraph; do { const QString line = stream.readLine(); if (line.isEmpty()) break; paragraph.append(line + ' '); } while(true); if (!paragraph.isNull()) { QString s = paragraph.simplified(); #ifdef OUTPUT_AS_ODT_FILE bodyWriter->startElement("text:p"); bodyWriter->addAttribute("text:style-name", styleName); if (!s.isEmpty()) bodyWriter->addTextSpan(s); bodyWriter->endElement(); #else if (!s.isEmpty()) { cursor.insertText(s /*, charFormat*/); cursor.insertBlock(); loadUpdater->setValue(stream.device()->pos()); } #endif } } } break; default: { // As Is: Line-break at the end of line. while (!stream.atEnd()) { QString s = stream.readLine(); #ifdef OUTPUT_AS_ODT_FILE bodyWriter->startElement("text:p"); bodyWriter->addAttribute("text:style-name", styleName); if (!s.isEmpty()) bodyWriter->addTextSpan(s); bodyWriter->endElement(); #else if (!s.isEmpty()) cursor.insertText(s /*, charFormat*/); cursor.insertBlock(); loadUpdater->setValue(stream.device()->pos()); #endif } } break; } #ifdef OUTPUT_AS_ODT_FILE bodyWriter->endElement(); // office:text bodyWriter->endElement(); // office:body mainStyles.saveOdfStyles(KoGenStyles::DocumentAutomaticStyles, contentWriter); odfStore.closeContentWriter(); odfStore.manifestWriter()->addManifestEntry("content.xml", "text/xml"); if (!mainStyles.saveOdfStylesDotXml(odfStore.store(), odfStore.manifestWriter())) { delete store; return KoFilter::CreationError; } if (store->open("meta.xml")) { KoStoreDevice dev(store); KoXmlWriter* xmlWriter = KoOdfWriteStore::createOasisXmlWriter(&dev, "office:document-meta"); xmlWriter->startElement("office:meta"); xmlWriter->startElement("meta:generator"); xmlWriter->addTextNode(QString("Calligra %1").arg(CALLIGRA_VERSION_STRING)); xmlWriter->endElement(); xmlWriter->startElement("meta:creation-date"); xmlWriter->addTextNode(QDateTime::currentDateTime().toString(Qt::ISODate)); xmlWriter->endElement(); xmlWriter->endElement(); // office:meta xmlWriter->endElement(); // root element xmlWriter->endDocument(); delete xmlWriter; if (store->close()) odfStore.manifestWriter()->addManifestEntry("meta.xml", "text/xml" ); } if (!odfStore.closeManifestWriter()) { kWarning() << "Error while trying to write 'META-INF/manifest.xml'. Partition full?"; delete store; return KoFilter::CreationError; } delete store; #else cursor.endEditBlock(); lay->setBlockLayout(false); lay->layout(); #endif return KoFilter::OK; }