• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

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

KIO

Skip menu "KIO"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.7
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal