📄 document.cpp.svn-base
字号:
// if /proc/meminfo doesn't exist, return MEMORY FULL QFile memFile( "/proc/meminfo" ); if ( !memFile.open( QIODevice::ReadOnly ) ) return 0; // read /proc/meminfo and sum up the contents of 'MemFree', 'Buffers' // and 'Cached' fields. consider swapped memory as used memory. int memoryFree = 0; QString entry; QTextStream readStream( &memFile ); while ( !readStream.atEnd() ) { entry = readStream.readLine(); if ( entry.startsWith( "MemFree:" ) || entry.startsWith( "Buffers:" ) || entry.startsWith( "Cached:" ) || entry.startsWith( "SwapFree:" ) ) memoryFree += entry.section( ' ', -2, -2 ).toInt(); if ( entry.startsWith( "SwapTotal:" ) ) memoryFree -= entry.section( ' ', -2, -2 ).toInt(); } memFile.close(); return 1024 * memoryFree;#else // tell the memory is full.. will act as in LOW profile return 0;#endif}void KPDFDocument::loadDocumentInfo()// note: load data and stores it internally (document or pages). observers// are still uninitialized at this point so don't access them{ //kDebug() << "Using '" << d->xmlFileName << "' as document info file." << endl; QFile infoFile( d->xmlFileName ); if ( !infoFile.exists() || !infoFile.open( QIODevice::ReadOnly ) ) return; // Load DOM from XML file QDomDocument doc( "documentInfo" ); if ( !doc.setContent( &infoFile ) ) { kDebug() << "Can't load XML pair! Check for broken xml." << endl; infoFile.close(); return; } infoFile.close(); QDomElement root = doc.documentElement(); if ( root.tagName() != "documentInfo" ) return; // Parse the DOM tree QDomNode topLevelNode = root.firstChild(); while ( topLevelNode.isElement() ) { QString catName = topLevelNode.toElement().tagName(); // Restore page attributes (bookmark, annotations, ...) from the DOM if ( catName == "pageList" ) { QDomNode pageNode = topLevelNode.firstChild(); while ( pageNode.isElement() ) { QDomElement pageElement = pageNode.toElement(); if ( pageElement.hasAttribute( "number" ) ) { // get page number (node's attribute) bool ok; int pageNumber = pageElement.attribute( "number" ).toInt( &ok ); // pass the domElement to the right page, to read config data from if ( ok && pageNumber >= 0 && pageNumber < (int)pages_vector.count() ) pages_vector[ pageNumber ]->restoreLocalContents( pageElement ); } pageNode = pageNode.nextSibling(); } } // Restore 'general info' from the DOM else if ( catName == "generalInfo" ) { QDomNode infoNode = topLevelNode.firstChild(); while ( infoNode.isElement() ) { QDomElement infoElement = infoNode.toElement(); // compatibility: [pre-3.4 viewport storage] @remove after 3.4 relase if ( infoElement.tagName() == "activePage" ) { if ( infoElement.hasAttribute( "viewport" ) ) *d->viewportIterator = DocumentViewport( infoElement.attribute( "viewport" ) ); } // restore viewports history if ( infoElement.tagName() == "history" ) { // clear history d->viewportHistory.clear(); // append old viewports QDomNode historyNode = infoNode.firstChild(); while ( historyNode.isElement() ) { QDomElement historyElement = historyNode.toElement(); if ( historyElement.hasAttribute( "viewport" ) ) { QString vpString = historyElement.attribute( "viewport" ); d->viewportIterator = d->viewportHistory.insert( d->viewportHistory.end(), DocumentViewport( vpString ) ); } historyNode = historyNode.nextSibling(); } // consistancy check if ( d->viewportHistory.isEmpty() ) d->viewportIterator = d->viewportHistory.insert( d->viewportHistory.end(), DocumentViewport() ); } infoNode = infoNode.nextSibling(); } } topLevelNode = topLevelNode.nextSibling(); } // </documentInfo>}QString KPDFDocument::giveAbsolutePath( const QString & fileName ){ if ( !d->url.isValid() ) return QString::null; return d->url.upUrl().url() + fileName;}bool KPDFDocument::openRelativeFile( const QString & fileName ){ QString absFileName = giveAbsolutePath( fileName ); if ( absFileName.isEmpty() ) return false; kDebug() << "openDocument: '" << absFileName << "'" << endl; emit openURL( absFileName ); return true;}void KPDFDocument::saveDocumentInfo() const{ if ( d->docFileName.isEmpty() ) return; QFile infoFile( d->xmlFileName ); if (infoFile.open( QIODevice::WriteOnly | QIODevice::Truncate) ) { // 1. Create DOM QDomDocument doc( "documentInfo" ); QDomElement root = doc.createElement( "documentInfo" ); doc.appendChild( root ); // 2.1. Save page attributes (bookmark state, annotations, ... ) to DOM QDomElement pageList = doc.createElement( "pageList" ); root.appendChild( pageList ); // <page list><page number='x'>.... </page> save pages that hold data QVector< KPDFPage * >::const_iterator pIt = pages_vector.begin(), pEnd = pages_vector.end(); for ( ; pIt != pEnd; ++pIt ) (*pIt)->saveLocalContents( pageList, doc ); // 2.2. Save document info (current viewport, history, ... ) to DOM QDomElement generalInfo = doc.createElement( "generalInfo" ); root.appendChild( generalInfo ); // <general info><history> ... </history> save history up to 10 viewports QLinkedList< DocumentViewport >::iterator backIterator = d->viewportIterator; if ( backIterator != d->viewportHistory.end() ) { // go back up to 10 steps from the current viewportIterator int backSteps = 10; while ( backSteps-- && backIterator != d->viewportHistory.begin() ) --backIterator; // create history root node QDomElement historyNode = doc.createElement( "history" ); generalInfo.appendChild( historyNode ); // add old[backIterator] and present[viewportIterator] items QLinkedList< DocumentViewport >::iterator endIt = d->viewportIterator; ++endIt; while ( backIterator != endIt ) { QString name = (backIterator == d->viewportIterator) ? "current" : "oldPage"; QDomElement historyEntry = doc.createElement( name ); historyEntry.setAttribute( "viewport", (*backIterator).toString() ); historyNode.appendChild( historyEntry ); ++backIterator; } } // 3. Save DOM to XML file QString xml = doc.toString(); QTextStream os( &infoFile ); os << xml; } infoFile.close();}void KPDFDocument::slotTimedMemoryCheck(){ // [MEM] clean memory (for 'free mem dependant' profiles only) if ( KpdfSettings::memoryLevel() != KpdfSettings::EnumMemoryLevel::Low && d->allocatedPixmapsTotalMemory > 1024*1024 ) cleanupPixmapMemory();}void KPDFDocument::slotRotation( int rotation ){ if ( generator->supportsRotation() ) { d->rotation = rotation; generator->setOrientation(pages_vector,rotation); foreachObserver( notifySetup( pages_vector, true ) ); foreachObserver( notifyContentsCleared (DocumentObserver::Pixmap | DocumentObserver::Highlights | DocumentObserver::Annotations));// foreachObserver( notifyViewportChanged( false /*disables smoothMove*/ ));// foreachObserver( notifyPageChanged( ) ); kDebug() << "Rotated: " << rotation << endl; }}void KPDFDocument::slotPaperSizes( int newsize ){ if (generator->supportsPaperSizes()) { generator->setPaperSize(pages_vector,newsize); foreachObserver( notifySetup( pages_vector, true ) ); kDebug() << "PaperSize no: " << newsize << endl; }}/** DocumentViewport **/DocumentViewport::DocumentViewport( int n ) : pageNumber( n ){ // default settings rePos.enabled = false; rePos.normalizedX = 0.5; rePos.normalizedY = 0.0; rePos.pos = Center; autoFit.enabled = false; autoFit.width = false; autoFit.height = false;}DocumentViewport::DocumentViewport( const QString & xmlDesc ) : pageNumber( -1 ){ // default settings (maybe overridden below) rePos.enabled = false; rePos.normalizedX = 0.5; rePos.normalizedY = 0.0; rePos.pos = Center; autoFit.enabled = false; autoFit.width = false; autoFit.height = false; // check for string presence if ( xmlDesc.isEmpty() ) return; // decode the string bool ok; int field = 0; QString token = xmlDesc.section( ';', field, field ); while ( !token.isEmpty() ) { // decode the current token if ( field == 0 ) { pageNumber = token.toInt( &ok ); if ( !ok ) return; } else if ( token.startsWith( "C1" ) ) { rePos.enabled = true; rePos.normalizedX = token.section( ':', 1, 1 ).toDouble(); rePos.normalizedY = token.section( ':', 2, 2 ).toDouble(); rePos.pos = Center; } else if ( token.startsWith( "C2" ) ) { rePos.enabled = true; rePos.normalizedX = token.section( ':', 1, 1 ).toDouble(); rePos.normalizedY = token.section( ':', 2, 2 ).toDouble(); if (token.section( ':', 3, 3 ).toInt() == 1) rePos.pos = Center; else rePos.pos = TopLeft; } else if ( token.startsWith( "AF1" ) ) { autoFit.enabled = true; autoFit.width = token.section( ':', 1, 1 ) == "T"; autoFit.height = token.section( ':', 2, 2 ) == "T"; } // proceed tokenizing string field++; token = xmlDesc.section( ';', field, field ); }}QString DocumentViewport::toString() const{ // start string with page number QString s = QString::number( pageNumber ); // if has center coordinates, save them on string if ( rePos.enabled ) s += QString( ";C2:" ) + QString::number( rePos.normalizedX ) + ':' + QString::number( rePos.normalizedY ) + ':' + QString::number( rePos.pos ); // if has autofit enabled, save its state on string if ( autoFit.enabled ) s += QString( ";AF1:" ) + (autoFit.width ? "T" : "F") + ':' + (autoFit.height ? "T" : "F"); return s;}bool DocumentViewport::operator==( const DocumentViewport & vp ) const{ bool equal = ( pageNumber == vp.pageNumber ) && ( rePos.enabled == vp.rePos.enabled ) && ( autoFit.enabled == vp.autoFit.enabled ); if ( !equal ) return false; if ( rePos.enabled && (( rePos.normalizedX != vp.rePos.normalizedX) || ( rePos.normalizedY != vp.rePos.normalizedY ) || rePos.pos != vp.rePos.pos) ) return false; if ( autoFit.enabled && (( autoFit.width != vp.autoFit.width ) || ( autoFit.height != vp.autoFit.height )) ) return false; return true;}/** DocumentInfo **/DocumentInfo::DocumentInfo() : QDomDocument( "DocumentInformation" ){ QDomElement docElement = createElement( "DocumentInfo" ); appendChild( docElement );}void DocumentInfo::set( const QString &key, const QString &value, const QString &title ){ QDomElement docElement = documentElement(); QDomElement element; // check whether key already exists QDomNodeList list = docElement.elementsByTagName( key ); if ( list.count() > 0 ) element = list.item( 0 ).toElement(); else element = createElement( key ); element.setAttribute( "value", value ); element.setAttribute( "title", title ); if ( list.count() == 0 ) docElement.appendChild( element );}QString DocumentInfo::get( const QString &key ) const{ QDomEleme
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -