00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "khtmlimage.h"
00021
#include "khtmlview.h"
00022
#include "khtml_ext.h"
00023
#include "xml/dom_docimpl.h"
00024
#include "html/html_documentimpl.h"
00025
#include "html/html_elementimpl.h"
00026
#include "rendering/render_image.h"
00027
#include "misc/loader.h"
00028
00029
#include <qvbox.h>
00030
#include <qtimer.h>
00031
00032
#include <kio/job.h>
00033
#include <kinstance.h>
00034
#include <kmimetype.h>
00035
#include <klocale.h>
00036
00037 K_EXPORT_COMPONENT_FACTORY( khtmlimagefactory , KHTMLImageFactory )
00038
00039
KInstance *KHTMLImageFactory::s_instance = 0;
00040
00041 KHTMLImageFactory::KHTMLImageFactory()
00042 {
00043 s_instance =
new KInstance(
"khtmlimage" );
00044 }
00045
00046 KHTMLImageFactory::~KHTMLImageFactory()
00047 {
00048
delete s_instance;
00049 }
00050
00051
KParts::Part *KHTMLImageFactory::createPartObject(
QWidget *parentWidget,
const char *widgetName,
00052
QObject *parent,
const char *name,
00053
const char *className,
const QStringList & )
00054 {
00055 KHTMLPart::GUIProfile prof = KHTMLPart::DefaultGUI;
00056
if ( strcmp( className,
"Browser/View" ) == 0 )
00057 prof = KHTMLPart::BrowserViewGUI;
00058
return new KHTMLImage( parentWidget, widgetName, parent, name, prof );
00059 }
00060
00061 KHTMLImage::KHTMLImage(
QWidget *parentWidget,
const char *widgetName,
00062
QObject *parent,
const char *name, KHTMLPart::GUIProfile prof )
00063 : KParts::ReadOnlyPart( parent,
name ), m_image( 0 )
00064 {
00065
KHTMLPart* parentPart = ::qt_cast<KHTMLPart *>( parent );
00066 setInstance( KHTMLImageFactory::instance(), prof == KHTMLPart::BrowserViewGUI && !parentPart );
00067
00068
QVBox *box =
new QVBox( parentWidget, widgetName );
00069
00070 m_khtml =
new KHTMLPart( box, widgetName,
this,
"htmlimagepart", prof );
00071 m_khtml->setAutoloadImages(
true );
00072 m_khtml->widget()->installEventFilter(
this);
00073
00074 setWidget( box );
00075
00076
00077 box->setFocusProxy( m_khtml->widget() );
00078
00079 m_ext =
new KHTMLImageBrowserExtension(
this,
"be" );
00080
00081
00082
KAction *encodingAction = actionCollection()->action(
"setEncoding" );
00083
if ( encodingAction )
00084 {
00085 encodingAction->
unplugAll();
00086
delete encodingAction;
00087 }
00088
KAction *viewSourceAction= actionCollection()->action(
"viewDocumentSource" );
00089
if ( viewSourceAction )
00090 {
00091 viewSourceAction->
unplugAll();
00092
delete viewSourceAction;
00093 }
00094
00095
KAction *selectAllAction= actionCollection()->action(
"selectAll" );
00096
if ( selectAllAction )
00097 {
00098 selectAllAction->
unplugAll();
00099
delete selectAllAction;
00100 }
00101
00102
00103
00104
00105 KHTMLPart *p = ::qt_cast<KHTMLPart *>(parent);
00106
KParts::BrowserExtension *be = p ? p->
browserExtension() : m_ext;
00107 connect(m_khtml->browserExtension(), SIGNAL(openURLRequestDelayed(
const KURL &,
const KParts::URLArgs &)),
00108 be, SIGNAL(openURLRequestDelayed(
const KURL &,
const KParts::URLArgs &)));
00109
00110 connect( m_khtml->browserExtension(), SIGNAL( popupMenu(
KXMLGUIClient *,
const QPoint &,
const KURL &,
00111
const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t) ), m_ext, SIGNAL( popupMenu(
KXMLGUIClient *,
const QPoint &,
const KURL &,
00112
const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t) ) );
00113
00114 connect( m_khtml->browserExtension(), SIGNAL( enableAction(
const char *,
bool ) ),
00115 m_ext, SIGNAL( enableAction(
const char *,
bool ) ) );
00116
00117 m_ext->setURLDropHandlingEnabled(
true );
00118 }
00119
00120 KHTMLImage::~KHTMLImage()
00121 {
00122 disposeImage();
00123
00124
00125
00126
00127
00128
00129
00130
00131
if ( m_khtml )
00132
delete static_cast<KHTMLPart *>( m_khtml );
00133 }
00134
00135
bool KHTMLImage::openURL(
const KURL &url )
00136 {
00137
static const QString &html =
KGlobal::staticQString(
"<html><body><img src=\"%1\"></body></html>" );
00138
00139 disposeImage();
00140
00141 m_url = url;
00142
00143 emit started( 0 );
00144
00145
KParts::URLArgs args = m_ext->urlArgs();
00146 m_mimeType = args.
serviceType;
00147
00148 emit setWindowCaption( url.prettyURL() );
00149
00150 m_khtml->begin( m_url, args.
xOffset, args.
yOffset );
00151 m_khtml->setAutoloadImages(
true );
00152
00153 DOM::DocumentImpl *impl = dynamic_cast<DOM::DocumentImpl *>( m_khtml->document().handle() );
00154
if ( impl && m_ext->urlArgs().reload )
00155 impl->docLoader()->setCachePolicy( KIO::CC_Reload );
00156
00157 khtml::DocLoader *dl = impl ? impl->docLoader() : 0;
00158 m_image = dl->requestImage( m_url.url() );
00159
if ( m_image )
00160 m_image->ref(
this );
00161
00162 m_khtml->write( html.arg( m_url.url() ) );
00163 m_khtml->end();
00164
00165
00166
00167
00168
00169
return true;
00170 }
00171
00172
bool KHTMLImage::closeURL()
00173 {
00174 disposeImage();
00175
return m_khtml->closeURL();
00176 }
00177
00178
void KHTMLImage::notifyFinished( khtml::CachedObject *o )
00179 {
00180
if ( !m_image || o != m_image )
00181
return;
00182
00183
const QPixmap &pix = m_image->pixmap();
00184
QString caption;
00185
00186
KMimeType::Ptr mimeType;
00187
if ( !m_mimeType.isEmpty() )
00188 mimeType =
KMimeType::mimeType( m_mimeType );
00189
00190
if ( mimeType ) {
00191
if (m_image && !m_image->suggestedTitle().isEmpty()) {
00192 caption = i18n(
"%1 (%2 - %3x%4 Pixels)" ).arg( m_image->suggestedTitle(), mimeType->comment() ).arg( pix.width() ).arg( pix.height() );
00193 }
else {
00194 caption = i18n(
"%1 - %2x%3 Pixels" ).arg( mimeType->comment() )
00195 .arg( pix.width() ).arg( pix.height() );
00196 }
00197 }
else {
00198
if (m_image && !m_image->suggestedTitle().isEmpty()) {
00199 caption = i18n(
"%1 (%2x%3 Pixels)" ).arg(m_image->suggestedTitle()).arg( pix.width() ).arg( pix.height() );
00200 }
else {
00201 caption = i18n(
"Image - %1x%2 Pixels" ).arg( pix.width() ).arg( pix.height() );
00202 }
00203 }
00204
00205 emit setWindowCaption( caption );
00206 emit completed();
00207 emit setStatusBarText(i18n(
"Done."));
00208 }
00209
00210
void KHTMLImage::guiActivateEvent(
KParts::GUIActivateEvent *e )
00211 {
00212
00213
00214
00215
if ( e->
activated() )
00216
return;
00217
KParts::ReadOnlyPart::guiActivateEvent(e);
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
void KHTMLImage::disposeImage()
00284 {
00285
if ( !m_image )
00286
return;
00287
00288 m_image->deref(
this );
00289 m_image = 0;
00290 }
00291
00292
bool KHTMLImage::eventFilter(
QObject *,
QEvent *e) {
00293
switch (e->type()) {
00294
case QEvent::DragEnter:
00295
case QEvent::DragMove:
00296
case QEvent::DragLeave:
00297
case QEvent::Drop: {
00298
00299
00300 KHTMLPart *p = ::qt_cast<KHTMLPart *>(parent());
00301
if (p)
00302
return QApplication::sendEvent(p->
widget(), e);
00303
00304
00305
return QApplication::sendEvent(widget(), e);
00306 }
00307
default: ;
00308 }
00309
return false;
00310 }
00311
00312 KHTMLImageBrowserExtension::KHTMLImageBrowserExtension( KHTMLImage *parent,
const char *name )
00313 : KParts::BrowserExtension( parent,
name )
00314 {
00315 m_imgPart = parent;
00316 }
00317
00318
int KHTMLImageBrowserExtension::xOffset()
00319 {
00320
return m_imgPart->doc()->view()->contentsX();
00321 }
00322
00323
int KHTMLImageBrowserExtension::yOffset()
00324 {
00325
return m_imgPart->doc()->view()->contentsY();
00326 }
00327
00328
void KHTMLImageBrowserExtension::print()
00329 {
00330 static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->print();
00331 }
00332
00333
void KHTMLImageBrowserExtension::reparseConfiguration()
00334 {
00335 static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->reparseConfiguration();
00336 m_imgPart->doc()->setAutoloadImages(
true );
00337 }
00338
00339
using namespace KParts;
00340
00341
00342
00343
00344
#include "khtmlimage.moc"