virtual bool process(const KoXmlElement & body, KoOdfReadStore & odfStore) { KoOdfLoadingContext loadingContext(odfStore.styles(), odfStore.store()); KoShapeLoadingContext context(loadingContext, m_container->resourceManager()); QList<KoShape*> shapes; m_container->loadOdf(body, context, shapes); m_layout->addShapes(shapes); return true; }
virtual bool process(const KoXmlElement & body, KoOdfReadStore & odfStore) { KoOdfLoadingContext loadingContext(odfStore.styles(), odfStore.store()); KoShapeLoadingContext context(loadingContext, m_view->canvasBase()->shapeController()->resourceManager()); KoXmlElement child; QList<KoShape*> shapes; forEachElement(child, body) { KoShape * shape = KoShapeRegistry::instance()->createShapeFromOdf(child, context); if (shape) { shapes.append(shape); } }
bool KoShapePaste::process(const KoXmlElement & body, KoOdfReadStore & odfStore) { d->pastedShapes.clear(); KoOdfLoadingContext loadingContext(odfStore.styles(), odfStore.store()); KoShapeLoadingContext context(loadingContext, d->canvas->shapeController()->resourceManager()); QList<KoShape*> shapes(d->layer ? d->layer->shapes(): d->canvas->shapeManager()->topLevelShapes()); int zIndex = 0; if (!shapes.isEmpty()) { zIndex = shapes.first()->zIndex(); foreach (KoShape * shape, shapes) { zIndex = qMax(zIndex, shape->zIndex()); }
bool KoPAPastePage::process( const KoXmlElement & body, KoOdfReadStore & odfStore ) { KoOdfLoadingContext loadingContext( odfStore.styles(), odfStore.store(), m_doc->defaultStylesResourcePath() ); KoPALoadingContext paContext(loadingContext, m_doc->resourceManager()); QList<KoPAPageBase *> newMasterPages( m_doc->loadOdfMasterPages( odfStore.styles().masterPages(), paContext ) ); QList<KoPAPageBase *> newPages( m_doc->loadOdfPages( body, paContext ) ); // Check where to start inserting pages KoPAPageBase * insertAfterPage = 0; KoPAPageBase * insertAfterMasterPage = 0; if ( dynamic_cast<KoPAMasterPage *>( m_activePage ) || ( m_activePage == 0 && newPages.empty() ) ) { insertAfterMasterPage = m_activePage; insertAfterPage = m_doc->pages( false ).last(); } else { insertAfterPage = m_activePage; insertAfterMasterPage = m_doc->pages( true ).last(); } if ( !newPages.empty() ) { KoGenStyles mainStyles; QBuffer buffer; buffer.open( QIODevice::WriteOnly ); KoXmlWriter xmlWriter( &buffer ); KoEmbeddedDocumentSaver embeddedSaver; KoPASavingContext savingContext(xmlWriter, mainStyles, embeddedSaver, 1); savingContext.addOption( KoShapeSavingContext::UniqueMasterPages ); QList<KoPAPageBase*> emptyList; QList<KoPAPageBase*> existingMasterPages = m_doc->pages( true ); savingContext.setClearDrawIds( true ); m_doc->saveOdfPages( savingContext, emptyList, existingMasterPages ); QMap<QString, KoPAMasterPage*> masterPageNames; foreach ( KoPAPageBase * page, existingMasterPages ) { KoPAMasterPage * masterPage = dynamic_cast<KoPAMasterPage*>( page ); Q_ASSERT( masterPage ); if ( masterPage ) { QString masterPageName( savingContext.masterPageName( masterPage ) ); if ( !masterPageNames.contains( masterPageName ) ) { masterPageNames.insert( masterPageName, masterPage ); } } }
bool KoShapePaste::process(const KoXmlElement & body, KoOdfReadStore & odfStore) { KoOdfLoadingContext loadingContext(odfStore.styles(), odfStore.store()); KoShapeLoadingContext context(loadingContext, d->canvas->shapeController()->dataCenterMap()); context.setZIndex(d->zIndex); QUndoCommand * cmd = new QUndoCommand(i18n("Paste Shapes")); // TODO if this is a text create a text shape and load the text inside the new shape. KoXmlElement element; forEachElement(element, body) { kDebug(30006) << "loading shape" << element.localName(); KoShape * shape = KoShapeRegistry::instance()->createShapeFromOdf(element, context); if (shape) { if (! shape->parent()) { shape->setParent(d->parent); } d->canvas->shapeController()->addShapeDirect(shape, cmd); } }
//1.6: KWDocument::loadOasis bool KWOdfLoader::load(KoOdfReadStore &odfStore) { //debugWords << "========================> KWOdfLoader::load START"; QPointer<KoUpdater> updater; QPointer<KoUpdater> loadUpdater; if (m_document->progressUpdater()) { updater = m_document->progressUpdater()->startSubtask(1, "KWOdfLoader::load"); loadUpdater = m_document->progressUpdater()->startSubtask(5, "KWOdfLoader::loadOdf"); updater->setProgress(0); loadUpdater->setProgress(0); } KoXmlElement content = odfStore.contentDoc().documentElement(); KoXmlElement realBody(KoXml::namedItemNS(content, KoXmlNS::office, "body")); if (realBody.isNull()) { errorWords << "No office:body found!" << endl; m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No office:body tag found.")); return false; } KoXmlElement body = KoXml::namedItemNS(realBody, KoXmlNS::office, "text"); if (body.isNull()) { errorWords << "No office:text found!" << endl; KoXmlElement childElem; QString localName; forEachElement(childElem, realBody) localName = childElem.localName(); if (localName.isEmpty()) m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No tag found inside office:body.")); else m_document->setErrorMessage(i18n("This is not a word processing document, but %1. Please try opening it with the appropriate application.", KoDocument::tagNameToDocumentType(localName))); return false; } // Load attributes from the office:text. These are text:global and text:use-soft-page-breaks. QString textGlobal = body.attributeNS(KoXmlNS::text, "global"); bool isTextGlobal = (textGlobal == "true"); if (isTextGlobal) { m_document->setIsMasterDocument(true); } // FIXME: text:use-soft-page-breaks if (updater) updater->setProgress(20); KoOdfLoadingContext odfContext(odfStore.styles(), odfStore.store(), QLatin1String("calligrawords/styles/")); KoShapeLoadingContext sc(odfContext, m_document->resourceManager()); sc.setDocumentRdf(m_document->documentRdf()); // Load user defined variable declarations if (KoVariableManager *variableManager = m_document->inlineTextObjectManager()->variableManager()) { variableManager->loadOdf(body); } // Load all styles before the corresponding paragraphs try to use them! KWOdfSharedLoadingData *sharedData = new KWOdfSharedLoadingData(this); sc.addSharedData(KOTEXT_SHARED_LOADING_ID, sharedData); KoStyleManager *styleManager = m_document->resourceManager()->resource(KoText::StyleManager).value<KoStyleManager*>(); Q_ASSERT(styleManager); sharedData->loadOdfStyles(sc, styleManager); if (updater) updater->setProgress(40); loadMasterPageStyles(sc); // add page background frame set KWFrameSet *pageBackgroundFrameSet = new KWFrameSet(Words::BackgroundFrameSet); m_document->addFrameSet(pageBackgroundFrameSet); #if 0 //1.6: KWOasisLoader oasisLoader(this); // <text:page-sequence> oasis extension for DTP (2003-10-27 post by Daniel) m_processingType = (!KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence").isNull()) ? DTP : WP; m_hasTOC = false; m_tabStop = MM_TO_POINT(15); const KoXmlElement *defaultParagStyle = styles.defaultStyle("paragraph"); if (defaultParagStyle) { KoStyleStack stack; stack.push(*defaultParagStyle); stack.setTypeProperties("paragraph"); QString tabStopVal = stack.property(KoXmlNS::style, "tab-stop-distance"); if (!tabStopVal.isEmpty()) m_tabStop = KoUnit::parseValue(tabStopVal); } m_initialEditing = 0; // TODO MAILMERGE // Variable settings // By default display real variable value if (!isReadWrite()) m_varColl->variableSetting()->setDisplayFieldCode(false); #endif // Load all styles before the corresponding paragraphs try to use them! #if 0 //1.6: if (m_frameStyleColl->loadOasisStyles(context) == 0) { // no styles loaded -> load default styles loadDefaultFrameStyleTemplates(); } if (m_tableStyleColl->loadOasisStyles(context, *m_styleColl, *m_frameStyleColl) == 0) { // no styles loaded -> load default styles loadDefaultTableStyleTemplates(); } static_cast<KWVariableSettings *>(m_varColl->variableSetting())->loadNoteConfiguration(styles.officeStyle()); loadDefaultTableTemplates(); //#else /* // We always needs at least one valid default paragraph style KoParagraphStyle *defaultParagraphStyle = m_document->styleManager()->defaultParagraphStyle(); //const KoXmlElement *defaultParagraphStyle = context.stylesReader().defaultStyle("paragraph"); //if(! defaultParagraphStyle) { KoParagraphStyle *parastyle = new KoParagraphStyle(); parastyle->setName("Standard"); m_document->styleManager()->add(parastyle); context.styleStack().setTypeProperties("paragraph"); // load all style attributes from "style:paragraph-properties" parastyle->loadOasis(context.styleStack()); // load the KoParagraphStyle from the stylestack KoCharacterStyle *charstyle = parastyle->characterStyle(); context.styleStack().setTypeProperties("text"); // load all style attributes from "style:text-properties" charstyle->loadOasis(context.styleStack()); // load the KoCharacterStyle from the stylestack //} */ #endif // load text:page-sequence KoXmlElement pageSequence = KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence"); if (! pageSequence.isNull()) { KWPageManager *pageManager = m_document->pageManager(); KoXmlElement page; forEachElement(page, pageSequence) { if (page.namespaceURI() == KoXmlNS::text && page.localName() == "page") { QString master = page.attributeNS(KoXmlNS::text, "master-page-name", QString()); pageManager->appendPage(pageManager->pageStyle(master)); } } }
bool KarbonPart::loadOdf(KoOdfReadStore & odfStore) { kDebug(38000) << "Start loading OASIS document..." /*<< doc.toString()*/; KoXmlElement contents = odfStore.contentDoc().documentElement(); kDebug(38000) << "Start loading OASIS document..." << contents.text(); kDebug(38000) << "Start loading OASIS contents..." << contents.lastChild().localName(); kDebug(38000) << "Start loading OASIS contents..." << contents.lastChild().namespaceURI(); kDebug(38000) << "Start loading OASIS contents..." << contents.lastChild().isElement(); KoXmlElement body(KoXml::namedItemNS(contents, KoXmlNS::office, "body")); if (body.isNull()) { kDebug(38000) << "No office:body found!"; setErrorMessage(i18n("Invalid OASIS document. No office:body tag found.")); return false; } body = KoXml::namedItemNS(body, KoXmlNS::office, "drawing"); if (body.isNull()) { kDebug(38000) << "No office:drawing found!"; setErrorMessage(i18n("Invalid OASIS document. No office:drawing tag found.")); return false; } KoXmlElement page(KoXml::namedItemNS(body, KoXmlNS::draw, "page")); if (page.isNull()) { kDebug(38000) << "No office:drawing found!"; setErrorMessage(i18n("Invalid OASIS document. No draw:page tag found.")); return false; } KoXmlElement * master = 0; if (odfStore.styles().masterPages().contains("Standard")) master = odfStore.styles().masterPages().value("Standard"); else if (odfStore.styles().masterPages().contains("Default")) master = odfStore.styles().masterPages().value("Default"); else if (! odfStore.styles().masterPages().empty()) master = odfStore.styles().masterPages().begin().value(); if (master) { const QString pageStyleName = master->attributeNS(KoXmlNS::style, "page-layout-name", QString()); const KoXmlElement *style = odfStore.styles().findStyle(pageStyleName); if (style) { KoPageLayout layout; layout.loadOdf(*style); setPageLayout(layout); } } else { kWarning() << "No master page found!"; return false; } KoOdfLoadingContext context(odfStore.styles(), odfStore.store()); KoShapeLoadingContext shapeContext(context, resourceManager()); d->document.loadOasis(page, shapeContext); if (d->document.pageSize().isEmpty()) { QSizeF pageSize = d->document.contentRect().united(QRectF(0, 0, 1, 1)).size(); setPageSize(pageSize); } loadOasisSettings(odfStore.settingsDoc()); return true; }
//1.6: KWDocument::loadOasis bool KWOdfLoader::load(KoOdfReadStore & odfStore) { emit sigProgress(0); //kDebug(32001) << "========================> KWOdfLoader::load START"; KoXmlElement content = odfStore.contentDoc().documentElement(); KoXmlElement realBody(KoXml::namedItemNS(content, KoXmlNS::office, "body")); if (realBody.isNull()) { kError(32001) << "No office:body found!" << endl; m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No office:body tag found.")); return false; } KoXmlElement body = KoXml::namedItemNS(realBody, KoXmlNS::office, "text"); if (body.isNull()) { kError(32001) << "No office:text found!" << endl; KoXmlElement childElem; QString localName; forEachElement(childElem, realBody) localName = childElem.localName(); if (localName.isEmpty()) m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No tag found inside office:body.")); else m_document->setErrorMessage(i18n("This is not a word processing document, but %1. Please try opening it with the appropriate application.", KoDocument::tagNameToDocumentType(localName))); return false; } // TODO check versions and mimetypes etc. bool hasMainText = false; KoXmlElement childElem; forEachElement(childElem, body) { if (childElem.namespaceURI() == KoXmlNS::text) { hasMainText = true; break; } } KoOdfLoadingContext odfContext(odfStore.styles(), odfStore.store(), m_document->componentData()); KoShapeLoadingContext sc(odfContext, m_document->dataCenterMap()); // Load all styles before the corresponding paragraphs try to use them! KWOdfSharedLoadingData * sharedData = new KWOdfSharedLoadingData(this); KoStyleManager *styleManager = dynamic_cast<KoStyleManager *>(m_document->dataCenterMap()["StyleManager"]); Q_ASSERT(styleManager); sharedData->loadOdfStyles(odfContext, styleManager); sc.addSharedData(KOTEXT_SHARED_LOADING_ID, sharedData); KoTextLoader * loader = new KoTextLoader(sc); Q_UNUSED(loader); KoOdfLoadingContext context(odfStore.styles(), odfStore.store(), m_document->componentData()); loadMasterPageStyles(context, hasMainText); #if 0 //1.6: KWOasisLoader oasisLoader(this); // <text:page-sequence> oasis extension for DTP (2003-10-27 post by Daniel) m_processingType = (!KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence").isNull()) ? DTP : WP; m_hasTOC = false; m_tabStop = MM_TO_POINT(15); const KoXmlElement* defaultParagStyle = styles.defaultStyle("paragraph"); if (defaultParagStyle) { KoStyleStack stack; stack.push(*defaultParagStyle); stack.setTypeProperties("paragraph"); QString tabStopVal = stack.property(KoXmlNS::style, "tab-stop-distance"); if (!tabStopVal.isEmpty()) m_tabStop = KoUnit::parseValue(tabStopVal); } m_initialEditing = 0; // TODO MAILMERGE // Variable settings // By default display real variable value if (!isReadWrite()) m_varColl->variableSetting()->setDisplayFieldCode(false); #endif // Load all styles before the corresponding paragraphs try to use them! #if 0 //1.6: if (m_frameStyleColl->loadOasisStyles(context) == 0) { // no styles loaded -> load default styles loadDefaultFrameStyleTemplates(); } if (m_tableStyleColl->loadOasisStyles(context, *m_styleColl, *m_frameStyleColl) == 0) { // no styles loaded -> load default styles loadDefaultTableStyleTemplates(); } static_cast<KWVariableSettings *>(m_varColl->variableSetting())->loadNoteConfiguration(styles.officeStyle()); loadDefaultTableTemplates(); //#else /* // We always needs at least one valid default paragraph style KoParagraphStyle *defaultParagraphStyle = m_document->styleManager()->defaultParagraphStyle(); //const KoXmlElement* defaultParagraphStyle = context.stylesReader().defaultStyle("paragraph"); //if( ! defaultParagraphStyle ) { KoParagraphStyle *parastyle = new KoParagraphStyle(); parastyle->setName("Standard"); m_document->styleManager()->add(parastyle); context.styleStack().setTypeProperties( "paragraph" ); // load all style attributes from "style:paragraph-properties" parastyle->loadOasis(context.styleStack()); // load the KoParagraphStyle from the stylestack KoCharacterStyle *charstyle = parastyle->characterStyle(); context.styleStack().setTypeProperties( "text" ); // load all style attributes from "style:text-properties" charstyle->loadOasis(context.styleStack()); // load the KoCharacterStyle from the stylestack //} */ #endif // load text:page-sequence KoXmlElement pageSequence = KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence"); if (! pageSequence.isNull()) { KWPageManager *pageManager = m_document->pageManager(); KoXmlElement page; forEachElement(page, pageSequence) { if (page.namespaceURI() == KoXmlNS::text && page.localName() == "page") { QString master = page.attributeNS(KoXmlNS::text, "master-page-name", QString()); pageManager->appendPage(pageManager->pageStyle(master)); } } }