diff options
Diffstat (limited to 'kparts/part.cpp')
-rw-r--r-- | kparts/part.cpp | 705 |
1 files changed, 0 insertions, 705 deletions
diff --git a/kparts/part.cpp b/kparts/part.cpp deleted file mode 100644 index b7bdc7cfa..000000000 --- a/kparts/part.cpp +++ /dev/null @@ -1,705 +0,0 @@ -/* This file is part of the KDE project - Copyright (C) 1999 Simon Hausmann <hausmann@kde.org> - (C) 1999 David Faure <faure@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include <kparts/part.h> -#include <kparts/event.h> -#include <kparts/plugin.h> -#include <kparts/mainwindow.h> -#include <kparts/partmanager.h> - -#include <tqapplication.h> -#include <tqfile.h> -#include <tqpoint.h> -#include <tqpointarray.h> -#include <tqpainter.h> -#include <tqtextstream.h> -#include <tqfileinfo.h> - -#include <kinstance.h> -#include <klocale.h> -#include <ktempfile.h> -#include <kmessagebox.h> -#include <kio/job.h> -#include <kstandarddirs.h> -#include <kfiledialog.h> -#include <kdirnotify_stub.h> - -#include <stdio.h> -#include <unistd.h> -#include <assert.h> -#include <kdebug.h> - -template class TQPtrList<KXMLGUIClient>; - -using namespace KParts; - -namespace KParts -{ - -class PartBasePrivate -{ -public: - PartBasePrivate() - { - m_pluginLoadingMode = PartBase::LoadPlugins; - } - ~PartBasePrivate() - { - } - PartBase::PluginLoadingMode m_pluginLoadingMode; -}; - -class PartPrivate -{ -public: - PartPrivate() - { - m_bSelectable = true; - } - ~PartPrivate() - { - } - - bool m_bSelectable; -}; -} - -PartBase::PartBase() -{ - d = new PartBasePrivate; - m_obj = 0L; -} - -PartBase::~PartBase() -{ - delete d; -} - -void PartBase::setPartObject( TQObject *obj ) -{ - m_obj = obj; -} - -TQObject *PartBase::partObject() const -{ - return m_obj; -} - -void PartBase::setInstance( TDEInstance *inst ) -{ - setInstance( inst, true ); -} - -void PartBase::setInstance( TDEInstance *inst, bool bLoadPlugins ) -{ - KXMLGUIClient::setInstance( inst ); - TDEGlobal::locale()->insertCatalogue( inst->instanceName() ); - // install 'instancename'data resource type - TDEGlobal::dirs()->addResourceType( inst->instanceName() + "data", - KStandardDirs::kde_default( "data" ) - + TQString::fromLatin1( inst->instanceName() ) + '/' ); - if ( bLoadPlugins ) - loadPlugins( m_obj, this, instance() ); -} - -void PartBase::loadPlugins( TQObject *parent, KXMLGUIClient *parentGUIClient, TDEInstance *instance ) -{ - if( d->m_pluginLoadingMode != DoNotLoadPlugins ) - Plugin::loadPlugins( parent, parentGUIClient, instance, d->m_pluginLoadingMode == LoadPlugins ); -} - -void PartBase::setPluginLoadingMode( PluginLoadingMode loadingMode ) -{ - d->m_pluginLoadingMode = loadingMode; -} - -Part::Part( TQObject *parent, const char* name ) - : TQObject( parent, name ) -{ - d = new PartPrivate; - m_widget = 0L; - m_manager = 0L; - PartBase::setPartObject( this ); -} - -Part::~Part() -{ - kdDebug(1000) << "Part::~Part " << this << endl; - - if ( m_widget ) - { - // We need to disconnect first, to avoid calling it ! - disconnect( m_widget, TQT_SIGNAL( destroyed() ), - this, TQT_SLOT( slotWidgetDestroyed() ) ); - } - - if ( m_manager ) - m_manager->removePart(this); - - if ( m_widget ) - { - kdDebug(1000) << "deleting widget " << m_widget << " " << m_widget->name() << endl; - delete (TQWidget*) m_widget; - } - - delete d; -} - -void Part::embed( TQWidget * parentWidget ) -{ - if ( widget() ) - widget()->reparent( parentWidget, 0, TQPoint( 0, 0 ), true ); -} - -TQWidget *Part::widget() -{ - return m_widget; -} - -void Part::setManager( PartManager *manager ) -{ - m_manager = manager; -} - -PartManager *Part::manager() const -{ - return m_manager; -} - -Part *Part::hitTest( TQWidget *widget, const TQPoint & ) -{ - if ( (TQWidget *)m_widget != widget ) - return 0L; - - return this; -} - -void Part::setWidget( TQWidget *widget ) -{ - assert ( !m_widget ); // otherwise we get two connects - m_widget = widget; - connect( m_widget, TQT_SIGNAL( destroyed() ), - this, TQT_SLOT( slotWidgetDestroyed() ) ); - - // Tell the actionCollection() which widget its - // action shortcuts should be connected to. - actionCollection()->setWidget( widget ); - - // Since KParts objects are XML-based, shortcuts should - // be connected to the widget when the XML settings - // are processed, rather than on KAction construction. - actionCollection()->setAutoConnectShortcuts( false ); -} - -void Part::setSelectable( bool selectable ) -{ - d->m_bSelectable = selectable; -} - -bool Part::isSelectable() const -{ - return d->m_bSelectable; -} - -void Part::customEvent( TQCustomEvent *event ) -{ - if ( PartActivateEvent::test( event ) ) - { - partActivateEvent( (PartActivateEvent *)event ); - return; - } - - if ( PartSelectEvent::test( event ) ) - { - partSelectEvent( (PartSelectEvent *)event ); - return; - } - - if ( GUIActivateEvent::test( event ) ) - { - guiActivateEvent( (GUIActivateEvent *)event ); - return; - } - - TQObject::customEvent( event ); -} - -void Part::partActivateEvent( PartActivateEvent * ) -{ -} - -void Part::partSelectEvent( PartSelectEvent * ) -{ -} - -void Part::guiActivateEvent( GUIActivateEvent * ) -{ -} - -TQWidget *Part::hostContainer( const TQString &containerName ) -{ - if ( !factory() ) - return 0L; - - return factory()->container( containerName, this ); -} - -void Part::slotWidgetDestroyed() -{ - kdDebug(1000) << "KPart::slotWidgetDestroyed(), deleting part " << name() << endl; - m_widget = 0; - delete this; -} - -////////////////////////////////////////////////// - -namespace KParts -{ - -class ReadOnlyPartPrivate -{ -public: - ReadOnlyPartPrivate() - { - m_job = 0L; - m_uploadJob = 0L; - m_showProgressInfo = true; - m_saveOk = false; - m_waitForSave = false; - m_duringSaveAs = false; - } - ~ReadOnlyPartPrivate() - { - } - - TDEIO::FileCopyJob * m_job; - TDEIO::FileCopyJob * m_uploadJob; - KURL m_originalURL; // for saveAs - TQString m_originalFilePath; // for saveAs - bool m_showProgressInfo : 1; - bool m_saveOk : 1; - bool m_waitForSave : 1; - bool m_duringSaveAs : 1; -}; - -} - -ReadOnlyPart::ReadOnlyPart( TQObject *parent, const char *name ) - : Part( parent, name ), m_bTemp( false ) -{ - d = new ReadOnlyPartPrivate; -} - -ReadOnlyPart::~ReadOnlyPart() -{ - ReadOnlyPart::closeURL(); - delete d; -} - -void ReadOnlyPart::setProgressInfoEnabled( bool show ) -{ - d->m_showProgressInfo = show; -} - -bool ReadOnlyPart::isProgressInfoEnabled() const -{ - return d->m_showProgressInfo; -} - -#ifndef KDE_NO_COMPAT -void ReadOnlyPart::showProgressInfo( bool show ) -{ - d->m_showProgressInfo = show; -} -#endif - -bool ReadOnlyPart::openURL( const KURL &url ) -{ - if ( !url.isValid() ) - return false; - if ( !closeURL() ) - return false; - m_url = url; - if ( m_url.isLocalFile() ) - { - emit started( 0 ); - m_file = m_url.path(); - bool ret = openFile(); - if (ret) - { - emit completed(); - emit setWindowCaption( m_url.prettyURL() ); - }; - return ret; - } - else - { - m_bTemp = true; - // Use same extension as remote file. This is important for mimetype-determination (e.g. koffice) - TQString fileName = url.fileName(); - TQFileInfo fileInfo(fileName); - TQString ext = fileInfo.extension(); - TQString extension; - if ( !ext.isEmpty() && url.query().isNull() ) // not if the URL has a query, e.g. cgi.pl?something - extension = "."+ext; // keep the '.' - KTempFile tempFile( TQString::null, extension ); - m_file = tempFile.name(); - - KURL destURL; - destURL.setPath( m_file ); - d->m_job = TDEIO::file_copy( m_url, destURL, 0600, true, false, d->m_showProgressInfo ); - d->m_job->setWindow( widget() ? widget()->topLevelWidget() : 0 ); - emit started( d->m_job ); - connect( d->m_job, TQT_SIGNAL( result( TDEIO::Job * ) ), this, TQT_SLOT( slotJobFinished ( TDEIO::Job * ) ) ); - return true; - } -} - -void ReadOnlyPart::abortLoad() -{ - if ( d->m_job ) - { - //kdDebug(1000) << "Aborting job " << d->m_job << endl; - d->m_job->kill(); - d->m_job = 0; - } -} - -bool ReadOnlyPart::closeURL() -{ - abortLoad(); //just in case - - if ( m_bTemp ) - { - unlink( TQFile::encodeName(m_file) ); - m_bTemp = false; - } - // It always succeeds for a read-only part, - // but the return value exists for reimplementations - // (e.g. pressing cancel for a modified read-write part) - return true; -} - -void ReadOnlyPart::slotJobFinished( TDEIO::Job * job ) -{ - kdDebug(1000) << "ReadOnlyPart::slotJobFinished" << endl; - assert( job == d->m_job ); - d->m_job = 0; - if (job->error()) - emit canceled( job->errorString() ); - else - { - if ( openFile() ) - emit setWindowCaption( m_url.prettyURL() ); - emit completed(); - } -} - -void ReadOnlyPart::guiActivateEvent( GUIActivateEvent * event ) -{ - if (event->activated()) - { - if (!m_url.isEmpty()) - { - kdDebug(1000) << "ReadOnlyPart::guiActivateEvent -> " << m_url.prettyURL() << endl; - emit setWindowCaption( m_url.prettyURL() ); - } else emit setWindowCaption( "" ); - } -} - -bool ReadOnlyPart::openStream( const TQString& mimeType, const KURL& url ) -{ - if ( !closeURL() ) - return false; - m_url = url; - return doOpenStream( mimeType ); -} - -bool ReadOnlyPart::writeStream( const TQByteArray& data ) -{ - return doWriteStream( data ); -} - -bool ReadOnlyPart::closeStream() -{ - return doCloseStream(); -} - -////////////////////////////////////////////////// - -ReadWritePart::ReadWritePart( TQObject *parent, const char *name ) - : ReadOnlyPart( parent, name ), m_bModified( false ), m_bClosing( false ) -{ - m_bReadWrite = true; -} - -ReadWritePart::~ReadWritePart() -{ - // parent destructor will delete temp file - // we can't call our own closeURL() here, because - // "cancel" wouldn't cancel anything. We have to assume - // the app called closeURL() before destroying us. -} - -void ReadWritePart::setReadWrite( bool readwrite ) -{ - // Perhaps we should check isModified here and issue a warning if true - m_bReadWrite = readwrite; -} - -void ReadWritePart::setModified( bool modified ) -{ - kdDebug(1000) << "ReadWritePart::setModified( " << (modified ? "true" : "false") << ")" << endl; - if ( !m_bReadWrite && modified ) - { - kdError(1000) << "Can't set a read-only document to 'modified' !" << endl; - return; - } - m_bModified = modified; -} - -void ReadWritePart::setModified() -{ - setModified( true ); -} - -bool ReadWritePart::queryClose() -{ - if ( !isReadWrite() || !isModified() ) - return true; - - TQString docName = url().fileName(); - if (docName.isEmpty()) docName = i18n( "Untitled" ); - - int res = KMessageBox::warningYesNoCancel( widget(), - i18n( "The document \"%1\" has been modified.\n" - "Do you want to save your changes or discard them?" ).arg( docName ), - i18n( "Close Document" ), KStdGuiItem::save(), KStdGuiItem::discard() ); - - bool abortClose=false; - bool handled=false; - - switch(res) { - case KMessageBox::Yes : - sigQueryClose(&handled,&abortClose); - if (!handled) - { - if (m_url.isEmpty()) - { - KURL url = KFileDialog::getSaveURL(); - if (url.isEmpty()) - return false; - - saveAs( url ); - } - else - { - save(); - } - } else if (abortClose) return false; - return waitSaveComplete(); - case KMessageBox::No : - return true; - default : // case KMessageBox::Cancel : - return false; - } -} - -bool ReadWritePart::closeURL() -{ - abortLoad(); //just in case - if ( isReadWrite() && isModified() ) - { - if (!queryClose()) - return false; - } - // Not modified => ok and delete temp file. - return ReadOnlyPart::closeURL(); -} - -bool ReadWritePart::closeURL( bool promptToSave ) -{ - return promptToSave ? closeURL() : ReadOnlyPart::closeURL(); -} - -bool ReadWritePart::save() -{ - d->m_saveOk = false; - if ( m_file.isEmpty() ) // document was created empty - prepareSaving(); - if( saveFile() ) - return saveToURL(); - else - emit canceled(TQString::null); - return false; -} - -bool ReadWritePart::saveAs( const KURL & kurl ) -{ - if (!kurl.isValid()) - { - kdError(1000) << "saveAs: Malformed URL " << kurl.url() << endl; - return false; - } - d->m_duringSaveAs = true; - d->m_originalURL = m_url; - d->m_originalFilePath = m_file; - m_url = kurl; // Store where to upload in saveToURL - prepareSaving(); - bool result = save(); // Save local file and upload local file - if (result) - emit setWindowCaption( m_url.prettyURL() ); - else - { - m_url = d->m_originalURL; - m_file = d->m_originalFilePath; - d->m_duringSaveAs = false; - d->m_originalURL = KURL(); - d->m_originalFilePath = TQString::null; - } - - return result; -} - -// Set m_file correctly for m_url -void ReadWritePart::prepareSaving() -{ - // Local file - if ( m_url.isLocalFile() ) - { - if ( m_bTemp ) // get rid of a possible temp file first - { // (happens if previous url was remote) - unlink( TQFile::encodeName(m_file) ); - m_bTemp = false; - } - m_file = m_url.path(); - } - else - { // Remote file - // We haven't saved yet, or we did but locally - provide a temp file - if ( m_file.isEmpty() || !m_bTemp ) - { - KTempFile tempFile; - m_file = tempFile.name(); - m_bTemp = true; - } - // otherwise, we already had a temp file - } -} - -bool ReadWritePart::saveToURL() -{ - if ( m_url.isLocalFile() ) - { - setModified( false ); - emit completed(); - // if m_url is a local file there won't be a temp file -> nothing to remove - assert( !m_bTemp ); - d->m_saveOk = true; - d->m_duringSaveAs = false; - d->m_originalURL = KURL(); - d->m_originalFilePath = TQString::null; - return true; // Nothing to do - } - else - { - if (d->m_uploadJob) - { - unlink(TQFile::encodeName(d->m_uploadJob->srcURL().path())); - d->m_uploadJob->kill(); - d->m_uploadJob = 0; - } - KTempFile tempFile; - TQString uploadFile = tempFile.name(); - KURL uploadUrl; - uploadUrl.setPath( uploadFile ); - tempFile.unlink(); - // Create hardlink - if (::link(TQFile::encodeName(m_file), TQFile::encodeName(uploadFile)) != 0) - { - // Uh oh, some error happened. - return false; - } - d->m_uploadJob = TDEIO::file_move( uploadUrl, m_url, -1, true /*overwrite*/ ); - d->m_uploadJob->setWindow( widget() ? widget()->topLevelWidget() : 0 ); - connect( d->m_uploadJob, TQT_SIGNAL( result( TDEIO::Job * ) ), this, TQT_SLOT( slotUploadFinished (TDEIO::Job *) ) ); - return true; - } -} - -void ReadWritePart::slotUploadFinished( TDEIO::Job * ) -{ - if (d->m_uploadJob->error()) - { - unlink(TQFile::encodeName(d->m_uploadJob->srcURL().path())); - TQString error = d->m_uploadJob->errorString(); - d->m_uploadJob = 0; - if (d->m_duringSaveAs) { - m_url = d->m_originalURL; - m_file = d->m_originalFilePath; - } - emit canceled( error ); - } - else - { - KDirNotify_stub allDirNotify("*", "KDirNotify*"); - KURL dirUrl( m_url ); - dirUrl.setPath( dirUrl.directory() ); - allDirNotify.FilesAdded( dirUrl ); - - d->m_uploadJob = 0; - setModified( false ); - emit completed(); - d->m_saveOk = true; - } - d->m_duringSaveAs = false; - d->m_originalURL = KURL(); - d->m_originalFilePath = TQString::null; - if (d->m_waitForSave) - { - tqApp->exit_loop(); - } -} - -// Trolls: Nothing to see here, please step away. -void tqt_enter_modal( TQWidget *widget ); -void tqt_leave_modal( TQWidget *widget ); - -bool ReadWritePart::waitSaveComplete() -{ - if (!d->m_uploadJob) - return d->m_saveOk; - - d->m_waitForSave = true; - - TQWidget dummy(0,0,(WFlags)(WType_Dialog | WShowModal)); - dummy.setFocusPolicy( TQ_NoFocus ); - tqt_enter_modal(&dummy); - tqApp->enter_loop(); - tqt_leave_modal(&dummy); - - d->m_waitForSave = false; - - return d->m_saveOk; -} - -#include "part.moc" - -// vim:sw=2:ts=8:et |