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 *, const QStringList & )
00054 {
00055 return new KHTMLImage( parentWidget, widgetName, parent, name );
00056 }
00057
00058 KHTMLImage::KHTMLImage( QWidget *parentWidget, const char *widgetName,
00059 QObject *parent, const char *name )
00060 : KParts::ReadOnlyPart( parent, name ), m_image( 0 )
00061 {
00062 setInstance( KHTMLImageFactory::instance() );
00063
00064 QVBox *box = new QVBox( parentWidget, widgetName );
00065
00066 m_khtml = new KHTMLPart( box, widgetName, this, "htmlimagepart", KHTMLPart::BrowserViewGUI );
00067 m_khtml->setAutoloadImages( true );
00068 m_khtml->widget()->installEventFilter(this);
00069
00070 setWidget( box );
00071
00072
00073 box->setFocusProxy( m_khtml->widget() );
00074
00075 m_ext = new KHTMLImageBrowserExtension( this, "be" );
00076
00077
00078 KAction *encodingAction = actionCollection()->action( "setEncoding" );
00079 if ( encodingAction )
00080 {
00081 encodingAction->unplugAll();
00082 delete encodingAction;
00083 }
00084 KAction *viewSourceAction= actionCollection()->action( "viewDocumentSource" );
00085 if ( viewSourceAction )
00086 {
00087 viewSourceAction->unplugAll();
00088 delete viewSourceAction;
00089 }
00090
00091 KAction *selectAllAction= actionCollection()->action( "selectAll" );
00092 if ( selectAllAction )
00093 {
00094 selectAllAction->unplugAll();
00095 delete selectAllAction;
00096 }
00097
00098
00099 connect(m_khtml->browserExtension(), SIGNAL(openURLRequestDelayed(const KURL &, const KParts::URLArgs &)),
00100 m_ext, SIGNAL(openURLRequestDelayed(const KURL &, const KParts::URLArgs &)));
00101
00102 connect( m_khtml->browserExtension(), SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &,
00103 const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t) ), m_ext, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &,
00104 const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t) ) );
00105
00106 connect( m_khtml->browserExtension(), SIGNAL( enableAction( const char *, bool ) ),
00107 m_ext, SIGNAL( enableAction( const char *, bool ) ) );
00108
00109 m_ext->setURLDropHandlingEnabled( true );
00110 }
00111
00112 KHTMLImage::~KHTMLImage()
00113 {
00114 disposeImage();
00115
00116
00117
00118
00119
00120
00121
00122
00123 if ( m_khtml )
00124 delete static_cast<KHTMLPart *>( m_khtml );
00125 }
00126
00127 bool KHTMLImage::openURL( const KURL &url )
00128 {
00129 static const QString &html = KGlobal::staticQString( "<html><body><img src=\"%1\"></body></html>" );
00130
00131 disposeImage();
00132
00133 m_url = url;
00134
00135 emit started( 0 );
00136
00137 KParts::URLArgs args = m_ext->urlArgs();
00138 m_mimeType = args.serviceType;
00139
00140 emit setWindowCaption( url.prettyURL() );
00141
00142 m_khtml->begin( m_url, args.xOffset, args.yOffset );
00143 m_khtml->setAutoloadImages( true );
00144
00145 DOM::DocumentImpl *impl = dynamic_cast<DOM::DocumentImpl *>( m_khtml->document().handle() );
00146 if ( impl && m_ext->urlArgs().reload )
00147 impl->docLoader()->setCachePolicy( KIO::CC_Refresh );
00148
00149 khtml::DocLoader *dl = impl ? impl->docLoader() : 0;
00150 m_image = dl->requestImage( m_url.url() );
00151 if ( m_image )
00152 m_image->ref( this );
00153
00154 m_khtml->write( html.arg( m_url.url() ) );
00155 m_khtml->end();
00156
00157
00158
00159
00160
00161 return true;
00162 }
00163
00164 bool KHTMLImage::closeURL()
00165 {
00166 disposeImage();
00167 return m_khtml->closeURL();
00168 }
00169
00170 void KHTMLImage::notifyFinished( khtml::CachedObject *o )
00171 {
00172 if ( !m_image || o != m_image )
00173 return;
00174
00175 const QPixmap &pix = m_image->pixmap();
00176 QString caption;
00177
00178 KMimeType::Ptr mimeType;
00179 if ( !m_mimeType.isEmpty() )
00180 mimeType = KMimeType::mimeType( m_mimeType );
00181
00182 if ( mimeType )
00183 caption = i18n( "%1 - %2x%3 Pixels" ).arg( mimeType->comment() )
00184 .arg( pix.width() ).arg( pix.height() );
00185 else
00186 caption = i18n( "Image - %1x%2 Pixels" ).arg( pix.width() ).arg( pix.height() );
00187
00188 emit setWindowCaption( caption );
00189 emit completed();
00190 emit setStatusBarText(i18n("Done."));
00191 }
00192
00193 void KHTMLImage::guiActivateEvent( KParts::GUIActivateEvent *e )
00194 {
00195
00196
00197
00198 if ( e->activated() )
00199 return;
00200 KParts::ReadOnlyPart::guiActivateEvent(e);
00201 }
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
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 void KHTMLImage::disposeImage()
00267 {
00268 if ( !m_image )
00269 return;
00270
00271 m_image->deref( this );
00272 m_image = 0;
00273 }
00274
00275 bool KHTMLImage::eventFilter(QObject *, QEvent *e) {
00276 switch (e->type()) {
00277 case QEvent::DragEnter:
00278 case QEvent::DragMove:
00279 case QEvent::DragLeave:
00280 case QEvent::Drop:
00281
00282
00283 return QApplication::sendEvent(widget(), e);
00284 default: ;
00285 }
00286 return false;
00287 }
00288
00289 KHTMLImageBrowserExtension::KHTMLImageBrowserExtension( KHTMLImage *parent, const char *name )
00290 : KParts::BrowserExtension( parent, name )
00291 {
00292 m_imgPart = parent;
00293 }
00294
00295 int KHTMLImageBrowserExtension::xOffset()
00296 {
00297 return m_imgPart->doc()->view()->contentsX();
00298 }
00299
00300 int KHTMLImageBrowserExtension::yOffset()
00301 {
00302 return m_imgPart->doc()->view()->contentsY();
00303 }
00304
00305 void KHTMLImageBrowserExtension::print()
00306 {
00307 static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->print();
00308 }
00309
00310 void KHTMLImageBrowserExtension::reparseConfiguration()
00311 {
00312 static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->reparseConfiguration();
00313 m_imgPart->doc()->setAutoloadImages( true );
00314 }
00315
00316 using namespace KParts;
00317
00318
00319
00320
00321 #include "khtmlimage.moc"