📄 html.cpp
字号:
// KFM Extension if ( !cellDown( _ke->state() & ShiftButton ? true : false ) ) { if ( docHeight() < height() ) break; int newY = y_offset + 20; if ( newY > docHeight() - height() ) newY = docHeight() - height(); slotScrollVert( newY ); emit scrollVert( newY ); } flushKeys(); } break; case Key_Next: { if ( docHeight() < height() ) break; int newY = y_offset + height() - 20; if ( newY > docHeight() - height() ) newY = docHeight() - height(); slotScrollVert( newY ); emit scrollVert( newY ); flushKeys(); } break; case Key_Up: { // KFM Extension if ( _ke->state() & AltButton ) { emit goUp(); } // KFM Extension else if ( !cellUp( _ke->state() & ShiftButton ? true : false ) ) { if ( docHeight() < height() ) break; int newY = y_offset - 20; if ( newY < 0 ) newY = 0; slotScrollVert( newY ); emit scrollVert( newY ); } flushKeys(); } break; case Key_Prior: { if ( docHeight() < height() ) break; int newY = y_offset - height() + 20; if ( newY < 0 ) newY = 0; slotScrollVert( newY ); emit scrollVert( newY ); flushKeys(); } break; case Key_Right: { // KFM Extension if ( _ke->state() & AltButton ) { emit goRight(); } // KFM Extension else if ( !cellRight( _ke->state() & ShiftButton ? true : false ) ) { if ( docWidth() < width() ) break; int newX = x_offset + 20; if ( newX > docWidth() - width() ) newX = docWidth() - width(); slotScrollHorz( newX ); emit scrollHorz( newX ); } flushKeys(); } break; case Key_Left: { // KFM Extension if ( _ke->state() & AltButton ) { emit goLeft(); } // KFM Extension else if ( !cellLeft( _ke->state() & ShiftButton ? true : false ) ) { if ( docWidth() < width() ) break; int newX = x_offset - 20; if ( newX < 0 ) newX = 0; slotScrollHorz( newX ); emit scrollHorz( newX ); } flushKeys(); } break; default: // KFM Extension if ( _ke->ascii() > 0 ) { QString saved (currentKeySeq); flushKeys(); currentKeySeq = saved.copy() + (char) _ke->ascii(); cellSequenceChanged(); } else KDNDWidget::keyPressEvent( _ke ); }}// Little routine from Alessandro Russo to flush extra keypresses from// the event queuevoid KHTMLWidget::flushKeys(){ XEvent ev_return; Display *dpy = qt_xdisplay(); while ( XCheckTypedEvent( dpy, KeyPress, &ev_return ) ); currentKeySeq = "";}void KHTMLWidget::paintSingleObject( HTMLObject *_obj ){ bool newPainter = FALSE;// if ( parsing )// return; if ( clue == 0 ) return; if ( painter == 0 ) { painter = new QPainter; painter->begin( this ); newPainter = TRUE; } int absx, absy; if ( ( absx = _obj->getAbsX() ) >= 0 ) { absy = _obj->getAbsY();/* drawBackground( x_offset, y_offset, absx - x_offset + leftBorder, absy - y_offset + topBorder, _obj->getWidth(), _obj->getHeight() );*/ _obj->print( painter, absx - x_offset + leftBorder - _obj->getXPos(), absy - y_offset + topBorder - (_obj->getYPos()-_obj->getAscent()) ); } else { int tx = -x_offset + leftBorder; int ty = -y_offset + topBorder; clue->print( painter, _obj, x_offset, y_offset, width(), height(), tx, ty ); } if ( newPainter ) { painter->end(); delete painter; painter = 0; }}void KHTMLWidget::paint( HTMLChain *_chain, int x, int y, int w, int h ){ bool newPainter = FALSE; if ( clue == 0 ) return; _chain->first(); if ( _chain->current() ) { if ( painter == 0 ) { painter = new QPainter; painter->begin( this ); newPainter = TRUE; } int tx = -x_offset + leftBorder; int ty = -y_offset + topBorder; bool db = bDrawBackground; bDrawBackground = true; drawBackground( x_offset, y_offset, x, y, w, h ); bDrawBackground = db; _chain->current()->print( painter, _chain, x + x_offset - leftBorder, y + y_offset - topBorder, w, h, tx, ty ); if ( newPainter ) { painter->end(); delete painter; painter = 0; } }}void KHTMLWidget::scheduleUpdate( bool clear ){ if ( clear ) bDrawBackground = true; if ( !updateTimer.isActive() ) { bDrawBackground = clear; updateTimer.start( 100, true ); }}void KHTMLWidget::slotUpdate(){ repaint( false ); // If we aren't parsing anymore then the background should always be // drawn. if ( !parsing ) bDrawBackground = true;}void KHTMLWidget::calcAbsolutePos(){ if ( clue ) clue->calcAbsolutePos( 0, 0 );}void KHTMLWidget::getSelected( QStrList &_list ){ if ( clue == 0 ) return; clue->getSelected( _list );}void KHTMLWidget::getSelectedText( QString &_str ){ if ( clue == 0 ) return; clue->getSelectedText( _str );}// Print the current document to the printer.// This currently prints the entire document without releasing control// to the event loop. This isn't a problem for small documents, but// may be annoying for very large documents. If this is changed in// the future, it should be noted that this widget CANNOT be redrawn// while it is printing as its layout is recalculated to suit the paper// size it is being printed on.//void KHTMLWidget::print(){ float scalers[] = { 1.1, 1.0, 0.9, 0.75, 0.6, 0.4 }; QPrinter printer; if ( printer.setup( 0 ) ) { bool newPainter = false; int pgWidth = 595, pgHeight = 842; switch ( printer.pageSize() ) { case QPrinter::A4: pgWidth = 595; pgHeight = 842; break; case QPrinter::B5: pgWidth = 516; pgHeight = 729; break; case QPrinter::Letter: pgWidth = 612; pgHeight = 792; break; case QPrinter::Legal: pgWidth = 612; pgHeight = 1008; break; case QPrinter::Executive: pgWidth = 540; pgHeight = 720; break; default: assert( 0 ); } if ( printer.orientation() == QPrinter::Landscape ) { int tmp = pgWidth; pgWidth = pgHeight; pgHeight = tmp; } pgWidth -= ( 2*PRINTING_MARGIN ); pgHeight -= ( 2*PRINTING_MARGIN ); pgWidth = (int) ((float)pgWidth / scalers[ settings->fontBaseSize ] ); pgHeight = (int) ((float)pgHeight / scalers[ settings->fontBaseSize ] ); int margin = (int)((float)PRINTING_MARGIN / scalers[ settings->fontBaseSize ] ); QPainter prPainter; prPainter.begin( &printer ); prPainter.scale( scalers[ settings->fontBaseSize ], scalers[ settings->fontBaseSize ] ); clue->recalcBaseSize( &prPainter ); clue->reset(); clue->setMaxWidth( pgWidth ); clue->calcSize(); clue->setPos( 0, clue->getAscent() ); calcAbsolutePos(); unsigned numBreaks = 1; int pos = 0; QArray<int> breaks( 10 ); breaks[0] = 0; do { debugM( "Break pos = %d\n", pos ); pos = clue->findPageBreak( pos + pgHeight ); if ( pos >= 0 ) { breaks[ numBreaks ] = pos; numBreaks++; if ( numBreaks == breaks.size() ) breaks.resize( numBreaks + 10 ); } } while ( pos > 0 ); for ( unsigned b = 0; b < numBreaks; b++ ) { int printHeight; if ( b < numBreaks - 1 ) printHeight = breaks[b+1] - breaks[b]; else printHeight = pgHeight; clue->print( &prPainter, 0, breaks[b], pgWidth, printHeight, margin, margin-breaks[b], true ); if ( b < numBreaks - 1 ) { printer.newPage(); } } prPainter.end(); if ( painter == 0 ) { painter = new QPainter; painter->begin( this ); newPainter = TRUE; } clue->recalcBaseSize( painter ); calcSize(); calcAbsolutePos(); if ( newPainter ) { painter->end(); delete painter; painter = 0; } }}void KHTMLWidget::setBaseURL( const char *_url){ baseURL = _url; baseURL.setReference( 0 ); baseURL.setSearchPart( 0 ); QString p = baseURL.httpPath(); if ( p.length() > 0 ) { int pos = p.findRev( '/' ); if ( pos >= 0 ) if(p.findRev('.') > pos) p.truncate( pos ); } p += "/"; baseURL.setPath( p );}void KHTMLWidget::begin( const char *_url, int _x_offset, int _y_offset ){ emit documentStarted(); bIsFrameSet = FALSE; // bIsFrame = FALSE; bFramesComplete = FALSE; bInNoframes = false; framesetStack.clear(); framesetList.clear(); frameList.clear(); freeBlock(); /* Clear the block stack */ if ( bIsTextSelected ) { bIsTextSelected = false; emit textSelected( false ); } if ( frameSet ) { delete frameSet; frameSet = 0; } x_offset = _x_offset; y_offset = _y_offset; // small hack to get positioning of pages working with restore() if( initialXPos ) x_offset = initialXPos; if( initialYPos ) y_offset = initialYPos; emit scrollHorz( x_offset ); emit scrollVert( y_offset ); bgPixmapURL = 0; stopParser(); reference = 0; if ( _url != 0 ) { actualURL = _url; reference = actualURL.reference(); setBaseURL( _url); // Set a default title KURL title(_url); title.setReference(0); title.setSearchPart(0); emit setTitle( title.url().data() ); } else { emit setTitle( "* Unknown *" ); } baseTarget = ""; if ( stringTok ) delete stringTok; stringTok = new StringTokenizer; if ( ht != 0 ) delete ht; ht = new HTMLTokenizer( this ); ht->begin(); writing = true;}void KHTMLWidget::write( const char *_str){ if ( _str == 0 ) return; ht->write( _str ); // If the timer has been stopped while waiting for more html, // start it again. if ( parsing && timerId == 0 ) timerId = startTimer( TIMER_INTERVAL );}void KHTMLWidget::end(){ writing = false; if ( ht ) ht->end();}// changes a current font// needed for headings, and whenever the font family change is necesseryvoid KHTMLWidget::selectFont( const char *_fontfamily, int _fontsize, int _weight, bool _italic ){ if ( _fontsize < 0 ) _fontsize = 0; else if ( _fontsize >= MAXFONTSIZES ) _fontsize = MAXFONTSIZES - 1; HTMLFont f( _fontfamily, _fontsize, settings->fontSizes, _weight, _italic, settings->charset); f.setUnderline( underline ); f.setStrikeOut( strikeOut ); f.setTextColor( *(colorStack.top()) ); const HTMLFont *fp = pFontManager->getFont( f ); font_stack.push( fp ); painter->setFont( *(font_stack.top()) );}void KHTMLWidget::selectFont( int _relative_font_size ){ int fontsize = settings->fontBaseSize + _relative_font_size; if ( !currentFont() ) { fontsize = settings->fontBaseSize; debug( "aarrrgh - no font" ); } if ( fontsize < 0 ) fontsize = 0; else if ( fontsize >= MAXFONTSIZES ) fontsize = MAXFONTSIZES - 1; HTMLFont f( font_stack.top()->family(), fontsize, settings->fontSizes, weight, italic, font_stack.top()->charset() ); f.setUnderline( underline ); f.setStrikeOut( strikeOut ); f.setTextColor( *(colorStack.top()) ); const HTMLFont *fp = pFontManager->getFont( f ); font_stack.push( fp ); painter->setFont( *(font_stack.top()) );}void KHTMLWidget::selectFont(){ int fontsize; if ( currentFont() ) fontsize = currentFont()->size(); else { fontsize = settings->fontBaseSize; debug( "aarrrgh - no font" ); assert(0); } HTMLFont f( font_stack.top()->family(), fontsize, settings->fontSizes, weight, italic, font_stack.top()->charset() ); f.setUnderline( underline );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -