/* This file is part of the KDE project Copyright (C) 1998, 1999, 2000 Torben Weis Copyright (C) 2004 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "KoDocumentInfo.h" #include "KoDom.h" #include "KoDocument.h" #include "kofficeversion.h" #include "KoApplication.h" #include #include #include #include #include #include #include #include #include "KoXmlNS.h" /***************************************** * * KoDocumentInfo * *****************************************/ KoDocumentInfo::KoDocumentInfo( TQObject* parent, const char* name ) : TQObject( parent, name ) { (void)new KoDocumentInfoUserMetadata( this ); (void)new KoDocumentInfoAuthor( this ); (void)new KoDocumentInfoAbout( this ); } KoDocumentInfo::~KoDocumentInfo() { } // KOffice-1.3 format bool KoDocumentInfo::load( const TQDomDocument& doc ) { TQStringList lst = pages(); TQStringList::ConstIterator it = lst.begin(); for( ; it != lst.end(); ++it ) { KoDocumentInfoPage* p = page( *it ); Q_ASSERT( p ); if ( !p->load( doc.documentElement() ) ) return false; } return true; } bool KoDocumentInfo::loadOasis( const TQDomDocument& metaDoc ) { //kdDebug()<<" metaDoc.toString() :"<loadOasis( office ) ) return false; } return true; } // KOffice-1.3 format TQDomDocument KoDocumentInfo::save() { TQDomDocument doc = KoDocument::createDomDocument( "document-info" /*DTD name*/, "document-info" /*tag name*/, "1.1" ); TQDomElement e = doc.documentElement(); const TQStringList lst = pages(); TQStringList::ConstIterator it = lst.begin(); for( ; it != lst.end(); ++it ) { KoDocumentInfoPage* p = page( *it ); Q_ASSERT( p ); TQDomElement s = p->save( doc ); if ( s.isNull() ) continue; e.appendChild( s ); } if ( e.isNull() ) return TQDomDocument(); return doc; } bool KoDocumentInfo::saveOasis( KoStore* store ) { KoStoreDevice dev( store ); KoXmlWriter* xmlWriter = KoDocument::createOasisXmlWriter( &dev, "office:document-meta" ); xmlWriter->startElement( "office:meta" ); xmlWriter->startElement( "meta:generator"); xmlWriter->addTextNode( TQString( "KOffice/%1" ).arg( KOFFICE_VERSION_STRING ) ); xmlWriter->endElement(); TQStringList lst = pages(); TQStringList::ConstIterator it = lst.begin(); for( ; it != lst.end(); ++it ) { KoDocumentInfoPage* p = page( *it ); Q_ASSERT( p ); if ( !p->saveOasis( *xmlWriter ) ) return false; } xmlWriter->endElement(); xmlWriter->endElement(); // root element xmlWriter->endDocument(); delete xmlWriter; return true; } KoDocumentInfoPage* KoDocumentInfo::page( const TQString& name ) const { TQObject* obj = const_cast(this)->child( name.latin1() ); return (KoDocumentInfoPage*)obj; } TQStringList KoDocumentInfo::pages() const { TQStringList ret; const TQObjectList list = childrenListObject(); if ( !list.isEmpty() ) { TQObjectListIt it( list ); TQObject *obj; while ( ( obj = it.current() ) ) { ret.prepend( obj->name() ); ++it; } } return ret; } TQString KoDocumentInfo::title() const { KoDocumentInfoAbout * aboutPage = static_cast(page( "about" )); if ( !aboutPage ) { kdWarning() << "'About' page not found in documentInfo !" << endl; return TQString(); } else return aboutPage->title(); } TQString KoDocumentInfo::creator() const { KoDocumentInfoAuthor * authorPage = static_cast(page( "author" )); if ( !authorPage ) { kdWarning() << "'Author' page not found in documentInfo !" << endl; return TQString(); } else return authorPage->fullName(); } /***************************************** * * KoDocumentInfoPage * *****************************************/ KoDocumentInfoPage::KoDocumentInfoPage( TQObject* parent, const char* name ) : TQObject( parent, name ) { } /***************************************** * * KoDocumentInfoAuthor * *****************************************/ KoDocumentInfoAuthor::KoDocumentInfoAuthor( KoDocumentInfo* info ) : KoDocumentInfoPage( info, "author" ) { initParameters(); } KoDocumentInfoAuthor::~KoDocumentInfoAuthor() { delete m_emailCfg; } void KoDocumentInfoAuthor::initParameters() { TDEConfig* config = KoGlobal::kofficeConfig(); if ( config->hasGroup( "Author" ) ) { TDEConfigGroupSaver cgs( config, "Author" ); m_telephoneHome=config->readEntry( "telephone" ); m_telephoneWork=config->readEntry( "telephone-work" ); m_fax=config->readEntry( "fax" ); m_country=config->readEntry( "country" ); m_postalCode=config->readEntry( "postal-code" ); m_city=config->readEntry( "city" ); m_street=config->readEntry( "street" ); } m_emailCfg = new TDEConfig( "emaildefaults", true ); m_emailCfg->setGroup( "Defaults" ); TQString group = m_emailCfg->readEntry("Profile","Default"); m_emailCfg->setGroup(TQString("PROFILE_%1").arg(group)); if ( m_fullName.isNull() ) // only if null. Empty means the user made it explicitly empty. { TQString name = m_emailCfg->readEntry( "FullName" ); if ( !name.isEmpty() ) m_fullName = name; } if ( m_company.isNull() ) { TQString name = m_emailCfg->readEntry( "Organization" ); if ( !name.isEmpty() ) m_company = name; } } bool KoDocumentInfoAuthor::saveOasis( KoXmlWriter &xmlWriter ) { if ( !m_fullName.isEmpty() ) { xmlWriter.startElement( "dc:creator"); xmlWriter.addTextNode( m_fullName ); xmlWriter.endElement(); } if ( !m_initial.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "initial" ); xmlWriter.addTextNode( m_initial ); xmlWriter.endElement(); } if ( !m_title.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "author-title" ); xmlWriter.addTextNode( m_title ); xmlWriter.endElement(); } if ( !m_company.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "company" ); xmlWriter.addTextNode( m_company ); xmlWriter.endElement(); } if ( !m_email.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "email" ); xmlWriter.addTextNode( m_email ); xmlWriter.endElement(); } if ( !m_telephoneHome.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "telephone" ); xmlWriter.addTextNode( m_telephoneHome ); xmlWriter.endElement(); } if ( !m_telephoneWork.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "telephone-work" ); xmlWriter.addTextNode( m_telephoneWork ); xmlWriter.endElement(); } if ( !m_fax.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "fax" ); xmlWriter.addTextNode( m_fax ); xmlWriter.endElement(); } if ( !m_country.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "country" ); xmlWriter.addTextNode( m_country ); xmlWriter.endElement(); } if ( !m_postalCode.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "postal-code" ); xmlWriter.addTextNode( m_postalCode ); xmlWriter.endElement(); } if ( !m_city.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "city" ); xmlWriter.addTextNode( m_city ); xmlWriter.endElement(); } if ( !m_street.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "street" ); xmlWriter.addTextNode( m_street ); xmlWriter.endElement(); } if ( !m_position.isEmpty() ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", "position" ); xmlWriter.addTextNode( m_position ); xmlWriter.endElement(); } return true; } bool KoDocumentInfoAuthor::loadOasis( const TQDomNode& metaDoc ) { TQDomElement e = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "creator" ); if ( !e.isNull() && !e.text().isEmpty() ) m_fullName = e.text(); TQDomNode n = metaDoc.firstChild(); for ( ; !n.isNull(); n = n.nextSibling() ) { if (n.isElement()) { TQDomElement e = n.toElement(); if ( e.namespaceURI() == KoXmlNS::meta && e.localName() == "user-defined" && !e.text().isEmpty() ) { TQString name = e.attributeNS( KoXmlNS::meta, "name", TQString() ); if ( name == "initial" ) m_initial = e.text(); else if ( name == "author-title" ) m_title = e.text(); else if ( name == "company" ) m_company = e.text(); else if ( name == "email" ) m_email = e.text(); else if ( name == "telephone" ) m_telephoneHome = e.text(); else if ( name == "telephone-work" ) m_telephoneWork = e.text(); else if ( name == "fax" ) m_fax = e.text(); else if ( name == "country" ) m_country = e.text(); else if ( name == "postal-code" ) m_postalCode = e.text(); else if ( name == "city" ) m_city = e.text(); else if ( name == "street" ) m_street = e.text(); else if ( name == "position" ) m_position = e.text(); } } } return true; } // KOffice-1.3 format bool KoDocumentInfoAuthor::load( const TQDomElement& e ) { TQDomNode n = e.namedItem( "author" ).firstChild(); for( ; !n.isNull(); n = n.nextSibling() ) { TQDomElement e = n.toElement(); if ( e.isNull() ) continue; if ( e.tagName() == "full-name" ) m_fullName = e.text(); else if ( e.tagName() == "initial" ) m_initial = e.text(); else if ( e.tagName() == "title" ) m_title = e.text(); else if ( e.tagName() == "company" ) m_company = e.text(); else if ( e.tagName() == "email" ) m_email = e.text(); else if ( e.tagName() == "telephone" ) m_telephoneHome = e.text(); else if ( e.tagName() == "telephone-work" ) m_telephoneWork = e.text(); else if ( e.tagName() == "fax" ) m_fax = e.text(); else if ( e.tagName() == "country" ) m_country = e.text(); else if ( e.tagName() == "postal-code" ) m_postalCode = e.text(); else if ( e.tagName() == "city" ) m_city = e.text(); else if ( e.tagName() == "street" ) m_street = e.text(); else if ( e.tagName() == "position" ) m_position = e.text(); } return true; } TQDomElement KoDocumentInfoAuthor::save( TQDomDocument& doc ) { TQDomElement e = doc.createElement( "author" ); TQDomElement t = doc.createElement( "full-name" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_fullName ) ); t = doc.createElement( "initial" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_initial ) ); t = doc.createElement( "title" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_title ) ); t = doc.createElement( "company" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_company ) ); t = doc.createElement( "email" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_email ) ); t = doc.createElement( "telephone" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_telephoneHome ) ); t = doc.createElement( "telephone-work" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_telephoneWork ) ); t = doc.createElement( "fax" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_fax ) ); t = doc.createElement( "country" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_country ) ); t = doc.createElement( "postal-code" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_postalCode ) ); t = doc.createElement( "city" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_city ) ); t = doc.createElement( "street" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_street ) ); t = doc.createElement( "position" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_position ) ); return e; } TQString KoDocumentInfoAuthor::fullName() const { return m_fullName; } TQString KoDocumentInfoAuthor::initial() const { return m_initial; } TQString KoDocumentInfoAuthor::title() const { return m_title; } TQString KoDocumentInfoAuthor::company() const { return m_company; } TQString KoDocumentInfoAuthor::email() const { return m_email; } TQString KoDocumentInfoAuthor::telephoneHome() const { return m_telephoneHome; } TQString KoDocumentInfoAuthor::telephoneWork() const { return m_telephoneWork; } TQString KoDocumentInfoAuthor::fax() const { return m_fax; } TQString KoDocumentInfoAuthor::country() const { return m_country; } TQString KoDocumentInfoAuthor::postalCode() const { return m_postalCode; } TQString KoDocumentInfoAuthor::city() const { return m_city; } TQString KoDocumentInfoAuthor::street() const { return m_street; } TQString KoDocumentInfoAuthor::position() const { return m_position; } void KoDocumentInfoAuthor::setFullName( const TQString& n ) { m_fullName = n; } void KoDocumentInfoAuthor::setInitial( const TQString& n ) { m_initial = n; } void KoDocumentInfoAuthor::setTitle( const TQString& n ) { m_title = n; } void KoDocumentInfoAuthor::setCompany( const TQString& n ) { m_company = n; } void KoDocumentInfoAuthor::setEmail( const TQString& n ) { m_email = n; } void KoDocumentInfoAuthor::setTelephoneHome( const TQString& n ) { m_telephoneHome = n; } void KoDocumentInfoAuthor::setTelephoneWork( const TQString& n ) { m_telephoneWork = n; } void KoDocumentInfoAuthor::setFax( const TQString& n ) { m_fax = n; } void KoDocumentInfoAuthor::setCountry( const TQString& n ) { m_country = n; } void KoDocumentInfoAuthor::setPostalCode( const TQString& n ) { m_postalCode = n; } void KoDocumentInfoAuthor::setCity( const TQString& n ) { m_city = n; } void KoDocumentInfoAuthor::setStreet( const TQString& n ) { m_street = n; } void KoDocumentInfoAuthor::setPosition( const TQString& n ) { m_position = n; } /***************************************** * * KoDocumentInfoAbout * *****************************************/ KoDocumentInfoAbout::KoDocumentInfoAbout( KoDocumentInfo* info ) : KoDocumentInfoPage( info, "about" ) { m_firstSave = true; m_docInfo = info; m_editingCycles = 0; m_initialCreator = m_docInfo->creator(); m_creationDate = TQDateTime::currentDateTime(); } void KoDocumentInfoAbout::saveParameters() { KoDocument* doc = dynamic_cast< KoDocument* >( m_docInfo->parent() ); if ( m_firstSave && doc && !doc->isAutosaving() ) m_editingCycles++; m_modificationDate = TQDateTime::currentDateTime(); m_firstSave = false; } bool KoDocumentInfoAbout::saveOasis( KoXmlWriter &xmlWriter ) { saveParameters(); if ( !m_title.isEmpty() ) { xmlWriter.startElement( "dc:title" ); xmlWriter.addTextNode( m_title ); xmlWriter.endElement(); } if ( !m_abstract.isEmpty() ) { xmlWriter.startElement( "dc:description" ); xmlWriter.addTextNode( m_abstract ); xmlWriter.endElement(); } if ( !m_keywords.isEmpty() ) { xmlWriter.startElement( "meta:keyword" ); xmlWriter.addTextNode( m_keywords ); xmlWriter.endElement(); } if ( !m_subject.isEmpty() ) { xmlWriter.startElement( "dc:subject" ); xmlWriter.addTextNode( m_subject ); xmlWriter.endElement(); } if ( !m_initialCreator.isEmpty() ) { xmlWriter.startElement( "meta:initial-creator" ); xmlWriter.addTextNode( m_initialCreator ); xmlWriter.endElement(); } xmlWriter.startElement( "meta:editing-cycles" ); xmlWriter.addTextNode( TQString::number( m_editingCycles ) ); xmlWriter.endElement(); if ( m_creationDate.isValid() ) { xmlWriter.startElement( "meta:creation-date" ); xmlWriter.addTextNode( m_creationDate.toString( Qt::ISODate ) ); xmlWriter.endElement(); } if ( m_modificationDate.isValid() ) { xmlWriter.startElement( "dc:date" ); xmlWriter.addTextNode( m_modificationDate.toString( Qt::ISODate ) ); xmlWriter.endElement(); } return true; } bool KoDocumentInfoAbout::loadOasis( const TQDomNode& metaDoc ) { TQDomElement e = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "title" ); if ( !e.isNull() && !e.text().isEmpty() ) { m_title = e.text(); } e = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "description" ); if ( !e.isNull() && !e.text().isEmpty() ) { m_abstract = e.text(); } e = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "subject" ); if ( !e.isNull() && !e.text().isEmpty() ) { m_subject = e.text(); } e = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "keyword" ); if ( !e.isNull() && !e.text().isEmpty() ) { m_keywords = e.text(); } e = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "initial-creator" ); if ( !e.isNull() && !e.text().isEmpty() ) m_initialCreator = e.text(); else m_initialCreator = i18n( "Unknown" ); e = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "editing-cycles" ); if ( !e.isNull() && !e.text().isEmpty() ) m_editingCycles = e.text().toInt(); e = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "creation-date" ); if ( !e.isNull() && !e.text().isEmpty() ) m_creationDate = TQDateTime::fromString( e.text(), Qt::ISODate ); else m_creationDate = TQDateTime(); e = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "date" ); if ( !e.isNull() && !e.text().isEmpty() ) m_modificationDate = TQDateTime::fromString( e.text(), Qt::ISODate ); return true; } // KOffice-1.3 format bool KoDocumentInfoAbout::load( const TQDomElement& e ) { TQDomNode n = e.namedItem( "about" ).firstChild(); for( ; !n.isNull(); n = n.nextSibling() ) { TQDomElement e = n.toElement(); if ( e.isNull() ) continue; if ( e.tagName() == "abstract" ) m_abstract = e.text(); else if ( e.tagName() == "title" ) m_title = e.text(); else if ( e.tagName() == "subject" ) m_subject = e.text(); else if ( e.tagName() == "keyword" ) m_keywords = e.text(); else if ( e.tagName() == "initial-creator" ) m_initialCreator = e.text(); else if ( e.tagName() == "editing-cycles" ) m_editingCycles = e.text().toInt(); else if ( e.tagName() == "creation-date" ) m_creationDate = TQDateTime::fromString( e.text(), Qt::ISODate ); else if ( e.tagName() == "date" ) m_modificationDate = TQDateTime::fromString( e.text(), Qt::ISODate ); } return true; } // KOffice-1.3 format TQDomElement KoDocumentInfoAbout::save( TQDomDocument& doc ) { saveParameters(); TQDomElement e = doc.createElement( "about" ); TQDomElement t = doc.createElement( "abstract" ); e.appendChild( t ); t.appendChild( doc.createCDATASection( m_abstract ) ); t = doc.createElement( "title" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_title ) ); t = doc.createElement( "keyword" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_keywords ) ); t = doc.createElement( "subject" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_subject ) ); t = doc.createElement( "initial-creator" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_initialCreator ) ); t = doc.createElement( "editing-cycles" ); e.appendChild( t ); t.appendChild( doc.createTextNode( TQString::number( m_editingCycles ) ) ); t = doc.createElement( "creation-date" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_creationDate.toString( Qt::ISODate ) ) ); t = doc.createElement( "date" ); e.appendChild( t ); t.appendChild( doc.createTextNode( m_modificationDate.toString( Qt::ISODate ) ) ); return e; } TQString KoDocumentInfoAbout::title() const { return m_title; } TQString KoDocumentInfoAbout::abstract() const { return m_abstract; } TQString KoDocumentInfoAbout::initialCreator() const { return m_initialCreator; } TQString KoDocumentInfoAbout::editingCycles() const { return TQString::number( m_editingCycles ); } TQString KoDocumentInfoAbout::creationDate() const { if ( m_creationDate.isValid() ) return TDEGlobal::locale()->formatDateTime( m_creationDate ); else return TQString(); } TQString KoDocumentInfoAbout::modificationDate() const { if ( m_modificationDate.isValid() ) return TDEGlobal::locale()->formatDateTime( m_modificationDate ); else return TQString(); } void KoDocumentInfoAbout::setTitle( const TQString& n ) { m_title = n; } void KoDocumentInfoAbout::setAbstract( const TQString& n ) { m_abstract = n; } TQString KoDocumentInfoAbout::keywords() const { return m_keywords; } TQString KoDocumentInfoAbout::subject() const { return m_subject; } void KoDocumentInfoAbout::setKeywords( const TQString& n ) { m_keywords = n; } void KoDocumentInfoAbout::setSubject( const TQString& n ) { m_subject = n; } void KoDocumentInfoAbout::resetMetaData() { m_editingCycles = 0; m_initialCreator = m_docInfo->creator(); m_creationDate = TQDateTime::currentDateTime(); m_modificationDate = TQDateTime(); } /***************************************** * * KoDocumentInfoUserMetadata * *****************************************/ KoDocumentInfoUserMetadata::KoDocumentInfoUserMetadata( KoDocumentInfo* info ) : KoDocumentInfoPage( info, "user_metadata" ) { m_reserved << "initial" << "author-title" << "company" << "email" << "telephone" << "telephone-work" << "fax" << "country" << "postal-code" << "city" << "street" << "position"; } bool KoDocumentInfoUserMetadata::saveOasis( KoXmlWriter &xmlWriter ) { TQMap::iterator it; for ( it = m_metaList.begin(); it != m_metaList.end(); ++it ) { xmlWriter.startElement( "meta:user-defined"); xmlWriter.addAttribute( "meta:name", it.key() ); xmlWriter.addTextNode( it.data() ); xmlWriter.endElement(); } return true; } bool KoDocumentInfoUserMetadata::loadOasis( const TQDomNode& metaDoc ) { TQDomNode n = metaDoc.firstChild(); for ( ; !n.isNull(); n = n.nextSibling() ) { if (n.isElement()) { TQDomElement e = n.toElement(); if ( e.namespaceURI() == KoXmlNS::meta && e.localName() == "user-defined" && !e.text().isEmpty() ) { TQString name = e.attributeNS( KoXmlNS::meta, "name", TQString() ); if ( !m_reserved.contains( name ) ) m_metaList[ name ] = e.text(); } } } return true; } // KOffice-1.3 format bool KoDocumentInfoUserMetadata::load( const TQDomElement& ) { return true; } // KOffice-1.3 format TQDomElement KoDocumentInfoUserMetadata::save( TQDomDocument& ) { return TQDomElement(); } #include