You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kio/kfile/kfilemetapreview.cpp

197 lines
5.7 KiB

/*
* This file is part of the KDE project.
* Copyright (C) 2003 Carsten Pfeiffer <pfeiffer@kde.org>
*
* 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 <tqlayout.h>
#include <kio/previewjob.h>
#include <klibloader.h>
#include <kimagefilepreview.h>
#include <kmimetype.h>
bool KFileMetaPreview::s_tryAudioPreview = true;
KFileMetaPreview::KFileMetaPreview( TQWidget *parent, const char *name )
: KPreviewWidgetBase( parent, name ),
haveAudioPreview( false )
{
TQHBoxLayout *layout = new TQHBoxLayout( this, 0, 0 );
m_stack = new TQWidgetStack( 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() );
TQStringList mimeTypes = imagePreview->supportedMimeTypes();
TQStringList::ConstIterator it = mimeTypes.begin();
for ( ; it != mimeTypes.end(); ++it )
{
// tqDebug(".... %s", (*it).latin1());
m_previewProviders.insert( *it, imagePreview );
}
}
KPreviewWidgetBase * KFileMetaPreview::previewProviderFor( const TQString& mimeType )
{
// tqDebug("### 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;
//tqDebug("#### 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 );
TQStringList mimeTypes = audioPreview->supportedMimeTypes();
TQStringList::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
TQString 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
TQVariant textProperty = mimeInfo->property( "X-KDE-text" );
if ( textProperty.isValid() && textProperty.type() == TQVariant::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 TQString& mimeType,
KPreviewWidgetBase *provider )
{
m_previewProviders.insert( mimeType, provider );
}
void KFileMetaPreview::clearPreviewProviders()
{
TQDictIterator<KPreviewWidgetBase> it( m_previewProviders );
for ( ; it.current(); ++it )
m_stack->removeWidget( it.current() );
m_previewProviders.clear();
}
// static
KPreviewWidgetBase * KFileMetaPreview::createAudioPreview( TQWidget *parent )
{
KLibFactory *factory = KLibLoader::self()->factory( "kfileaudiopreview" );
if ( !factory )
{
s_tryAudioPreview = false;
return 0L;
}
return dynamic_cast<KPreviewWidgetBase*>( factory->create( TQT_TQOBJECT(parent), "kfileaudiopreview" ));
}
void KFileMetaPreview::virtual_hook( int, void* ) {}
#include "kfilemetapreview.moc"