diff options
Diffstat (limited to 'tdehtml/tdehtml_ext.cpp')
-rw-r--r-- | tdehtml/tdehtml_ext.cpp | 1032 |
1 files changed, 1032 insertions, 0 deletions
diff --git a/tdehtml/tdehtml_ext.cpp b/tdehtml/tdehtml_ext.cpp new file mode 100644 index 000000000..62a5293c1 --- /dev/null +++ b/tdehtml/tdehtml_ext.cpp @@ -0,0 +1,1032 @@ +// -*- c-basic-offset: 2 -*- +/* This file is part of the KDE project + * + * Copyright (C) 2000-2003 Simon Hausmann <hausmann@kde.org> + * 2001-2003 George Staikos <staikos@kde.org> + * 2001-2003 Laurent Montel <montel@kde.org> + * 2001-2003 Dirk Mueller <mueller@kde.org> + * 2001-2003 Waldo Bastian <bastian@kde.org> + * 2001-2003 David Faure <faure@kde.org> + * 2001-2003 Daniel Naber <dnaber@kde.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <assert.h> +#include "tdehtml_ext.h" +#include "tdehtmlview.h" +#include "tdehtml_pagecache.h" +#include "rendering/render_form.h" +#include "rendering/render_image.h" +#include "html/html_imageimpl.h" +#include "misc/loader.h" +#include "dom/html_form.h" +#include "dom/html_image.h" +#include <tqclipboard.h> +#include <tqfileinfo.h> +#include <tqpopupmenu.h> +#include <tqurl.h> +#include <tqmetaobject.h> +#include <tqucomextra_p.h> +#include <tqdragobject.h> + +#include <kdebug.h> +#include <klocale.h> +#include <kfiledialog.h> +#include <kio/job.h> +#include <kprocess.h> +#include <ktoolbarbutton.h> +#include <ktoolbar.h> +#include <ksavefile.h> +#include <kurldrag.h> +#include <kstringhandler.h> +#include <kapplication.h> +#include <kmessagebox.h> +#include <kstandarddirs.h> +#include <krun.h> +#include <kurifilter.h> +#include <kiconloader.h> +#include <kdesktopfile.h> +#include <tdemultipledrag.h> +#include <kinputdialog.h> + +#include "tdehtml_factory.h" + +#include "dom/dom_element.h" +#include "misc/htmltags.h" + +#include "tdehtmlpart_p.h" + +KHTMLPartBrowserExtension::KHTMLPartBrowserExtension( KHTMLPart *parent, const char *name ) +: KParts::BrowserExtension( parent, name ) +{ + m_part = parent; + setURLDropHandlingEnabled( true ); + + enableAction( "cut", false ); + enableAction( "copy", false ); + enableAction( "paste", false ); + + m_connectedToClipboard = false; +} + +int KHTMLPartBrowserExtension::xOffset() +{ + return m_part->view()->contentsX(); +} + +int KHTMLPartBrowserExtension::yOffset() +{ + return m_part->view()->contentsY(); +} + +void KHTMLPartBrowserExtension::saveState( TQDataStream &stream ) +{ + //kdDebug( 6050 ) << "saveState!" << endl; + m_part->saveState( stream ); +} + +void KHTMLPartBrowserExtension::restoreState( TQDataStream &stream ) +{ + //kdDebug( 6050 ) << "restoreState!" << endl; + m_part->restoreState( stream ); +} + +void KHTMLPartBrowserExtension::editableWidgetFocused( TQWidget *widget ) +{ + m_editableFormWidget = widget; + updateEditActions(); + + if ( !m_connectedToClipboard && m_editableFormWidget ) + { + connect( TQApplication::clipboard(), TQT_SIGNAL( dataChanged() ), + this, TQT_SLOT( updateEditActions() ) ); + + if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) || m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) ) + connect( m_editableFormWidget, TQT_SIGNAL( selectionChanged() ), + this, TQT_SLOT( updateEditActions() ) ); + + m_connectedToClipboard = true; + } + editableWidgetFocused(); +} + +void KHTMLPartBrowserExtension::editableWidgetBlurred( TQWidget * /*widget*/ ) +{ + TQWidget *oldWidget = m_editableFormWidget; + + m_editableFormWidget = 0; + enableAction( "cut", false ); + enableAction( "paste", false ); + m_part->emitSelectionChanged(); + + if ( m_connectedToClipboard ) + { + disconnect( TQApplication::clipboard(), TQT_SIGNAL( dataChanged() ), + this, TQT_SLOT( updateEditActions() ) ); + + if ( oldWidget ) + { + if ( oldWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) || oldWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) ) + disconnect( oldWidget, TQT_SIGNAL( selectionChanged() ), + this, TQT_SLOT( updateEditActions() ) ); + } + + m_connectedToClipboard = false; + } + editableWidgetBlurred(); +} + +void KHTMLPartBrowserExtension::setExtensionProxy( KParts::BrowserExtension *proxy ) +{ + if ( m_extensionProxy ) + { + disconnect( m_extensionProxy, TQT_SIGNAL( enableAction( const char *, bool ) ), + this, TQT_SLOT( extensionProxyActionEnabled( const char *, bool ) ) ); + if ( m_extensionProxy->inherits( "KHTMLPartBrowserExtension" ) ) + { + disconnect( m_extensionProxy, TQT_SIGNAL( editableWidgetFocused() ), + this, TQT_SLOT( extensionProxyEditableWidgetFocused() ) ); + disconnect( m_extensionProxy, TQT_SIGNAL( editableWidgetBlurred() ), + this, TQT_SLOT( extensionProxyEditableWidgetBlurred() ) ); + } + } + + m_extensionProxy = proxy; + + if ( m_extensionProxy ) + { + connect( m_extensionProxy, TQT_SIGNAL( enableAction( const char *, bool ) ), + this, TQT_SLOT( extensionProxyActionEnabled( const char *, bool ) ) ); + if ( m_extensionProxy->inherits( "KHTMLPartBrowserExtension" ) ) + { + connect( m_extensionProxy, TQT_SIGNAL( editableWidgetFocused() ), + this, TQT_SLOT( extensionProxyEditableWidgetFocused() ) ); + connect( m_extensionProxy, TQT_SIGNAL( editableWidgetBlurred() ), + this, TQT_SLOT( extensionProxyEditableWidgetBlurred() ) ); + } + + enableAction( "cut", m_extensionProxy->isActionEnabled( "cut" ) ); + enableAction( "copy", m_extensionProxy->isActionEnabled( "copy" ) ); + enableAction( "paste", m_extensionProxy->isActionEnabled( "paste" ) ); + } + else + { + updateEditActions(); + enableAction( "copy", false ); // ### re-check this + } +} + +void KHTMLPartBrowserExtension::cut() +{ + if ( m_extensionProxy ) + { + callExtensionProxyMethod( "cut()" ); + return; + } + + if ( !m_editableFormWidget ) + return; + + if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) ) + static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->cut(); + else if ( m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) ) + static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->cut(); +} + +void KHTMLPartBrowserExtension::copy() +{ + if ( m_extensionProxy ) + { + callExtensionProxyMethod( "copy()" ); + return; + } + + kdDebug( 6050 ) << "************! KHTMLPartBrowserExtension::copy()" << endl; + if ( !m_editableFormWidget ) + { + // get selected text and paste to the clipboard + TQString text= m_part->selectedText(); + text.replace( TQChar( 0xa0 ), ' ' ); + + + TQClipboard *cb = TQApplication::clipboard(); + disconnect( cb, TQT_SIGNAL( selectionChanged() ), m_part, TQT_SLOT( slotClearSelection() ) ); +#ifndef QT_NO_MIMECLIPBOARD + TQString htmltext; + /* + * When selectionModeEnabled, that means the user has just selected + * the text, not ctrl+c to copy it. The selection clipboard + * doesn't seem to support mime type, so to save time, don't calculate + * the selected text as html. + * optomisation disabled for now until everything else works. + */ + //if(!cb->selectionModeEnabled()) + htmltext = m_part->selectedTextAsHTML(); + TQTextDrag *textdrag = new TQTextDrag(text, 0L); + KMultipleDrag *drag = new KMultipleDrag( m_editableFormWidget ); + drag->addDragObject( textdrag ); + if(!htmltext.isEmpty()) { + htmltext.replace( TQChar( 0xa0 ), ' ' ); + TQTextDrag *htmltextdrag = new TQTextDrag(htmltext, 0L); + htmltextdrag->setSubtype("html"); + drag->addDragObject( htmltextdrag ); + } + cb->setData(drag); +#else + cb->setText(text); +#endif + + connect( cb, TQT_SIGNAL( selectionChanged() ), m_part, TQT_SLOT( slotClearSelection() ) ); + } + else + { + if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) ) + static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->copy(); + else if ( m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) ) + static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->copy(); + } +} + +void KHTMLPartBrowserExtension::searchProvider() +{ + // action name is of form "previewProvider[<searchproviderprefix>:]" + const TQString searchProviderPrefix = TQString( TQT_TQOBJECT_CONST(sender())->name() ).mid( 14 ); + + KURIFilterData data; + TQStringList list; + data.setData( searchProviderPrefix + m_part->selectedText() ); + list << "kurisearchfilter" << "kuriikwsfilter"; + + if( !KURIFilter::self()->filterURI(data, list) ) + { + KDesktopFile file("searchproviders/google.desktop", true, "services"); + TQString encodedSearchTerm = m_part->selectedText(); + TQUrl::encode(encodedSearchTerm); + data.setData(file.readEntry("Query").replace("\\{@}", encodedSearchTerm)); + } + + KParts::URLArgs args; + args.frameName = "_blank"; + + emit m_part->browserExtension()->openURLRequest( data.uri(), args ); +} + +void KHTMLPartBrowserExtension::openSelection() +{ + KParts::URLArgs args; + args.frameName = "_blank"; + + emit m_part->browserExtension()->openURLRequest( m_part->selectedText(), args ); +} + +void KHTMLPartBrowserExtension::paste() +{ + if ( m_extensionProxy ) + { + callExtensionProxyMethod( "paste()" ); + return; + } + + if ( !m_editableFormWidget ) + return; + + if ( m_editableFormWidget->inherits( TQLINEEDIT_OBJECT_NAME_STRING ) ) + static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->paste(); + else if ( m_editableFormWidget->inherits( TQTEXTEDIT_OBJECT_NAME_STRING ) ) + static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->paste(); +} + +void KHTMLPartBrowserExtension::callExtensionProxyMethod( const char *method ) +{ + if ( !m_extensionProxy ) + return; + + int slot = m_extensionProxy->metaObject()->findSlot( method ); + if ( slot == -1 ) + return; + + TQUObject o[ 1 ]; + m_extensionProxy->tqt_invoke( slot, o ); +} + +void KHTMLPartBrowserExtension::updateEditActions() +{ + if ( !m_editableFormWidget ) + { + enableAction( "cut", false ); + enableAction( "copy", false ); + enableAction( "paste", false ); + return; + } + + // ### duplicated from KonqMainWindow::slotClipboardDataChanged +#ifndef QT_NO_MIMECLIPBOARD // Handle minimalized versions of Qt Embedded + TQMimeSource *data = TQApplication::clipboard()->data(); + enableAction( "paste", data->provides( "text/plain" ) ); +#else + TQString data=TQApplication::clipboard()->text(); + enableAction( "paste", data.contains("://")); +#endif + bool hasSelection = false; + + if( m_editableFormWidget) { + if ( ::tqqt_cast<TQLineEdit*>(m_editableFormWidget)) + hasSelection = static_cast<TQLineEdit *>( &(*m_editableFormWidget) )->hasSelectedText(); + else if(::tqqt_cast<TQTextEdit*>(m_editableFormWidget)) + hasSelection = static_cast<TQTextEdit *>( &(*m_editableFormWidget) )->hasSelectedText(); + } + + enableAction( "copy", hasSelection ); + enableAction( "cut", hasSelection ); +} + +void KHTMLPartBrowserExtension::extensionProxyEditableWidgetFocused() { + editableWidgetFocused(); +} + +void KHTMLPartBrowserExtension::extensionProxyEditableWidgetBlurred() { + editableWidgetBlurred(); +} + +void KHTMLPartBrowserExtension::extensionProxyActionEnabled( const char *action, bool enable ) +{ + // only forward enableAction calls for actions we actually do forward + if ( strcmp( action, "cut" ) == 0 || + strcmp( action, "copy" ) == 0 || + strcmp( action, "paste" ) == 0 ) { + enableAction( action, enable ); + } +} + +void KHTMLPartBrowserExtension::reparseConfiguration() +{ + m_part->reparseConfiguration(); +} + +void KHTMLPartBrowserExtension::print() +{ + m_part->view()->print(); +} + +void KHTMLPartBrowserExtension::disableScrolling() +{ + TQScrollView *scrollView = m_part->view(); + if (scrollView) { + scrollView->setVScrollBarMode(TQScrollView::AlwaysOff); + scrollView->setHScrollBarMode(TQScrollView::AlwaysOff); + } +} + +class KHTMLPopupGUIClient::KHTMLPopupGUIClientPrivate +{ +public: + KHTMLPart *m_tdehtml; + KURL m_url; + KURL m_imageURL; + TQPixmap m_pixmap; + TQString m_suggestedFilename; +}; + + +KHTMLPopupGUIClient::KHTMLPopupGUIClient( KHTMLPart *tdehtml, const TQString &doc, const KURL &url ) + : TQObject( tdehtml ) +{ + d = new KHTMLPopupGUIClientPrivate; + d->m_tdehtml = tdehtml; + d->m_url = url; + bool isImage = false; + bool hasSelection = tdehtml->hasSelection(); + setInstance( tdehtml->instance() ); + + DOM::Element e; + e = tdehtml->nodeUnderMouse(); + + if ( !e.isNull() && (e.elementId() == ID_IMG || + (e.elementId() == ID_INPUT && !static_cast<DOM::HTMLInputElement>(e).src().isEmpty()))) + { + if (e.elementId() == ID_IMG) { + DOM::HTMLImageElementImpl *ie = static_cast<DOM::HTMLImageElementImpl*>(e.handle()); + tdehtml::RenderImage *ri = dynamic_cast<tdehtml::RenderImage*>(ie->renderer()); + if (ri && ri->contentObject()) { + d->m_suggestedFilename = static_cast<tdehtml::CachedImage*>(ri->contentObject())->suggestedFilename(); + } + } + isImage=true; + } + + if (hasSelection) + { + KAction* copyAction = KStdAction::copy( d->m_tdehtml->browserExtension(), TQT_SLOT( copy() ), actionCollection(), "copy" ); + copyAction->setText(i18n("&Copy Text")); + copyAction->setEnabled(d->m_tdehtml->browserExtension()->isActionEnabled( "copy" )); + actionCollection()->insert( tdehtml->actionCollection()->action( "selectAll" ) ); + + + // Fill search provider entries + TDEConfig config("kuriikwsfilterrc"); + config.setGroup("General"); + const TQString defaultEngine = config.readEntry("DefaultSearchEngine", "google"); + const char keywordDelimiter = config.readNumEntry("KeywordDelimiter", ':'); + + // search text + TQString selectedText = tdehtml->selectedText(); + selectedText.replace("&", "&&"); + if ( selectedText.length()>18 ) { + selectedText.truncate(15); + selectedText+="..."; + } + + // default search provider + KService::Ptr service = KService::serviceByDesktopPath(TQString("searchproviders/%1.desktop").arg(defaultEngine)); + + // search provider icon + TQPixmap icon; + KURIFilterData data; + TQStringList list; + data.setData( TQString("some keyword") ); + list << "kurisearchfilter" << "kuriikwsfilter"; + + TQString name; + if ( KURIFilter::self()->filterURI(data, list) ) + { + TQString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png"); + if ( iconPath.isEmpty() ) + icon = SmallIcon("find"); + else + icon = TQPixmap( iconPath ); + name = service->name(); + } + else + { + icon = SmallIcon("google"); + name = "Google"; + } + + // using .arg(foo, bar) instead of .arg(foo).arg(bar), as foo can contain %x + new KAction( i18n( "Search for '%1' with %2" ).arg( selectedText, name ), icon, 0, d->m_tdehtml->browserExtension(), + TQT_SLOT( searchProvider() ), actionCollection(), "searchProvider" ); + + // favorite search providers + TQStringList favoriteEngines; + favoriteEngines << "google" << "google_groups" << "google_news" << "webster" << "dmoz" << "wikipedia"; + favoriteEngines = config.readListEntry("FavoriteSearchEngines", favoriteEngines); + + if ( !favoriteEngines.isEmpty()) { + KActionMenu* providerList = new KActionMenu( i18n( "Search for '%1' with" ).arg( selectedText ), actionCollection(), "searchProviderList" ); + + TQStringList::ConstIterator it = favoriteEngines.begin(); + for ( ; it != favoriteEngines.end(); ++it ) { + if (*it==defaultEngine) + continue; + service = KService::serviceByDesktopPath(TQString("searchproviders/%1.desktop").arg(*it)); + if (!service) + continue; + const TQString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter; + data.setData( searchProviderPrefix + "some keyword" ); + + if ( KURIFilter::self()->filterURI(data, list) ) + { + TQString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png"); + if ( iconPath.isEmpty() ) + icon = SmallIcon("find"); + else + icon = TQPixmap( iconPath ); + name = service->name(); + + providerList->insert( new KAction( name, icon, 0, d->m_tdehtml->browserExtension(), + TQT_SLOT( searchProvider() ), actionCollection(), TQString( "searchProvider" + searchProviderPrefix ).latin1() ) ); + } + } + } + + + if ( selectedText.contains("://") && KURL(selectedText).isValid() ) + new KAction( i18n( "Open '%1'" ).arg( selectedText ), "window_new", 0, + d->m_tdehtml->browserExtension(), TQT_SLOT( openSelection() ), actionCollection(), "openSelection" ); + } + else if ( url.isEmpty() && !isImage ) + { + actionCollection()->insert( tdehtml->actionCollection()->action( "security" ) ); + actionCollection()->insert( tdehtml->actionCollection()->action( "setEncoding" ) ); + new KAction( i18n( "Stop Animations" ), 0, this, TQT_SLOT( slotStopAnimations() ), + actionCollection(), "stopanimations" ); + } + + if ( !url.isEmpty() ) + { + if (url.protocol() == "mailto") + { + new KAction( i18n( "Copy Email Address" ), 0, this, TQT_SLOT( slotCopyLinkLocation() ), + actionCollection(), "copylinklocation" ); + } + else + { + new KAction( i18n( "&Save Link As..." ), 0, this, TQT_SLOT( slotSaveLinkAs() ), + actionCollection(), "savelinkas" ); + new KAction( i18n( "Copy &Link Address" ), 0, this, TQT_SLOT( slotCopyLinkLocation() ), + actionCollection(), "copylinklocation" ); + } + } + + // frameset? -> add "Reload Frame" etc. + if (!hasSelection) + { + if ( tdehtml->parentPart() ) + { + new KAction( i18n( "Open in New &Window" ), "window_new", 0, this, TQT_SLOT( slotFrameInWindow() ), + actionCollection(), "frameinwindow" ); + new KAction( i18n( "Open in &This Window" ), 0, this, TQT_SLOT( slotFrameInTop() ), + actionCollection(), "frameintop" ); + new KAction( i18n( "Open in &New Tab" ), "tab_new", 0, this, TQT_SLOT( slotFrameInTab() ), + actionCollection(), "frameintab" ); + new KAction( i18n( "Reload Frame" ), 0, this, TQT_SLOT( slotReloadFrame() ), + actionCollection(), "reloadframe" ); + + if ( KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled() ) { + if ( tdehtml->d->m_frame->m_type == tdehtml::ChildFrame::IFrame ) + new KAction( i18n( "Block IFrame..." ), 0, this, TQT_SLOT( slotBlockIFrame() ), actionCollection(), "blockiframe" ); + } + + new KAction( i18n( "View Frame Source" ), 0, d->m_tdehtml, TQT_SLOT( slotViewDocumentSource() ), + actionCollection(), "viewFrameSource" ); + new KAction( i18n( "View Frame Information" ), 0, d->m_tdehtml, TQT_SLOT( slotViewPageInfo() ), actionCollection(), "viewFrameInfo" ); + // This one isn't in tdehtml_popupmenu.rc anymore, because Print isn't either, + // and because print frame is already in the toolbar and the menu. + // But leave this here, so that it's easy to read it. + new KAction( i18n( "Print Frame..." ), "frameprint", 0, d->m_tdehtml->browserExtension(), TQT_SLOT( print() ), actionCollection(), "printFrame" ); + new KAction( i18n( "Save &Frame As..." ), 0, d->m_tdehtml, TQT_SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" ); + + actionCollection()->insert( tdehtml->parentPart()->actionCollection()->action( "viewDocumentSource" ) ); + actionCollection()->insert( tdehtml->parentPart()->actionCollection()->action( "viewPageInfo" ) ); + } else { + actionCollection()->insert( tdehtml->actionCollection()->action( "viewDocumentSource" ) ); + actionCollection()->insert( tdehtml->actionCollection()->action( "viewPageInfo" ) ); + } + } else if (isImage || !url.isEmpty()) { + actionCollection()->insert( tdehtml->actionCollection()->action( "viewDocumentSource" ) ); + actionCollection()->insert( tdehtml->actionCollection()->action( "viewPageInfo" ) ); + new KAction( i18n( "Stop Animations" ), 0, this, TQT_SLOT( slotStopAnimations() ), + actionCollection(), "stopanimations" ); + } + + if (isImage) + { + if ( e.elementId() == ID_IMG ) { + d->m_imageURL = KURL( static_cast<DOM::HTMLImageElement>( e ).src().string() ); + DOM::HTMLImageElementImpl *imageimpl = static_cast<DOM::HTMLImageElementImpl *>( e.handle() ); + Q_ASSERT(imageimpl); + if(imageimpl) // should be true always. right? + { + if(imageimpl->complete()) { + d->m_pixmap = imageimpl->currentPixmap(); + } + } + } + else + d->m_imageURL = KURL( static_cast<DOM::HTMLInputElement>( e ).src().string() ); + new KAction( i18n( "Save Image As..." ), 0, this, TQT_SLOT( slotSaveImageAs() ), + actionCollection(), "saveimageas" ); + new KAction( i18n( "Send Image..." ), 0, this, TQT_SLOT( slotSendImage() ), + actionCollection(), "sendimage" ); + + +#ifndef QT_NO_MIMECLIPBOARD + (new KAction( i18n( "Copy Image" ), 0, this, TQT_SLOT( slotCopyImage() ), + actionCollection(), "copyimage" ))->setEnabled(!d->m_pixmap.isNull()); +#endif + + if(d->m_pixmap.isNull()) { //fallback to image location if still loading the image. this will always be true if ifdef QT_NO_MIMECLIPBOARD + new KAction( i18n( "Copy Image Location" ), 0, this, TQT_SLOT( slotCopyImageLocation() ), + actionCollection(), "copyimagelocation" ); + } + + TQString name = KStringHandler::csqueeze(d->m_imageURL.fileName()+d->m_imageURL.query(), 25); + new KAction( i18n( "View Image (%1)" ).arg(d->m_suggestedFilename.isEmpty() ? name.replace("&", "&&") : d->m_suggestedFilename.replace("&", "&&")), 0, this, TQT_SLOT( slotViewImage() ), + actionCollection(), "viewimage" ); + + if (KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled()) + { + new KAction( i18n( "Block Image..." ), 0, this, TQT_SLOT( slotBlockImage() ), + actionCollection(), "blockimage" ); + + if (!d->m_imageURL.host().isEmpty() && + !d->m_imageURL.protocol().isEmpty()) + { + new KAction( i18n( "Block Images From %1" ).arg(d->m_imageURL.host()), 0, this, TQT_SLOT( slotBlockHost() ), + actionCollection(), "blockhost" ); + } + } + } + + setXML( doc ); + setDOMDocument( TQDomDocument(), true ); // ### HACK + + TQDomElement menu = domDocument().documentElement().namedItem( "Menu" ).toElement(); + + if ( actionCollection()->count() > 0 ) + menu.insertBefore( domDocument().createElement( "separator" ), menu.firstChild() ); +} + +KHTMLPopupGUIClient::~KHTMLPopupGUIClient() +{ + delete d; +} + +void KHTMLPopupGUIClient::slotSaveLinkAs() +{ + TDEIO::MetaData metaData; + metaData["referrer"] = d->m_tdehtml->referrer(); + saveURL( d->m_tdehtml->widget(), i18n( "Save Link As" ), d->m_url, metaData ); +} + +void KHTMLPopupGUIClient::slotSendImage() +{ + TQStringList urls; + urls.append( d->m_imageURL.url()); + TQString subject = d->m_imageURL.url(); + kapp->invokeMailer(TQString::null, TQString::null, TQString::null, subject, + TQString::null, //body + TQString::null, + urls); // attachments + + +} + +void KHTMLPopupGUIClient::slotSaveImageAs() +{ + TDEIO::MetaData metaData; + metaData["referrer"] = d->m_tdehtml->referrer(); + saveURL( d->m_tdehtml->widget(), i18n( "Save Image As" ), d->m_imageURL, metaData, TQString::null, 0, d->m_suggestedFilename ); +} + +void KHTMLPopupGUIClient::slotBlockHost() +{ + TQString name=d->m_imageURL.protocol()+"://"+d->m_imageURL.host()+"/*"; + KHTMLFactory::defaultHTMLSettings()->addAdFilter( name ); + d->m_tdehtml->reparseConfiguration(); +} + +void KHTMLPopupGUIClient::slotBlockImage() +{ + bool ok = false; + + TQString url = KInputDialog::getText( i18n("Add URL to Filter"), + i18n("Enter the URL:"), + d->m_imageURL.url(), + &ok); + if ( ok ) { + KHTMLFactory::defaultHTMLSettings()->addAdFilter( url ); + d->m_tdehtml->reparseConfiguration(); + } +} + +void KHTMLPopupGUIClient::slotBlockIFrame() +{ + bool ok = false; + TQString url = KInputDialog::getText( i18n( "Add URL to Filter"), + i18n("Enter the URL:"), + d->m_tdehtml->url().url(), + &ok ); + if ( ok ) { + KHTMLFactory::defaultHTMLSettings()->addAdFilter( url ); + d->m_tdehtml->reparseConfiguration(); + } +} + +void KHTMLPopupGUIClient::slotCopyLinkLocation() +{ + KURL safeURL(d->m_url); + safeURL.setPass(TQString::null); +#ifndef QT_NO_MIMECLIPBOARD + // Set it in both the mouse selection and in the clipboard + KURL::List lst; + lst.append( safeURL ); + TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Clipboard ); + TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Selection ); +#else + TQApplication::clipboard()->setText( safeURL.url() ); //FIXME(E): Handle multiple entries +#endif +} + +void KHTMLPopupGUIClient::slotStopAnimations() +{ + d->m_tdehtml->stopAnimations(); +} + +void KHTMLPopupGUIClient::slotCopyImage() +{ +#ifndef QT_NO_MIMECLIPBOARD + KURL safeURL(d->m_imageURL); + safeURL.setPass(TQString::null); + + KURL::List lst; + lst.append( safeURL ); + KMultipleDrag *drag = new KMultipleDrag(d->m_tdehtml->view(), "Image"); + + drag->addDragObject( new TQImageDrag(d->m_pixmap.convertToImage()) ); + drag->addDragObject( new KURLDrag(lst, d->m_tdehtml->view(), "Image URL") ); + + // Set it in both the mouse selection and in the clipboard + TQApplication::clipboard()->setData( drag, TQClipboard::Clipboard ); + TQApplication::clipboard()->setData( new KURLDrag(lst), TQClipboard::Selection ); +#else + kdDebug() << "slotCopyImage called when the clipboard does not support this. This should not be possible." << endl; +#endif +} + +void KHTMLPopupGUIClient::slotCopyImageLocation() +{ + KURL safeURL(d->m_imageURL); + safeURL.setPass(TQString::null); +#ifndef QT_NO_MIMECLIPBOARD + // Set it in both the mouse selection and in the clipboard + KURL::List lst; + lst.append( safeURL ); + TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Clipboard ); + TQApplication::clipboard()->setData( new KURLDrag( lst ), TQClipboard::Selection ); +#else + TQApplication::clipboard()->setText( safeURL.url() ); //FIXME(E): Handle multiple entries +#endif +} + +void KHTMLPopupGUIClient::slotViewImage() +{ + d->m_tdehtml->browserExtension()->createNewWindow(d->m_imageURL); +} + +void KHTMLPopupGUIClient::slotReloadFrame() +{ + KParts::URLArgs args( d->m_tdehtml->browserExtension()->urlArgs() ); + args.reload = true; + args.metaData()["referrer"] = d->m_tdehtml->pageReferrer(); + // reload document + d->m_tdehtml->closeURL(); + d->m_tdehtml->browserExtension()->setURLArgs( args ); + d->m_tdehtml->openURL( d->m_tdehtml->url() ); +} + +void KHTMLPopupGUIClient::slotFrameInWindow() +{ + KParts::URLArgs args( d->m_tdehtml->browserExtension()->urlArgs() ); + args.metaData()["referrer"] = d->m_tdehtml->pageReferrer(); + args.metaData()["forcenewwindow"] = "true"; + emit d->m_tdehtml->browserExtension()->createNewWindow( d->m_tdehtml->url(), args ); +} + +void KHTMLPopupGUIClient::slotFrameInTop() +{ + KParts::URLArgs args( d->m_tdehtml->browserExtension()->urlArgs() ); + args.metaData()["referrer"] = d->m_tdehtml->pageReferrer(); + args.frameName = "_top"; + emit d->m_tdehtml->browserExtension()->openURLRequest( d->m_tdehtml->url(), args ); +} + +void KHTMLPopupGUIClient::slotFrameInTab() +{ + KParts::URLArgs args( d->m_tdehtml->browserExtension()->urlArgs() ); + args.metaData()["referrer"] = d->m_tdehtml->pageReferrer(); + args.setNewTab(true); + emit d->m_tdehtml->browserExtension()->createNewWindow( d->m_tdehtml->url(), args ); +} + +void KHTMLPopupGUIClient::saveURL( TQWidget *parent, const TQString &caption, + const KURL &url, + const TQMap<TQString, TQString> &metadata, + const TQString &filter, long cacheId, + const TQString & suggestedFilename ) +{ + TQString name = TQString::fromLatin1( "index.html" ); + if ( !suggestedFilename.isEmpty() ) + name = suggestedFilename; + else if ( !url.fileName().isEmpty() ) + name = url.fileName(); + + KURL destURL; + int query; + do { + query = KMessageBox::Yes; + destURL = KFileDialog::getSaveURL( name, filter, parent, caption ); + if( destURL.isLocalFile() ) + { + TQFileInfo info( destURL.path() ); + if( info.exists() ) { + // TODO: use TDEIO::RenameDlg (shows more information) + query = KMessageBox::warningContinueCancel( parent, i18n( "A file named \"%1\" already exists. " "Are you sure you want to overwrite it?" ).arg( info.fileName() ), i18n( "Overwrite File?" ), i18n( "Overwrite" ) ); + } + } + } while ( query == KMessageBox::Cancel ); + + if ( destURL.isValid() ) + saveURL(url, destURL, metadata, cacheId); +} + +void KHTMLPopupGUIClient::saveURL( const KURL &url, const KURL &destURL, + const TQMap<TQString, TQString> &metadata, + long cacheId ) +{ + if ( destURL.isValid() ) + { + bool saved = false; + if (KHTMLPageCache::self()->isComplete(cacheId)) + { + if (destURL.isLocalFile()) + { + KSaveFile destFile(destURL.path()); + if (destFile.status() == 0) + { + KHTMLPageCache::self()->saveData(cacheId, destFile.dataStream()); + saved = true; + } + } + else + { + // save to temp file, then move to final destination. + KTempFile destFile; + if (destFile.status() == 0) + { + KHTMLPageCache::self()->saveData(cacheId, destFile.dataStream()); + destFile.close(); + KURL url2 = KURL(); + url2.setPath(destFile.name()); + TDEIO::file_move(url2, destURL, -1, true /*overwrite*/); + saved = true; + } + } + } + if(!saved) + { + // DownloadManager <-> konqueror integration + // find if the integration is enabled + // the empty key means no integration + // only use download manager for non-local urls! + bool downloadViaKIO = true; + if ( !url.isLocalFile() ) + { + TDEConfig cfg("konquerorrc", false, false); + cfg.setGroup("HTML Settings"); + TQString downloadManger = cfg.readPathEntry("DownloadManager"); + if (!downloadManger.isEmpty()) + { + // then find the download manager location + kdDebug(1000) << "Using: "<<downloadManger <<" as Download Manager" <<endl; + TQString cmd = KStandardDirs::findExe(downloadManger); + if (cmd.isEmpty()) + { + TQString errMsg=i18n("The Download Manager (%1) could not be found in your $PATH ").arg(downloadManger); + TQString errMsgEx= i18n("Try to reinstall it \n\nThe integration with Konqueror will be disabled!"); + KMessageBox::detailedSorry(0,errMsg,errMsgEx); + cfg.writePathEntry("DownloadManager",TQString::null); + cfg.sync (); + } + else + { + downloadViaKIO = false; + KURL cleanDest = destURL; + cleanDest.setPass( TQString::null ); // don't put password into commandline + cmd += " " + TDEProcess::quote(url.url()) + " " + + TDEProcess::quote(cleanDest.url()); + kdDebug(1000) << "Calling command "<<cmd<<endl; + KRun::runCommand(cmd); + } + } + } + + if ( downloadViaKIO ) + { + TDEIO::Job *job = TDEIO::file_copy( url, destURL, -1, true /*overwrite*/ ); + job->setMetaData(metadata); + job->addMetaData("MaxCacheSize", "0"); // Don't store in http cache. + job->addMetaData("cache", "cache"); // Use entry from cache if available. + job->setAutoErrorHandlingEnabled( true ); + } + } //end if(!saved) + } +} + +KHTMLPartBrowserHostExtension::KHTMLPartBrowserHostExtension( KHTMLPart *part ) +: KParts::BrowserHostExtension( part ) +{ + m_part = part; +} + +KHTMLPartBrowserHostExtension::~KHTMLPartBrowserHostExtension() +{ +} + +TQStringList KHTMLPartBrowserHostExtension::frameNames() const +{ + return m_part->frameNames(); +} + +const TQPtrList<KParts::ReadOnlyPart> KHTMLPartBrowserHostExtension::frames() const +{ + return m_part->frames(); +} + +bool KHTMLPartBrowserHostExtension::openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs ) +{ + return m_part->openURLInFrame( url, urlArgs ); +} + +void KHTMLPartBrowserHostExtension::virtual_hook( int id, void *data ) +{ + if (id == VIRTUAL_FIND_FRAME_PARENT) + { + FindFrameParentParams *param = static_cast<FindFrameParentParams*>(data); + KHTMLPart *parentPart = m_part->findFrameParent(param->callingPart, param->frame); + if (parentPart) + param->parent = parentPart->browserHostExtension(); + return; + } + BrowserHostExtension::virtual_hook( id, data ); +} + + +// defined in tdehtml_part.cpp +extern const int KDE_NO_EXPORT fastZoomSizes[]; +extern const int KDE_NO_EXPORT fastZoomSizeCount; + +// BCI: remove in KDE 4 +KHTMLZoomFactorAction::KHTMLZoomFactorAction( KHTMLPart *part, bool direction, const TQString &text, const TQString &icon, const TQObject *receiver, const char *slot, TQObject *parent, const char *name ) + : KAction( text, icon, 0, receiver, slot, parent, name ) +{ + init(part, direction); +} + +KHTMLZoomFactorAction::KHTMLZoomFactorAction( KHTMLPart *part, bool direction, const TQString &text, const TQString &icon, const KShortcut &cut, const TQObject *receiver, const char *slot, TQObject *parent, const char *name ) + : KAction( text, icon, cut, receiver, slot, parent, name ) +{ + init(part, direction); +} + +void KHTMLZoomFactorAction::init(KHTMLPart *part, bool direction) +{ + m_direction = direction; + m_part = part; + + m_popup = new TQPopupMenu; + // xgettext: no-c-format + m_popup->insertItem( i18n( "Default Font Size (100%)" ) ); + + int m = m_direction ? 1 : -1; + int ofs = fastZoomSizeCount / 2; // take index of 100% + + // this only works if there is an odd number of elements in fastZoomSizes[] + for ( int i = m; i != m*(ofs+1); i += m ) + { + int num = i * m; + TQString numStr = TQString::number( num ); + if ( num > 0 ) numStr.prepend( '+' ); + + // xgettext: no-c-format + m_popup->insertItem( i18n( "%1%" ).arg( fastZoomSizes[ofs + i] ) ); + } + + connect( m_popup, TQT_SIGNAL( activated( int ) ), this, TQT_SLOT( slotActivated( int ) ) ); +} + +KHTMLZoomFactorAction::~KHTMLZoomFactorAction() +{ + delete m_popup; +} + +int KHTMLZoomFactorAction::plug( TQWidget *w, int index ) +{ + int containerId = KAction::plug( w, index ); + if ( containerId == -1 || !w->inherits( "KToolBar" ) ) + return containerId; + + KToolBarButton *button = static_cast<KToolBar *>( w )->getButton( itemId( containerId ) ); + if ( !button ) + return containerId; + + button->setDelayedPopup( m_popup ); + return containerId; +} + +void KHTMLZoomFactorAction::slotActivated( int id ) +{ + int idx = m_popup->indexOf( id ); + + if (idx == 0) + m_part->setZoomFactor(100); + else + m_part->setZoomFactor(fastZoomSizes[fastZoomSizeCount/2 + (m_direction ? 1 : -1)*idx]); +} + +#include "tdehtml_ext.moc" + |