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>
46#include <tdemessagebox.h>
49#include <tdetempfile.h>
52#include <tdelistview.h>
55#include <kfilterdev.h>
58#include <kiconloader.h>
59#include <kpushbutton.h>
62class KoDocumentInfoDlg::KoDocumentInfoDlgPrivate
65 KoDocumentInfoDlgPrivate()
68 ~KoDocumentInfoDlgPrivate()
72 KoDocumentInfo *m_info;
73 KoDocumentInfoAboutWidget *m_aboutWidget;
74 KoDocumentInfoAuthorWidget *m_authorWidget;
75 KoDocumentInfoUserMetadataWidget *m_metaWidget;
78 KDialogBase *m_dialog;
81KoDocumentInfoDlg::KoDocumentInfoDlg( KoDocumentInfo *docInfo, TQWidget *parent,
const char *name,
83: TQObject( parent,
"docinfodlg" )
85 d =
new KoDocumentInfoDlgPrivate;
89 d->m_bDeleteDialog =
false;
94 i18n(
"Document Information" ),
97 d->m_dialog->setInitialSize( TQSize( 500, 500 ) );
98 d->m_bDeleteDialog =
true;
101 TQStringList pages = docInfo->pages();
102 TQStringList::ConstIterator it = pages.begin();
103 TQStringList::ConstIterator end = pages.end();
104 for (; it != end; ++it )
106 KoDocumentInfoPage *pg = docInfo->page( *it );
107 if ( pg->inherits(
"KoDocumentInfoAuthor" ) )
108 addAuthorPage(
static_cast<KoDocumentInfoAuthor *
>( pg ) );
109 else if ( pg->inherits(
"KoDocumentInfoAbout" ) )
110 addAboutPage(
static_cast<KoDocumentInfoAbout *
>( pg ) );
116KoDocumentInfoDlg::~KoDocumentInfoDlg()
118 if ( d->m_bDeleteDialog )
124int KoDocumentInfoDlg::exec()
126 return d->m_dialog->exec();
134void KoDocumentInfoDlg::loadFromKABC()
136 TDEABC::StdAddressBook *ab =
static_cast<TDEABC::StdAddressBook*
>
137 ( TDEABC::StdAddressBook::self() );
142 TDEABC::Addressee addr = ab->whoAmI();
143 if ( addr.isEmpty() )
146 \"Set as Personal Contact Data\" from the \"Edit\" menu in KAddressbook to set one." ) );
150 d->m_authorWidget->leFullName->setText( addr.formattedName() );
151 d->m_authorWidget->leInitial->setText( addr.givenName()[ 0 ] +
". " +
152 addr.familyName()[ 0 ] +
"." );
153 d->m_authorWidget->leAuthorTitle->setText( addr.title() );
154 d->m_authorWidget->leCompany->setText( addr.organization() );
155 d->m_authorWidget->leEmail->setText( addr.preferredEmail() );
157 TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Home );
158 d->m_authorWidget->leTelephoneHome->setText( phone.number() );
159 phone = addr.phoneNumber( TDEABC::PhoneNumber::Work );
160 d->m_authorWidget->leTelephoneWork->setText( phone.number() );
162 phone = addr.phoneNumber( TDEABC::PhoneNumber::Fax );
163 d->m_authorWidget->leFax->setText( phone.number() );
165 TDEABC::Address a = addr.address( TDEABC::Address::Home );
166 d->m_authorWidget->leCountry->setText( a.country() );
167 d->m_authorWidget->lePostalCode->setText( a.postalCode() );
168 d->m_authorWidget->leCity->setText( a.locality() );
169 d->m_authorWidget->leStreet->setText( a.street() );
174void KoDocumentInfoDlg::deleteInfo()
176 d->m_authorWidget->leFullName->setText( TQString() );
177 d->m_authorWidget->leInitial->setText( TQString() );
178 d->m_authorWidget->leAuthorTitle->setText( TQString() );
179 d->m_authorWidget->leCompany->setText( TQString() );
180 d->m_authorWidget->leEmail->setText( TQString() );
181 d->m_authorWidget->leTelephoneHome->setText( TQString() );
182 d->m_authorWidget->leTelephoneWork->setText( TQString() );
183 d->m_authorWidget->leFax->setText( TQString() );
184 d->m_authorWidget->leCountry->setText( TQString() );
185 d->m_authorWidget->lePostalCode->setText( TQString() );
186 d->m_authorWidget->leCity->setText( TQString() );
187 d->m_authorWidget->leStreet->setText( TQString() );
191void KoDocumentInfoDlg::resetMetaData()
193 TQString s = TDEGlobal::locale()->formatDateTime( TQDateTime::currentDateTime() );
194 d->m_aboutWidget->labelCreated->setText( s +
", " + d->m_info->creator() );
195 d->m_aboutWidget->labelModified->setText(
"" );
196 d->m_aboutWidget->labelRevision->setText(
"0" );
200void KoDocumentInfoDlg::addAuthorPage( KoDocumentInfoAuthor *authorInfo )
202 TQVBox *page = d->m_dialog->addVBoxPage( i18n(
"Author" ) );
203 d->m_authorWidget =
new KoDocumentInfoAuthorWidget( page );
204 d->m_authorWidget->labelAuthor->setPixmap( TDEGlobal::iconLoader()->loadIcon(
"preferences-desktop-personal", TDEIcon::Desktop, 48 ) );
205 d->m_authorWidget->pbLoadKABC->setIconSet( TQIconSet( TDEGlobal::iconLoader()->loadIcon(
"kaddressbook", TDEIcon::Small ) ) );
206 d->m_authorWidget->pbDelete->setIconSet( TQIconSet( TDEGlobal::iconLoader()->loadIcon(
"eraser", TDEIcon::Small ) ) );
208 d->m_authorWidget->leFullName->setText( authorInfo->fullName() );
209 d->m_authorWidget->leInitial->setText( authorInfo->initial() );
210 d->m_authorWidget->leAuthorTitle->setText( authorInfo->title() );
211 d->m_authorWidget->leCompany->setText( authorInfo->company() );
212 d->m_authorWidget->leEmail->setText( authorInfo->email() );
213 d->m_authorWidget->leTelephoneWork->setText( authorInfo->telephoneWork() );
214 d->m_authorWidget->leTelephoneHome->setText( authorInfo->telephoneHome() );
215 d->m_authorWidget->leFax->setText( authorInfo->fax() );
216 d->m_authorWidget->leCountry->setText( authorInfo->country() );
217 d->m_authorWidget->lePostalCode->setText( authorInfo->postalCode() );
218 d->m_authorWidget->leCity->setText( authorInfo->city() );
219 d->m_authorWidget->leStreet->setText( authorInfo->street() );
220 d->m_authorWidget->leAuthorPosition->setText( authorInfo->position() );
222 connect( d->m_authorWidget->leFullName, TQ_SIGNAL( textChanged(
const TQString & ) ),
223 this, TQ_SIGNAL( changed() ) );
224 connect( d->m_authorWidget->leInitial, TQ_SIGNAL( textChanged(
const TQString & ) ),
225 this, TQ_SIGNAL( changed() ) );
226 connect( d->m_authorWidget->leAuthorTitle, TQ_SIGNAL( textChanged(
const TQString & ) ),
227 this, TQ_SIGNAL( changed() ) );
228 connect( d->m_authorWidget->leCompany, TQ_SIGNAL( textChanged(
const TQString & ) ),
229 this, TQ_SIGNAL( changed() ) );
230 connect( d->m_authorWidget->leEmail, TQ_SIGNAL( textChanged(
const TQString & ) ),
231 this, TQ_SIGNAL( changed() ) );
232 connect( d->m_authorWidget->leTelephoneWork, TQ_SIGNAL( textChanged(
const TQString & ) ),
233 this, TQ_SIGNAL( changed() ) );
234 connect( d->m_authorWidget->leTelephoneHome, TQ_SIGNAL( textChanged(
const TQString & ) ),
235 this, TQ_SIGNAL( changed() ) );
236 connect( d->m_authorWidget->leFax, TQ_SIGNAL( textChanged(
const TQString & ) ),
237 this, TQ_SIGNAL( changed() ) );
238 connect( d->m_authorWidget->leCountry, TQ_SIGNAL( textChanged(
const TQString & ) ),
239 this, TQ_SIGNAL( changed() ) );
240 connect( d->m_authorWidget->lePostalCode, TQ_SIGNAL( textChanged(
const TQString & ) ),
241 this, TQ_SIGNAL( changed() ) );
242 connect( d->m_authorWidget->leCity, TQ_SIGNAL( textChanged(
const TQString & ) ),
243 this, TQ_SIGNAL( changed() ) );
244 connect( d->m_authorWidget->leStreet, TQ_SIGNAL( textChanged(
const TQString & ) ),
245 this, TQ_SIGNAL( changed() ) );
246 connect( d->m_authorWidget->leAuthorPosition, TQ_SIGNAL( textChanged(
const TQString & ) ),
247 this, TQ_SIGNAL( changed() ) );
248 connect( d->m_authorWidget->pbLoadKABC, TQ_SIGNAL( clicked() ),
249 this, TQ_SLOT( loadFromKABC() ) );
250 connect( d->m_authorWidget->pbDelete, TQ_SIGNAL( clicked() ),
251 this, TQ_SLOT( deleteInfo() ) );
254void KoDocumentInfoDlg::addAboutPage( KoDocumentInfoAbout *aboutInfo )
256 TQVBox *page = d->m_dialog->addVBoxPage( i18n(
"General" ) );
257 d->m_aboutWidget =
new KoDocumentInfoAboutWidget( page );
258 d->m_aboutWidget->pbReset->setIconSet( TQIconSet( TDEGlobal::iconLoader()->loadIcon(
"reload", TDEIcon::Small ) ) );
259 KoDocument* doc =
dynamic_cast< KoDocument*
>( d->m_info->parent() );
262 d->m_aboutWidget->leDocFile->setText( doc->
file() );
263 d->m_aboutWidget->labelType->setText( KMimeType::mimeType( doc->
mimeType() )->comment() );
264 d->m_aboutWidget->pixmapLabel->setPixmap( KMimeType::mimeType( doc->
mimeType() )->pixmap( TDEIcon::Desktop, 48 ) );
266 if ( aboutInfo->creationDate() != TQString() )
267 d->m_aboutWidget->labelCreated->setText( aboutInfo->creationDate() +
", " + aboutInfo->initialCreator() );
268 if ( aboutInfo->modificationDate() != TQString() )
269 d->m_aboutWidget->labelModified->setText( aboutInfo->modificationDate() +
", " + d->m_info->creator() );
270 d->m_aboutWidget->labelRevision->setText( aboutInfo->editingCycles() );
271 d->m_aboutWidget->leDocTitle->setText( aboutInfo->title() );
272 d->m_aboutWidget->leDocSubject->setText( aboutInfo->subject() );
273 d->m_aboutWidget->leDocKeywords->setText( aboutInfo->keywords() );
274 d->m_aboutWidget->meDocAbstract->setText( aboutInfo->abstract() );
276 connect( d->m_aboutWidget->leDocTitle, TQ_SIGNAL( textChanged(
const TQString & ) ),
277 this, TQ_SIGNAL( changed() ) );
278 connect( d->m_aboutWidget->meDocAbstract, TQ_SIGNAL( textChanged() ),
279 this, TQ_SIGNAL( changed() ) );
280 connect( d->m_aboutWidget->leDocSubject, TQ_SIGNAL( textChanged(
const TQString & ) ),
281 this, TQ_SIGNAL( changed() ) );
282 connect( d->m_aboutWidget->leDocKeywords, TQ_SIGNAL( textChanged(
const TQString & ) ),
283 this, TQ_SIGNAL( changed() ) );
284 connect( d->m_aboutWidget->pbReset, TQ_SIGNAL( clicked() ),
285 aboutInfo, TQ_SLOT( resetMetaData() ) );
286 connect( d->m_aboutWidget->pbReset, TQ_SIGNAL( clicked() ),
287 this, TQ_SLOT( resetMetaData() ) );
290void KoDocumentInfoDlg::addUserMetadataPage( KoDocumentInfoUserMetadata *userMetadataInfo )
292 TQVBox *page = d->m_dialog->addVBoxPage( i18n(
"User-Defined Metadata" ) );
293 d->m_metaWidget =
new KoDocumentInfoUserMetadataWidget( page );
295 d->m_metaWidget->metaListView->addColumn(
"Name" );
296 d->m_metaWidget->metaListView->setFullWidth(
true );
298 TQMap<TQString, TQString>::iterator it;
299 for ( it = userMetadataInfo->metadataList()->begin(); it != userMetadataInfo->metadataList()->end(); ++it )
301 TQString
name = it.key();
302 TQString value = it.data();
303 TDEListViewItem* it =
new TDEListViewItem( d->m_metaWidget->metaListView, name, value );
304 it->setPixmap( 0, TDEGlobal::iconLoader()->loadIcon(
"text", TDEIcon::Small ) );
308void KoDocumentInfoDlg::save()
310 TQStringList pages = d->m_info->pages();
311 TQStringList::ConstIterator it = pages.begin();
312 TQStringList::ConstIterator end = pages.end();
314 for (; it != end; ++it )
316 KoDocumentInfoPage *pg = d->m_info->page( *it );
317 if ( pg->inherits(
"KoDocumentInfoAuthor" ) )
320 save(
static_cast<KoDocumentInfoAuthor *
>( pg ) );
322 else if ( pg->inherits(
"KoDocumentInfoAbout" ) )
325 save(
static_cast<KoDocumentInfoAbout *
>( pg ) );
329 d->m_info->documentInfochanged();
332void KoDocumentInfoDlg::save( KoDocumentInfoAuthor *authorInfo )
334 authorInfo->setFullName( d->m_authorWidget->leFullName->text() );
335 authorInfo->setInitial( d->m_authorWidget->leInitial->text() );
336 authorInfo->setTitle( d->m_authorWidget->leAuthorTitle->text() );
337 authorInfo->setCompany( d->m_authorWidget->leCompany->text() );
338 authorInfo->setEmail( d->m_authorWidget->leEmail->text() );
339 authorInfo->setTelephoneWork( d->m_authorWidget->leTelephoneWork->text() );
340 authorInfo->setTelephoneHome( d->m_authorWidget->leTelephoneHome->text() );
341 authorInfo->setFax( d->m_authorWidget->leFax->text() );
342 authorInfo->setCountry( d->m_authorWidget->leCountry->text() );
343 authorInfo->setPostalCode( d->m_authorWidget->lePostalCode->text() );
344 authorInfo->setCity( d->m_authorWidget->leCity->text() );
345 authorInfo->setStreet( d->m_authorWidget->leStreet->text() );
346 authorInfo->setPosition( d->m_authorWidget->leAuthorPosition->text() );
348 TDEConfig* config = KoGlobal::kofficeConfig();
349 TDEConfigGroupSaver cgs( config,
"Author" );
350 config->writeEntry(
"telephone", d->m_authorWidget->leTelephoneHome->text());
351 config->writeEntry(
"telephone-work", d->m_authorWidget->leTelephoneWork->text());
352 config->writeEntry(
"fax", d->m_authorWidget->leFax->text());
353 config->writeEntry(
"country",d->m_authorWidget->leCountry->text());
354 config->writeEntry(
"postal-code",d->m_authorWidget->lePostalCode->text());
355 config->writeEntry(
"city", d->m_authorWidget->leCity->text());
356 config->writeEntry(
"street", d->m_authorWidget->leStreet->text());
360void KoDocumentInfoDlg::save( KoDocumentInfoAbout *aboutInfo )
362 aboutInfo->setTitle( d->m_aboutWidget->leDocTitle->text() );
363 aboutInfo->setSubject( d->m_aboutWidget->leDocSubject->text() );
364 aboutInfo->setKeywords( d->m_aboutWidget->leDocKeywords->text() );
365 aboutInfo->setAbstract( d->m_aboutWidget->meDocAbstract->text() );
368void KoDocumentInfoDlg::save( KoDocumentInfoUserMetadata* )
373class KoDocumentInfoPropsPage::KoDocumentInfoPropsPagePrivate
376 KoDocumentInfo *m_info;
377 KoDocumentInfoDlg *m_dlg;
382 const KTarFile *m_docInfoFile;
385KoDocumentInfoPropsPage::KoDocumentInfoPropsPage( KPropertiesDialog *props,
387 const TQStringList & )
388: KPropsDlgPlugin( props )
390 d =
new KoDocumentInfoPropsPagePrivate;
391 d->m_info =
new KoDocumentInfo(
this,
"docinfo" );
392 d->m_url = props->item()->url();
395 if ( !d->m_url.isLocalFile() )
401#warning TODO port this to KoStore !!!
403 d->m_src =
new KTarGz( d->m_url.path(),
"application/x-gzip" );
405 if ( !d->m_src->open( IO_ReadOnly ) )
408 const KTarDirectory *root = d->m_src->directory();
412 const KTarEntry *entry = root->entry(
"documentinfo.xml" );
414 if ( entry && entry->isFile() )
416 d->m_docInfoFile =
static_cast<const KTarFile *
>( entry );
418 TQBuffer buffer( d->m_docInfoFile->data() );
419 buffer.open( IO_ReadOnly );
422 doc.setContent( &buffer );
424 d->m_info->load( doc );
427 d->m_dlg =
new KoDocumentInfoDlg( d->m_info, 0, 0, props );
428 connect( d->m_dlg, TQ_SIGNAL( changed() ),
429 this, TQ_SIGNAL( changed() ) );
432KoDocumentInfoPropsPage::~KoDocumentInfoPropsPage()
441void KoDocumentInfoPropsPage::applyChanges()
443 const KTarDirectory *root = d->m_src->directory();
447 struct stat statBuff;
449 if ( stat( TQFile::encodeName( d->m_url.path() ), &statBuff ) != 0 )
452 KTempFile tempFile( d->m_url.path(), TQString(), statBuff.st_mode );
454 tempFile.setAutoDelete(
true );
456 if ( tempFile.status() != 0 )
459 if ( !tempFile.close() )
462 d->m_dst =
new KTarGz( tempFile.name(),
"application/x-gzip" );
464 if ( !d->m_dst->open( IO_WriteOnly ) )
467 KMimeType::Ptr mimeType = KMimeType::findByURL( d->m_url, 0,
true );
468 if ( mimeType &&
dynamic_cast<KFilterDev *
>( d->m_dst->device() ) != 0 )
470 TQCString appIdentification(
"KOffice " );
471 appIdentification += mimeType->name().latin1();
472 appIdentification +=
'\004';
473 appIdentification +=
'\006';
474 d->m_dst->setOrigFileName( appIdentification );
477 bool docInfoSaved =
false;
479 TQStringList entries = root->entries();
480 TQStringList::ConstIterator it = entries.begin();
481 TQStringList::ConstIterator end = entries.end();
482 for (; it != end; ++it )
484 const KTarEntry *entry = root->entry( *it );
488 if ( entry->name() ==
"documentinfo.xml" ||
489 ( !docInfoSaved && !entries.contains(
"documentinfo.xml" ) ) )
494 buffer.open( IO_WriteOnly );
495 TQTextStream str( &buffer );
496 str << d->m_info->save();
499 kdDebug( 30003 ) <<
"writing documentinfo.xml" << endl;
500 d->m_dst->writeFile(
"documentinfo.xml", entry->user(), entry->group(), buffer.buffer().size(),
501 buffer.buffer().data() );
506 copy( TQString(), entry );
512 dir.rename( tempFile.name(), d->m_url.path() );
518void KoDocumentInfoPropsPage::copy(
const TQString &path,
const KArchiveEntry *entry )
520 kdDebug( 30003 ) <<
"copy " << entry->name() << endl;
521 if ( entry->isFile() )
523 const KTarFile *file =
static_cast<const KTarFile *
>( entry );
524 kdDebug( 30003 ) <<
"file :" << entry->name() << endl;
525 kdDebug( 30003 ) <<
"full path is: " << path << entry->name() << endl;
526 d->m_dst->writeFile( path + entry->name(), entry->user(), entry->group(),
528 file->data().data() );
532 const KTarDirectory *dir =
static_cast<const KTarDirectory *
>( entry );
533 kdDebug( 30003 ) <<
"dir : " << entry->name() << endl;
534 kdDebug( 30003 ) <<
"full path is: " << path << entry->name() << endl;
536 TQString p = path + entry->name();
539 d->m_dst->writeDir( p, entry->user(), entry->group() );
543 TQStringList entries = dir->entries();
544 TQStringList::ConstIterator it = entries.begin();
545 TQStringList::ConstIterator end = entries.end();
546 for (; it != end; ++it )
547 copy( p, dir->entry( *it ) );
551#include "KoDocumentInfoDlg.moc"
static void sorry(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, int options=Notify)
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.
const char * name(StdAction id)