📄 mghtml_part.cpp
字号:
bool MGHTMLPart::restoreURL( const KURL &url ){// d->m_redirectionTimer.stop();// kdDebug( 6050 ) << "closing old URL" << endl; closeURL(); d->m_bComplete = false; d->m_workingURL = url; // set the java(script) flags according to the current host.// d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host()); d->m_bJScriptEnabled = false;// d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host()); d->m_bJavaEnabled = false; m_url = url;// KHTMLPageCache::self()->fetchData( d->m_cacheId, this, SLOT(slotRestoreData(const QByteArray &)));// emit started( 0L ); slotChildStarted(0L); return true;}void MGHTMLPart::checkCompleted(){ int requests = 0; ConstFrameIt it = d->m_frames.begin(); ConstFrameIt end = d->m_frames.end(); for (; it != end; ++it ) if ( !(*it).m_bCompleted ) return;// requests = khtml::Cache::loader()->numRequests( m_url.url() ); //kdDebug( 6060 ) << "number of loader requests: " << requests << endl;// if ( requests > 0 )// return; if ( d->m_bParsing || d->m_bComplete ) return; d->m_bComplete = true;// if (!parentPart())// emit setStatusBarText(i18n("Done."));// if ( !d->m_redirectURL.isEmpty() )// d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );// if ( !d->m_redirectURL.isEmpty() ) { return; // We don't emit completed as long as we have a redirection pending. // We might want to add a message to the statusbar when we are not i18n-frozen. }// emit completed(); updateActions();}void MGHTMLPart::slotChildStarted( KIO::Job *job ) // !!!!! modify job{ khtml::ChildFrame *child = frame( sender() ); assert( child ); child->m_bCompleted = false; if ( d->m_bComplete ) {#if 0 // WABA: Looks like this belongs somewhere else if ( !parentPart() ) { emit d->m_extension->openURLNotify(); // !!!!! modify it }#endif d->m_bComplete = false;// emit started( job ); slotChildStarted(job); }}void MGHTMLPart::slotChildCompleted(){ khtml::ChildFrame *child = frame( sender() ); assert( child ); child->m_bCompleted = true; child->m_args = KParts::URLArgs(); checkCompleted();}void MGHTMLPart::updateFontSize( int add ){ resetFontSizes(); QValueList<int> sizes = fontSizes(); QValueList<int>::Iterator it = sizes.begin(); QValueList<int>::Iterator end = sizes.end(); for (; it != end; ++it ) (*it) += add; setFontSizes( sizes );// QApplication::setOverrideCursor( waitCursor ); if(d->m_doc) d->m_doc->applyChanges();// QApplication::restoreOverrideCursor();}void MGHTMLPart::slotIncFontSizes(){ updateFontSize( ++d->m_fontBase ); if ( !d->m_paDecFontSizes->isEnabled() ) d->m_paDecFontSizes->setEnabled( true );}void MGHTMLPart::slotDecFontSizes(){ if ( d->m_fontBase >= 1 ) updateFontSize( --d->m_fontBase ); if ( d->m_fontBase == 0 ) d->m_paDecFontSizes->setEnabled( false );}void MGHTMLPart::slotFinishedParsing(){ d->m_bParsing = false; d->m_doc->close();// disconnect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing())); if (!d->m_view) return; d->m_view->restoreScrollBar(); if ( !m_url.htmlRef().isEmpty() ) gotoAnchor( m_url.htmlRef() ); else if (d->m_view->contentsY()==0) // check that the view has not been moved by the use {// d->m_view->setContentsPos( d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset ); d->m_view->setContentsPos(0, 0); } HTMLCollectionImpl imgColl( d->m_doc, HTMLCollectionImpl::DOC_IMAGES ); d->m_totalImageCount = 0; KURL::List imageURLs; unsigned long i = 0; unsigned long len = imgColl.length(); for (; i < len; i++ ) { NodeImpl *node = imgColl.item( i ); if ( node->id() != ID_IMG ) continue; QString imgURL = static_cast<DOM::ElementImpl *>( node )->getAttribute( ATTR_SRC ).string(); KURL url; if ( KURL::isRelativeURL( imgURL ) ) url = completeURL( imgURL ); else url = KURL( imgURL ); if ( !imageURLs.contains( url ) ) { d->m_totalImageCount++; imageURLs.append( url ); } } checkCompleted();}void MGHTMLPart::slotLoaderRequestDone(const DOM::DOMString &baseURL, khtml::CachedObject *obj ){ if ( baseURL != m_url.url() ) return; if (obj && obj->type() == khtml::CachedObject::Image && !d->m_bParsing ) // !!!!! user our method { d->m_loadedImages++;// if ( d->m_loadedImages <= d->m_totalImageCount )// emit d->m_extension->infoMessage(i18n( "%1 of %2 Images loaded").arg(d->m_loadedImages).arg(d->m_totalImageCount)); } checkCompleted();}//--------------------- modified completely ----------------------------------------*///----------------------ignore these functions now ---------------------------------/*void MGHTMLPart::slotSetEncoding(){ if(d->m_paSetEncoding->currentItem() == 0) setEncoding(QString::null, false); else setEncoding(d->m_paSetEncoding->currentText(), true);}bool MGHTMLPart::setEncoding( const QString &name, bool override ){ d->m_encoding = name; d->m_haveEncoding = override; if(!d->m_settings->charset() == QFont::Unicode) d->m_settings->setCharset( KGlobal::charsets()->charsetForEncoding(name) ); if( !m_url.isEmpty() ) { closeURL(); KURL url = m_url; m_url = 0; openURL(url); } return true;}KJSProxy *MGHTMLPart::jScript(){ if ( d->m_bJScriptOverride && !d->m_bJScriptForce || !d->m_bJScriptOverride && !d->m_bJScriptEnabled) return 0; if ( !d->m_jscript ) { KLibrary *lib = KLibLoader::self()->library("kjs_html"); if ( !lib ) return 0; void *sym = lib->symbol("kjs_html_init"); if ( !sym ) { delete lib; return 0; } typedef KJSProxy* (*initFunction)(KHTMLPart *); initFunction initSym = (initFunction) sym; d->m_jscript = (*initSym)(this); d->m_kjs_lib = lib; kjs_lib_count++; } return d->m_jscript;}KJavaAppletContext *MGHTMLPart::javaContext(){ return d->m_javaContext;}KJavaAppletContext *MGHTMLPart::createJavaContext(){ if ( !d->m_javaContext ) { d->m_javaContext = new KJavaAppletContext(); connect( d->m_javaContext, SIGNAL(showStatus(const QString&)), this, SIGNAL(setStatusBarText(const QString&)) ); connect( d->m_javaContext, SIGNAL(showDocument(const QString&, const QString&)), this, SLOT(slotShowDocument(const QString&, const QString&)) ); } return d->m_javaContext;}KParts::BrowserExtension *MGHTMLPart::browserExtension() const{ return d->m_extension;}void MGHTMLPart::popupMenu( const QString &url ){ KURL u( m_url ); if ( !url.isEmpty() ) u = KURL( m_url, url ); mode_t mode = S_IFDIR; KXMLGUIClient *client = new KHTMLPopupGUIClient( this, d->m_popupMenuXML, url.isEmpty() ? KURL() : u ); emit d->m_extension->popupMenu( client, QCursor::pos(), u, QString::fromLatin1( "text/html" ), mode ); delete client; emit popupMenu(url, QCursor::pos());}void MGHTMLPart::slotFind(){ KHTMLPart *part = this; f ( d->m_frames.count() > 0 ) part = static_cast<KHTMLPart *>( partManager()->activePart() ); assert( part->inherits( "KHTMLPart" ) ); assert( d->m_findDialog == 0 ); KHTMLFind *findDlg = new KHTMLFind( part, part->widget(), "khtmlfind" ); findDlg->setText( part->d->m_lastFindState.text ); findDlg->setCaseSensitive( part->d->m_lastFindState.caseSensitive ); findDlg->setDirection( part->d->m_lastFindState.direction ); findDlg->show(); connect( findDlg, SIGNAL( done() ), this, SLOT( slotFindDone() ) ); connect( findDlg, SIGNAL( destroyed() ), this, SLOT( slotFindDialogDestroyed() ) ); d->m_findDialog = findDlg; d->m_paFind->setEnabled( false );}void MGHTMLPart::slotFindDone(){ assert( d->m_findDialog ); KHTMLPart *part = d->m_findDialog->part(); part->d->m_lastFindState.text = d->m_findDialog->getText(); part->d->m_lastFindState.caseSensitive = d->m_findDialog->case_sensitive(); part->d->m_lastFindState.direction = d->m_findDialog->get_direction(); delete d->m_findDialog;}void MGHTMLPart::slotFindDialogDestroyed(){ assert( sender() == d->m_findDialog ); d->m_findDialog = 0; d->m_paFind->setEnabled( true );}void MGHTMLPart::selectAll(){ NodeImpl *first = d->m_doc->body(); NodeImpl *next; while ( first && first->id() != ID_TEXT ) { next = first->firstChild(); if ( !next ) next = first->nextSibling(); while( first && !next ) { first = first->parentNode(); if ( first ) next = first->nextSibling(); } first = next; } NodeImpl *last = d->m_doc->body(); while ( last && last->id() != ID_TEXT ) { next = last->lastChild(); if ( !next ) next = last->previousSibling(); while ( last && !next ) { last = last->parentNode(); if ( last ) next = last->previousSibling(); } last = next; } if ( !first || !last ) return; d->m_selectionStart = first; d->m_startOffset = 0; d->m_selectionEnd = last; d->m_endOffset = static_cast<TextImpl *>( last )->string()->l; d->m_startBeforeEnd = true; d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset, d->m_selectionEnd.handle(), d->m_endOffset ); emitSelectionChanged();}void MGHTMLPart::slotSelectAll(){ KHTMLPart *part = this; if ( d->m_frames.count() > 0 ) part = static_cast<KHTMLPart *>( partManager()->activePart() ); assert( part ); part->selectAll();}void MGHTMLPart::findTextBegin(){ d->m_findPos = -1; d->m_findNode = 0;}bool MGHTMLPart::findTextNext( const QRegExp &exp, bool forward ){ if(!d->m_findNode) d->m_findNode = d->m_doc->body(); if ( !d->m_findNode || d->m_findNode->id() == ID_FRAMESET ) return false; while(1) { if(d->m_findNode->id() == ID_TEXT && d->m_findNode->renderer() ) { DOMStringImpl *t = (static_cast<TextImpl *>(d->m_findNode))->string(); QConstString s(t->s, t->l); d->m_findPos = s.string().find(exp, d->m_findPos+1); if(d->m_findPos != -1) { int x = 0, y = 0; khtml::RenderText *text = static_cast<khtml::RenderText *>(d->m_findNode->renderer()); text->posOfChar(d->m_findPos, x, y); d->m_view->setContentsPos(x-50, y-50); return true; } } d->m_findPos = -1; NodeImpl *next; if ( forward ) { next = d->m_findNode->firstChild(); if(!next) next = d->m_findNode->nextSibling(); while(d->m_findNode && !next) { d->m_findNode = d->m_findNode->parentNode(); if( d->m_findNode ) { next = d->m_findNode->nextSibling(); } } } else { next = d->m_findNode->lastChild(); if (!next ) next = d->m_findNode->previousSibling(); while ( d->m_findNode && !next ) { d->m_findNode = d->m_findNode->parentNode(); if( d->m_findNode ) { next = d->m_findNode->previousSibling(); } } } d->m_findNode = next; if(!d->m_findNode) return false; }}bool MGHTMLPart::findTextNext( const QString &str, bool forward, bool caseSensitive ){ if(!d->m_findNode) d->m_findNode = d->m_doc->body(); if ( !d->m_findNode || d->m_findNode->id() == ID_FRAMESET ) return false; while(1) { if(d->m_findNode->id() == ID_TEXT && d->m_findNode->renderer() ) { DOMStringImpl *t = (static_cast<TextImpl *>(d->m_findNode))->string(); QConstString s(t->s, t->l); d->m_findPos = s.string().find(str, d->m_findPos+1, caseSensitive); if(d->m_findPos != -1) { int x = 0, y = 0; static_cast<khtml::RenderText *>(d->m_findNode->renderer())->posOfChar(d->m_findPos, x, y); d->m_view->setContentsPos(x-50, y-50); d->m_selectionStart = d->m_findNode; d->m_startOffset = d->m_findPos; d->m_selectionEnd = d->m_findNode; d->m_endOffset = d->m_findPos + str.length(); d->m_startBeforeEnd = true; d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset, d->m_selectionEnd.handle(), d->m_endOffset ); emitSelectionChanged(); return true; } } d->m_findPos = -1; NodeImpl *next; if ( forward ) { next = d->m_findNode->firstChild(); if(!next) next = d->m_findNode->nextSibling(); while(d->m_findNode && !next) { d->m_findNode = d->m_findNode->parentNode(); if( d->m_findNode ) { next = d->m_findNode->nextSibling(); } } } else { next = d->m_findNode->lastChild(); if (!next ) next = d->m_findNode->previousSibling(); while ( d->m_findNode && !next ) { d->m_findNode = d->m_findNode->parentNode(); if( d->m_findNode ) { next = d->m_findNode->previousSibling(); } } } d->m_findNode = next; if(!d->m_findNode) return false; }}QString MGHTMLPart::selectedText() const{ QString text; DOM::Node n = d->m_selectionStart; while(!n.isNull()) { if(n.nodeType() == DOM::Node::TEXT_NODE) { QString str = static_cast<TextImpl *>(n.handle())->data().string(); if(n == d->m_selectionStart && n == d->m_selectionEnd) text = str.mid(d->m_startOffset, d->m_endOffset - d->m_startOffset); else if(n == d->m_selectionStart) text = str.mid(d->m_startOffset); else if(n == d->m_selectionEnd) text += str.left(d->m_endOffset); else text += str; } else if(n.elementId() == ID_BR) text += "\n"; else if(n.elementId() == ID_P || n.elementId() == ID_TD) text += "\n\n"; if(n == d->m_selectionEnd) break; DOM::Node next = n.firstChild(); if(next.isNull()) next = n.nextSibling(); while( next.isNull() && !n.parentNode().isNull() )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -