00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include <qbitmap.h>
00021
00022
#include <kapplication.h>
00023
#include <kiconloader.h>
00024
#include <kmimetype.h>
00025
#include <kprotocolinfo.h>
00026
00027
#include "konq_pixmapprovider.h"
00028
00029 KonqPixmapProvider * KonqPixmapProvider::s_self = 0L;
00030
00031 KonqPixmapProvider * KonqPixmapProvider::self()
00032 {
00033
if ( !s_self )
00034 s_self =
new KonqPixmapProvider( kapp,
"KonqPixmapProvider" );
00035
00036
return s_self;
00037 }
00038
00039 KonqPixmapProvider::KonqPixmapProvider( QObject *parent,
const char *name )
00040 : KPixmapProvider(),
00041
KonqFavIconMgr( parent, name )
00042 {
00043 }
00044
00045 KonqPixmapProvider::~KonqPixmapProvider()
00046 {
00047 s_self = 0L;
00048 }
00049
00050
00051
00052
00053
00054 QPixmap KonqPixmapProvider::pixmapFor(
const QString& url,
int size )
00055 {
00056 QMapIterator<QString,QString> it = iconMap.find( url );
00057 QString icon;
00058
if ( it != iconMap.end() ) {
00059 icon = it.data();
00060
if ( !icon.isEmpty() )
00061
return loadIcon( url, icon, size );
00062 }
00063
00064
if ( url.isEmpty() ) {
00065
00066 icon = KMimeType::mimeType(
"inode/directory" )->KServiceType::icon();
00067 }
00068
else
00069 {
00070 KURL u;
00071
if ( url.at(0) ==
'/' )
00072 u.setPath( url );
00073
else
00074 u = url;
00075
00076 icon = KMimeType::iconForURL( u );
00077 }
00078
00079 Q_ASSERT( !icon.isEmpty() );
00080
00081
00082 iconMap.insert( url, icon );
00083
00084
return loadIcon( url, icon, size );
00085 }
00086
00087
00088
void KonqPixmapProvider::load( KConfig *kc,
const QString& key )
00089 {
00090 iconMap.clear();
00091 QStringList list;
00092 list = kc->readListEntry( key );
00093 QStringList::Iterator it = list.begin();
00094 QString url, icon;
00095
while ( it != list.end() ) {
00096 url = (*it);
00097
if ( ++it == list.end() )
00098
break;
00099 icon = (*it);
00100 iconMap.insert( url, icon );
00101
00102 ++it;
00103 }
00104 }
00105
00106
00107
00108
void KonqPixmapProvider::save( KConfig *kc,
const QString& key,
00109
const QStringList& items )
00110 {
00111 QStringList list;
00112 QStringList::ConstIterator it = items.begin();
00113 QMapConstIterator<QString,QString> mit;
00114
while ( it != items.end() ) {
00115 mit = iconMap.find( *it );
00116
if ( mit != iconMap.end() ) {
00117 list.append( mit.key() );
00118 list.append( mit.data() );
00119 }
00120
00121 ++it;
00122 }
00123 kc->writeEntry( key, list );
00124 }
00125
00126
void KonqPixmapProvider::notifyChange(
bool isHost, QString hostOrURL,
00127 QString iconName )
00128 {
00129
for ( QMapIterator<QString,QString> it = iconMap.begin();
00130 it != iconMap.end();
00131 ++it )
00132 {
00133 KURL url( it.key() );
00134
if ( url.protocol().startsWith(
"http") &&
00135 ( ( isHost && url.host() == hostOrURL ) ||
00136 ( url.host() + url.path() == hostOrURL ) ) )
00137 {
00138
00139
00140 QString icon = isHost ? KMimeType::favIconForURL( url ) : iconName;
00141
if ( !icon.isEmpty() )
00142 *it = icon;
00143 }
00144 }
00145
00146 emit changed();
00147 }
00148
00149
void KonqPixmapProvider::clear()
00150 {
00151 iconMap.clear();
00152 }
00153
00154 QPixmap KonqPixmapProvider::loadIcon(
const QString& url,
const QString& icon,
00155
int size )
00156 {
00157
if ( size <= KIcon::SizeSmall )
00158
return SmallIcon( icon, size );
00159
00160 KURL u;
00161
if ( url.at(0) ==
'/' )
00162 u.setPath( url );
00163
else
00164 u = url;
00165
00166 QPixmap big;
00167
00168
00169
if ( url.startsWith(
"http:/" ) && icon.startsWith(
"favicons/") ) {
00170 QPixmap small = SmallIcon( icon, size );
00171 big = KGlobal::iconLoader()->loadIcon( KProtocolInfo::icon(
"http"),
00172 KIcon::Panel, size );
00173
00174
int x = big.width() - small.width();
00175
int y = 0;
00176
00177
if ( big.mask() ) {
00178 QBitmap mask = *big.mask();
00179 bitBlt( &mask, x, y,
00180 small.mask() ? const_cast<QBitmap *>(small.mask()) : &small, 0, 0,
00181 small.width(), small.height(),
00182 small.mask() ? OrROP : SetROP );
00183 big.setMask( mask );
00184 }
00185
00186 bitBlt( &big, x, y, &small );
00187 }
00188
00189
else
00190 big = KGlobal::iconLoader()->loadIcon( icon, KIcon::Panel, size );
00191
00192
return big;
00193 }