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