summaryrefslogtreecommitdiffstats
path: root/kio/kfile/kfilemetapreview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kio/kfile/kfilemetapreview.cpp')
-rw-r--r--kio/kfile/kfilemetapreview.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/kio/kfile/kfilemetapreview.cpp b/kio/kfile/kfilemetapreview.cpp
new file mode 100644
index 000000000..4d5ec339b
--- /dev/null
+++ b/kio/kfile/kfilemetapreview.cpp
@@ -0,0 +1,196 @@
+/*
+ * This file is part of the KDE project.
+ * Copyright (C) 2003 Carsten Pfeiffer <[email protected]>
+ *
+ * You can Freely distribute this program under the GNU Library General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#include "kfilemetapreview.h"
+
+#include <qlayout.h>
+
+#include <kio/previewjob.h>
+#include <klibloader.h>
+#include <kimagefilepreview.h>
+#include <kmimetype.h>
+
+bool KFileMetaPreview::s_tryAudioPreview = true;
+
+KFileMetaPreview::KFileMetaPreview( QWidget *parent, const char *name )
+ : KPreviewWidgetBase( parent, name ),
+ haveAudioPreview( false )
+{
+ QHBoxLayout *layout = new QHBoxLayout( this, 0, 0 );
+ m_stack = new QWidgetStack( this );
+ layout->addWidget( m_stack );
+
+ // ###
+// m_previewProviders.setAutoDelete( true );
+ initPreviewProviders();
+}
+
+KFileMetaPreview::~KFileMetaPreview()
+{
+}
+
+void KFileMetaPreview::initPreviewProviders()
+{
+ m_previewProviders.clear();
+ // hardcoded so far
+
+ // image previews
+ KImageFilePreview *imagePreview = new KImageFilePreview( m_stack );
+ (void) m_stack->addWidget( imagePreview );
+ m_stack->raiseWidget( imagePreview );
+ resize( imagePreview->sizeHint() );
+
+ QStringList mimeTypes = imagePreview->supportedMimeTypes();
+ QStringList::ConstIterator it = mimeTypes.begin();
+ for ( ; it != mimeTypes.end(); ++it )
+ {
+// qDebug(".... %s", (*it).latin1());
+ m_previewProviders.insert( *it, imagePreview );
+ }
+}
+
+KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const QString& mimeType )
+{
+// qDebug("### looking for: %s", mimeType.latin1());
+ // often the first highlighted item, where we can be sure, there is no plugin
+ // (this "folders reflect icons" is a konq-specific thing, right?)
+ if ( mimeType == "inode/directory" )
+ return 0L;
+
+ KPreviewWidgetBase *provider = m_previewProviders.find( mimeType );
+ if ( provider )
+ return provider;
+
+//qDebug("#### didn't find anything for: %s", mimeType.latin1());
+
+ if ( s_tryAudioPreview &&
+ !mimeType.startsWith("text/") && !mimeType.startsWith("image/") )
+ {
+ if ( !haveAudioPreview )
+ {
+ KPreviewWidgetBase *audioPreview = createAudioPreview( m_stack );
+ if ( audioPreview )
+ {
+ haveAudioPreview = true;
+ (void) m_stack->addWidget( audioPreview );
+ QStringList mimeTypes = audioPreview->supportedMimeTypes();
+ QStringList::ConstIterator it = mimeTypes.begin();
+ for ( ; it != mimeTypes.end(); ++it )
+ m_previewProviders.insert( *it, audioPreview );
+ }
+ }
+ }
+
+ // with the new mimetypes from the audio-preview, try again
+ provider = m_previewProviders.find( mimeType );
+ if ( provider )
+ return provider;
+
+ // ### mimetype may be image/* for example, try that
+ int index = mimeType.find( '/' );
+ if ( index > 0 )
+ {
+ provider = m_previewProviders.find( mimeType.left( index + 1 ) + "*" );
+ if ( provider )
+ return provider;
+ }
+
+ KMimeType::Ptr mimeInfo = KMimeType::mimeType( mimeType );
+ if ( mimeInfo )
+ {
+ // check mime type inheritance
+ QString parentMimeType = mimeInfo->parentMimeType();
+ while ( !parentMimeType.isEmpty() )
+ {
+ provider = m_previewProviders.find( parentMimeType );
+ if ( provider )
+ return provider;
+
+ KMimeType::Ptr parentMimeInfo = KMimeType::mimeType( parentMimeType );
+ if ( !parentMimeInfo ) break;
+
+ parentMimeType = parentMimeInfo->parentMimeType();
+ }
+
+ // check X-KDE-Text property
+ QVariant textProperty = mimeInfo->property( "X-KDE-text" );
+ if ( textProperty.isValid() && textProperty.type() == QVariant::Bool )
+ {
+ if ( textProperty.toBool() )
+ {
+ provider = m_previewProviders.find( "text/plain" );
+ if ( provider )
+ return provider;
+
+ provider = m_previewProviders.find( "text/*" );
+ if ( provider )
+ return provider;
+ }
+ }
+ }
+
+ return 0L;
+}
+
+void KFileMetaPreview::showPreview(const KURL &url)
+{
+ KMimeType::Ptr mt = KMimeType::findByURL( url );
+ KPreviewWidgetBase *provider = previewProviderFor( mt->name() );
+ if ( provider )
+ {
+ if ( provider != m_stack->visibleWidget() ) // stop the previous preview
+ clearPreview();
+
+ m_stack->setEnabled( true );
+ m_stack->raiseWidget( provider );
+ provider->showPreview( url );
+ }
+ else
+ {
+ clearPreview();
+ m_stack->setEnabled( false );
+ }
+}
+
+void KFileMetaPreview::clearPreview()
+{
+ if ( m_stack->visibleWidget() )
+ static_cast<KPreviewWidgetBase*>( m_stack->visibleWidget() )->clearPreview();
+}
+
+void KFileMetaPreview::addPreviewProvider( const QString& mimeType,
+ KPreviewWidgetBase *provider )
+{
+ m_previewProviders.insert( mimeType, provider );
+}
+
+void KFileMetaPreview::clearPreviewProviders()
+{
+ QDictIterator<KPreviewWidgetBase> it( m_previewProviders );
+ for ( ; it.current(); ++it )
+ m_stack->removeWidget( it.current() );
+
+ m_previewProviders.clear();
+}
+
+// static
+KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( QWidget *parent )
+{
+ KLibFactory *factory = KLibLoader::self()->factory( "kfileaudiopreview" );
+ if ( !factory )
+ {
+ s_tryAudioPreview = false;
+ return 0L;
+ }
+
+ return dynamic_cast<KPreviewWidgetBase*>( factory->create( parent, "kfileaudiopreview" ));
+}
+
+void KFileMetaPreview::virtual_hook( int, void* ) {}
+
+#include "kfilemetapreview.moc"