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 )
494 #ifndef KDE_NO_DEPRECATED
503 #ifndef KDE_NO_DEPRECATED
516 d->m_showProgressInfo = show;
523 return d->m_showProgressInfo;
526 #ifndef KDE_NO_COMPAT
531 d->m_showProgressInfo = show;
539 if ( !url.isValid() )
541 if (d->m_bAutoDetectedMime) {
542 d->m_arguments.setMimeType(
QString());
543 d->m_bAutoDetectedMime =
false;
548 d->m_arguments = args;
553 if (d->m_url.isLocalFile()) {
554 d->m_file = d->m_url.toLocalFile();
555 return d->openLocalFile();
560 d->m_statJob->ui()->setWindow(
widget() ?
widget()->topLevelWidget() : 0 );
561 connect(d->m_statJob, SIGNAL(result(
KJob*)),
this, SLOT(_k_slotStatJobFinished(
KJob*)));
571 kWarning(1000) <<
"Default implementation of ReadOnlyPart::openFile called!"
572 << metaObject()->className() <<
"should reimplement either openUrl or openFile.";
576 bool ReadOnlyPartPrivate::openLocalFile()
579 emit q->started( 0 );
582 if (m_arguments.mimeType().isEmpty()) {
587 m_arguments.setMimeType(mime->
name());
588 m_bAutoDetectedMime =
true;
591 const bool ret = q->openFile();
593 emit q->setWindowCaption(m_url.prettyUrl());
601 void ReadOnlyPartPrivate::openRemoteFile()
606 QString fileName = m_url.fileName();
607 QFileInfo fileInfo(fileName);
608 QString ext = fileInfo.completeSuffix();
610 if (!ext.isEmpty() && m_url.query().isNull())
614 tempFile.setAutoRemove(
false);
616 m_file = tempFile.fileName();
623 m_job->ui()->setWindow(q->widget() ? q->widget()->topLevelWidget() : 0);
624 emit q->started(m_job);
625 QObject::connect(m_job, SIGNAL(result(
KJob*)), q, SLOT(_k_slotJobFinished(
KJob*)));
634 if ( d->m_statJob ) {
636 d->m_statJob->kill();
656 QFile::remove( d->m_file );
665 void ReadOnlyPartPrivate::_k_slotStatJobFinished(
KJob * job)
667 Q_ASSERT(job == m_statJob);
677 (void)openLocalFile();
684 void ReadOnlyPartPrivate::_k_slotJobFinished(
KJob * job )
688 assert( job == m_job );
694 if ( q->openFile() ) {
695 emit q->setWindowCaption( m_url.prettyUrl() );
697 }
else emit q->canceled(
QString());
701 void ReadOnlyPartPrivate::_k_slotGotMimeType(
KIO::Job *job,
const QString &mime)
704 Q_ASSERT(job == m_job); Q_UNUSED(job)
706 if (m_arguments.mimeType().isEmpty()) {
707 m_arguments.setMimeType(mime);
708 m_bAutoDetectedMime =
true;
718 if (!d->m_url.isEmpty())
733 d->m_arguments = args;
735 return doOpenStream( mimeType );
740 return doWriteStream( data );
745 return doCloseStream();
750 return findChild<KParts::BrowserExtension *>();
756 d->m_arguments = arguments;
757 d->m_bAutoDetectedMime = arguments.
mimeType().isEmpty();
763 return d->m_arguments;
770 :
ReadOnlyPart( *new ReadWritePartPrivate(this), parent )
787 d->m_bReadWrite = readwrite;
794 kDebug(1000) <<
"setModified(" << (modified ?
"true" :
"false") <<
")";
795 if ( !d->m_bReadWrite && modified )
797 kError(1000) <<
"Can't set a read-only document to 'modified' !" << endl;
800 d->m_bModified = modified;
816 if (docName.isEmpty()) docName =
i18n(
"Untitled" );
819 if(!parentWidget) parentWidget=QApplication::activeWindow();
822 i18n(
"The document \"%1\" has been modified.\n"
823 "Do you want to save your changes or discard them?" , docName ),
826 bool abortClose=
false;
834 if (d->m_url.isEmpty())
846 }
else if (abortClose)
return false;
877 if ( d->m_file.isEmpty() )
892 kError(1000) <<
"saveAs: Malformed URL " << kurl.
url() << endl;
895 d->m_duringSaveAs =
true;
896 d->m_originalURL = d->m_url;
897 d->m_originalFilePath = d->m_file;
900 bool result =
save();
905 d->m_url = d->m_originalURL;
906 d->m_file = d->m_originalFilePath;
907 d->m_duringSaveAs =
false;
908 d->m_originalURL =
KUrl();
909 d->m_originalFilePath.clear();
916 void ReadWritePartPrivate::prepareSaving()
919 if ( m_url.isLocalFile() )
923 QFile::remove( m_file );
926 m_file = m_url.toLocalFile();
931 if ( m_file.isEmpty() || !m_bTemp )
934 tempFile.setAutoRemove(
false);
936 m_file = tempFile.fileName();
947 if ( d->m_url.isLocalFile() )
952 assert( !d->m_bTemp );
954 d->m_duringSaveAs =
false;
955 d->m_originalURL =
KUrl();
956 d->m_originalFilePath.clear();
963 QFile::remove(d->m_uploadJob->srcUrl().toLocalFile());
964 d->m_uploadJob->kill();
969 QString uploadFile = tempFile->fileName();
972 uploadUrl.
setPath( uploadFile );
974 if (::
link(QFile::encodeName(d->m_file), QFile::encodeName(uploadFile)) != 0)
980 d->m_uploadJob->ui()->setWindow(
widget() ?
widget()->topLevelWidget() : 0 );
981 connect( d->m_uploadJob, SIGNAL(result(
KJob*)),
this, SLOT(_k_slotUploadFinished(
KJob*)) );
986 void ReadWritePartPrivate::_k_slotUploadFinished(
KJob * )
990 if (m_uploadJob->error())
992 QFile::remove(m_uploadJob->srcUrl().toLocalFile());
993 QString error = m_uploadJob->errorString();
995 if (m_duringSaveAs) {
996 q->setUrl(m_originalURL);
997 m_file = m_originalFilePath;
999 emit q->canceled( error );
1003 KUrl dirUrl( m_url );
1004 dirUrl.setPath( dirUrl.directory() );
1005 ::org::kde::KDirNotify::emitFilesAdded( dirUrl.url() );
1008 q->setModified(
false );
1009 emit q->completed();
1012 m_duringSaveAs =
false;
1013 m_originalURL =
KUrl();
1014 m_originalFilePath.clear();
1015 if (m_waitForSave) {
1024 return d->m_bReadWrite;
1031 return d->m_bModified;
1038 if (!d->m_uploadJob)
1041 d->m_waitForSave =
true;
1043 d->m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
1045 d->m_waitForSave =
false;
1052 class KParts::OpenUrlArgumentsPrivate :
public QSharedData
1055 OpenUrlArgumentsPrivate()
1057 actionRequestedByUser(true),
1064 bool actionRequestedByUser;
1072 : d(new OpenUrlArgumentsPrivate)
1143 return d->actionRequestedByUser;
1148 d->actionRequestedByUser = userRequested;