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
00028 #include <qvbox.h>
00029 #include <qtimer.h>
00030
00031 #include <kio/job.h>
00032 #include <kinstance.h>
00033 #include <kmimetype.h>
00034 #include <klocale.h>
00035
00036 K_EXPORT_COMPONENT_FACTORY( khtmlimagepart, KHTMLImageFactory )
00037
00038 KInstance *KHTMLImageFactory::s_instance = 0;
00039
00040 KHTMLImageFactory::KHTMLImageFactory()
00041 {
00042 s_instance = new KInstance( "khtmlimage" );
00043 }
00044
00045 KHTMLImageFactory::~KHTMLImageFactory()
00046 {
00047 delete s_instance;
00048 }
00049
00050 KParts::Part *KHTMLImageFactory::createPartObject( QWidget *parentWidget, const char *widgetName,
00051 QObject *parent, const char *name,
00052 const char *, const QStringList & )
00053 {
00054 return new KHTMLImage( parentWidget, widgetName, parent, name );
00055 }
00056
00057 KHTMLImage::KHTMLImage( QWidget *parentWidget, const char *widgetName,
00058 QObject *parent, const char *name )
00059 : KParts::ReadOnlyPart( parent, name )
00060 {
00061 setInstance( KHTMLImageFactory::instance() );
00062
00063 QVBox *box = new QVBox( parentWidget, widgetName );
00064
00065 m_khtml = new KHTMLPart( box, widgetName, this, "htmlimagepart" );
00066 m_khtml->setAutoloadImages( true );
00067
00068 setWidget( box );
00069
00070
00071 box->setFocusProxy( m_khtml->widget() );
00072
00073 m_ext = new KHTMLImageBrowserExtension( this, "be" );
00074
00075
00076 KAction *encodingAction = actionCollection()->action( "setEncoding" );
00077 if ( encodingAction )
00078 {
00079 encodingAction->unplugAll();
00080 delete encodingAction;
00081 }
00082 KAction *viewSourceAction= actionCollection()->action( "viewDocumentSource" );
00083 if ( viewSourceAction )
00084 {
00085 viewSourceAction->unplugAll();
00086 delete viewSourceAction;
00087 }
00088
00089 KAction *selectAllAction= actionCollection()->action( "selectAll" );
00090 if ( selectAllAction )
00091 {
00092 selectAllAction->unplugAll();
00093 delete selectAllAction;
00094 }
00095
00096 connect( m_khtml->browserExtension(), SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ),
00097 m_ext, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ) );
00098
00099 connect( m_khtml->browserExtension(), SIGNAL( enableAction( const char *, bool ) ),
00100 m_ext, SIGNAL( enableAction( const char *, bool ) ) );
00101
00102 m_ext->setURLDropHandlingEnabled( true );
00103 }
00104
00105 KHTMLImage::~KHTMLImage()
00106 {
00107
00108
00109
00110
00111
00112
00113
00114 if ( m_khtml )
00115 delete static_cast<KHTMLPart *>( m_khtml );
00116 }
00117
00118 bool KHTMLImage::openURL( const KURL &url )
00119 {
00120 static const QString &html = KGlobal::staticQString( "<html><body><img src=\"%1\"></body></html>" );
00121
00122 m_url = url;
00123
00124 emit started( 0 );
00125
00126 KParts::URLArgs args = m_ext->urlArgs();
00127 m_mimeType = args.serviceType;
00128
00129 m_khtml->begin( m_url, args.xOffset, args.yOffset );
00130 m_khtml->setAutoloadImages( true );
00131
00132 DOM::DocumentImpl *impl = dynamic_cast<DOM::DocumentImpl *>( m_khtml->document().handle() );
00133 if ( impl && m_ext->urlArgs().reload )
00134 impl->docLoader()->setCachePolicy( KIO::CC_Refresh );
00135
00136 m_khtml->write( html.arg( m_url.url() ) );
00137 m_khtml->end();
00138
00139 emit setWindowCaption( url.prettyURL() );
00140
00141 connect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
00142 this, SLOT( updateWindowCaption() ) );
00143 return true;
00144 }
00145
00146 bool KHTMLImage::closeURL()
00147 {
00148 return m_khtml->closeURL();
00149 }
00150
00151 void KHTMLImage::guiActivateEvent( KParts::GUIActivateEvent *e )
00152 {
00153 if ( e->activated() )
00154 emit setWindowCaption( m_url.prettyURL() );
00155 }
00156
00157 void KHTMLImage::slotPopupMenu( KXMLGUIClient *cl, const QPoint &pos, const KURL &u,
00158 const QString &, mode_t mode )
00159 {
00160 emit m_ext->popupMenu( cl, pos, u, m_mimeType, mode );
00161 }
00162
00163 void KHTMLImage::slotImageJobFinished( KIO::Job *job )
00164 {
00165 if ( job->error() )
00166 {
00167 job->showErrorDialog();
00168 emit canceled( job->errorString() );
00169 }
00170 else
00171 {
00172 if ( m_khtml->view()->contentsY() == 0 )
00173 {
00174 KParts::URLArgs args = m_ext->urlArgs();
00175 m_khtml->view()->setContentsPos( args.xOffset, args.yOffset );
00176 }
00177
00178 emit completed();
00179
00180 QTimer::singleShot( 0, this, SLOT( updateWindowCaption() ) );
00181 }
00182 }
00183
00184 void KHTMLImage::updateWindowCaption()
00185 {
00186 if ( !m_khtml )
00187 return;
00188
00189 DOM::HTMLDocumentImpl *impl = dynamic_cast<DOM::HTMLDocumentImpl *>( m_khtml->document().handle() );
00190 if ( !impl )
00191 return;
00192
00193 DOM::HTMLElementImpl *body = impl->body();
00194 if ( !body )
00195 return;
00196
00197 DOM::NodeImpl *image = body->firstChild();
00198 if ( !image )
00199 return;
00200
00201 khtml::RenderImage *renderImage = dynamic_cast<khtml::RenderImage *>( image->renderer() );
00202 if ( !renderImage )
00203 return;
00204
00205 QPixmap pix = renderImage->pixmap();
00206
00207 QString caption;
00208
00209 KMimeType::Ptr mimeType;
00210 if ( !m_mimeType.isEmpty() )
00211 mimeType = KMimeType::mimeType( m_mimeType );
00212
00213 if ( mimeType )
00214 caption = i18n( "%1 - %2x%3 Pixels" ).arg( mimeType->comment() )
00215 .arg( pix.width() ).arg( pix.height() );
00216 else
00217 caption = i18n( "Image - %2x%3 Pixels" ).arg( pix.width() ).arg( pix.height() );
00218
00219 emit setWindowCaption( caption );
00220 emit completed();
00221 emit setStatusBarText(i18n("Done."));
00222 }
00223
00224 KHTMLImageBrowserExtension::KHTMLImageBrowserExtension( KHTMLImage *parent, const char *name )
00225 : KParts::BrowserExtension( parent, name )
00226 {
00227 m_imgPart = parent;
00228 }
00229
00230 int KHTMLImageBrowserExtension::xOffset()
00231 {
00232 return m_imgPart->doc()->view()->contentsX();
00233 }
00234
00235 int KHTMLImageBrowserExtension::yOffset()
00236 {
00237 return m_imgPart->doc()->view()->contentsY();
00238 }
00239
00240 void KHTMLImageBrowserExtension::print()
00241 {
00242 static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->print();
00243 }
00244
00245 void KHTMLImageBrowserExtension::reparseConfiguration()
00246 {
00247 static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->reparseConfiguration();
00248 m_imgPart->doc()->setAutoloadImages( true );
00249 }
00250
00251 using namespace KParts;
00252
00253
00254
00255
00256 #include "khtmlimage.moc"