kfilemetapreview.cpp
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 <tqlayout.h> 00012 00013 #include <kio/previewjob.h> 00014 #include <klibloader.h> 00015 #include <kimagefilepreview.h> 00016 #include <kmimetype.h> 00017 00018 bool KFileMetaPreview::s_tryAudioPreview = true; 00019 00020 KFileMetaPreview::KFileMetaPreview( TQWidget *parent, const char *name ) 00021 : KPreviewWidgetBase( parent, name ), 00022 haveAudioPreview( false ) 00023 { 00024 TQHBoxLayout *layout = new TQHBoxLayout( this, 0, 0 ); 00025 m_stack = new TQWidgetStack( this ); 00026 layout->addWidget( m_stack ); 00027 00028 // ### 00029 // m_previewProviders.setAutoDelete( true ); 00030 initPreviewProviders(); 00031 } 00032 00033 KFileMetaPreview::~KFileMetaPreview() 00034 { 00035 } 00036 00037 void KFileMetaPreview::initPreviewProviders() 00038 { 00039 m_previewProviders.clear(); 00040 // hardcoded so far 00041 00042 // image previews 00043 KImageFilePreview *imagePreview = new KImageFilePreview( m_stack ); 00044 (void) m_stack->addWidget( imagePreview ); 00045 m_stack->raiseWidget( imagePreview ); 00046 resize( imagePreview->sizeHint() ); 00047 00048 TQStringList mimeTypes = imagePreview->supportedMimeTypes(); 00049 TQStringList::ConstIterator it = mimeTypes.begin(); 00050 for ( ; it != mimeTypes.end(); ++it ) 00051 { 00052 // qDebug(".... %s", (*it).latin1()); 00053 m_previewProviders.insert( *it, imagePreview ); 00054 } 00055 } 00056 00057 KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const TQString& mimeType ) 00058 { 00059 // qDebug("### looking for: %s", mimeType.latin1()); 00060 // often the first highlighted item, where we can be sure, there is no plugin 00061 // (this "folders reflect icons" is a konq-specific thing, right?) 00062 if ( mimeType == "inode/directory" ) 00063 return 0L; 00064 00065 KPreviewWidgetBase *provider = m_previewProviders.find( mimeType ); 00066 if ( provider ) 00067 return provider; 00068 00069 //qDebug("#### didn't find anything for: %s", mimeType.latin1()); 00070 00071 if ( s_tryAudioPreview && 00072 !mimeType.startsWith("text/") && !mimeType.startsWith("image/") ) 00073 { 00074 if ( !haveAudioPreview ) 00075 { 00076 KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack ); 00077 if ( audioPreview ) 00078 { 00079 haveAudioPreview = true; 00080 (void) m_stack->addWidget( audioPreview ); 00081 TQStringList mimeTypes = audioPreview->supportedMimeTypes(); 00082 TQStringList::ConstIterator it = mimeTypes.begin(); 00083 for ( ; it != mimeTypes.end(); ++it ) 00084 m_previewProviders.insert( *it, audioPreview ); 00085 } 00086 } 00087 } 00088 00089 // with the new mimetypes from the audio-preview, try again 00090 provider = m_previewProviders.find( mimeType ); 00091 if ( provider ) 00092 return provider; 00093 00094 // ### mimetype may be image/* for example, try that 00095 int index = mimeType.find( '/' ); 00096 if ( index > 0 ) 00097 { 00098 provider = m_previewProviders.find( mimeType.left( index + 1 ) + "*" ); 00099 if ( provider ) 00100 return provider; 00101 } 00102 00103 KMimeType::Ptr mimeInfo = KMimeType::mimeType( mimeType ); 00104 if ( mimeInfo ) 00105 { 00106 // check mime type inheritance 00107 TQString parentMimeType = mimeInfo->parentMimeType(); 00108 while ( !parentMimeType.isEmpty() ) 00109 { 00110 provider = m_previewProviders.find( parentMimeType ); 00111 if ( provider ) 00112 return provider; 00113 00114 KMimeType::Ptr parentMimeInfo = KMimeType::mimeType( parentMimeType ); 00115 if ( !parentMimeInfo ) break; 00116 00117 parentMimeType = parentMimeInfo->parentMimeType(); 00118 } 00119 00120 // check X-KDE-Text property 00121 TQVariant textProperty = mimeInfo->property( "X-KDE-text" ); 00122 if ( textProperty.isValid() && textProperty.type() == TQVariant::Bool ) 00123 { 00124 if ( textProperty.toBool() ) 00125 { 00126 provider = m_previewProviders.find( "text/plain" ); 00127 if ( provider ) 00128 return provider; 00129 00130 provider = m_previewProviders.find( "text/*" ); 00131 if ( provider ) 00132 return provider; 00133 } 00134 } 00135 } 00136 00137 return 0L; 00138 } 00139 00140 void KFileMetaPreview::showPreview(const KURL &url) 00141 { 00142 KMimeType::Ptr mt = KMimeType::findByURL( url ); 00143 KPreviewWidgetBase *provider = previewProviderFor( mt->name() ); 00144 if ( provider ) 00145 { 00146 if ( provider != m_stack->visibleWidget() ) // stop the previous preview 00147 clearPreview(); 00148 00149 m_stack->setEnabled( true ); 00150 m_stack->raiseWidget( provider ); 00151 provider->showPreview( url ); 00152 } 00153 else 00154 { 00155 clearPreview(); 00156 m_stack->setEnabled( false ); 00157 } 00158 } 00159 00160 void KFileMetaPreview::clearPreview() 00161 { 00162 if ( m_stack->visibleWidget() ) 00163 static_cast<KPreviewWidgetBase*>( m_stack->visibleWidget() )->clearPreview(); 00164 } 00165 00166 void KFileMetaPreview::addPreviewProvider( const TQString& mimeType, 00167 KPreviewWidgetBase *provider ) 00168 { 00169 m_previewProviders.insert( mimeType, provider ); 00170 } 00171 00172 void KFileMetaPreview::clearPreviewProviders() 00173 { 00174 TQDictIterator<KPreviewWidgetBase> it( m_previewProviders ); 00175 for ( ; it.current(); ++it ) 00176 m_stack->removeWidget( it.current() ); 00177 00178 m_previewProviders.clear(); 00179 } 00180 00181 // static 00182 KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( TQWidget *parent ) 00183 { 00184 KLibFactory *factory = KLibLoader::self()->factory( "kfileaudiopreview" ); 00185 if ( !factory ) 00186 { 00187 s_tryAudioPreview = false; 00188 return 0L; 00189 } 00190 00191 return dynamic_cast<KPreviewWidgetBase*>( factory->create( TQT_TQOBJECT(parent), "kfileaudiopreview" )); 00192 } 00193 00194 void KFileMetaPreview::virtual_hook( int, void* ) {} 00195 00196 #include "kfilemetapreview.moc"