29 #include <QtGui/QApplication>
30 #include <QtCore/QFile>
31 #include <QtCore/QFileInfo>
32 #include <QtGui/QPainter>
33 #include <QtCore/QPoint>
52 using namespace KParts;
62 PartBasePrivate(
PartBase *q): q_ptr(q)
65 m_pluginInterfaceVersion = 0;
69 virtual ~PartBasePrivate()
75 int m_pluginInterfaceVersion;
79 class PartPrivate:
public PartBasePrivate
82 Q_DECLARE_PUBLIC(
Part)
88 m_autoDeleteWidget(true),
89 m_autoDeletePart(true),
100 bool m_autoDeleteWidget;
101 bool m_autoDeletePart;
103 QPointer<QWidget> m_widget;
109 : d_ptr(new PartBasePrivate(this))
168 d->m_pluginLoadingMode = loadingMode;
175 d->m_pluginInterfaceVersion = version;
199 disconnect( d->m_widget, SIGNAL(destroyed()),
204 d->m_manager->removePart(
this);
206 if ( d->m_widget && d->m_autoDeleteWidget )
208 kDebug(1000) <<
"deleting widget" << d->m_widget << d->m_widget->objectName();
209 delete static_cast<QWidget*
>(d->m_widget);
212 delete d->m_iconLoader;
219 widget()->setParent( parentWidget, 0 );
235 d->m_autoDeleteWidget = autoDeleteWidget;
241 d->m_autoDeletePart = autoDeletePart;
250 if (!d->m_iconLoader) {
254 return d->m_iconLoader;
275 if ( (
QWidget *)d->m_widget != widget )
285 connect( d->m_widget, SIGNAL(destroyed()),
293 d->m_bSelectable = selectable;
300 return d->m_bSelectable;
351 if (d->m_autoDeletePart) {
352 kDebug(1000) <<
"deleting part" << objectName();
367 class ReadOnlyPartPrivate:
public PartPrivate
377 m_showProgressInfo =
true;
379 m_waitForSave =
false;
380 m_duringSaveAs =
false;
382 m_bAutoDetectedMime =
false;
385 ~ReadOnlyPartPrivate()
389 void _k_slotJobFinished(
KJob * job );
390 void _k_slotStatJobFinished(
KJob * job);
392 bool openLocalFile();
393 void openRemoteFile();
400 bool m_showProgressInfo : 1;
402 bool m_waitForSave : 1;
403 bool m_duringSaveAs : 1;
411 bool m_bAutoDetectedMime : 1;
426 class ReadWritePartPrivate:
public ReadOnlyPartPrivate
431 ReadWritePartPrivate(
ReadWritePart *q): ReadOnlyPartPrivate(q)
438 void _k_slotUploadFinished(
KJob * job );
440 void prepareSaving();
445 QEventLoop m_eventLoop;
451 :
Part( *new ReadOnlyPartPrivate(this), parent )
493 #ifndef KDE_NO_DEPRECATED
502 #ifndef KDE_NO_DEPRECATED
515 d->m_showProgressInfo = show;
522 return d->m_showProgressInfo;
525 #ifndef KDE_NO_COMPAT
530 d->m_showProgressInfo = show;
538 if ( !url.isValid() )
540 if (d->m_bAutoDetectedMime) {
541 d->m_arguments.setMimeType(
QString());
542 d->m_bAutoDetectedMime =
false;
547 d->m_arguments = args;
552 if (d->m_url.isLocalFile()) {
554 return d->openLocalFile();
559 d->m_statJob->ui()->setWindow(
widget() ?
widget()->topLevelWidget() : 0 );
560 connect(d->m_statJob, SIGNAL(result(
KJob*)),
this, SLOT(_k_slotStatJobFinished(
KJob*)));
570 kWarning(1000) <<
"Default implementation of ReadOnlyPart::openFile called!"
571 << metaObject()->className() <<
"should reimplement either openUrl or openFile.";
575 bool ReadOnlyPartPrivate::openLocalFile()
578 emit q->started( 0 );
581 if (m_arguments.mimeType().isEmpty()) {
586 m_arguments.setMimeType(mime->
name());
587 m_bAutoDetectedMime =
true;
590 const bool ret = q->openFile();
592 emit q->setWindowCaption(m_url.prettyUrl());
600 void ReadOnlyPartPrivate::openRemoteFile()
605 QString fileName = m_url.fileName();
606 QFileInfo fileInfo(fileName);
607 QString ext = fileInfo.completeSuffix();
609 if (!ext.isEmpty() && m_url.query().isNull())
613 tempFile.setAutoRemove(
false);
615 m_file = tempFile.fileName();
622 m_job->ui()->setWindow(q->widget() ? q->widget()->topLevelWidget() : 0);
623 emit q->started(m_job);
624 QObject::connect(m_job, SIGNAL(result(
KJob*)), q, SLOT(_k_slotJobFinished(
KJob*)));
633 if ( d->m_statJob ) {
635 d->m_statJob->kill();
655 QFile::remove( d->m_file );
664 void ReadOnlyPartPrivate::_k_slotStatJobFinished(
KJob * job)
666 Q_ASSERT(job == m_statJob);
676 (void)openLocalFile();
683 void ReadOnlyPartPrivate::_k_slotJobFinished(
KJob * job )
687 assert( job == m_job );
693 if ( q->openFile() ) {
694 emit q->setWindowCaption( m_url.prettyUrl() );
696 }
else emit q->canceled(
QString());
700 void ReadOnlyPartPrivate::_k_slotGotMimeType(
KIO::Job *job,
const QString &mime)
703 Q_ASSERT(job == m_job); Q_UNUSED(job)
705 if (m_arguments.mimeType().isEmpty()) {
706 m_arguments.setMimeType(mime);
707 m_bAutoDetectedMime =
true;
717 if (!d->m_url.isEmpty())
732 d->m_arguments = args;
734 return doOpenStream( mimeType );
739 return doWriteStream( data );
744 return doCloseStream();
749 return findChild<KParts::BrowserExtension *>();
755 d->m_arguments = arguments;
756 d->m_bAutoDetectedMime = arguments.
mimeType().isEmpty();
762 return d->m_arguments;
769 :
ReadOnlyPart( *new ReadWritePartPrivate(this), parent )
786 d->m_bReadWrite = readwrite;
793 kDebug(1000) <<
"setModified(" << (modified ?
"true" :
"false") <<
")";
794 if ( !d->m_bReadWrite && modified )
796 kError(1000) <<
"Can't set a read-only document to 'modified' !" << endl;
799 d->m_bModified = modified;
815 if (docName.isEmpty()) docName =
i18n(
"Untitled" );
818 if(!parentWidget) parentWidget=QApplication::activeWindow();
821 i18n(
"The document \"%1\" has been modified.\n"
822 "Do you want to save your changes or discard them?" , docName ),
825 bool abortClose=
false;
833 if (d->m_url.isEmpty())
845 }
else if (abortClose)
return false;
876 if ( d->m_file.isEmpty() )
891 kError(1000) <<
"saveAs: Malformed URL " << kurl.
url() << endl;
894 d->m_duringSaveAs =
true;
895 d->m_originalURL = d->m_url;
896 d->m_originalFilePath = d->m_file;
899 bool result =
save();
903 d->m_url = d->m_originalURL;
904 d->m_file = d->m_originalFilePath;
905 d->m_duringSaveAs =
false;
906 d->m_originalURL =
KUrl();
907 d->m_originalFilePath.clear();
914 void ReadWritePartPrivate::prepareSaving()
917 if ( m_url.isLocalFile() )
921 QFile::remove( m_file );
924 m_file = m_url.toLocalFile();
929 if ( m_file.isEmpty() || !m_bTemp )
932 tempFile.setAutoRemove(
false);
934 m_file = tempFile.fileName();
945 if ( d->m_url.isLocalFile() )
950 assert( !d->m_bTemp );
952 d->m_duringSaveAs =
false;
953 d->m_originalURL =
KUrl();
954 d->m_originalFilePath.clear();
961 QFile::remove(d->m_uploadJob->srcUrl().toLocalFile());
962 d->m_uploadJob->kill();
967 QString uploadFile = tempFile->fileName();
970 uploadUrl.
setPath( uploadFile );
972 if (::
link(QFile::encodeName(d->m_file), QFile::encodeName(uploadFile)) != 0)
978 d->m_uploadJob->ui()->setWindow(
widget() ?
widget()->topLevelWidget() : 0 );
979 connect( d->m_uploadJob, SIGNAL(result(
KJob*)),
this, SLOT(_k_slotUploadFinished(
KJob*)) );
984 void ReadWritePartPrivate::_k_slotUploadFinished(
KJob * )
988 if (m_uploadJob->error())
990 QFile::remove(m_uploadJob->srcUrl().toLocalFile());
991 QString error = m_uploadJob->errorString();
993 if (m_duringSaveAs) {
994 m_url = m_originalURL;
995 m_file = m_originalFilePath;
997 emit q->canceled( error );
1001 KUrl dirUrl( m_url );
1002 dirUrl.setPath( dirUrl.directory() );
1003 ::org::kde::KDirNotify::emitFilesAdded( dirUrl.url() );
1006 q->setModified(
false );
1007 emit q->completed();
1010 m_duringSaveAs =
false;
1011 m_originalURL =
KUrl();
1012 m_originalFilePath.clear();
1013 if (m_waitForSave) {
1022 return d->m_bReadWrite;
1029 return d->m_bModified;
1036 if (!d->m_uploadJob)
1039 d->m_waitForSave =
true;
1041 d->m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
1043 d->m_waitForSave =
false;
1050 class KParts::OpenUrlArgumentsPrivate :
public QSharedData
1053 OpenUrlArgumentsPrivate()
1055 actionRequestedByUser(true),
1062 bool actionRequestedByUser;
1070 : d(new OpenUrlArgumentsPrivate)
1141 return d->actionRequestedByUser;
1146 d->actionRequestedByUser = userRequested;