📄 krviewer.cpp
字号:
/*************************************************************************** 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 + -