📄 document.cpp.svn-base
字号:
page_rects.clear(); foreachObserver( notifyVisibleRectsChanged() ); // reset internal variables d->viewportHistory.clear(); d->viewportHistory.append( DocumentViewport() ); d->viewportIterator = d->viewportHistory.begin(); d->allocatedPixmapsTotalMemory = 0;}void KPDFDocument::addObserver( DocumentObserver * pObserver ){ // keep the pointer to the observer in a map d->observers[ pObserver->observerId() ] = pObserver; // if the observer is added while a document is already opened, tell it if ( !pages_vector.isEmpty() ) { pObserver->notifySetup( pages_vector, true ); pObserver->notifyViewportChanged( false /*disables smoothMove*/ ); }}void KPDFDocument::notifyObservers (NotifyRequest * request){ switch (request->type) { case DocumentObserver::Setup: foreachObserver( notifySetup( pages_vector, request->toggle ) ); break; case DocumentObserver::Viewport: foreachObserver( notifyViewportChanged( request->toggle ) ); break; case DocumentObserver::Page: foreachObserver( notifyPageChanged( request->page, request->flags ) ); break; case DocumentObserver::Contents: foreachObserver( notifyContentsCleared( request->flags ) ); break; case DocumentObserver::VisibleAreas: qDeleteAll(page_rects); page_rects = request->rects; foreachObserver( notifyVisibleRectsChanged() ); break; }}void KPDFDocument::removeObserver( DocumentObserver * pObserver ){ // remove observer from the map. it won't receive notifications anymore if ( d->observers.contains( pObserver->observerId() ) ) { // free observer's pixmap data int observerId = pObserver->observerId(); QVector<KPDFPage*>::iterator it = pages_vector.begin(), end = pages_vector.end(); for ( ; it != end; ++it ) (*it)->deletePixmap( observerId ); // [MEM] free observer's allocation descriptors QLinkedList< AllocatedPixmap * >::iterator aIt = d->allocatedPixmapsFifo.begin(); QLinkedList< AllocatedPixmap * >::iterator aEnd = d->allocatedPixmapsFifo.end(); while ( aIt != aEnd ) { AllocatedPixmap * p = *aIt; if ( p->id == observerId ) { aIt = d->allocatedPixmapsFifo.erase( aIt ); delete p; } else ++aIt; } // delete observer entry from the map d->observers.remove( observerId ); }}void KPDFDocument::reparseConfig(){ // reparse generator config and if something changed clear KPDFPages if ( generator && generator->reparseConfig() ) { // invalidate pixmaps QVector<KPDFPage*>::iterator it = pages_vector.begin(), end = pages_vector.end(); for ( ; it != end; ++it ) (*it)->deletePixmapsAndRects(); // [MEM] remove allocation descriptors QLinkedList< AllocatedPixmap * >::iterator aIt = d->allocatedPixmapsFifo.begin(); QLinkedList< AllocatedPixmap * >::iterator aEnd = d->allocatedPixmapsFifo.end(); for ( ; aIt != aEnd; ++aIt ) delete *aIt; d->allocatedPixmapsFifo.clear(); d->allocatedPixmapsTotalMemory = 0; // send reload signals to observers foreachObserver( notifyContentsCleared( DocumentObserver::Pixmap ) ); } // free memory if in 'low' profile if ( KpdfSettings::memoryLevel() == KpdfSettings::EnumMemoryLevel::Low && !d->allocatedPixmapsFifo.isEmpty() && !pages_vector.isEmpty() ) cleanupPixmapMemory();}bool KPDFDocument::isOpened() const{ return generator;}bool KPDFDocument::handleEvent( QEvent * event ){ return generator ? generator->handleEvent( event ) : true;}bool KPDFDocument::canConfigurePrinter( ) const{ return generator ? generator->canConfigurePrinter() : false;}const DocumentInfo * KPDFDocument::documentInfo() const{ return generator ? generator->generateDocumentInfo() : NULL;}const DocumentSynopsis * KPDFDocument::documentSynopsis() const{ return generator ? generator->generateDocumentSynopsis() : NULL;}const DocumentFonts * KPDFDocument::documentFonts() const{ return generator ? generator->generateDocumentFonts() : NULL;}const QList<EmbeddedFile*> *KPDFDocument::embeddedFiles() const{ return generator ? generator->embeddedFiles() : NULL;}const KPDFPage * KPDFDocument::page( int n ) const{ return ( n < pages_vector.count() ) ? pages_vector[n] : 0;}const DocumentViewport & KPDFDocument::viewport() const{ return (*d->viewportIterator);}const QVector< VisiblePageRect * > & KPDFDocument::visiblePageRects() const{ return page_rects;}void KPDFDocument::setVisiblePageRects( const QVector< VisiblePageRect * > & visiblePageRects, int excludeId ){ QVector< VisiblePageRect * >::iterator vIt = page_rects.begin(); QVector< VisiblePageRect * >::iterator vEnd = page_rects.end(); for ( ; vIt != vEnd; ++vIt ) delete *vIt; page_rects = visiblePageRects; // notify change to all other (different from id) observers QMap< int, DocumentObserver * >::iterator it = d->observers.begin(), end = d->observers.end(); for ( ; it != end ; ++ it ) if ( it.key() != excludeId ) (*it)->notifyVisibleRectsChanged();}uint KPDFDocument::currentPage() const{ return (*d->viewportIterator).pageNumber;}uint KPDFDocument::pages() const{ return pages_vector.size();}KUrl KPDFDocument::currentDocument() const{ return d->url;}bool KPDFDocument::isAllowed( int flags ) const{ return generator ? generator->isAllowed( flags ) : false;}bool KPDFDocument::supportsSearching() const{ return generator ? generator->supportsSearching() : false;}bool KPDFDocument::supportsRotation() const{ return generator ? generator->supportsRotation() : false;}bool KPDFDocument::supportsPaperSizes() const{ return generator ? generator->supportsPaperSizes() : false;}QStringList KPDFDocument::paperSizes() const{ return generator ? generator->paperSizes() : QStringList();}bool KPDFDocument::canExportToText() const{ return generator ? generator->canExportToText() : false;}bool KPDFDocument::exportToText( const QString& fileName ) const{ return generator ? generator->exportToText( fileName ) : false;}QList<ExportEntry*> KPDFDocument::exportFormats() const{ return generator ? generator->exportFormats() : QList<ExportEntry*>();}bool KPDFDocument::exportTo( const QString& fileName, const KMimeType::Ptr& mime ) const{ return generator ? generator->exportTo( fileName, mime ) : false;}bool KPDFDocument::historyAtBegin() const{ return d->viewportIterator == d->viewportHistory.begin();}bool KPDFDocument::historyAtEnd() const{ return d->viewportIterator == --(d->viewportHistory.end());}QString KPDFDocument::getMetaData( const QString & key, const QString & option ) const{ return generator ? generator->getMetaData( key, option ) : QString();}int KPDFDocument::rotation() const{ return d->rotation;}void KPDFDocument::requestPixmaps( const QLinkedList< PixmapRequest * > & requests ){ if ( !generator ) { // delete requests.. QLinkedList< PixmapRequest * >::const_iterator rIt = requests.begin(), rEnd = requests.end(); for ( ; rIt != rEnd; ++rIt ) delete *rIt; // ..and return return; } // 1. [CLEAN STACK] remove previous requests of requesterID int requesterID = requests.first()->id; QLinkedList< PixmapRequest * >::iterator sIt = d->pixmapRequestsStack.begin(), sEnd = d->pixmapRequestsStack.end(); while ( sIt != sEnd ) { if ( (*sIt)->id == requesterID ) { // delete request and remove it from stack delete *sIt; sIt = d->pixmapRequestsStack.erase( sIt ); } else ++sIt; } // 2. [ADD TO STACK] add requests to stack bool threadingDisabled = !KpdfSettings::enableThreading(); QLinkedList< PixmapRequest * >::const_iterator rIt = requests.begin(), rEnd = requests.end(); for ( ; rIt != rEnd; ++rIt ) { // set the 'page field' (see PixmapRequest) and check if it is valid PixmapRequest * request = *rIt; kWarning() << "request id=" << request->id << " " <<request->width << "x" << request->height << "@" << request->pageNumber << endl; if ( !(request->page = pages_vector[ request->pageNumber ]) ) { // skip requests referencing an invalid page (must not happen) delete request; continue; } request->documentRotation = d->rotation; if ( !request->async ) request->priority = 0; if ( request->async && threadingDisabled ) request->async = false; // add request to the 'stack' at the right place if ( !request->priority ) // add priority zero requests to the top of the stack d->pixmapRequestsStack.append( request ); else { // insert in stack sorted by priority sIt = d->pixmapRequestsStack.begin(); sEnd = d->pixmapRequestsStack.end(); while ( sIt != sEnd && (*sIt)->priority >= request->priority ) ++sIt; d->pixmapRequestsStack.insert( sIt, request ); } } // 3. [START FIRST GENERATION] if <NO>generator is ready, start a new generation, // or else (if gen is running) it will be started when the new contents will //come from generator (in requestDone())</NO> // all handling of requests put into sendGeneratorRequest // if ( generator->canGeneratePixmap() ) sendGeneratorRequest();}void KPDFDocument::requestTextPage( uint page ){ KPDFPage * kp = pages_vector[ page ]; if ( !generator || !kp ) return; // Memory management for TextPages generator->generateSyncTextPage( kp );}void KPDFDocument::addPageAnnotation( int page, Annotation * annotation ){ // find out the page to attach annotation KPDFPage * kp = pages_vector[ page ]; if ( !generator || !kp ) return; // add annotation to the page kp->addAnnotation( annotation ); // notify observers about the change foreachObserver( notifyPageChanged( page, DocumentObserver::Annotations ) );}void KPDFDocument::modifyPageAnnotation( int page, Annotation * newannotation ){ //TODO: modify annotations // find out the page KPDFPage * kp = pages_vector[ page ]; if ( !generator || !kp ) return; kp->modifyAnnotation( newannotation ); // notify observers about the change foreachObserver( notifyPageChanged( page, DocumentObserver::Annotations ) );}void KPDFDocument::removePageAnnotation( int page, Annotation * annotation ){ // find out the page KPDFPage * kp = pages_vector[ page ]; if ( !generator || !kp ) return; kp->removeAnnotation( annotation ); // notify observers about the change foreachObserver( notifyPageChanged( page, DocumentObserver::Annotations ) );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -