KIO
kfilemetapreview.cpp
Go to the documentation of this file.00001 /* 00002 * This file is part of the KDE project. 00003 * Copyright (C) 2003 Carsten Pfeiffer <pfeiffer@kde.org> 00004 * 00005 * You can Freely distribute this program under the GNU Library General Public 00006 * License. See the file "COPYING" for the exact licensing terms. 00007 */ 00008 00009 #include "kfilemetapreview.h" 00010 00011 #include <QtGui/QLayout> 00012 00013 #include <kio/previewjob.h> 00014 #include <kpluginloader.h> 00015 #include <kpluginfactory.h> 00016 #include <kimagefilepreview.h> 00017 #include <kmimetype.h> 00018 00019 bool KFileMetaPreview::s_tryAudioPreview = true; 00020 00021 KFileMetaPreview::KFileMetaPreview( QWidget *parent ) 00022 : KPreviewWidgetBase( parent ), 00023 haveAudioPreview( false ) 00024 { 00025 QHBoxLayout *layout = new QHBoxLayout( this ); 00026 layout->setMargin( 0 ); 00027 layout->setSpacing( 0 ); 00028 m_stack = new QStackedWidget( this ); 00029 layout->addWidget( m_stack ); 00030 00031 // ### 00032 // m_previewProviders.setAutoDelete( true ); 00033 initPreviewProviders(); 00034 } 00035 00036 KFileMetaPreview::~KFileMetaPreview() 00037 { 00038 } 00039 00040 void KFileMetaPreview::initPreviewProviders() 00041 { 00042 qDeleteAll(m_previewProviders); 00043 m_previewProviders.clear(); 00044 // hardcoded so far 00045 00046 // image previews 00047 KImageFilePreview *imagePreview = new KImageFilePreview( m_stack ); 00048 (void) m_stack->addWidget( imagePreview ); 00049 m_stack->setCurrentWidget ( imagePreview ); 00050 resize( imagePreview->sizeHint() ); 00051 00052 const QStringList mimeTypes = imagePreview->supportedMimeTypes(); 00053 QStringList::ConstIterator it = mimeTypes.begin(); 00054 for ( ; it != mimeTypes.end(); ++it ) 00055 { 00056 // qDebug(".... %s", (*it).toLatin1().constData()); 00057 m_previewProviders.insert( *it, imagePreview ); 00058 } 00059 } 00060 00061 KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const QString& mimeType ) 00062 { 00063 // qDebug("### looking for: %s", mimeType.toLatin1().constData()); 00064 // often the first highlighted item, where we can be sure, there is no plugin 00065 // (this "folders reflect icons" is a konq-specific thing, right?) 00066 if ( mimeType == "inode/directory" ) 00067 return 0L; 00068 00069 KPreviewWidgetBase *provider = m_previewProviders.value( mimeType ); 00070 if ( provider ) 00071 return provider; 00072 00073 //qDebug("#### didn't find anything for: %s", mimeType.toLatin1().constData()); 00074 00075 if ( s_tryAudioPreview && 00076 !mimeType.startsWith("text/") && !mimeType.startsWith("image/") ) 00077 { 00078 if ( !haveAudioPreview ) 00079 { 00080 KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack ); 00081 if ( audioPreview ) 00082 { 00083 haveAudioPreview = true; 00084 (void) m_stack->addWidget( audioPreview ); 00085 const QStringList mimeTypes = audioPreview->supportedMimeTypes(); 00086 QStringList::ConstIterator it = mimeTypes.begin(); 00087 for ( ; it != mimeTypes.end(); ++it ) 00088 m_previewProviders.insert( *it, audioPreview ); 00089 } 00090 } 00091 } 00092 00093 // with the new mimetypes from the audio-preview, try again 00094 provider = m_previewProviders.value( mimeType ); 00095 if ( provider ) 00096 return provider; 00097 00098 // ### mimetype may be image/* for example, try that 00099 int index = mimeType.indexOf( '/' ); 00100 if ( index > 0 ) 00101 { 00102 provider = m_previewProviders.value( mimeType.left( index + 1 ) + '*' ); 00103 if ( provider ) 00104 return provider; 00105 } 00106 00107 KMimeType::Ptr mimeInfo = KMimeType::mimeType( mimeType ); 00108 if ( mimeInfo ) { 00109 // check mime type inheritance 00110 const QStringList parentMimeTypes = mimeInfo->allParentMimeTypes(); 00111 Q_FOREACH(const QString& parentMimeType, parentMimeTypes) { 00112 provider = m_previewProviders.value( parentMimeType ); 00113 if ( provider ) 00114 return provider; 00115 } 00116 } 00117 // The logic in this code duplicates the logic in PreviewJob. 00118 // But why do we need multiple KPreviewWidgetBase instances anyway? 00119 00120 return 0L; 00121 } 00122 00123 void KFileMetaPreview::showPreview(const KUrl &url) 00124 { 00125 KMimeType::Ptr mt = KMimeType::findByUrl( url ); 00126 KPreviewWidgetBase *provider = previewProviderFor( mt->name() ); 00127 if ( provider ) 00128 { 00129 if ( provider != m_stack->currentWidget() ) // stop the previous preview 00130 clearPreview(); 00131 00132 m_stack->setEnabled( true ); 00133 m_stack->setCurrentWidget( provider ); 00134 provider->showPreview( url ); 00135 } 00136 else 00137 { 00138 clearPreview(); 00139 m_stack->setEnabled( false ); 00140 } 00141 } 00142 00143 void KFileMetaPreview::clearPreview() 00144 { 00145 if ( m_stack->currentWidget() ) 00146 static_cast<KPreviewWidgetBase*>( m_stack->currentWidget() )->clearPreview(); 00147 } 00148 00149 void KFileMetaPreview::addPreviewProvider( const QString& mimeType, 00150 KPreviewWidgetBase *provider ) 00151 { 00152 m_previewProviders.insert( mimeType, provider ); 00153 } 00154 00155 00156 void KFileMetaPreview::clearPreviewProviders() 00157 { 00158 QHash<QString, KPreviewWidgetBase*>::const_iterator i = m_previewProviders.constBegin(); 00159 while (i != m_previewProviders.constEnd()) 00160 { 00161 m_stack->removeWidget(i.value()); 00162 ++i; 00163 } 00164 qDeleteAll(m_previewProviders); 00165 m_previewProviders.clear(); 00166 } 00167 00168 // static 00169 KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent ) 00170 { 00171 KPluginFactory *factory = KPluginLoader( "kfileaudiopreview" ).factory(); 00172 if ( !factory ) 00173 { 00174 s_tryAudioPreview = false; 00175 return 0L; 00176 } 00177 KPreviewWidgetBase* w = factory->create<KPreviewWidgetBase>( parent ); 00178 if ( w ) 00179 w->setObjectName( "kfileaudiopreview" ); 00180 return w; 00181 } 00182 00183 #include "kfilemetapreview.moc"