22#include "KoDocumentInfoDlg.h"
23#include "KoDocumentInfo.h"
24#include "koDocumentInfoAboutWidget.h"
25#include "koDocumentInfoAuthorWidget.h"
26#include "koDocumentInfoUserMetadataWidget.h"
27#include "KoDocument.h"
41#include <tqdatetime.h>
43#include <tdeabc/addressee.h>
44#include <tdeabc/stdaddressbook.h>
45#include <tdeversion.h>
47#include <tdemessagebox.h>
50#include <tdetempfile.h>
53#include <tdelistview.h>
56#include <kfilterdev.h>
59#include <kiconloader.h>
60#include <kpushbutton.h>
63class KoDocumentInfoDlg::KoDocumentInfoDlgPrivate
66 KoDocumentInfoDlgPrivate()
69 ~KoDocumentInfoDlgPrivate()
73 KoDocumentInfo *m_info;
74 KoDocumentInfoAboutWidget *m_aboutWidget;
75 KoDocumentInfoAuthorWidget *m_authorWidget;
76 KoDocumentInfoUserMetadataWidget *m_metaWidget;
82KoDocumentInfoDlg::KoDocumentInfoDlg( KoDocumentInfo *docInfo, TQWidget *parent,
const char *name,
84: TQObject( parent,
"docinfodlg" )
86 d =
new KoDocumentInfoDlgPrivate;
90 d->m_bDeleteDialog =
false;
95 i18n(
"Document Information" ),
98 d->m_dialog->setInitialSize( TQSize( 500, 500 ) );
99 d->m_bDeleteDialog =
true;
102 TQStringList pages = docInfo->pages();
103 TQStringList::ConstIterator it = pages.begin();
104 TQStringList::ConstIterator end = pages.end();
105 for (; it != end; ++it )
107 KoDocumentInfoPage *pg = docInfo->page( *it );
108 if ( pg->inherits(
"KoDocumentInfoAuthor" ) )
109 addAuthorPage(
static_cast<KoDocumentInfoAuthor *
>( pg ) );
110 else if ( pg->inherits(
"KoDocumentInfoAbout" ) )
111 addAboutPage(
static_cast<KoDocumentInfoAbout *
>( pg ) );
117KoDocumentInfoDlg::~KoDocumentInfoDlg()
119 if ( d->m_bDeleteDialog )
125int KoDocumentInfoDlg::exec()
127 return d->m_dialog->exec();
135void KoDocumentInfoDlg::loadFromKABC()
137 TDEABC::StdAddressBook *ab =
static_cast<TDEABC::StdAddressBook*
>
138 ( TDEABC::StdAddressBook::self() );
143 TDEABC::Addressee addr = ab->whoAmI();
144 if ( addr.isEmpty() )
147 \"Set as Personal Contact Data\" from the \"Edit\" menu in KAddressbook to set one." ) );
151 d->m_authorWidget->leFullName->setText( addr.formattedName() );
152 d->m_authorWidget->leInitial->setText( addr.givenName()[ 0 ] +
". " +
153 addr.familyName()[ 0 ] +
"." );
154 d->m_authorWidget->leAuthorTitle->setText( addr.title() );
155 d->m_authorWidget->leCompany->setText( addr.organization() );
156 d->m_authorWidget->leEmail->setText( addr.preferredEmail() );
158 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Home );
159 d->m_authorWidget->leTelephoneHome->setText( phone.number() );
160 phone = addr.phoneNumber( TDEABC::PhoneNumber::Work );
161 d->m_authorWidget->leTelephoneWork->setText( phone.number() );
163 phone = addr.phoneNumber( TDEABC::PhoneNumber::Fax );
164 d->m_authorWidget->leFax->setText( phone.number() );
166 TDEABC::Address a = addr.address( TDEABC::Address::Home );
167 d->m_authorWidget->leCountry->setText( a.country() );
168 d->m_authorWidget->lePostalCode->setText( a.postalCode() );
169 d->m_authorWidget->leCity->setText( a.locality() );
170 d->m_authorWidget->leStreet->setText( a.street() );
175void KoDocumentInfoDlg::deleteInfo()
177 d->m_authorWidget->leFullName->setText( TQString() );
178 d->m_authorWidget->leInitial->setText( TQString() );
179 d->m_authorWidget->leAuthorTitle->setText( TQString() );
180 d->m_authorWidget->leCompany->setText( TQString() );
181 d->m_authorWidget->leEmail->setText( TQString() );
182 d->m_authorWidget->leTelephoneHome->setText( TQString() );
183 d->m_authorWidget->leTelephoneWork->setText( TQString() );
184 d->m_authorWidget->leFax->setText( TQString() );
185 d->m_authorWidget->leCountry->setText( TQString() );
186 d->m_authorWidget->lePostalCode->setText( TQString() );
187 d->m_authorWidget->leCity->setText( TQString() );
188 d->m_authorWidget->leStreet->setText( TQString() );
192void KoDocumentInfoDlg::resetMetaData()
194 TQString s = TDEGlobal::locale()->formatDateTime( TQDateTime::currentDateTime() );
195 d->m_aboutWidget->labelCreated->setText( s +
", " + d->m_info->creator() );
196 d->m_aboutWidget->labelModified->setText(
"" );
197 d->m_aboutWidget->labelRevision->setText(
"0" );
201void KoDocumentInfoDlg::addAuthorPage( KoDocumentInfoAuthor *authorInfo )
203 TQVBox *page = d->m_dialog->addVBoxPage( i18n(
"Author" ) );
204 d->m_authorWidget =
new KoDocumentInfoAuthorWidget( page );
205 d->m_authorWidget->labelAuthor->setPixmap( TDEGlobal::iconLoader()->loadIcon(
"preferences-desktop-personal", TDEIcon::Desktop, 48 ) );
206 d->m_authorWidget->pbLoadKABC->setIconSet( TQIconSet( TDEGlobal::iconLoader()->loadIcon(
"kaddressbook", TDEIcon::Small ) ) );
207 d->m_authorWidget->pbDelete->setIconSet( TQIconSet( TDEGlobal::iconLoader()->loadIcon(
"eraser", TDEIcon::Small ) ) );
209 d->m_authorWidget->leFullName->setText( authorInfo->fullName() );
210 d->m_authorWidget->leInitial->setText( authorInfo->initial() );
211 d->m_authorWidget->leAuthorTitle->setText( authorInfo->title() );
212 d->m_authorWidget->leCompany->setText( authorInfo->company() );
213 d->m_authorWidget->leEmail->setText( authorInfo->email() );
214 d->m_authorWidget->leTelephoneWork->setText( authorInfo->telephoneWork() );
215 d->m_authorWidget->leTelephoneHome->setText( authorInfo->telephoneHome() );
216 d->m_authorWidget->leFax->setText( authorInfo->fax() );
217 d->m_authorWidget->leCountry->setText( authorInfo->country() );
218 d->m_authorWidget->lePostalCode->setText( authorInfo->postalCode() );
219 d->m_authorWidget->leCity->setText( authorInfo->city() );
220 d->m_authorWidget->leStreet->setText( authorInfo->street() );
221 d->m_authorWidget->leAuthorPosition->setText( authorInfo->position() );
223 connect( d->m_authorWidget->leFullName, TQ_SIGNAL( textChanged(
const TQString & ) ),
224 this, TQ_SIGNAL( changed() ) );
225 connect( d->m_authorWidget->leInitial, TQ_SIGNAL( textChanged(
const TQString & ) ),
226 this, TQ_SIGNAL( changed() ) );
227 connect( d->m_authorWidget->leAuthorTitle, TQ_SIGNAL( textChanged(
const TQString & ) ),
228 this, TQ_SIGNAL( changed() ) );
229 connect( d->m_authorWidget->leCompany, TQ_SIGNAL( textChanged(
const TQString & ) ),
230 this, TQ_SIGNAL( changed() ) );
231 connect( d->m_authorWidget->leEmail, TQ_SIGNAL( textChanged(
const TQString & ) ),
232 this, TQ_SIGNAL( changed() ) );
233 connect( d->m_authorWidget->leTelephoneWork, TQ_SIGNAL( textChanged(
const TQString & ) ),
234 this, TQ_SIGNAL( changed() ) );
235 connect( d->m_authorWidget->leTelephoneHome, TQ_SIGNAL( textChanged(
const TQString & ) ),
236 this, TQ_SIGNAL( changed() ) );
237 connect( d->m_authorWidget->leFax, TQ_SIGNAL( textChanged(
const TQString & ) ),
238 this, TQ_SIGNAL( changed() ) );
239 connect( d->m_authorWidget->leCountry, TQ_SIGNAL( textChanged(
const TQString & ) ),
240 this, TQ_SIGNAL( changed() ) );
241 connect( d->m_authorWidget->lePostalCode, TQ_SIGNAL( textChanged(
const TQString & ) ),
242 this, TQ_SIGNAL( changed() ) );
243 connect( d->m_authorWidget->leCity, TQ_SIGNAL( textChanged(
const TQString & ) ),
244 this, TQ_SIGNAL( changed() ) );
245 connect( d->m_authorWidget->leStreet, TQ_SIGNAL( textChanged(
const TQString & ) ),
246 this, TQ_SIGNAL( changed() ) );
247 connect( d->m_authorWidget->leAuthorPosition, TQ_SIGNAL( textChanged(
const TQString & ) ),
248 this, TQ_SIGNAL( changed() ) );
249 connect( d->m_authorWidget->pbLoadKABC, TQ_SIGNAL( clicked() ),
250 this, TQ_SLOT( loadFromKABC() ) );
251 connect( d->m_authorWidget->pbDelete, TQ_SIGNAL( clicked() ),
252 this, TQ_SLOT( deleteInfo() ) );
255void KoDocumentInfoDlg::addAboutPage( KoDocumentInfoAbout *aboutInfo )
257 TQVBox *page = d->m_dialog->addVBoxPage( i18n(
"General" ) );
258 d->m_aboutWidget =
new KoDocumentInfoAboutWidget( page );
259 d->m_aboutWidget->pbReset->setIconSet( TQIconSet( TDEGlobal::iconLoader()->loadIcon(
"reload", TDEIcon::Small ) ) );
263 d->m_aboutWidget->leDocFile->setText( doc->
file() );
264 d->m_aboutWidget->labelType->setText( KMimeType::mimeType( doc->
mimeType() )->comment() );
265 d->m_aboutWidget->pixmapLabel->setPixmap( KMimeType::mimeType( doc->
mimeType() )->pixmap( TDEIcon::Desktop, 48 ) );
267 if ( aboutInfo->creationDate() != TQString() )
268 d->m_aboutWidget->labelCreated->setText( aboutInfo->creationDate() +
", " + aboutInfo->initialCreator() );
269 if ( aboutInfo->modificationDate() != TQString() )
270 d->m_aboutWidget->labelModified->setText( aboutInfo->modificationDate() +
", " + d->m_info->creator() );
271 d->m_aboutWidget->labelRevision->setText( aboutInfo->editingCycles() );
272 d->m_aboutWidget->leDocTitle->setText( aboutInfo->title() );
273 d->m_aboutWidget->leDocSubject->setText( aboutInfo->subject() );
274 d->m_aboutWidget->leDocKeywords->setText( aboutInfo->keywords() );
275 d->m_aboutWidget->meDocAbstract->setText( aboutInfo->abstract() );
277 connect( d->m_aboutWidget->leDocTitle, TQ_SIGNAL( textChanged(
const TQString & ) ),
278 this, TQ_SIGNAL( changed() ) );
279 connect( d->m_aboutWidget->meDocAbstract, TQ_SIGNAL( textChanged() ),
280 this, TQ_SIGNAL( changed() ) );
281 connect( d->m_aboutWidget->leDocSubject, TQ_SIGNAL( textChanged(
const TQString & ) ),
282 this, TQ_SIGNAL( changed() ) );
283 connect( d->m_aboutWidget->leDocKeywords, TQ_SIGNAL( textChanged(
const TQString & ) ),
284 this, TQ_SIGNAL( changed() ) );
285 connect( d->m_aboutWidget->pbReset, TQ_SIGNAL( clicked() ),
286 aboutInfo, TQ_SLOT( resetMetaData() ) );
287 connect( d->m_aboutWidget->pbReset, TQ_SIGNAL( clicked() ),
288 this, TQ_SLOT( resetMetaData() ) );
291void KoDocumentInfoDlg::addUserMetadataPage( KoDocumentInfoUserMetadata *userMetadataInfo )
293 TQVBox *page = d->m_dialog->addVBoxPage( i18n(
"User-Defined Metadata" ) );
294 d->m_metaWidget =
new KoDocumentInfoUserMetadataWidget( page );
296 d->m_metaWidget->metaListView->addColumn(
"Name" );
297 d->m_metaWidget->metaListView->setFullWidth(
true );
299 TQMap<TQString, TQString>::iterator it;
300 for ( it = userMetadataInfo->metadataList()->begin(); it != userMetadataInfo->metadataList()->end(); ++it )
302 TQString
name = it.key();
303 TQString value = it.data();
305 it->setPixmap( 0, TDEGlobal::iconLoader()->loadIcon(
"text", TDEIcon::Small ) );
309void KoDocumentInfoDlg::save()
311 TQStringList pages = d->m_info->pages();
312 TQStringList::ConstIterator it = pages.begin();
313 TQStringList::ConstIterator end = pages.end();
315 for (; it != end; ++it )
317 KoDocumentInfoPage *pg = d->m_info->page( *it );
318 if ( pg->inherits(
"KoDocumentInfoAuthor" ) )
321 save(
static_cast<KoDocumentInfoAuthor *
>( pg ) );
323 else if ( pg->inherits(
"KoDocumentInfoAbout" ) )
326 save(
static_cast<KoDocumentInfoAbout *
>( pg ) );
330 d->m_info->documentInfochanged();
333void KoDocumentInfoDlg::save( KoDocumentInfoAuthor *authorInfo )
335 authorInfo->setFullName( d->m_authorWidget->leFullName->text() );
336 authorInfo->setInitial( d->m_authorWidget->leInitial->text() );
337 authorInfo->setTitle( d->m_authorWidget->leAuthorTitle->text() );
338 authorInfo->setCompany( d->m_authorWidget->leCompany->text() );
339 authorInfo->setEmail( d->m_authorWidget->leEmail->text() );
340 authorInfo->setTelephoneWork( d->m_authorWidget->leTelephoneWork->text() );
341 authorInfo->setTelephoneHome( d->m_authorWidget->leTelephoneHome->text() );
342 authorInfo->setFax( d->m_authorWidget->leFax->text() );
343 authorInfo->setCountry( d->m_authorWidget->leCountry->text() );
344 authorInfo->setPostalCode( d->m_authorWidget->lePostalCode->text() );
345 authorInfo->setCity( d->m_authorWidget->leCity->text() );
346 authorInfo->setStreet( d->m_authorWidget->leStreet->text() );
347 authorInfo->setPosition( d->m_authorWidget->leAuthorPosition->text() );
349 TDEConfig* config = KoGlobal::kofficeConfig();
350 TDEConfigGroupSaver cgs( config,
"Author" );
351 config->writeEntry(
"telephone", d->m_authorWidget->leTelephoneHome->text());
352 config->writeEntry(
"telephone-work", d->m_authorWidget->leTelephoneWork->text());
353 config->writeEntry(
"fax", d->m_authorWidget->leFax->text());
354 config->writeEntry(
"country",d->m_authorWidget->leCountry->text());
355 config->writeEntry(
"postal-code",d->m_authorWidget->lePostalCode->text());
356 config->writeEntry(
"city", d->m_authorWidget->leCity->text());
357 config->writeEntry(
"street", d->m_authorWidget->leStreet->text());
361void KoDocumentInfoDlg::save( KoDocumentInfoAbout *aboutInfo )
363 aboutInfo->setTitle( d->m_aboutWidget->leDocTitle->text() );
364 aboutInfo->setSubject( d->m_aboutWidget->leDocSubject->text() );
365 aboutInfo->setKeywords( d->m_aboutWidget->leDocKeywords->text() );
366 aboutInfo->setAbstract( d->m_aboutWidget->meDocAbstract->text() );
369void KoDocumentInfoDlg::save( KoDocumentInfoUserMetadata* )
374class KoDocumentInfoPropsPage::KoDocumentInfoPropsPagePrivate
377 KoDocumentInfo *m_info;
378 KoDocumentInfoDlg *m_dlg;
383 const KTarFile *m_docInfoFile;
386KoDocumentInfoPropsPage::KoDocumentInfoPropsPage( KPropertiesDialog *props,
388 const TQStringList & )
389: KPropsDlgPlugin( props )
391 d =
new KoDocumentInfoPropsPagePrivate;
392 d->m_info =
new KoDocumentInfo(
this,
"docinfo" );
393 d->m_url = props->item()->url();
396 if ( !d->m_url.isLocalFile() )
402#warning TODO port this to KoStore !!!
404 d->m_src =
new KTarGz( d->m_url.path(),
"application/x-gzip" );
406 if ( !d->m_src->open( IO_ReadOnly ) )
409 const KTarDirectory *root = d->m_src->directory();
413 const KTarEntry *entry = root->entry(
"documentinfo.xml" );
415 if ( entry && entry->isFile() )
417 d->m_docInfoFile =
static_cast<const KTarFile *
>( entry );
419 TQBuffer buffer( d->m_docInfoFile->data() );
420 buffer.open( IO_ReadOnly );
423 doc.setContent( &buffer );
425 d->m_info->load( doc );
428 d->m_dlg =
new KoDocumentInfoDlg( d->m_info, 0, 0, props );
429 connect( d->m_dlg, TQ_SIGNAL( changed() ),
430 this, TQ_SIGNAL( changed() ) );
433KoDocumentInfoPropsPage::~KoDocumentInfoPropsPage()
442void KoDocumentInfoPropsPage::applyChanges()
444 const KTarDirectory *root = d->m_src->directory();
448 struct stat statBuff;
450 if ( stat( TQFile::encodeName( d->m_url.path() ), &statBuff ) != 0 )
453 KTempFile tempFile( d->m_url.path(), TQString(), statBuff.st_mode );
455 tempFile.setAutoDelete(
true );
457 if ( tempFile.status() != 0 )
460 if ( !tempFile.close() )
463 d->m_dst =
new KTarGz( tempFile.name(),
"application/x-gzip" );
465 if ( !d->m_dst->open( IO_WriteOnly ) )
468 KMimeType::Ptr mimeType = KMimeType::findByURL( d->m_url, 0,
true );
469 if ( mimeType &&
dynamic_cast<KFilterDev *
>( d->m_dst->device() ) != 0 )
471 TQCString appIdentification(
"KOffice " );
472 appIdentification += mimeType->name().latin1();
473 appIdentification +=
'\004';
474 appIdentification +=
'\006';
475 d->m_dst->setOrigFileName( appIdentification );
478 bool docInfoSaved =
false;
480 TQStringList entries = root->entries();
481 TQStringList::ConstIterator it = entries.begin();
482 TQStringList::ConstIterator end = entries.end();
483 for (; it != end; ++it )
485 const KTarEntry *entry = root->entry( *it );
489 if ( entry->name() ==
"documentinfo.xml" ||
490 ( !docInfoSaved && !entries.contains(
"documentinfo.xml" ) ) )
495 buffer.open( IO_WriteOnly );
496 TQTextStream str( &buffer );
497 str << d->m_info->save();
500 kdDebug( 30003 ) <<
"writing documentinfo.xml" << endl;
501 d->m_dst->writeFile(
"documentinfo.xml", entry->user(), entry->group(), buffer.buffer().size(),
502 buffer.buffer().data() );
507 copy( TQString(), entry );
513 dir.rename( tempFile.name(), d->m_url.path() );
519void KoDocumentInfoPropsPage::copy(
const TQString &path,
const KArchiveEntry *entry )
521 kdDebug( 30003 ) <<
"copy " << entry->name() << endl;
522 if ( entry->isFile() )
524 const KTarFile *file =
static_cast<const KTarFile *
>( entry );
525 kdDebug( 30003 ) <<
"file :" << entry->name() << endl;
526 kdDebug( 30003 ) <<
"full path is: " << path << entry->name() << endl;
527 d->m_dst->writeFile( path + entry->name(), entry->user(), entry->group(),
529 file->data().data() );
533 const KTarDirectory *dir =
static_cast<const KTarDirectory *
>( entry );
534 kdDebug( 30003 ) <<
"dir : " << entry->name() << endl;
535 kdDebug( 30003 ) <<
"full path is: " << path << entry->name() << endl;
537 TQString p = path + entry->name();
540 d->m_dst->writeDir( p, entry->user(), entry->group() );
544 TQStringList entries = dir->entries();
545 TQStringList::ConstIterator it = entries.begin();
546 TQStringList::ConstIterator end = entries.end();
547 for (; it != end; ++it )
548 copy( p, dir->entry( *it ) );
552#include "KoDocumentInfoDlg.moc"
static void sorry(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, int options=Notify)
The KOffice document class.
TQString & file()
Only use these functions to restore m_file (in KoMainWindow) after a failed save (remember to use set...
TQCString mimeType() const
Returns the actual mimetype of the document.
TDEAction * save(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
TDEAction * copy(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
const char * name(StdAction id)