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 KURL u;
00065
if ( url.at(0) ==
'/' )
00066 u.setPath( url );
00067
else
00068 u = url;
00069
00070 icon = KMimeType::iconForURL( u );
00071
00072 Q_ASSERT( !icon.isEmpty() );
00073
00074
00075 iconMap.insert( url, icon );
00076
00077
return loadIcon( url, icon, size );
00078 }
00079
00080
00081
void KonqPixmapProvider::load( KConfig *kc,
const QString& key )
00082 {
00083 iconMap.clear();
00084 QStringList list;
00085 list = kc->readListEntry( key );
00086 QStringList::Iterator it = list.begin();
00087 QString url, icon;
00088
while ( it != list.end() ) {
00089 url = (*it);
00090
if ( ++it == list.end() )
00091
break;
00092 icon = (*it);
00093 iconMap.insert( url, icon );
00094
00095 ++it;
00096 }
00097 }
00098
00099
00100
00101
void KonqPixmapProvider::save( KConfig *kc,
const QString& key,
00102
const QStringList& items )
00103 {
00104 QStringList list;
00105 QStringList::ConstIterator it = items.begin();
00106 QMapConstIterator<QString,QString> mit;
00107
while ( it != items.end() ) {
00108 mit = iconMap.find( *it );
00109
if ( mit != iconMap.end() ) {
00110 list.append( mit.key() );
00111 list.append( mit.data() );
00112 }
00113
00114 ++it;
00115 }
00116 kc->writeEntry( key, list );
00117 }
00118
00119
void KonqPixmapProvider::notifyChange(
bool isHost, QString hostOrURL,
00120 QString iconName )
00121 {
00122
for ( QMapIterator<QString,QString> it = iconMap.begin();
00123 it != iconMap.end();
00124 ++it )
00125 {
00126 KURL url( it.key() );
00127
if ( url.protocol().startsWith(
"http") &&
00128 ( ( isHost && url.host() == hostOrURL ) ||
00129 ( url.host() + url.path() == hostOrURL ) ) )
00130 {
00131
00132
00133 QString icon = isHost ? KMimeType::favIconForURL( url ) : iconName;
00134
if ( !icon.isEmpty() )
00135 *it = icon;
00136 }
00137 }
00138
00139 emit changed();
00140 }
00141
00142
void KonqPixmapProvider::clear()
00143 {
00144 iconMap.clear();
00145 }
00146
00147 QPixmap KonqPixmapProvider::loadIcon(
const QString& url,
const QString& icon,
00148
int size )
00149 {
00150
if ( size <= KIcon::SizeSmall )
00151
return SmallIcon( icon, size );
00152
00153 KURL u;
00154
if ( url.at(0) ==
'/' )
00155 u.setPath( url );
00156
else
00157 u = url;
00158
00159 QPixmap big;
00160
00161
00162
if ( url.startsWith(
"http:/" ) && icon.startsWith(
"favicons/") ) {
00163 QPixmap small = SmallIcon( icon, size );
00164 big = KGlobal::iconLoader()->loadIcon( KProtocolInfo::icon(
"http"),
00165 KIcon::Panel, size );
00166
00167
int x = big.width() - small.width();
00168
int y = 0;
00169
00170
if ( big.mask() ) {
00171 QBitmap mask = *big.mask();
00172 bitBlt( &mask, x, y,
00173 small.mask() ? const_cast<QBitmap *>(small.mask()) : &small, 0, 0,
00174 small.width(), small.height(),
00175 small.mask() ? OrROP : SetROP );
00176 big.setMask( mask );
00177 }
00178
00179 bitBlt( &big, x, y, &small );
00180 }
00181
00182
else
00183 big = KGlobal::iconLoader()->loadIcon( icon, KIcon::Panel, size );
00184
00185
return big;
00186 }