⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 panelviewer.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
字号:
#include <kurl.h>#include <qstring.h>#include <qwidgetstack.h>#include <qapplication.h>#include <kparts/part.h>#include <kparts/browserextension.h>#include <kmessagebox.h>#include <qdict.h>#include <qlabel.h>#include <kmimetype.h>#include <ktempfile.h>#include <klocale.h>#include <klibloader.h>#include <kuserprofile.h>#include <kdebug.h>#include <kfileitem.h>#include <kio/netaccess.h>#include <qfile.h>#include <klargefile.h>#include "panelviewer.h"#define DICTSIZE 211/* ----==={ PanelViewerBase }===---- */PanelViewerBase::PanelViewerBase( QWidget *parent ) :QWidgetStack( parent ), mimes( 0 ), cpart( 0 ) {	setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Ignored ) );	mimes = new QDict<KParts::ReadOnlyPart>( DICTSIZE, false );	mimes->setAutoDelete( true );	cpart = 0;	fallback = new QLabel( i18n( "No file selected or selected file can't be displayed." ), this );	fallback->setAlignment( AlignCenter | ExpandTabs | WordBreak );	addWidget( fallback );	raiseWidget( fallback );}PanelViewerBase::~PanelViewerBase() {//	cpart->queryClose();	closeURL();	mimes->clear();	delete mimes;	delete fallback;}/* ----==={ PanelViewer }===---- */PanelViewer::PanelViewer( QWidget *parent ) :PanelViewerBase( parent ) {}PanelViewer::~PanelViewer() {}KParts::ReadOnlyPart* PanelViewer::openURL( const KURL &url, KrViewer::Mode mode ) {	emit urlChanged( this, url );	closeURL();	curl = url;	if( mode == KrViewer::Generic ){		cmimetype = KMimeType::findByURL( curl ) ->name();		cpart = ( *mimes ) [ cmimetype ];		if ( !cpart ){			cpart = getPart( cmimetype );			mimes->insert( cmimetype, cpart );		}	}	KTempFile tmpFile;	if( mode == KrViewer::Hex ){		if ( !cpart ) cpart = getHexPart();		if ( !cpart ) oldHexViewer(tmpFile);	}		if ( !cpart ) cpart = getPart( "text/plain" );	if ( !cpart ) cpart = getPart( "all/allfiles" );	if ( cpart ) {		addWidget( cpart->widget() );		raiseWidget( cpart->widget() );	}	if ( cpart && cpart->openURL( curl ) ){		curl = url; /* needed because of the oldHexViewer */		return cpart;	}	else {		raiseWidget( fallback );		return 0;	}}bool PanelViewer::closeURL() {	raiseWidget( fallback );	if ( cpart && cpart->closeURL() ) {		cpart = 0;		return true;	}	return false;}KParts::ReadOnlyPart* PanelViewer::getPart( QString mimetype ) {	KParts::ReadOnlyPart * part = 0L;	KLibFactory *factory = 0;	KService::Ptr ptr = KServiceTypeProfile::preferredService( mimetype, "KParts/ReadOnlyPart" );	if ( ptr ) {		QStringList args;		QVariant argsProp = ptr->property( "X-KDE-BrowserView-Args" );		if ( argsProp.isValid() ) {			QString argStr = argsProp.toString();			args = QStringList::split( " ", argStr );		}		QVariant prop = ptr->property( "X-KDE-BrowserView-AllowAsDefault" );		if ( !prop.isValid() || prop.toBool() )   // defaults to true		{			factory = KLibLoader::self() ->factory( ptr->library().latin1() );			if ( factory ) {				part = static_cast<KParts::ReadOnlyPart *>( factory->create( this,				        ptr->name().latin1(), QString( "KParts::ReadOnlyPart" ).latin1(), args ) );			}		}	}	if ( part ) {		KParts::BrowserExtension * ext = KParts::BrowserExtension::childObject( part );		if ( ext ) {			connect( ext, SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ), this, SLOT( openURL( const KURL & ) ) );			connect( ext, SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ), this, SIGNAL( openURLRequest( const KURL & ) ) );		}	}	return part;}KParts::ReadOnlyPart* PanelViewer::getHexPart(){	KParts::ReadOnlyPart * part = 0L;	KLibFactory * factory = KLibLoader::self() ->factory( "libkhexedit2part" );	if ( factory ) {		// Create the part		part = ( KParts::ReadOnlyPart * ) factory->create( this, "hexedit2part","KParts::ReadOnlyPart" );	}	return part;}void PanelViewer::oldHexViewer(KTempFile& tmpFile) {	QString file;	// files that are not local must first be downloaded	if ( !curl.isLocalFile() ) {		if ( !KIO::NetAccess::download( curl, file,this ) ) {			KMessageBox::sorry( this, i18n( "KrViewer is unable to download: " ) + curl.url() );			return ;		}	} else file = curl.path();	// create a hex file	QFile f_in( file );	f_in.open( IO_ReadOnly );	QDataStream in( &f_in );	FILE *out = KDE_fopen( tmpFile.name().local8Bit(), "w" );	KIO::filesize_t fileSize = f_in.size();	KIO::filesize_t address = 0;	char buf[ 16 ];	unsigned int* pBuff = ( unsigned int* ) buf;	while ( address < fileSize ) {		memset( buf, 0, 16 );		int bufSize = ( ( fileSize - address ) > 16 ) ? 16 : ( fileSize - address );		in.readRawBytes( buf, bufSize );		fprintf( out, "0x%8.8llx: ", address );		for ( int i = 0; i < 4; ++i ) {			if ( i < ( bufSize / 4 ) ) fprintf( out, "%8.8x ", pBuff[ i ] );			else fprintf( out, "         " );		}		fprintf( out, "| " );		for ( int i = 0; i < bufSize; ++i ) {			if ( buf[ i ] > ' ' && buf[ i ] < '~' ) fputc( buf[ i ], out );			else fputc( '.', out );		}		fputc( '\n', out );		address += 16;	}	// clean up	f_in.close();	fclose( out );	if ( !curl.isLocalFile() )	KIO::NetAccess::removeTempFile( file );	curl = tmpFile.name();}/* ----==={ PanelEditor }===---- */PanelEditor::PanelEditor( QWidget *parent ) :PanelViewerBase( parent ) {}PanelEditor::~PanelEditor() {}KParts::ReadOnlyPart* PanelEditor::openURL( const KURL &url, KrViewer::Mode mode ) {	emit urlChanged( this, url );	closeURL();	curl = url;	if( mode == KrViewer::Generic ){		cmimetype = KMimeType::findByURL( curl ) ->name();		cpart = ( *mimes ) [ cmimetype ];		if ( !cpart ){ 			cpart = getPart( cmimetype );			mimes->insert( cmimetype, cpart );		}	}	if ( !cpart ) cpart = getPart( "text/plain" );	if ( !cpart ) cpart = getPart( "all/allfiles" );	if ( cpart ) {		addWidget( cpart->widget() );		raiseWidget( cpart->widget() );	}	else {		raiseWidget( fallback );		return 0;	}	bool create = true;	KIO::StatJob* statJob = KIO::stat( url, false );	connect( statJob, SIGNAL( result( KIO::Job* ) ), this, SLOT( slotStatResult( KIO::Job* ) ) );	busy = true;	while ( busy ) qApp->processEvents();	if( !entry.isEmpty() ) {		KFileItem file( entry, url );		if( file.isReadable() ) create = false;	}		if( create ){		if( static_cast<KParts::ReadWritePart *>(cpart)->saveAs( curl ) ) return cpart;	}	else {		if ( cpart->openURL( curl ) ) return cpart;	}	return 0;}bool PanelEditor::queryClose() {	if ( !cpart ) return true;	return static_cast<KParts::ReadWritePart *>(cpart)->queryClose();}bool PanelEditor::closeURL() {	if ( !cpart ) return false;		static_cast<KParts::ReadWritePart *>(cpart)->closeURL( false );		raiseWidget( fallback );	cpart = 0;	return true;}KParts::ReadWritePart* PanelEditor::getPart( QString mimetype ) {	KParts::ReadWritePart * part = 0L;	KLibFactory *factory = 0;	KService::Ptr ptr = KServiceTypeProfile::preferredService( mimetype, "KParts/ReadWritePart" );	if ( ptr ) {		QStringList args;		QVariant argsProp = ptr->property( "X-KDE-BrowserView-Args" );		if ( argsProp.isValid() ) {			QString argStr = argsProp.toString();			args = QStringList::split( " ", argStr );		}		QVariant prop = ptr->property( "X-KDE-BrowserView-AllowAsDefault" );		if ( !prop.isValid() || prop.toBool() )  // defaults to true		{			factory = KLibLoader::self() ->factory( ptr->library().latin1() );			if ( factory ) {				part = static_cast<KParts::ReadWritePart *>( factory->create( this,				        ptr->name().latin1(), QString( "KParts::ReadWritePart" ).latin1(), args ) );			}		}	}	if ( part ) {		KParts::BrowserExtension * ext = KParts::BrowserExtension::childObject( part );		if ( ext ) {			connect( ext, SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ), this, SLOT( openURL( const KURL & ) ) );			connect( ext, SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ), this, SIGNAL( openURLRequest( const KURL & ) ) );		}	}	return part;}void PanelEditor::slotStatResult( KIO::Job* job ) {  if( !job || job->error() ) entry = KIO::UDSEntry();  else entry = static_cast<KIO::StatJob*>(job)->statResult();  busy = false;}bool PanelEditor::isModified(){	return static_cast<KParts::ReadWritePart *>(cpart)->isModified();}#include "panelviewer.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -