• Skip to content
  • Skip to link menu
KDE 4.1 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KHTML

khtmlimage.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE project
00002    Copyright (C) 2000 Simon Hausmann <hausmann@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017    Boston, MA 02110-1301, USA.
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 
00030 #include <QtCore/QTimer>
00031 
00032 #include <kjobuidelegate.h>
00033 #include <kio/job.h>
00034 #include <kcomponentdata.h>
00035 #include <kmimetype.h>
00036 #include <klocale.h>
00037 #include <kvbox.h>
00038 #include <kactioncollection.h>
00039 
00040 // Export init_khtmlimagefactory. This way we don't have to export the whole class
00041 // just for khtmlimagepart. See khtmlimage_init.cpp
00042 K_EXPORT_COMPONENT_FACTORY(khtmlimagepart, KHTMLImageFactory)
00043 
00044 KComponentData *KHTMLImageFactory::s_componentData = 0;
00045 
00046 KHTMLImageFactory::KHTMLImageFactory()
00047 {
00048     s_componentData = new KComponentData( "khtmlimage" );
00049 }
00050 
00051 KHTMLImageFactory::~KHTMLImageFactory()
00052 {
00053     delete s_componentData;
00054 }
00055 
00056 KParts::Part *KHTMLImageFactory::createPartObject( QWidget *parentWidget,
00057                                                    QObject *parent,
00058                                                    const char *className, const QStringList &args )
00059 {
00060   KHTMLPart::GUIProfile prof = KHTMLPart::DefaultGUI;
00061     if ( strcmp( className, "Browser/View" ) == 0 ) // old hack
00062         prof = KHTMLPart::BrowserViewGUI;
00063     if (args.contains("Browser/View"))
00064         prof = KHTMLPart::BrowserViewGUI;
00065   return new KHTMLImage( parentWidget, parent, prof );
00066 }
00067 
00068 KHTMLImage::KHTMLImage( QWidget *parentWidget,
00069                         QObject *parent, KHTMLPart::GUIProfile prof )
00070     : KParts::ReadOnlyPart( parent ), m_image( 0 )
00071 {
00072     KHTMLPart* parentPart = qobject_cast<KHTMLPart*>( parent );
00073     setComponentData( KHTMLImageFactory::componentData(), prof == KHTMLPart::BrowserViewGUI && !parentPart );
00074 
00075     KVBox *box = new KVBox( parentWidget );
00076     box->setAcceptDrops( true );
00077 
00078     m_khtml = new KHTMLPart( box, this, prof );
00079     m_khtml->setAutoloadImages( true );
00080 
00081     connect( m_khtml->view(), SIGNAL( finishedLayout() ), this, SLOT( restoreScrollPosition() ) );
00082 
00083     setWidget( box );
00084 
00085     // VBox can't take focus, so pass it on to sub-widget
00086     box->setFocusProxy( m_khtml->widget() );
00087 
00088     m_ext = new KHTMLImageBrowserExtension( this );
00089     m_ext->setObjectName( "be" );
00090 
00091     // Remove unnecessary actions.
00092     delete actionCollection()->action( "setEncoding" );
00093     delete actionCollection()->action( "viewDocumentSource" );
00094     delete actionCollection()->action( "selectAll" );
00095 
00096     // forward important signals from the khtml part
00097 
00098     // forward opening requests to parent frame (if existing)
00099     KHTMLPart *p = qobject_cast<KHTMLPart*>(parent);
00100     KParts::BrowserExtension *be = p ? p->browserExtension() : m_ext;
00101     connect(m_khtml->browserExtension(), SIGNAL(openUrlRequestDelayed(const KUrl &, const KParts::OpenUrlArguments&, const KParts::BrowserArguments &)),
00102             be, SIGNAL(openUrlRequestDelayed(const KUrl &, const KParts::OpenUrlArguments&, const KParts::BrowserArguments &)));
00103 
00104     connect(m_khtml->browserExtension(), SIGNAL(popupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)),
00105             this, SLOT(slotPopupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)));
00106 
00107     connect( m_khtml->browserExtension(), SIGNAL( enableAction( const char *, bool ) ),
00108              m_ext, SIGNAL( enableAction( const char *, bool ) ) );
00109 
00110     m_ext->setURLDropHandlingEnabled( true );
00111 }
00112 
00113 KHTMLImage::~KHTMLImage()
00114 {
00115     disposeImage();
00116 
00117     // important: delete the html part before the part or qobject destructor runs.
00118     // we now delete the htmlpart which deletes the part's widget which makes
00119     // _OUR_ m_widget 0 which in turn avoids our part destructor to delete the
00120     // widget ;-)
00121     // ### additional note: it _can_ be that the part has been deleted before:
00122     // when we're in a html frameset and the view dies first, then it will also
00123     // kill the htmlpart
00124     if ( m_khtml )
00125         delete static_cast<KHTMLPart *>( m_khtml );
00126 }
00127 
00128 bool KHTMLImage::openUrl( const KUrl &url )
00129 {
00130     static const QString &html = KGlobal::staticQString( "<html><body><img src=\"%1\"></body></html>" );
00131 
00132     disposeImage();
00133 
00134     setUrl(url);
00135 
00136     emit started( 0 );
00137 
00138     KParts::OpenUrlArguments args = arguments();
00139     m_mimeType = args.mimeType();
00140 
00141     emit setWindowCaption( url.prettyUrl() );
00142 
00143     // Need to keep a copy of the offsets since they are cleared when emitting completed
00144     m_xOffset = args.xOffset();
00145     m_yOffset = args.yOffset();
00146 
00147     m_khtml->begin( this->url() );
00148     m_khtml->setAutoloadImages( true );
00149 
00150     DOM::DocumentImpl *impl = dynamic_cast<DOM::DocumentImpl *>( m_khtml->document().handle() ); // ### hack ;-)
00151     if (!impl) return false;
00152 
00153     if ( arguments().reload() )
00154         impl->docLoader()->setCachePolicy( KIO::CC_Reload );
00155 
00156     khtml::DocLoader *dl = impl->docLoader();
00157     m_image = dl->requestImage( this->url().url() );
00158     if ( m_image )
00159         m_image->ref( this );
00160 
00161     m_khtml->write( html.arg( this->url().url() ) );
00162     m_khtml->end();
00163 
00164     /*
00165     connect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
00166             this, SLOT( updateWindowCaption() ) );
00167             */
00168     return true;
00169 }
00170 
00171 bool KHTMLImage::closeUrl()
00172 {
00173     disposeImage();
00174     return m_khtml->closeUrl();
00175 }
00176 
00177 // This can happen after openUrl returns, or directly from m_image->ref()
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, KMimeType::ResolveAliases);
00189 
00190     if ( mimeType ) {
00191         if (m_image && !m_image->suggestedTitle().isEmpty()) {
00192             caption = i18n( "%1 (%2 - %3x%4 Pixels)", m_image->suggestedTitle(), mimeType->comment(), m_image->pixmap_size().width(), m_image->pixmap_size().height() );
00193         } else {
00194             caption = i18n( "%1 - %2x%3 Pixels" ,  mimeType->comment() ,
00195                   m_image->pixmap_size().width() ,  m_image->pixmap_size().height() );
00196         }
00197     } else {
00198         if (m_image && !m_image->suggestedTitle().isEmpty()) {
00199             caption = i18n( "%1 (%2x%3 Pixels)" , m_image->suggestedTitle(),  m_image->pixmap_size().width() ,  m_image->pixmap_size().height() );
00200         } else {
00201             caption = i18n( "Image - %1x%2 Pixels" ,  m_image->pixmap_size().width() ,  m_image->pixmap_size().height() );
00202         }
00203     }
00204 
00205     emit setWindowCaption( caption );
00206     emit completed();
00207     emit setStatusBarText(i18n("Done."));
00208 }
00209 
00210 void KHTMLImage::restoreScrollPosition()
00211 {
00212     if ( m_khtml->view()->contentsY() == 0 ) {
00213         m_khtml->view()->setContentsPos( m_xOffset, m_yOffset );
00214     }
00215 }
00216 
00217 void KHTMLImage::guiActivateEvent( KParts::GUIActivateEvent *e )
00218 {
00219     // prevent the base implementation from emitting setWindowCaption with
00220     // our url. It destroys our pretty, previously caption. Konq saves/restores
00221     // the caption for us anyway.
00222     if ( e->activated() )
00223         return;
00224     KParts::ReadOnlyPart::guiActivateEvent(e);
00225 }
00226 
00227 /*
00228 void KHTMLImage::slotImageJobFinished( KIO::Job *job )
00229 {
00230     if ( job->error() )
00231     {
00232         job->uiDelegate()->showErrorMessage();
00233         emit canceled( job->errorString() );
00234     }
00235     else
00236     {
00237         emit completed();
00238         QTimer::singleShot( 0, this, SLOT( updateWindowCaption() ) );
00239     }
00240 }
00241 
00242 void KHTMLImage::updateWindowCaption()
00243 {
00244     if ( !m_khtml )
00245         return;
00246 
00247     DOM::HTMLDocumentImpl *impl = dynamic_cast<DOM::HTMLDocumentImpl *>( m_khtml->document().handle() );
00248     if ( !impl )
00249         return;
00250 
00251     DOM::HTMLElementImpl *body = impl->body();
00252     if ( !body )
00253         return;
00254 
00255     DOM::NodeImpl *image = body->firstChild();
00256     if ( !image )
00257         return;
00258 
00259     khtml::RenderImage *renderImage = dynamic_cast<khtml::RenderImage *>( image->renderer() );
00260     if ( !renderImage )
00261         return;
00262 
00263     QPixmap pix = renderImage->pixmap();
00264 
00265     QString caption;
00266 
00267     KMimeType::Ptr mimeType;
00268     if ( !m_mimeType.isEmpty() )
00269         mimeType = KMimeType::mimeType( m_mimeType, KMimeType::ResolveAliases );
00270 
00271     if ( mimeType )
00272         caption = i18n( "%1 - %2x%3 Pixels" ).arg( mimeType->comment() )
00273                   .arg( pix.width() ).arg( pix.height() );
00274     else
00275         caption = i18n( "Image - %1x%2 Pixels" ).arg( pix.width() ).arg( pix.height() );
00276 
00277     emit setWindowCaption( caption );
00278     emit completed();
00279     emit setStatusBarText(i18n("Done."));
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 KHTMLImageBrowserExtension::KHTMLImageBrowserExtension( KHTMLImage *parent )
00293     : KParts::BrowserExtension( parent )
00294 {
00295     m_imgPart = parent;
00296 }
00297 
00298 int KHTMLImageBrowserExtension::xOffset()
00299 {
00300     return m_imgPart->doc()->view()->contentsX();
00301 }
00302 
00303 int KHTMLImageBrowserExtension::yOffset()
00304 {
00305     return m_imgPart->doc()->view()->contentsY();
00306 }
00307 
00308 void KHTMLImageBrowserExtension::print()
00309 {
00310     static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->print();
00311 }
00312 
00313 void KHTMLImageBrowserExtension::reparseConfiguration()
00314 {
00315     static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->reparseConfiguration();
00316     m_imgPart->doc()->setAutoloadImages( true );
00317 }
00318 
00319 
00320 void KHTMLImageBrowserExtension::disableScrolling()
00321 {
00322     static_cast<KHTMLPartBrowserExtension *>( m_imgPart->doc()->browserExtension() )->disableScrolling();
00323 }
00324 
00325 void KHTMLImage::slotPopupMenu( const QPoint &global, const KUrl &url, mode_t mode,
00326                                 const KParts::OpenUrlArguments &origArgs,
00327                                 const KParts::BrowserArguments &browserArgs,
00328                                 KParts::BrowserExtension::PopupFlags flags,
00329                                 const KParts::BrowserExtension::ActionGroupMap& actionGroups )
00330 {
00331     KParts::OpenUrlArguments args = origArgs;
00332     args.setMimeType(m_mimeType);
00333     m_ext->popupMenu(global, url, mode, args, browserArgs, flags, actionGroups);
00334 }
00335 
00336 #include "khtmlimage.moc"

KHTML

Skip menu "KHTML"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • KIO
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal