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

📄 filebrowser.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "inlineedit.h"#include "filebrowser.h"#include <qtopia/resource.h>#include <qtopia/config.h>#include <qtopia/global.h>#include <qtopia/mimetype.h>#include <qtopia/applnk.h>#include <qtopia/services.h>#include <qtopia/qcopenvelope_qws.h>#ifdef QWS#include <qcopchannel_qws.h>#endif#include <qmessagebox.h>#include <qdir.h>#include <qregexp.h>#include <qheader.h>#include <qtopia/qpetoolbar.h>#include <qpopupmenu.h>#include <qtopia/qpemenubar.h>#include <qaction.h>#include <qstringlist.h>#include <qcursor.h>#include <qmultilineedit.h>#include <qfont.h>#include <qtooltip.h>#if defined(Q_OS_LINUX) || defined(_OS_LINUX_)#include <unistd.h>#endif#include <stdlib.h>#include <sys/stat.h>static QPixmap	*pmLockedFolder;static QPixmap	*pmFolder;static QPixmap	*pmLocked;static QPixmap	*pmLibrary;static QPixmap	*pmUnknown;////  FileItem//FileItem::FileItem( QListView * parent, const QFileInfo & fi )    : QListViewItem( parent ),      fileInfo( fi ){    QDate d = fi.lastModified().date();    setText( 0, fi.fileName() );    setText( 1, sizeString( fi.size() ) + " " );    setText( 2, QString().sprintf("%4d-%02d-%02d",d.year(), d.month(), d.day() ) );    MimeType mt(fi.filePath());    if( fi.isDir() )	setText( 3, "directory" );    else if( isLib() )	setText( 3, "library" );    else	setText( 3, mt.description() );    QPixmap pm;    if( fi.isDir() ){	if( !QDir( fi.filePath() ).isReadable() )	    pm = *pmLockedFolder;	else	    pm = *pmFolder;    }    else if( !fi.isReadable() )	pm = *pmLocked;    else if( isLib() )	pm = *pmLibrary;    else	pm = mt.pixmap();    if ( pm.isNull() )	pm = *pmUnknown;    setPixmap(0,pm);}QString FileItem::sizeString( unsigned int s ){    double size = s;    if ( size > 1024 * 1024 * 1024 )		return QString().sprintf( "%.1f", size / ( 1024 * 1024 * 1024 ) ) + "G";    else if ( size > 1024 * 1024 )		return QString().sprintf( "%.1f", size / ( 1024 * 1024 ) ) + "M";    else if ( size > 1024 )		return QString().sprintf( "%.1f", size / ( 1024 ) ) + "K";    else		return QString::number( size ) + "B";}QString FileItem::key( int column, bool ascending ) const{    QString tmp;    ascending = ascending;    if( (column == 0) && fileInfo.isDir() ){ // Sort by name		// We want the directories to appear at the top of the list		tmp = (char) 0;		return (tmp + text( column ).lower());    }    else if( column == 2 ) { // Sort by date		QDateTime epoch( QDate( 1980, 1, 1 ) );        tmp.sprintf( "%08d", epoch.secsTo( fileInfo.lastModified() ) );		return tmp;    }    else if( column == 1 ) { // Sort by size		return tmp.sprintf( "%08d", fileInfo.size() );    }    return text( column ).lower();}bool FileItem::isLib(){    // This is of course not foolproof    if( !qstrncmp("lib", fileInfo.baseName(), 3) &&		( fileInfo.extension().contains( "so" ) ||		  fileInfo.extension().contains( "a" ) ) )		return TRUE;    else		return FALSE;}int FileItem::launch(){    //    // If this item is in $QPEDIR/Documents, pass it's    // associated .desktop file along to the third party rather    // than itself, to avoid double referencing the same file from    // separate .desktop files.    //    QString	file_to_launch = fileInfo.filePath();    MimeType	mt(fileInfo.filePath());    QString	fname_desktop(file_to_launch);    if (file_to_launch.contains(QDir::homeDirPath() + "/Documents")) {	int	idx;	idx = fname_desktop.findRev('.');           // fix suffix	if (idx != -1) {	    fname_desktop.truncate(idx);	}	fname_desktop += ".desktop";	idx = fname_desktop.findRev('/');           // take filename only	if (idx != -1) {	    fname_desktop = fname_desktop.right(fname_desktop.length() - idx);	}	fname_desktop = QDir::homeDirPath() + "/Documents/" + mt.id() +	       fname_desktop;    }    if (!QFile::exists(fname_desktop)) {	//	// We're trying to open a file that lives in $QPEDIR/Documents	// but doesn't have an associated .desktop.  Something bad has	// happened to get into this state; revert back to opening the	// file we were originally asked for.	//	fname_desktop = fileInfo.filePath();    }    QString type = mt.id();    Config cfg(Service::appConfig("Open/"+type),Config::File);    cfg.setGroup("Standard");    if ( cfg.readNumEntry("Version") > 100 ) {	// Use Open service	QCopEnvelope e(Service::channel("Open/"+type), "openFile(QString)");	e << fname_desktop;    } else {	// Use setDocument()	DocLnk doc( fname_desktop, FALSE );	doc.execute();    }    listView()->clearSelection();    return 1;}bool FileItem::rename( const QString & name ){    QString oldpath, newpath;    if ( name.isEmpty() )		return FALSE;    if ( name.contains( QRegExp("[/\\$\"\'\\*\\?]") ) )		return FALSE;    oldpath = fileInfo.filePath();    newpath = fileInfo.dirPath() + "/" + name;    if ( ::rename( (const char *) oldpath, (const char *) newpath ) != 0 )		return FALSE;    else		return TRUE;}////  FileView//FileView::FileView( const QString & dir, QWidget * parent,					const char * name )    : QListView( parent, name ),      menuTimer( this ),      le( NULL ),      itemToRename( NULL ){    setFrameStyle( NoFrame );    addColumn( "Name" );    addColumn( "Date" );    addColumn( "Size" );    addColumn( "Type" );    setMultiSelection( TRUE );    header()->hide();    setColumnWidthMode( 0, Manual );    setColumnWidthMode( 3, Manual );    // right align yize column    setColumnAlignment( 1, AlignRight );    scaleIcons();    generateDir( dir );    connect( this, SIGNAL( clicked( QListViewItem * )),			 SLOT( itemClicked( QListViewItem * )) );    connect( this, SIGNAL( doubleClicked( QListViewItem * )),			 SLOT( itemDblClicked( QListViewItem * )) );    connect( this, SIGNAL( selectionChanged() ), SLOT( cancelMenuTimer() ) );    connect( &menuTimer, SIGNAL( timeout() ), SLOT( showFileMenu() ) );}FileView::~FileView(void){    delete pmLockedFolder;    delete pmFolder;    delete pmLocked;    delete pmLibrary;    delete pmUnknown;}void FileView::resizeEvent( QResizeEvent *e ){    setColumnWidth( 0, width() - 2 * lineWidth() - 20 - columnWidth( 1 ) - columnWidth( 2 ) );    // hide type column, we use it for "sort by type" only    setColumnWidth( 3, 0 );    QListView::resizeEvent( e );}void FileView::updateDir(){    generateDir( currentDir );}void FileView::setDir( const QString & dir ){    if ( dir.startsWith( "/dev" ) ) {	menuTimer.stop();	QMessageBox::warning( this, tr( "File Manager" ),			      tr( "Can't show /dev/ directory." ), tr( "&OK" ) );	return;    }    dirHistory += currentDir;    generateDir( dir );}void FileView::generateDir( const QString & dir ){    QDir d( dir );    if( d.exists() && !d.isReadable() ) return;    currentDir = d.canonicalPath();    d.setFilter( QDir::Dirs | QDir::Files );    d.setSorting( QDir::Name | QDir::DirsFirst | QDir::IgnoreCase |				  QDir::Reversed );    const QFileInfoList * list = d.entryInfoList();    QFileInfoListIterator it( *list );    QFileInfo *fi;    clear();    while( (fi = it.current()) ){		if( (fi->fileName() == ".") || (fi->fileName() == "..") ){			++it;			continue;		}		(void) new FileItem( (QListView *) this, *fi );		++it;    }    emit dirChanged();}void FileView::rename(){    itemToRename = (FileItem *) currentItem();    const QPixmap * pm;    int pmw;    if( itemToRename == NULL ) return;    if( ( pm = itemToRename->pixmap( 0 ) ) == NULL )		pmw = 0;    else		pmw = pm->width();    ensureItemVisible( itemToRename );    horizontalScrollBar()->setValue( 0 );    horizontalScrollBar()->setEnabled( FALSE );    verticalScrollBar()->setEnabled( FALSE );    selected = isSelected( itemToRename );    setSelected( itemToRename, FALSE );    if( le == NULL ){	le = new InlineEdit( this );	le->setFrame( FALSE );	connect( le, SIGNAL( lostFocus() ), SLOT( endRenaming() ) );	connect(le, SIGNAL(returnPressed()), this, SLOT(endRenaming()));    }    QRect r = itemRect( itemToRename );    r.setTop( r.top() + frameWidth() + 1 );    r.setLeft( r.left() + frameWidth() + pmw );    r.setBottom( r.bottom() + frameWidth() );    r.setWidth( columnWidth( 0 ) - pmw );    le->setGeometry( r );    le->setText( itemToRename->text( 0 ) );    le->selectAll();    le->show();    le->setFocus();}void FileView::endRenaming(){    if( le && itemToRename ) {	le->hide();	setSelected( itemToRename, selected );	if (itemToRename) {	    if( !itemToRename->rename( le->text() ) ){		QMessageBox::warning( this, tr( "Rename file" ),		    tr( "Rename failed!" ), tr( "&OK" ) );	    } else {		updateDir();	    }	    itemToRename = NULL;	    horizontalScrollBar()->setEnabled( TRUE );	    verticalScrollBar()->setEnabled( TRUE );	}    }}void FileView::copy(){    endRenaming();    // dont keep cut files any longer than necessary    // ##### a better inmplementation might be to rename the CUT file    // ##### to ".QPE-FILEBROWSER-MOVING" rather than copying it.    system ( "rm -rf /tmp/qpemoving" );    FileItem * i;    if((i = (FileItem *) firstChild()) == 0) return;    flist.clear();    while( i ){		if( i->isSelected() /*&& !i->isDir()*/ ){			flist += i->getFilePath();		}		i = (FileItem *) i->nextSibling();    }}void FileView::paste(){    int i, err;    QString cmd, dest, basename, cd = currentDir;    if(cd == "/") cd = "";    for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it ) {		basename = (*it).mid((*it).findRev("/") + 1, (*it).length());		dest = cd + "/" + basename;		if( QFile( dest ).exists() ){			i = 1;			dest = cd + "/Copy of " + basename;			while( QFile( dest ).exists() ){				dest.sprintf( "%s/Copy (%d) of %s", (const char *) cd, i++,							  (const char *) basename );			}		}		//		// Copy a directory recursively using the "cp" command -		// may have to be changed		//		if( QFileInfo( (*it) ).isDir() ){			cmd = "/bin/cp -fpR \"" + (*it) +"\" " + "\"" + dest + "\"";			err = system( (const char *) cmd );		} else if( !copyFile( dest, (*it) ) ){			err = -1;		} else {			err = 0;		}		if ( err != 0 ) {			QMessageBox::warning( this, tr("Paste file"), tr("Paste failed!"),								  tr("OK") );			break;		} else {			updateDir();			QListViewItem * i = firstChild();			basename = dest.mid( dest.findRev("/") + 1, dest.length() );			while( i ){				if( i->text(0) == basename ){					setCurrentItem( i );					ensureItemVisible( i );					break;				}				i = i->nextSibling();			}		}    }}bool FileView::copyFile( const QString & dest, const QString & src ){    char bf[ 50000 ];    int  bytesRead;    bool success = TRUE;    struct stat status;    QFile s( src );    QFile d( dest );    if( s.open( IO_ReadOnly | IO_Raw ) &&		d.open( IO_WriteOnly | IO_Raw ) )    {		while( (bytesRead = s.readBlock( bf, sizeof( bf ) )) ==			   sizeof( bf ) )		{			if( d.writeBlock( bf, sizeof( bf ) ) != sizeof( bf ) ){				success = FALSE;				break;			}		}		if( success && (bytesRead > 0) ){			d.writeBlock( bf, bytesRead );		}    } else {		success = FALSE;    }#if !defined (Q_OS_WIN32)    // Set file permissions    if( stat( (const char *) src, &status ) == 0 ){		chmod( (const char *) dest, status.st_mode );    }

⌨️ 快捷键说明

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