00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#include <assert.h>
00029
#include "khtml_ext.h"
00030
#include "khtmlview.h"
00031
#include "khtml_pagecache.h"
00032
#include "rendering/render_form.h"
00033
#include "rendering/render_image.h"
00034
#include "html/html_imageimpl.h"
00035
#include "misc/loader.h"
00036
#include "dom/html_form.h"
00037
#include "dom/html_image.h"
00038
#include <qclipboard.h>
00039
#include <qfileinfo.h>
00040
#include <qpopupmenu.h>
00041
#include <qmetaobject.h>
00042
#include <private/qucomextra_p.h>
00043
#include <qdragobject.h>
00044
00045
#include <kdebug.h>
00046
#include <klocale.h>
00047
#include <kfiledialog.h>
00048
#include <kio/job.h>
00049
#include <kprocess.h>
00050
#include <ktoolbarbutton.h>
00051
#include <ktoolbar.h>
00052
#include <ksavefile.h>
00053
#include <kurldrag.h>
00054
#include <kstringhandler.h>
00055
#include <kapplication.h>
00056
#include <kmessagebox.h>
00057
#include <kstandarddirs.h>
00058
#include <krun.h>
00059
#include <kurifilter.h>
00060
#include <kiconloader.h>
00061
#include <kdesktopfile.h>
00062
#include <kmultipledrag.h>
00063
00064
#include "dom/dom_element.h"
00065
#include "misc/htmltags.h"
00066
00067 KHTMLPartBrowserExtension::KHTMLPartBrowserExtension(
KHTMLPart *parent,
const char *name )
00068 : KParts::BrowserExtension( parent,
name )
00069 {
00070 m_part = parent;
00071 setURLDropHandlingEnabled(
true );
00072
00073 enableAction(
"cut",
false );
00074 enableAction(
"copy",
false );
00075 enableAction(
"paste",
false );
00076
00077 m_connectedToClipboard =
false;
00078 }
00079
00080
int KHTMLPartBrowserExtension::xOffset()
00081 {
00082
return m_part->
view()->contentsX();
00083 }
00084
00085
int KHTMLPartBrowserExtension::yOffset()
00086 {
00087
return m_part->
view()->contentsY();
00088 }
00089
00090
void KHTMLPartBrowserExtension::saveState(
QDataStream &stream )
00091 {
00092
00093 m_part->
saveState( stream );
00094 }
00095
00096
void KHTMLPartBrowserExtension::restoreState(
QDataStream &stream )
00097 {
00098
00099 m_part->
restoreState( stream );
00100 }
00101
00102
void KHTMLPartBrowserExtension::editableWidgetFocused(
QWidget *widget )
00103 {
00104 m_editableFormWidget = widget;
00105 updateEditActions();
00106
00107
if ( !m_connectedToClipboard && m_editableFormWidget )
00108 {
00109 connect( QApplication::clipboard(), SIGNAL( dataChanged() ),
00110
this, SLOT( updateEditActions() ) );
00111
00112
if ( m_editableFormWidget->inherits(
"QLineEdit" ) || m_editableFormWidget->inherits(
"QTextEdit" ) )
00113 connect( m_editableFormWidget, SIGNAL( selectionChanged() ),
00114
this, SLOT( updateEditActions() ) );
00115
00116 m_connectedToClipboard =
true;
00117 }
00118 editableWidgetFocused();
00119 }
00120
00121
void KHTMLPartBrowserExtension::editableWidgetBlurred(
QWidget * )
00122 {
00123
QWidget *oldWidget = m_editableFormWidget;
00124
00125 m_editableFormWidget = 0;
00126
enableAction(
"cut",
false );
00127
enableAction(
"paste",
false );
00128 m_part->
emitSelectionChanged();
00129
00130
if ( m_connectedToClipboard )
00131 {
00132 disconnect( QApplication::clipboard(), SIGNAL( dataChanged() ),
00133
this, SLOT( updateEditActions() ) );
00134
00135
if ( oldWidget )
00136 {
00137
if ( oldWidget->inherits(
"QLineEdit" ) || oldWidget->inherits(
"QTextEdit" ) )
00138 disconnect( oldWidget, SIGNAL( selectionChanged() ),
00139
this, SLOT( updateEditActions() ) );
00140 }
00141
00142 m_connectedToClipboard =
false;
00143 }
00144 editableWidgetBlurred();
00145 }
00146
00147
void KHTMLPartBrowserExtension::setExtensionProxy(
KParts::BrowserExtension *proxy )
00148 {
00149
if ( m_extensionProxy )
00150 {
00151 disconnect( m_extensionProxy, SIGNAL(
enableAction(
const char *,
bool ) ),
00152
this, SLOT( extensionProxyActionEnabled(
const char *,
bool ) ) );
00153
if ( m_extensionProxy->inherits(
"KHTMLPartBrowserExtension" ) )
00154 {
00155 disconnect( m_extensionProxy, SIGNAL( editableWidgetFocused() ),
00156
this, SLOT( extensionProxyEditableWidgetFocused() ) );
00157 disconnect( m_extensionProxy, SIGNAL( editableWidgetBlurred() ),
00158
this, SLOT( extensionProxyEditableWidgetBlurred() ) );
00159 }
00160 }
00161
00162 m_extensionProxy = proxy;
00163
00164
if ( m_extensionProxy )
00165 {
00166 connect( m_extensionProxy, SIGNAL(
enableAction(
const char *,
bool ) ),
00167
this, SLOT( extensionProxyActionEnabled(
const char *,
bool ) ) );
00168
if ( m_extensionProxy->inherits(
"KHTMLPartBrowserExtension" ) )
00169 {
00170 connect( m_extensionProxy, SIGNAL( editableWidgetFocused() ),
00171
this, SLOT( extensionProxyEditableWidgetFocused() ) );
00172 connect( m_extensionProxy, SIGNAL( editableWidgetBlurred() ),
00173
this, SLOT( extensionProxyEditableWidgetBlurred() ) );
00174 }
00175
00176
enableAction(
"cut", m_extensionProxy->isActionEnabled(
"cut" ) );
00177
enableAction(
"copy", m_extensionProxy->isActionEnabled(
"copy" ) );
00178
enableAction(
"paste", m_extensionProxy->isActionEnabled(
"paste" ) );
00179 }
00180
else
00181 {
00182 updateEditActions();
00183
enableAction(
"copy",
false );
00184 }
00185 }
00186
00187
void KHTMLPartBrowserExtension::cut()
00188 {
00189
if ( m_extensionProxy )
00190 {
00191 callExtensionProxyMethod(
"cut()" );
00192
return;
00193 }
00194
00195
if ( !m_editableFormWidget )
00196
return;
00197
00198
if ( m_editableFormWidget->inherits(
"QLineEdit" ) )
00199 static_cast<QLineEdit *>( &(*m_editableFormWidget) )->cut();
00200
else if ( m_editableFormWidget->inherits(
"QTextEdit" ) )
00201 static_cast<QTextEdit *>( &(*m_editableFormWidget) )->cut();
00202 }
00203
00204
void KHTMLPartBrowserExtension::copy()
00205 {
00206
if ( m_extensionProxy )
00207 {
00208 callExtensionProxyMethod(
"copy()" );
00209
return;
00210 }
00211
00212
kdDebug( 6050 ) <<
"************! KHTMLPartBrowserExtension::copy()" <<
endl;
00213
if ( !m_editableFormWidget )
00214 {
00215
00216
QString text= m_part->
selectedText();
00217 text.replace(
QChar( 0xa0 ),
' ' );
00218
00219
00220
QClipboard *cb = QApplication::clipboard();
00221 disconnect( cb, SIGNAL( selectionChanged() ), m_part, SLOT( slotClearSelection() ) );
00222
#ifndef QT_NO_MIMECLIPBOARD
00223
QString htmltext;
00224
00225
00226
00227
00228
00229
00230
00231
00232 htmltext = m_part->
selectedTextAsHTML();
00233
QTextDrag *textdrag =
new QTextDrag(text, 0L);
00234
KMultipleDrag *drag =
new KMultipleDrag( m_editableFormWidget );
00235 drag->
addDragObject( textdrag );
00236
if(!htmltext.isEmpty()) {
00237 htmltext.replace(
QChar( 0xa0 ),
' ' );
00238 QTextDrag *htmltextdrag =
new QTextDrag(htmltext, 0L);
00239 htmltextdrag->setSubtype(
"html");
00240 drag->
addDragObject( htmltextdrag );
00241 }
00242 cb->setData(drag);
00243
#else
00244
cb->setText(text);
00245
#endif
00246
00247 connect( cb, SIGNAL( selectionChanged() ), m_part, SLOT( slotClearSelection() ) );
00248 }
00249
else
00250 {
00251
if ( m_editableFormWidget->inherits(
"QLineEdit" ) )
00252 static_cast<QLineEdit *>( &(*m_editableFormWidget) )->copy();
00253
else if ( m_editableFormWidget->inherits(
"QTextEdit" ) )
00254 static_cast<QTextEdit *>( &(*m_editableFormWidget) )->copy();
00255 }
00256 }
00257
00258
void KHTMLPartBrowserExtension::searchProvider()
00259 {
00260
KURIFilterData data;
00261
QStringList list;
00262 data.
setData( m_part->
selectedText() );
00263 list <<
"kurisearchfilter" <<
"kuriikwsfilter";
00264
00265
if( !
KURIFilter::self()->
filterURI(data, list) )
00266 {
00267
KDesktopFile file(
"searchproviders/google.desktop",
true,
"services");
00268 data.
setData(file.
readEntry(
"Query").replace(
"\\{@}", m_part->
selectedText()));
00269 }
00270
00271
KParts::URLArgs args;
00272 args.
frameName =
"_blank";
00273
00274 emit m_part->
browserExtension()->
openURLRequest( data.
uri(), args );
00275 }
00276
00277
void KHTMLPartBrowserExtension::openSelection()
00278 {
00279
KParts::URLArgs args;
00280 args.
frameName =
"_blank";
00281
00282 emit m_part->
browserExtension()->
openURLRequest( m_part->
selectedText(), args );
00283 }
00284
00285
void KHTMLPartBrowserExtension::paste()
00286 {
00287
if ( m_extensionProxy )
00288 {
00289 callExtensionProxyMethod(
"paste()" );
00290
return;
00291 }
00292
00293
if ( !m_editableFormWidget )
00294
return;
00295
00296
if ( m_editableFormWidget->inherits(
"QLineEdit" ) )
00297 static_cast<QLineEdit *>( &(*m_editableFormWidget) )->paste();
00298
else if ( m_editableFormWidget->inherits(
"QTextEdit" ) )
00299 static_cast<QTextEdit *>( &(*m_editableFormWidget) )->paste();
00300 }
00301
00302
void KHTMLPartBrowserExtension::callExtensionProxyMethod(
const char *method )
00303 {
00304
if ( !m_extensionProxy )
00305
return;
00306
00307
int slot = m_extensionProxy->metaObject()->findSlot( method );
00308
if ( slot == -1 )
00309
return;
00310
00311 QUObject o[ 1 ];
00312 m_extensionProxy->qt_invoke( slot, o );
00313 }
00314
00315
void KHTMLPartBrowserExtension::updateEditActions()
00316 {
00317
if ( !m_editableFormWidget )
00318 {
00319
enableAction(
"cut",
false );
00320
enableAction(
"copy",
false );
00321
enableAction(
"paste",
false );
00322
return;
00323 }
00324
00325
00326
#ifndef QT_NO_MIMECLIPBOARD // Handle minimalized versions of Qt Embedded
00327
QMimeSource *data = QApplication::clipboard()->data();
00328
enableAction(
"paste", data->provides(
"text/plain" ) );
00329
#else
00330
QString data=QApplication::clipboard()->text();
00331
enableAction(
"paste", data.contains(
"://"));
00332
#endif
00333
bool hasSelection =
false;
00334
00335
if( m_editableFormWidget) {
00336
if ( ::qt_cast<QLineEdit*>(m_editableFormWidget))
00337 hasSelection = static_cast<QLineEdit *>( &(*m_editableFormWidget) )->hasSelectedText();
00338
else if(::qt_cast<QTextEdit*>(m_editableFormWidget))
00339 hasSelection = static_cast<QTextEdit *>( &(*m_editableFormWidget) )->hasSelectedText();
00340 }
00341
00342
enableAction(
"copy", hasSelection );
00343
enableAction(
"cut", hasSelection );
00344 }
00345
00346
void KHTMLPartBrowserExtension::extensionProxyEditableWidgetFocused() {
00347 editableWidgetFocused();
00348 }
00349
00350
void KHTMLPartBrowserExtension::extensionProxyEditableWidgetBlurred() {
00351 editableWidgetBlurred();
00352 }
00353
00354
void KHTMLPartBrowserExtension::extensionProxyActionEnabled(
const char *action,
bool enable )
00355 {
00356
00357
if ( strcmp( action,
"cut" ) == 0 ||
00358 strcmp( action,
"copy" ) == 0 ||
00359 strcmp( action,
"paste" ) == 0 ) {
00360
enableAction( action, enable );
00361 }
00362 }
00363
00364
void KHTMLPartBrowserExtension::reparseConfiguration()
00365 {
00366 m_part->
reparseConfiguration();
00367 }
00368
00369
void KHTMLPartBrowserExtension::print()
00370 {
00371 m_part->
view()->
print();
00372 }
00373
00374
class KHTMLPopupGUIClient::KHTMLPopupGUIClientPrivate
00375 {
00376
public:
00377
KHTMLPart *m_khtml;
00378
KURL m_url;
00379
KURL m_imageURL;
00380
QImage m_image;
00381
QString m_suggestedFilename;
00382 };
00383
00384
00385 KHTMLPopupGUIClient::KHTMLPopupGUIClient(
KHTMLPart *khtml,
const QString &doc,
const KURL &url )
00386 :
QObject( khtml )
00387 {
00388 d =
new KHTMLPopupGUIClientPrivate;
00389 d->m_khtml = khtml;
00390 d->
m_url = url;
00391
bool isImage =
false;
00392
bool hasSelection = khtml->
hasSelection();
00393 setInstance( khtml->
instance() );
00394
00395
DOM::Element e;
00396 e = khtml->
nodeUnderMouse();
00397
00398
if ( !e.
isNull() && (e.
elementId() == ID_IMG ||
00399 (e.
elementId() == ID_INPUT && !static_cast<DOM::HTMLInputElement>(e).src().isEmpty())))
00400 {
00401
if (e.
elementId() == ID_IMG) {
00402 DOM::HTMLImageElementImpl *ie = static_cast<DOM::HTMLImageElementImpl*>(e.
handle());
00403 khtml::RenderImage *ri = dynamic_cast<khtml::RenderImage*>(ie->renderer());
00404
if (ri && ri->contentObject()) {
00405 d->m_suggestedFilename = static_cast<khtml::CachedImage*>(ri->contentObject())->suggestedFilename();
00406 }
00407 }
00408 isImage=
true;
00409 }
00410
00411
if ( url.
isEmpty() && !isImage )
00412 {
00413
if (hasSelection)
00414 {
00415
KAction* copyAction =
KStdAction::copy( d->m_khtml->browserExtension(), SLOT(
copy() ), actionCollection(),
"copy" );
00416 copyAction->
setText(i18n(
"&Copy Text"));
00417 copyAction->
setEnabled(d->m_khtml->browserExtension()->isActionEnabled(
"copy" ));
00418 actionCollection()->insert( khtml->
actionCollection()->
action(
"selectAll" ) );
00419
00420
KConfig config(
"kuriikwsfilterrc");
00421 config.
setGroup(
"General");
00422
QString engine = config.
readEntry(
"DefaultSearchEngine");
00423
00424
00425
QString selectedText = khtml->
selectedText();
00426
if ( selectedText.length()>18 ) {
00427 selectedText.truncate(15);
00428 selectedText+=
"...";
00429 }
00430
00431
00432
KDesktopFile file(
"searchproviders/" + engine +
".desktop",
true,
"services");
00433
00434
00435
QPixmap icon;
00436
KURIFilterData data;
00437
QStringList list;
00438 data.
setData(
QString(
"some keyword") );
00439 list <<
"kurisearchfilter" <<
"kuriikwsfilter";
00440
00441
QString name;
00442
if (
KURIFilter::self()->
filterURI(data, list) )
00443 {
00444
QString iconPath =
locate(
"cache", KMimeType::favIconForURL(data.
uri()) +
".png");
00445
if ( iconPath.isEmpty() )
00446 icon = SmallIcon(
"find");
00447
else
00448 icon =
QPixmap( iconPath );
00449
name = file.
readName();
00450 }
00451
else
00452 {
00453 icon = SmallIcon(
"google");
00454
name =
"Google";
00455 }
00456
00457
new KAction( i18n(
"Search '%1' at %2" ).arg( selectedText ).arg( name ), icon, 0, d->m_khtml->browserExtension(),
00458 SLOT( searchProvider() ), actionCollection(),
"searchProvider" );
00459
00460
if ( selectedText.contains(
"://") &&
KURL(selectedText).isValid() )
00461
new KAction( i18n(
"Open '%1'" ).arg( selectedText ),
"window_new", 0,
00462 d->m_khtml->browserExtension(), SLOT( openSelection() ), actionCollection(),
"openSelection" );
00463 }
00464
else
00465 {
00466 actionCollection()->insert( khtml->
actionCollection()->
action(
"security" ) );
00467 actionCollection()->insert( khtml->
actionCollection()->
action(
"setEncoding" ) );
00468
new KAction( i18n(
"Stop Animations" ), 0,
this, SLOT( slotStopAnimations() ),
00469 actionCollection(),
"stopanimations" );
00470 }
00471 }
00472
00473
if ( !url.
isEmpty() )
00474 {
00475
if (url.
protocol() ==
"mailto")
00476 {
00477
new KAction( i18n(
"Copy Email Address" ), 0,
this, SLOT( slotCopyLinkLocation() ),
00478 actionCollection(),
"copylinklocation" );
00479 }
00480
else
00481 {
00482
new KAction( i18n(
"&Save Link As..." ), 0,
this, SLOT( slotSaveLinkAs() ),
00483 actionCollection(),
"savelinkas" );
00484
new KAction( i18n(
"Copy &Link Address" ), 0,
this, SLOT( slotCopyLinkLocation() ),
00485 actionCollection(),
"copylinklocation" );
00486 }
00487 }
00488
00489
00490
if (!hasSelection)
00491 {
00492
if ( khtml->
parentPart() )
00493 {
00494
new KAction( i18n(
"Open in New &Window" ),
"window_new", 0,
this, SLOT( slotFrameInWindow() ),
00495 actionCollection(),
"frameinwindow" );
00496
new KAction( i18n(
"Open in &This Window" ), 0,
this, SLOT( slotFrameInTop() ),
00497 actionCollection(),
"frameintop" );
00498
new KAction( i18n(
"Open in &New Tab" ),
"tab_new", 0,
this, SLOT( slotFrameInTab() ),
00499 actionCollection(),
"frameintab" );
00500
new KAction( i18n(
"Reload Frame" ), 0,
this, SLOT( slotReloadFrame() ),
00501 actionCollection(),
"reloadframe" );
00502
new KAction( i18n(
"View Frame Source" ), 0, d->m_khtml, SLOT( slotViewDocumentSource() ),
00503 actionCollection(),
"viewFrameSource" );
00504
new KAction( i18n(
"View Frame Information" ), 0, d->m_khtml, SLOT( slotViewPageInfo() ), actionCollection(),
"viewFrameInfo" );
00505
00506
00507
00508
new KAction( i18n(
"Print Frame..." ),
"frameprint", 0, d->m_khtml->browserExtension(), SLOT(
print() ), actionCollection(),
"printFrame" );
00509
new KAction( i18n(
"Save &Frame As..." ), 0, d->m_khtml, SLOT( slotSaveFrame() ), actionCollection(),
"saveFrame" );
00510
00511 actionCollection()->insert( khtml->
parentPart()->
actionCollection()->
action(
"viewDocumentSource" ) );
00512 actionCollection()->insert( khtml->
parentPart()->
actionCollection()->
action(
"viewPageInfo" ) );
00513 }
else {
00514 actionCollection()->insert( khtml->
actionCollection()->
action(
"viewDocumentSource" ) );
00515 actionCollection()->insert( khtml->
actionCollection()->
action(
"viewPageInfo" ) );
00516 }
00517 }
else if (isImage || !url.
isEmpty()) {
00518 actionCollection()->insert( khtml->
actionCollection()->
action(
"viewDocumentSource" ) );
00519 actionCollection()->insert( khtml->
actionCollection()->
action(
"viewPageInfo" ) );
00520
new KAction( i18n(
"Stop Animations" ), 0,
this, SLOT( slotStopAnimations() ),
00521 actionCollection(),
"stopanimations" );
00522 }
00523
00524
if (isImage)
00525 {
00526
if ( e.
elementId() == ID_IMG ) {
00527 d->m_imageURL =
KURL( static_cast<DOM::HTMLImageElement>( e ).src().string() );
00528 DOM::HTMLImageElementImpl *imageimpl = static_cast<DOM::HTMLImageElementImpl *>( e.handle() );
00529 Q_ASSERT(imageimpl);
00530
if(imageimpl)
00531 {
00532
if(imageimpl->complete()) {
00533 d->m_image = imageimpl->currentImage();
00534 }
00535 }
00536 }
00537
else
00538 d->m_imageURL =
KURL( static_cast<DOM::HTMLInputElement>( e ).src().string() );
00539
new KAction( i18n(
"Save Image As..." ), 0,
this, SLOT( slotSaveImageAs() ),
00540 actionCollection(),
"saveimageas" );
00541
new KAction( i18n(
"Send Image..." ), 0,
this, SLOT( slotSendImage() ),
00542 actionCollection(),
"sendimage" );
00543
00544
00545
#ifndef QT_NO_MIMECLIPBOARD
00546
(
new KAction( i18n(
"Copy Image" ), 0,
this, SLOT( slotCopyImage() ),
00547 actionCollection(),
"copyimage" ))->setEnabled(!d->m_image.isNull());
00548
#endif
00549
00550
if(d->m_image.isNull()) {
00551
new KAction( i18n(
"Copy Image Location" ), 0,
this, SLOT( slotCopyImageLocation() ),
00552 actionCollection(),
"copyimagelocation" );
00553 }
00554
00555
QString name =
KStringHandler::csqueeze(d->m_imageURL.fileName()+d->m_imageURL.query(), 25);
00556
new KAction( i18n(
"View Image (%1)" ).arg(d->m_suggestedFilename.isEmpty() ?
name.replace(
"&",
"&&") : d->m_suggestedFilename.
replace("&", "&&")), 0, this, SLOT( slotViewImage() ),
00557 actionCollection(), "viewimage" );
00558 }
00559
00560 setXML( doc );
00561 setDOMDocument(
QDomDocument(),
true );
00562
00563
QDomElement menu = domDocument().documentElement().namedItem(
"Menu" ).toElement();
00564
00565
if ( actionCollection()->count() > 0 )
00566 menu.insertBefore( domDocument().createElement(
"separator" ), menu.firstChild() );
00567 }
00568
00569 KHTMLPopupGUIClient::~KHTMLPopupGUIClient()
00570 {
00571
delete d;
00572 }
00573
00574
void KHTMLPopupGUIClient::slotSaveLinkAs()
00575 {
00576
KIO::MetaData metaData;
00577 metaData[
"referrer"] = d->m_khtml->referrer();
00578 saveURL( d->m_khtml->widget(), i18n(
"Save Link As" ), d->m_url, metaData );
00579 }
00580
00581
void KHTMLPopupGUIClient::slotSendImage()
00582 {
00583
QStringList urls;
00584 urls.append( d->m_imageURL.url());
00585
QString subject = d->m_imageURL.url();
00586 kapp->invokeMailer(QString::null, QString::null, QString::null, subject,
00587 QString::null,
00588 QString::null,
00589 urls);
00590
00591
00592 }
00593
00594
void KHTMLPopupGUIClient::slotSaveImageAs()
00595 {
00596
KIO::MetaData metaData;
00597 metaData[
"referrer"] = d->m_khtml->referrer();
00598 saveURL( d->m_khtml->widget(), i18n(
"Save Image As" ), d->m_imageURL, metaData, QString::null, 0, d->m_suggestedFilename );
00599 }
00600
00601
void KHTMLPopupGUIClient::slotCopyLinkLocation()
00602 {
00603
KURL safeURL(d->m_url);
00604 safeURL.
setPass(QString::null);
00605
#ifndef QT_NO_MIMECLIPBOARD
00606
00607
KURL::List lst;
00608 lst.append( safeURL );
00609 QApplication::clipboard()->setData(
new KURLDrag( lst ), QClipboard::Clipboard );
00610 QApplication::clipboard()->setData(
new KURLDrag( lst ), QClipboard::Selection );
00611
#else
00612
QApplication::clipboard()->setText( safeURL.
url() );
00613
#endif
00614
}
00615
00616
void KHTMLPopupGUIClient::slotStopAnimations()
00617 {
00618 d->m_khtml->stopAnimations();
00619 }
00620
00621
void KHTMLPopupGUIClient::slotCopyImage()
00622 {
00623
#ifndef QT_NO_MIMECLIPBOARD
00624
KURL safeURL(d->m_imageURL);
00625 safeURL.
setPass(QString::null);
00626
00627
KURL::List lst;
00628 lst.append( safeURL );
00629 KMultipleDrag *drag =
new KMultipleDrag(d->m_khtml->view(),
"Image");
00630
00631 drag->
addDragObject(
new QImageDrag(d->m_image) );
00632 drag->
addDragObject(
new KURLDrag(lst, d->m_khtml->view(),
"Image URL") );
00633
00634
00635 QApplication::clipboard()->setData( drag, QClipboard::Clipboard );
00636 QApplication::clipboard()->setData(
new KURLDrag(lst), QClipboard::Selection );
00637
#else
00638
kdDebug() <<
"slotCopyImage called when the clipboard does not support this. This should not be possible." <<
endl;
00639
#endif
00640
}
00641
00642
void KHTMLPopupGUIClient::slotCopyImageLocation()
00643 {
00644
KURL safeURL(d->m_imageURL);
00645 safeURL.
setPass(QString::null);
00646
#ifndef QT_NO_MIMECLIPBOARD
00647
00648
KURL::List lst;
00649 lst.append( safeURL );
00650 QApplication::clipboard()->setData(
new KURLDrag( lst ), QClipboard::Clipboard );
00651 QApplication::clipboard()->setData(
new KURLDrag( lst ), QClipboard::Selection );
00652
#else
00653
QApplication::clipboard()->setText( safeURL.
url() );
00654
#endif
00655
}
00656
00657
void KHTMLPopupGUIClient::slotViewImage()
00658 {
00659 d->m_khtml->browserExtension()->createNewWindow(d->m_imageURL);
00660 }
00661
00662
void KHTMLPopupGUIClient::slotReloadFrame()
00663 {
00664
KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
00665 args.
reload =
true;
00666 args.
metaData()[
"referrer"] = d->m_khtml->pageReferrer();
00667
00668 d->m_khtml->closeURL();
00669 d->m_khtml->browserExtension()->setURLArgs( args );
00670 d->m_khtml->openURL( d->m_khtml->url() );
00671 }
00672
00673
void KHTMLPopupGUIClient::slotFrameInWindow()
00674 {
00675
KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
00676 args.
metaData()[
"referrer"] = d->m_khtml->pageReferrer();
00677 args.
metaData()[
"forcenewwindow"] =
"true";
00678 emit d->m_khtml->browserExtension()->createNewWindow( d->m_khtml->url(), args );
00679 }
00680
00681
void KHTMLPopupGUIClient::slotFrameInTop()
00682 {
00683
KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
00684 args.
metaData()[
"referrer"] = d->m_khtml->pageReferrer();
00685 args.
frameName =
"_top";
00686 emit d->m_khtml->browserExtension()->openURLRequest( d->m_khtml->url(), args );
00687 }
00688
00689
void KHTMLPopupGUIClient::slotFrameInTab()
00690 {
00691
KParts::URLArgs args( d->m_khtml->browserExtension()->urlArgs() );
00692 args.
metaData()[
"referrer"] = d->m_khtml->pageReferrer();
00693 args.
setNewTab(
true);
00694 emit d->m_khtml->browserExtension()->createNewWindow( d->m_khtml->url(), args );
00695 }
00696
00697
void KHTMLPopupGUIClient::saveURL(
QWidget *parent,
const QString &caption,
00698
const KURL &url,
00699
const QMap<QString, QString> &metadata,
00700
const QString &filter,
long cacheId,
00701
const QString & suggestedFilename )
00702 {
00703
QString name = QString::fromLatin1(
"index.html" );
00704
if ( !suggestedFilename.isEmpty() )
00705
name = suggestedFilename;
00706
else if ( !url.
fileName().isEmpty() )
00707
name = url.
fileName();
00708
00709
KURL destURL;
00710
int query;
00711
do {
00712 query = KMessageBox::Yes;
00713 destURL =
KFileDialog::getSaveURL( name, filter, parent, caption );
00714
if( destURL.
isLocalFile() )
00715 {
00716
QFileInfo info( destURL.
path() );
00717
if( info.exists() ) {
00718
00719 query =
KMessageBox::warningYesNo( parent, i18n(
"A file named \"%1\" already exists. " "Are you sure you want to overwrite it?" ).arg( info.fileName() ), i18n(
"Overwrite File?" ), i18n(
"Overwrite" ),
KStdGuiItem::cancel() );
00720 }
00721 }
00722 }
while ( query == KMessageBox::No );
00723
00724
if ( destURL.
isValid() )
00725 saveURL(url, destURL, metadata, cacheId);
00726 }
00727
00728
void KHTMLPopupGUIClient::saveURL(
const KURL &url,
const KURL &destURL,
00729
const QMap<QString, QString> &metadata,
00730
long cacheId )
00731 {
00732
if ( destURL.
isValid() )
00733 {
00734
bool saved =
false;
00735
if (
KHTMLPageCache::self()->
isComplete(cacheId))
00736 {
00737
if (destURL.
isLocalFile())
00738 {
00739
KSaveFile destFile(destURL.
path());
00740
if (destFile.
status() == 0)
00741 {
00742
KHTMLPageCache::self()->
saveData(cacheId, destFile.
dataStream());
00743 saved =
true;
00744 }
00745 }
00746
else
00747 {
00748
00749
KTempFile destFile;
00750
if (destFile.
status() == 0)
00751 {
00752
KHTMLPageCache::self()->
saveData(cacheId, destFile.
dataStream());
00753 destFile.
close();
00754
KURL url2 =
KURL();
00755 url2.
setPath(destFile.
name());
00756
KIO::file_move(url2, destURL, -1,
true );
00757 saved =
true;
00758 }
00759 }
00760 }
00761
if(!saved)
00762 {
00763
00764
00765
00766
00767
bool downloadViaKIO =
true;
00768
if ( !url.
isLocalFile() )
00769 {
00770
KConfig cfg(
"konquerorrc",
false,
false);
00771 cfg.
setGroup(
"HTML Settings");
00772
QString downloadManger = cfg.
readPathEntry(
"DownloadManager");
00773
if (!downloadManger.isEmpty())
00774 {
00775
00776
kdDebug(1000) <<
"Using: "<<downloadManger <<
" as Download Manager" <<
endl;
00777
QString cmd =
KStandardDirs::findExe(downloadManger);
00778
if (cmd.isEmpty())
00779 {
00780
QString errMsg=i18n(
"The Download Manager (%1) could not be found in your $PATH ").arg(downloadManger);
00781
QString errMsgEx= i18n(
"Try to reinstall it \n\nThe integration with Konqueror will be disabled!");
00782
KMessageBox::detailedSorry(0,errMsg,errMsgEx);
00783 cfg.
writePathEntry(
"DownloadManager",QString::null);
00784 cfg.
sync ();
00785 }
00786
else
00787 {
00788 downloadViaKIO =
false;
00789
KURL cleanDest = destURL;
00790 cleanDest.
setPass( QString::null );
00791 cmd +=
" " +
KProcess::quote(url.
url()) +
" " +
00792
KProcess::quote(cleanDest.
url());
00793
kdDebug(1000) <<
"Calling command "<<cmd<<
endl;
00794
KRun::runCommand(cmd);
00795 }
00796 }
00797 }
00798
00799
if ( downloadViaKIO )
00800 {
00801
KIO::Job *job =
KIO::file_copy( url, destURL, -1,
true );
00802 job->
setMetaData(metadata);
00803 job->
addMetaData(
"MaxCacheSize",
"0");
00804 job->
addMetaData(
"cache",
"cache");
00805 job->
setAutoErrorHandlingEnabled(
true );
00806 }
00807 }
00808 }
00809 }
00810
00811 KHTMLPartBrowserHostExtension::KHTMLPartBrowserHostExtension(
KHTMLPart *part )
00812 : KParts::BrowserHostExtension( part )
00813 {
00814 m_part = part;
00815 }
00816
00817 KHTMLPartBrowserHostExtension::~KHTMLPartBrowserHostExtension()
00818 {
00819 }
00820
00821
QStringList KHTMLPartBrowserHostExtension::frameNames()
const
00822
{
00823
return m_part->
frameNames();
00824 }
00825
00826
const QPtrList<KParts::ReadOnlyPart> KHTMLPartBrowserHostExtension::frames()
const
00827
{
00828
return m_part->frames();
00829 }
00830
00831
bool KHTMLPartBrowserHostExtension::openURLInFrame(
const KURL &url,
const KParts::URLArgs &urlArgs )
00832 {
00833
return m_part->openURLInFrame( url, urlArgs );
00834 }
00835
00836
void KHTMLPartBrowserHostExtension::virtual_hook(
int id,
void *data )
00837 {
00838
if (
id == VIRTUAL_FIND_FRAME_PARENT)
00839 {
00840 FindFrameParentParams *param = static_cast<FindFrameParentParams*>(data);
00841
KHTMLPart *parentPart = m_part->findFrameParent(param->callingPart, param->frame);
00842
if (parentPart)
00843 param->parent = parentPart->
browserHostExtension();
00844
return;
00845 }
00846 BrowserHostExtension::virtual_hook(
id, data );
00847 }
00848
00849
00850
00851
extern const int KDE_NO_EXPORT fastZoomSizes[];
00852
extern const int KDE_NO_EXPORT fastZoomSizeCount;
00853
00854
00855 KHTMLZoomFactorAction::KHTMLZoomFactorAction(
KHTMLPart *part,
bool direction,
const QString &text,
const QString &icon,
const QObject *receiver,
const char *slot,
QObject *parent,
const char *name )
00856 :
KAction( text, icon, 0, receiver, slot, parent,
name )
00857 {
00858 init(part, direction);
00859 }
00860
00861 KHTMLZoomFactorAction::KHTMLZoomFactorAction(
KHTMLPart *part,
bool direction,
const QString &text,
const QString &icon,
const KShortcut &cut,
const QObject *receiver,
const char *slot,
QObject *parent,
const char *name )
00862 :
KAction( text, icon,
cut, receiver, slot, parent,
name )
00863 {
00864 init(part, direction);
00865 }
00866
00867
void KHTMLZoomFactorAction::init(
KHTMLPart *part,
bool direction)
00868 {
00869 m_direction = direction;
00870 m_part = part;
00871
00872 m_popup =
new QPopupMenu;
00873 m_popup->insertItem( i18n(
"Default Font Size (100%)" ) );
00874
00875
int m = m_direction ? 1 : -1;
00876
int ofs = fastZoomSizeCount / 2;
00877
00878
00879
for (
int i = m; i != m*(ofs+1); i += m )
00880 {
00881
int num = i * m;
00882
QString numStr = QString::number( num );
00883
if ( num > 0 ) numStr.prepend(
'+' );
00884
00885 m_popup->insertItem( i18n(
"%1%" ).arg( fastZoomSizes[ofs + i] ) );
00886 }
00887
00888 connect( m_popup, SIGNAL( activated(
int ) ),
this, SLOT( slotActivated(
int ) ) );
00889 }
00890
00891 KHTMLZoomFactorAction::~KHTMLZoomFactorAction()
00892 {
00893
delete m_popup;
00894 }
00895
00896
int KHTMLZoomFactorAction::plug(
QWidget *w,
int index )
00897 {
00898
int containerId =
KAction::plug( w, index );
00899
if ( containerId == -1 || !w->inherits(
"KToolBar" ) )
00900
return containerId;
00901
00902
KToolBarButton *button = static_cast<KToolBar *>( w )->getButton( itemId( containerId ) );
00903
if ( !button )
00904
return containerId;
00905
00906 button->
setDelayedPopup( m_popup );
00907
return containerId;
00908 }
00909
00910
void KHTMLZoomFactorAction::slotActivated(
int id )
00911 {
00912
int idx = m_popup->indexOf(
id );
00913
00914
if (idx == 0)
00915 m_part->setZoomFactor(100);
00916
else
00917 m_part->setZoomFactor(fastZoomSizes[fastZoomSizeCount/2 + (m_direction ? 1 : -1)*idx]);
00918 }
00919
00920
#include "khtml_ext.moc"
00921