00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <koDocumentInfoDlg.h>
00023
#include <koDocumentInfo.h>
00024
#include <koGlobal.h>
00025
#include <koStore.h>
00026
00027
#include <sys/stat.h>
00028
#include <unistd.h>
00029
#include <assert.h>
00030
00031
#include <qlabel.h>
00032
#include <qlineedit.h>
00033
#include <qmultilineedit.h>
00034
#include <qbuffer.h>
00035
#include <qdom.h>
00036
#include <qdir.h>
00037
#include <qpushbutton.h>
00038
00039
#include <kabc/addressee.h>
00040
#include <kabc/stdaddressbook.h>
00041
#include <kdeversion.h>
00042
#include <klocale.h>
00043
#include <ktar.h>
00044
#include <kdebug.h>
00045
#include <ktempfile.h>
00046
#include <kmimetype.h>
00047
#include <qlayout.h>
00048
#include <qgrid.h>
00049
#include <kfilterdev.h>
00050
00051
class KoDocumentInfoDlg::KoDocumentInfoDlgPrivate
00052 {
00053
public:
00054 KoDocumentInfoDlgPrivate()
00055 {
00056 }
00057 ~KoDocumentInfoDlgPrivate()
00058 {
00059 }
00060
00061 KoDocumentInfo *m_info;
00062
00063
QLineEdit *m_leFullName;
00064
QLineEdit *m_leInitial;
00065
QLineEdit *m_leAuthorTitle;
00066
QLineEdit *m_leCompany;
00067
QLineEdit *m_leEmail;
00068
QLineEdit *m_leTelephone;
00069
QLineEdit *m_leFax;
00070
QLineEdit *m_leCountry;
00071
QLineEdit *m_lePostalCode;
00072
QLineEdit *m_leCity;
00073
QLineEdit *m_leStreet;
00074
QPushButton *m_pbLoadKABC;
00075
00076
QLineEdit *m_leDocTitle;
00077
QMultiLineEdit *m_meAbstract;
00078
00079 KConfig *m_emailCfg;
00080
00081
bool m_bDeleteDialog;
00082 KDialogBase *m_dialog;
00083 };
00084
00085 KoDocumentInfoDlg::KoDocumentInfoDlg( KoDocumentInfo *docInfo,
QWidget *parent,
const char *name,
00086 KDialogBase *dialog )
00087 :
QObject( parent, "docinfodlg" )
00088 {
00089 d =
new KoDocumentInfoDlgPrivate;
00090 d->m_info = docInfo;
00091 d->m_emailCfg =
new KConfig(
"emaildefaults",
true );
00092
00093 d->m_emailCfg->setGroup(
"Defaults" );
00094
00095
QString group = d->m_emailCfg->readEntry(
"Profile",
"Default");
00096
00097 d->m_emailCfg->setGroup(
QString(
"PROFILE_%1").arg(group));
00098
00099 d->m_dialog = dialog;
00100 d->m_bDeleteDialog =
false;
00101
00102
if ( !dialog )
00103 {
00104 d->m_dialog =
new KDialogBase( KDialogBase::Tabbed,
00105 i18n(
"Document Information" ),
00106 KDialogBase::Ok | KDialogBase::Cancel,
00107 KDialogBase::Ok, parent, name,
true,
true );
00108 d->m_bDeleteDialog =
true;
00109 }
00110
00111
QStringList pages = docInfo->pages();
00112 QStringList::ConstIterator it = pages.begin();
00113 QStringList::ConstIterator end = pages.end();
00114
for (; it != end; ++it )
00115 {
00116 KoDocumentInfoPage *pg = docInfo->page( *it );
00117
if ( pg->inherits(
"KoDocumentInfoAuthor" ) )
00118 addAuthorPage( static_cast<KoDocumentInfoAuthor *>( pg ) );
00119
else if ( pg->inherits(
"KoDocumentInfoAbout" ) )
00120 addAboutPage( static_cast<KoDocumentInfoAbout *>( pg ) );
00121 }
00122 }
00123
00124 KoDocumentInfoDlg::~KoDocumentInfoDlg()
00125 {
00126
delete d->m_emailCfg;
00127
00128
if ( d->m_bDeleteDialog )
00129
delete d->m_dialog;
00130
00131
delete d;
00132 }
00133
00134
int KoDocumentInfoDlg::exec()
00135 {
00136
return d->m_dialog->exec();
00137 }
00138
00139 KDialogBase *KoDocumentInfoDlg::dialog()
const
00140
{
00141
return d->m_dialog;
00142 }
00143
00144
void KoDocumentInfoDlg::loadFromKABC()
00145 {
00146
#if KDE_IS_VERSION( 3, 1, 90 )
00147
KABC::StdAddressBook *ab = static_cast<KABC::StdAddressBook*>
00148 ( KABC::StdAddressBook::self() );
00149
00150
if ( !ab )
00151
return;
00152
00153 KABC::Addressee addr = ab->whoAmI();
00154
if ( addr.isEmpty() )
00155
return;
00156
00157 d->m_leFullName->setText( addr.formattedName() );
00158 d->m_leInitial->setText( addr.givenName()[ 0 ] +
". " +
00159 addr.familyName()[ 0 ] +
"." );
00160 d->m_leAuthorTitle->setText( addr.title() );
00161 d->m_leCompany->setText( addr.organization() );
00162 d->m_leEmail->setText( addr.preferredEmail() );
00163
00164 KABC::PhoneNumber phone = addr.phoneNumber( KABC::PhoneNumber::Home );
00165 d->m_leTelephone->setText( phone.number() );
00166 phone = addr.phoneNumber( KABC::PhoneNumber::Fax );
00167 d->m_leFax->setText( phone.number() );
00168
00169 KABC::Address a = addr.address( KABC::Address::Home );
00170 d->m_leCountry->setText( a.country() );
00171 d->m_lePostalCode->setText( a.postalCode() );
00172 d->m_leCity->setText( a.locality() );
00173 d->m_leStreet->setText( a.street() );
00174
00175 emit changed();
00176
#endif
00177
}
00178
00179
void KoDocumentInfoDlg::addAuthorPage( KoDocumentInfoAuthor *authorInfo )
00180 {
00181
QFrame *page = d->m_dialog->addPage( i18n(
"Author" ) );
00182
QGridLayout *layout =
new QGridLayout( page, 11, 2, KDialog::marginHint(),
00183 KDialog::spacingHint() );
00184
00185 layout->addWidget(
new QLabel( i18n(
"Name:" ), page ), 0, 0 );
00186 d->m_leFullName =
new QLineEdit( authorInfo->fullName(), page );
00187 layout->addWidget( d->m_leFullName, 0, 1 );
00188
00189
if ( authorInfo->fullName().isNull() )
00190 {
00191
QString name = d->m_emailCfg->readEntry(
"FullName" );
00192
if ( !name.isEmpty() )
00193 d->m_leFullName->setText( name );
00194 }
00195
00196 layout->addWidget(
new QLabel( i18n(
"Initials:" ), page ), 1, 0 );
00197 d->m_leInitial =
new QLineEdit( authorInfo->initial(), page );
00198 layout->addWidget( d->m_leInitial, 1, 1 );
00199
00200 layout->addWidget(
new QLabel( i18n(
"Title:" ), page ), 2, 0 );
00201 d->m_leAuthorTitle =
new QLineEdit( authorInfo->title(), page );
00202 layout->addWidget( d->m_leAuthorTitle, 2, 1 );
00203
00204 layout->addWidget(
new QLabel( i18n(
"Company:" ), page ), 3, 0 );
00205 d->m_leCompany =
new QLineEdit( authorInfo->company(), page );
00206 layout->addWidget( d->m_leCompany, 3, 1 );
00207
00208
if ( authorInfo->company().isNull() )
00209 {
00210
QString name = d->m_emailCfg->readEntry(
"Organization" );
00211
if ( !name.isEmpty() )
00212 d->m_leCompany->setText( name );
00213 }
00214
00215 layout->addWidget(
new QLabel( i18n(
"Email:" ), page ), 4, 0 );
00216 d->m_leEmail =
new QLineEdit( authorInfo->email(), page );
00217 layout->addWidget( d->m_leEmail, 4, 1 );
00218
00219
if ( authorInfo->email().isNull() )
00220 {
00221
QString email = d->m_emailCfg->readEntry(
"EmailAddress" );
00222
if ( !email.isEmpty() )
00223 d->m_leEmail->setText( email );
00224 }
00225
00226 layout->addWidget(
new QLabel( i18n(
"Telephone:" ), page ), 5, 0 );
00227 d->m_leTelephone =
new QLineEdit( authorInfo->telephone(), page );
00228 layout->addWidget( d->m_leTelephone, 5, 1 );
00229
00230 layout->addWidget(
new QLabel( i18n(
"Fax:" ), page ), 6, 0 );
00231 d->m_leFax =
new QLineEdit( authorInfo->fax(), page );
00232 layout->addWidget( d->m_leFax, 6, 1 );
00233
00234 layout->addWidget(
new QLabel( i18n(
"Street:" ), page ), 7, 0 );
00235 d->m_leStreet =
new QLineEdit( authorInfo->street(), page );
00236 layout->addWidget( d->m_leStreet, 7, 1 );
00237
00238 layout->addWidget(
new QLabel( i18n(
"Postal code:" ), page ), 8, 0 );
00239 d->m_lePostalCode =
new QLineEdit( authorInfo->postalCode(), page );
00240 layout->addWidget( d->m_lePostalCode, 8, 1 );
00241
00242 layout->addWidget(
new QLabel( i18n(
"City:" ), page ), 9, 0 );
00243 d->m_leCity =
new QLineEdit( authorInfo->city(), page );
00244 layout->addWidget( d->m_leCity, 9, 1 );
00245
00246 layout->addWidget(
new QLabel( i18n(
"Country:" ), page ), 10, 0 );
00247 d->m_leCountry =
new QLineEdit( authorInfo->country(), page );
00248 layout->addWidget( d->m_leCountry, 10, 1 );
00249
00250 d->m_pbLoadKABC =
new QPushButton( i18n(
"Load From Address Book" ), page );
00251 layout->addMultiCellWidget( d->m_pbLoadKABC, 11, 11, 0, 1 );
00252
00253 connect( d->m_leFullName, SIGNAL( textChanged(
const QString & ) ),
00254
this, SIGNAL( changed() ) );
00255 connect( d->m_leInitial, SIGNAL( textChanged(
const QString & ) ),
00256
this, SIGNAL( changed() ) );
00257
00258 connect( d->m_leAuthorTitle, SIGNAL( textChanged(
const QString & ) ),
00259
this, SIGNAL( changed() ) );
00260 connect( d->m_leCompany, SIGNAL( textChanged(
const QString & ) ),
00261
this, SIGNAL( changed() ) );
00262 connect( d->m_leEmail, SIGNAL( textChanged(
const QString & ) ),
00263
this, SIGNAL( changed() ) );
00264 connect( d->m_leTelephone, SIGNAL( textChanged(
const QString & ) ),
00265
this, SIGNAL( changed() ) );
00266 connect( d->m_leFax, SIGNAL( textChanged(
const QString & ) ),
00267
this, SIGNAL( changed() ) );
00268 connect( d->m_leCountry, SIGNAL( textChanged(
const QString & ) ),
00269
this, SIGNAL( changed() ) );
00270 connect( d->m_lePostalCode, SIGNAL( textChanged(
const QString & ) ),
00271
this, SIGNAL( changed() ) );
00272 connect( d->m_leCity, SIGNAL( textChanged(
const QString & ) ),
00273
this, SIGNAL( changed() ) );
00274 connect( d->m_leStreet, SIGNAL( textChanged(
const QString & ) ),
00275
this, SIGNAL( changed() ) );
00276 connect( d->m_pbLoadKABC, SIGNAL( clicked() ),
00277
this, SLOT( loadFromKABC() ) );
00278 }
00279
00280
void KoDocumentInfoDlg::addAboutPage( KoDocumentInfoAbout *aboutInfo )
00281 {
00282
QFrame *page = d->m_dialog->addPage( i18n(
"about the document",
"About") );
00283 QGridLayout *grid =
new QGridLayout( page, 3, 2, KDialog::marginHint(), KDialog::spacingHint() );
00284
00285 grid->addWidget(
new QLabel( i18n(
"Title:" ), page ), 0, 0);
00286 d->m_leDocTitle =
new QLineEdit( aboutInfo->title(), page );
00287 grid->addWidget(d->m_leDocTitle, 0, 1);
00288
00289 grid->addWidget(
new QLabel( i18n(
"Abstract:" ), page ), 1, 0, Qt::AlignTop );
00290
00291 d->m_meAbstract =
new QMultiLineEdit( page );
00292 d->m_meAbstract->setText( aboutInfo->abstract() );
00293 grid->addMultiCellWidget(d->m_meAbstract, 1, 2, 1, 1);
00294
00295 connect( d->m_leDocTitle, SIGNAL( textChanged(
const QString & ) ),
00296
this, SIGNAL( changed() ) );
00297 connect( d->m_meAbstract, SIGNAL( textChanged() ),
00298
this, SIGNAL( changed() ) );
00299 }
00300
00301
void KoDocumentInfoDlg::save()
00302 {
00303
QStringList pages = d->m_info->pages();
00304 QStringList::ConstIterator it = pages.begin();
00305 QStringList::ConstIterator end = pages.end();
00306
bool saveInfo=
false;
00307
for (; it != end; ++it )
00308 {
00309 KoDocumentInfoPage *pg = d->m_info->page( *it );
00310
if ( pg->inherits(
"KoDocumentInfoAuthor" ) )
00311 {
00312 saveInfo=
true;
00313 save( static_cast<KoDocumentInfoAuthor *>( pg ) );
00314 }
00315
else if ( pg->inherits(
"KoDocumentInfoAbout" ) )
00316 {
00317 saveInfo=
true;
00318 save( static_cast<KoDocumentInfoAbout *>( pg ) );
00319 }
00320 }
00321
if(saveInfo)
00322 d->m_info->documentInfochanged();
00323 }
00324
00325
void KoDocumentInfoDlg::save( KoDocumentInfoAuthor *authorInfo )
00326 {
00327 authorInfo->setFullName( d->m_leFullName->text() );
00328 authorInfo->setInitial( d->m_leInitial->text() );
00329 authorInfo->setTitle( d->m_leAuthorTitle->text() );
00330 authorInfo->setCompany( d->m_leCompany->text() );
00331 authorInfo->setEmail( d->m_leEmail->text() );
00332 authorInfo->setTelephone( d->m_leTelephone->text() );
00333 authorInfo->setFax( d->m_leFax->text() );
00334 authorInfo->setCountry( d->m_leCountry->text() );
00335 authorInfo->setPostalCode( d->m_lePostalCode->text() );
00336 authorInfo->setCity( d->m_leCity->text() );
00337 authorInfo->setStreet( d->m_leStreet->text() );
00338
00339 KConfig* config = KoGlobal::kofficeConfig();
00340 KConfigGroupSaver cgs( config,
"Author" );
00341 config->writeEntry(
"telephone", d->m_leTelephone->text());
00342 config->writeEntry(
"fax", d->m_leFax->text());
00343 config->writeEntry(
"country",d->m_leCountry->text());
00344 config->writeEntry(
"postal-code",d->m_lePostalCode->text());
00345 config->writeEntry(
"city", d->m_leCity->text());
00346 config->writeEntry(
"street", d->m_leStreet->text());
00347 config->sync();
00348 }
00349
00350
void KoDocumentInfoDlg::save( KoDocumentInfoAbout *aboutInfo )
00351 {
00352 aboutInfo->setTitle( d->m_leDocTitle->text() );
00353 aboutInfo->setAbstract( d->m_meAbstract->text() );
00354 }
00355
00356
class KoDocumentInfoPropsPage::KoDocumentInfoPropsPagePrivate
00357 {
00358
public:
00359 KoDocumentInfo *m_info;
00360 KoDocumentInfoDlg *m_dlg;
00361 KURL m_url;
00362 KTarGz *m_src;
00363 KTarGz *m_dst;
00364
00365
const KTarFile *m_docInfoFile;
00366 };
00367
00368 KoDocumentInfoPropsPage::KoDocumentInfoPropsPage( KPropertiesDialog *props,
00369
const char *,
00370
const QStringList & )
00371 : KPropsDlgPlugin( props )
00372 {
00373 d =
new KoDocumentInfoPropsPagePrivate;
00374 d->m_info =
new KoDocumentInfo(
this,
"docinfo" );
00375 d->m_url = props->item()->url();
00376 d->m_dlg = 0;
00377
00378
if ( !d->m_url.isLocalFile() )
00379
return;
00380
00381 d->m_dst = 0;
00382
00383
#ifdef __GNUC__
00384
#warning TODO port this to KoStore !!!
00385
#endif
00386
d->m_src =
new KTarGz( d->m_url.path(),
"application/x-gzip" );
00387
00388
if ( !d->m_src->open( IO_ReadOnly ) )
00389
return;
00390
00391
const KTarDirectory *root = d->m_src->directory();
00392
if ( !root )
00393
return;
00394
00395
const KTarEntry *entry = root->entry(
"documentinfo.xml" );
00396
00397
if ( entry && entry->isFile() )
00398 {
00399 d->m_docInfoFile = static_cast<const KTarFile *>( entry );
00400
00401
QBuffer buffer( d->m_docInfoFile->data() );
00402 buffer.open( IO_ReadOnly );
00403
00404
QDomDocument doc;
00405 doc.setContent( &buffer );
00406
00407 d->m_info->load( doc );
00408 }
00409
00410 d->m_dlg =
new KoDocumentInfoDlg( d->m_info, 0, 0, props );
00411 connect( d->m_dlg, SIGNAL( changed() ),
00412
this, SIGNAL( changed() ) );
00413 }
00414
00415 KoDocumentInfoPropsPage::~KoDocumentInfoPropsPage()
00416 {
00417
delete d->m_info;
00418
delete d->m_src;
00419
delete d->m_dst;
00420
delete d->m_dlg;
00421
delete d;
00422 }
00423
00424
void KoDocumentInfoPropsPage::applyChanges()
00425 {
00426
const KTarDirectory *root = d->m_src->directory();
00427
if ( !root )
00428
return;
00429
00430
struct stat statBuff;
00431
00432
if ( stat( QFile::encodeName( d->m_url.path() ), &statBuff ) != 0 )
00433
return;
00434
00435 KTempFile tempFile( d->m_url.path(), QString::null, statBuff.st_mode );
00436
00437 tempFile.setAutoDelete(
true );
00438
00439
if ( tempFile.status() != 0 )
00440
return;
00441
00442
if ( !tempFile.close() )
00443
return;
00444
00445 d->m_dst =
new KTarGz( tempFile.name(),
"application/x-gzip" );
00446
00447
if ( !d->m_dst->open( IO_WriteOnly ) )
00448
return;
00449
00450 KMimeType::Ptr mimeType = KMimeType::findByURL( d->m_url, 0,
true );
00451
if ( mimeType && dynamic_cast<KFilterDev *>( d->m_dst->device() ) != 0 )
00452 {
00453
QCString appIdentification(
"KOffice " );
00454 appIdentification += mimeType->name().latin1();
00455 appIdentification +=
'\004';
00456 appIdentification +=
'\006';
00457 d->m_dst->setOrigFileName( appIdentification );
00458 }
00459
00460
bool docInfoSaved =
false;
00461
00462
QStringList entries = root->entries();
00463 QStringList::ConstIterator it = entries.begin();
00464 QStringList::ConstIterator end = entries.end();
00465
for (; it != end; ++it )
00466 {
00467
const KTarEntry *entry = root->entry( *it );
00468
00469 assert( entry );
00470
00471
if ( entry->name() ==
"documentinfo.xml" ||
00472 ( !docInfoSaved && !entries.contains(
"documentinfo.xml" ) ) )
00473 {
00474 d->m_dlg->save();
00475
00476
QBuffer buffer;
00477 buffer.open( IO_WriteOnly );
00478
QTextStream str( &buffer );
00479 str << d->m_info->save();
00480 buffer.close();
00481
00482 kdDebug( 30003 ) <<
"writing documentinfo.xml" << endl;
00483 d->m_dst->writeFile(
"documentinfo.xml", entry->user(), entry->group(), buffer.buffer().size(),
00484 buffer.buffer().data() );
00485
00486 docInfoSaved =
true;
00487 }
00488
else
00489 copy( QString::null, entry );
00490 }
00491
00492 d->m_dst->close();
00493
00494
QDir dir;
00495 dir.rename( tempFile.name(), d->m_url.path() );
00496
00497
delete d->m_dst;
00498 d->m_dst = 0;
00499 }
00500
00501
void KoDocumentInfoPropsPage::copy(
const QString &path,
const KTarEntry *entry )
00502 {
00503 kdDebug( 30003 ) <<
"copy " << entry->name() << endl;
00504
if ( entry->isFile() )
00505 {
00506
const KTarFile *file = static_cast<const KTarFile *>( entry );
00507 kdDebug( 30003 ) <<
"file :" << entry->name() << endl;
00508 kdDebug( 30003 ) <<
"full path is: " << path << entry->name() << endl;
00509 d->m_dst->writeFile( path + entry->name(), entry->user(), entry->group(),
00510 file->size(),
00511 file->data().data() );
00512 }
00513
else
00514 {
00515
const KTarDirectory *dir = static_cast<const KTarDirectory *>( entry );
00516 kdDebug( 30003 ) <<
"dir : " << entry->name() << endl;
00517 kdDebug( 30003 ) <<
"full path is: " << path << entry->name() << endl;
00518
00519
QString p = path + entry->name();
00520
if ( p !=
"/" )
00521 {
00522 d->m_dst->writeDir( p, entry->user(), entry->group() );
00523 p.append(
"/" );
00524 }
00525
00526
QStringList entries = dir->entries();
00527 QStringList::ConstIterator it = entries.begin();
00528 QStringList::ConstIterator end = entries.end();
00529
for (; it != end; ++it )
00530 copy( p, dir->entry( *it ) );
00531 }
00532 }
00533
00534
00535
00536
00537
#include <koDocumentInfoDlg.moc>