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

📄 krviewer.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************                         krviewer.cpp  -  description                            -------------------   begin                : Thu Apr 18 2002   copyright            : (C) 2002 by Shie Erlich & Rafi Yanai   email                :***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/ // Qt includes#include <qdatastream.h>#include <qfile.h>#include <qpopupmenu.h> #include <qtimer.h>// KDE includes#include <kmenubar.h>#include <kmimetype.h>#include <klocale.h>#include <kparts/part.h>#include <kparts/componentfactory.h>#include <kmessagebox.h>#include <klibloader.h>#include <ktrader.h>#include <kio/netaccess.h>#include <kio/jobclasses.h>#include <kio/job.h>#include <kstatusbar.h>#include <kdebug.h>#include <klargefile.h>#include <khtml_part.h>#include <kprocess.h>#include <kfileitem.h> // Krusader includes#include "krviewer.h"#include "../krusader.h"#include "../defaults.h"#include "../kicons.h"#include "panelviewer.h"#define VIEW_ICON     "viewmag"#define EDIT_ICON     "edit"#define MODIFIED_ICON "filesaveas"QPtrList<KrViewer> KrViewer::viewers;KrViewer::KrViewer( QWidget *parent, const char *name ) :KParts::MainWindow( parent, name ), manager( this, this ), tabBar( this ), returnFocusTo( 0 ), returnFocusTab( 0 ),                                    reservedKeys(), reservedKeyIDs() {	//setWFlags(WType_TopLevel | WDestructiveClose);	setXMLFile( "krviewer.rc" ); // kpart-related xml file	setHelpMenuEnabled( false );	setAutoSaveSettings( "KrViewerWindow", true );	tmpFile.setAutoDelete( true );	connect( &manager, SIGNAL( activePartChanged( KParts::Part* ) ),	         this, SLOT( createGUI( KParts::Part* ) ) );	connect( &tabBar, SIGNAL( currentChanged( QWidget *) ),	         this, SLOT( tabChanged(QWidget*) ) );	connect( &tabBar, SIGNAL( closeRequest( QWidget *) ),	         this, SLOT( tabCloseRequest(QWidget*) ) );	tabBar.setTabReorderingEnabled(false);#if KDE_IS_VERSION(3,4,0)	tabBar.setAutomaticResizeTabs(true);#endif//	"edit"//	"filesaveas"	setCentralWidget( &tabBar );	printAction = KStdAction::print( this, SLOT( print() ), 0, 0 );	copyAction = KStdAction::copy( this, SLOT( copy() ), 0, 0 );	viewerMenu = new QPopupMenu( this );	viewerMenu->insertItem( i18n( "&Generic viewer" ), this, SLOT( viewGeneric() ), CTRL + SHIFT + Key_G, 1 );	viewerMenu->insertItem( i18n( "&Text viewer" ), this, SLOT( viewText() ), CTRL + SHIFT + Key_T, 2 );	viewerMenu->insertItem( i18n( "&Hex viewer" ), this, SLOT( viewHex() ), CTRL + SHIFT + Key_H, 3 );	viewerMenu->insertSeparator();	viewerMenu->insertItem( i18n( "Text &editor" ), this, SLOT( editText() ), CTRL + SHIFT + Key_E, 4 );	viewerMenu->insertSeparator();	viewerMenu->insertItem( i18n( "&Next tab" ), this, SLOT( nextTab() ), ALT+Key_Right );	viewerMenu->insertItem( i18n( "&Previous tab" ), this, SLOT( prevTab() ), ALT+Key_Left );	detachActionIndex = viewerMenu->insertItem( i18n( "&Detach tab" ), this, SLOT( detachTab() ), CTRL + SHIFT + Key_D );	//no point in detaching only one tab..	viewerMenu->setItemEnabled(detachActionIndex,false);		viewerMenu->insertSeparator();	viewerMenu->insertItem( printAction->text(), this, SLOT( print() ), printAction->shortcut() );	viewerMenu->insertItem( copyAction->text(), this, SLOT( copy() ), copyAction->shortcut() );	viewerMenu->insertSeparator();	tabCloseID = viewerMenu->insertItem( i18n( "&Close current tab" ), this, SLOT( tabCloseRequest() ), Key_Escape );	closeID = viewerMenu->insertItem( i18n( "&Quit" ), this, SLOT( close() ), CTRL + Key_Q );	//toolBar() ->insertLined("Edit:",1,"",this,"",true ,i18n("Enter an URL to edit and press enter"));		tabBar.setHoverCloseButton(true);	checkModified();}KrViewer::~KrViewer() {	disconnect( &manager, SIGNAL( activePartChanged( KParts::Part* ) ),	            this, SLOT( createGUI( KParts::Part* ) ) );	viewers.remove( this );	delete printAction;	delete copyAction;}void KrViewer::createGUI( KParts::Part* part ) {	if ( part == 0 )   /*     KHTMLPart calls this function with 0 at destruction.    */		return ;        /*   Can cause crash after JavaScript self.close() if removed  */		// and show the new part widget	connect( part, SIGNAL( setStatusBarText( const QString& ) ),	         this, SLOT( slotSetStatusBarText( const QString& ) ) );	KParts::MainWindow::createGUI( part );	toolBar() ->insertLineSeparator(0);	PanelViewerBase *pvb = getPanelViewerBase( part );	if( pvb )		updateActions( pvb );	toolBar() ->show();	statusBar() ->show();	// the KParts part may override the viewer shortcuts. We prevent it	// by installing an event filter on the menuBar() and the part	reservedKeys.clear();	reservedKeyIDs.clear();		// getting the key sequences of the viewer menu	for( unsigned w=0; w != viewerMenu->count(); w++ )	{		int id = viewerMenu->idAt( w );		QKeySequence sequence = viewerMenu->accel( id );		if( sequence.count() > 0 )		{			reservedKeys.push_back( sequence[ 0 ] );			reservedKeyIDs.push_back( id );		}	}		// and "fix" the menubar	menuBar() ->removeItem( 70 );	menuBar() ->insertItem( i18n( "&KrViewer" ), viewerMenu, 70 );	menuBar() ->show();		// filtering out the key events	menuBar() ->installEventFilter( this );	part->installEventFilter( this );}bool KrViewer::eventFilter (  QObject * /* watched */, QEvent * e ){	if( e->type() == QEvent::AccelOverride )	{		QKeyEvent* ke = (QKeyEvent*) e;		if( reservedKeys.contains( ke->key() ) )		{			ke->accept();						int id = reservedKeyIDs[ reservedKeys.findIndex( ke->key() ) ];			if( id != -1 )			{				// don't activate the close functions immediately!				// it can cause crash				if( id == tabCloseID )					QTimer::singleShot( 0, this, SLOT( tabCloseRequest() ) );				else if( id == closeID )					QTimer::singleShot( 0, this, SLOT( close() ) );				else {					int index = viewerMenu->indexOf( id );					viewerMenu->activateItemAt( index );				}			}			return true;		}	}	else if( e->type() == QEvent::KeyPress )	{		QKeyEvent* ke = (QKeyEvent*) e;		if( reservedKeys.contains( ke->key() ) )		{			ke->accept();			return true;		}	}	return false;}void KrViewer::keyPressEvent( QKeyEvent *e ) {	switch ( e->key() ) {		case Key_F10:			close();			break;		case Key_Escape:			tabCloseRequest();			break;		default:			e->ignore();			break;	}}KrViewer* KrViewer::getViewer(bool new_window){	if( !new_window ){		if( !viewers.first() ){				viewers.prepend( new KrViewer() ); // add to first (active)		}		else {			if( viewers.first()->isMinimized() ) // minimized? -> show it again				viewers.first()->showNormal();			viewers.first()->raise();			viewers.first()->setActiveWindow();		}		return viewers.first();	}	else {		KrViewer *newViewer = new KrViewer();		viewers.prepend( newViewer );		return newViewer;	}}	void KrViewer::view( KURL url, QWidget * parent ) {	Mode defaultMode = Generic;	bool defaultWindow = false;	krConfig->setGroup( "General" );	defaultWindow = krConfig->readBoolEntry( "View In Separate Window",_ViewInSeparateWindow );	QString modeString = krConfig->readEntry( "Default Viewer Mode","generic" );	if( modeString == "generic" ) defaultMode = Generic;	else if( modeString == "text" ) defaultMode = Text;	else if( modeString == "hex" ) defaultMode = Hex;	view(url,defaultMode,defaultWindow, parent );}void KrViewer::view( KURL url, Mode mode,  bool new_window, QWidget * parent ) {	KrViewer* viewer = getViewer(new_window);	PanelViewerBase* viewWidget = new PanelViewer(&viewer->tabBar);	KParts::Part* part = viewWidget->openURL(url,mode);	viewer->addTab(viewWidget,i18n( "Viewing" ),VIEW_ICON,part);	viewer->returnFocusTo = parent;	viewer->returnFocusTab = viewWidget;}void KrViewer::edit( KURL url, QWidget * parent ) {	edit( url, Text, -1, parent );}void KrViewer::edit( KURL url, Mode mode, int new_window, QWidget * parent ) {	krConfig->setGroup( "General" );	QString edit = krConfig->readEntry( "Editor", _Editor );		if( new_window == -1 )		new_window = krConfig->readBoolEntry( "View In Separate Window",_ViewInSeparateWindow );	if ( edit != "internal editor" ) {		KProcess proc;		// if the file is local, pass a normal path and not a url. this solves		// the problem for editors that aren't url-aware		if ( url.isLocalFile() )			proc << QStringList::split( ' ', edit ) << url.path();		else proc << QStringList::split( ' ', edit ) << url.prettyURL();		if ( !proc.start( KProcess::DontCare ) )			KMessageBox::sorry( krApp, i18n( "Can't open " ) + "\"" + edit + "\"" );		return ;	}	KrViewer* viewer = getViewer(new_window);	PanelViewerBase* editWidget = new PanelEditor(&viewer->tabBar);	KParts::Part* part = editWidget->openURL(url,mode);	viewer->addTab(editWidget,i18n("Editing"),EDIT_ICON,part);		viewer->returnFocusTo = parent;	viewer->returnFocusTab = editWidget;}void KrViewer::addTab(PanelViewerBase* pvb, QString msg, QString iconName ,KParts::Part* part){	if( !part ) return;	KURL url = pvb->url();	setCaption( msg+": " + url.prettyURL() );	QIconSet icon = QIconSet(krLoader->loadIcon(iconName,KIcon::Small));	manager.addPart( part, this );	manager.setActivePart( part );	tabBar.insertTab(pvb,icon,url.fileName()+"("+msg+")");		tabBar.setCurrentPage(tabBar.indexOf(pvb));	tabBar.setTabToolTip(pvb,msg+": " + url.prettyURL());	updateActions( pvb );	// now we can offer the option to detach tabs (we have more than one)	if( tabBar.count() > 1 ){		viewerMenu->setItemEnabled(detachActionIndex,true);		}	show();	tabBar.show();		connect( pvb, SIGNAL( urlChanged( PanelViewerBase *, const KURL & ) ), 	         this,  SLOT( tabURLChanged(PanelViewerBase *, const KURL & ) ) );}void KrViewer::tabURLChanged( PanelViewerBase *pvb, const KURL & url ) {	QString msg = pvb->isEditor() ? i18n( "Editing" ) : i18n( "Viewing" );	tabBar.setTabLabel( pvb, url.fileName()+"("+msg+")" );	tabBar.setTabToolTip(pvb,msg+": " + url.prettyURL());}void KrViewer::tabChanged(QWidget* w){	manager.setActivePart( static_cast<PanelViewerBase*>(w)->part() );		if( static_cast<PanelViewerBase*>(w) != returnFocusTab ) {		returnFocusTo = 0;		returnFocusTab = 0;	}		// set this viewer to be the main viewer	if( viewers.remove( this ) ) viewers.prepend( this ); // move to first}void KrViewer::tabCloseRequest(QWidget *w){	if( !w ) return;		// important to save as returnFocusTo will be cleared at removePart	QWidget * returnFocusToThisWidget = returnFocusTo;		PanelViewerBase* pvb = static_cast<PanelViewerBase*>(w);		if( !pvb->queryClose() )

⌨️ 快捷键说明

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