formfile.cpp

来自「qt-x11-free-3.0.3.tar.gz minigui图形界面工具」· C++ 代码 · 共 694 行 · 第 1/2 页

CPP
694
字号
/************************************************************************ Copyright (C) 2000 Trolltech AS.  All rights reserved.**** This file is part of Qt Designer.**** 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 "formfile.h"#include "timestamp.h"#include "project.h"#include "formwindow.h"#include "command.h"#include "sourceeditor.h"#include "mainwindow.h"#include "../interfaces/languageinterface.h"#include "resource.h"#include "workspace.h"#include <qmessagebox.h>#include <qfile.h>#include <qregexp.h>#include <qstatusbar.h>static QString make_func_pretty( const QString &s ){    QString res = s;    if ( res.find( ")" ) - res.find( "(" ) == 1 )	return res;    res.replace( QRegExp( "[(]" ), "( " );    res.replace( QRegExp( "[)]" ), " )" );    res.replace( QRegExp( "&" ), " &" );    res.replace( QRegExp( "[*]" ), " *" );    res.replace( QRegExp( "," ), ", " );    res.replace( QRegExp( ":" ), " : " );    res = res.simplifyWhiteSpace();    return res;}FormFile::FormFile( const QString &fn, bool temp, Project *p )    : filename( fn ), fileNameTemp( temp ), pro( p ), fw( 0 ), ed( 0 ),      timeStamp( 0, fn + codeExtension() ), codeEdited( FALSE ){    LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );    if ( iface )	seperateSource = iface->supports( LanguageInterface::StoreFormCodeSeperate );    else	seperateSource = FALSE;    pro->addFormFile( this );    loadCode();    if ( !temp )	checkFileName( FALSE );}FormFile::~FormFile(){    pro->removeFormFile( this );    if ( formWindow() )	formWindow()->setFormFile( 0 );}void FormFile::setFormWindow( FormWindow *f ){    if ( f == fw )	return;    if ( fw )	fw->setFormFile( 0 );    fw = f;    if ( fw )	fw->setFormFile( this );    if ( seperateSource )	parseCode( cod, FALSE );}void FormFile::setEditor( SourceEditor *e ){    ed = e;}void FormFile::setFileName( const QString &fn ){    if ( fn == filename )	return;    if ( fn.isEmpty() ) {	fileNameTemp = TRUE;	if ( filename.find( "unnamed" ) != 0 )	    filename = createUnnamedFileName();	return;    }    filename = fn;    timeStamp.setFileName( filename + codeExtension() );    cod = "";    loadCode();}void FormFile::setCode( const QString &c ){    cod = c;}FormWindow *FormFile::formWindow() const{    return fw;}SourceEditor *FormFile::editor() const{    return ed;}QString FormFile::fileName() const{    return filename;}QString FormFile::absFileName() const{    return pro->makeAbsolute( filename );}QString FormFile::codeFile() const{    return filename + codeExtension();}QString FormFile::code(){    bool createSource = TRUE;    QString txt;    LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );    if ( iface && iface->supports( LanguageInterface::StoreFormCodeSeperate ) ) {	createSource = FALSE;	txt = cod;    }    if ( createSource ) {	QValueList<MetaDataBase::Slot> slotList = MetaDataBase::slotList( formWindow() );	QMap<QString, QString> bodies = MetaDataBase::functionBodies( formWindow() );	for ( QValueList<MetaDataBase::Slot>::Iterator it = slotList.begin(); it != slotList.end(); ++it ) {	    if ( (*it).language != pro->language() )		continue;	    QString sl( (*it).slot );	    QString comments = MetaDataBase::functionComments( formWindow(), sl );	    if ( !comments.isEmpty() )		txt += comments + "\n";	    txt += iface->createFunctionStart( formWindow()->name(), make_func_pretty( sl ),					       ( (*it).returnType.isEmpty() ?						 QString( "void" ) :						 (*it).returnType ) );	    QMap<QString, QString>::Iterator bit = bodies.find( MetaDataBase::normalizeSlot( (*it).slot ) );	    if ( bit != bodies.end() )		txt += "\n" + *bit + "\n\n";	    else		txt += "\n" + iface->createEmptyFunction() + "\n\n";	}    }    return txt;}bool FormFile::save( bool withMsgBox ){    if ( !formWindow() )	return TRUE;    if ( fileNameTemp )	return saveAs();    if ( !isModified() )	return TRUE;    if ( ed )	ed->save();    else	loadCode();    if ( isModified( WFormWindow ) ) {	if ( withMsgBox ) {	    if ( !formWindow()->checkCustomWidgets() )		return FALSE;	}	if ( QFile::exists( pro->makeAbsolute( filename ) ) ) {	    QString fn( pro->makeAbsolute( filename ) );#if defined(Q_OS_WIN32)	    fn += ".bak";#else	    fn += "~";#endif	    QFile f( pro->makeAbsolute( filename ) );	    if ( f.open( IO_ReadOnly ) ) {		QFile f2( fn );		if ( f2.open( IO_WriteOnly ) ) {		    QCString data( f.size() );		    f.readBlock( data.data(), f.size() );		    f2.writeBlock( data );		} else {		    QMessageBox::warning( MainWindow::self, "Save", "The file " + codeFile() + " could not be saved" );		}	    }	}    }    if ( isModified( WFormCode ) && seperateSource ) {	if ( QFile::exists( pro->makeAbsolute( codeFile() ) ) ) {	    QString fn( pro->makeAbsolute( codeFile() ) );#if defined(Q_OS_WIN32)	    fn += ".bak";#else	    fn += "~";#endif	    QFile f( pro->makeAbsolute( codeFile() ) );	    if ( f.open( IO_ReadOnly ) ) {		QFile f2( fn );		if ( f2.open( IO_WriteOnly ) ) {		    QCString data( f.size() );		    f.readBlock( data.data(), f.size() );		    f2.writeBlock( data );		} else {		    QMessageBox::warning( MainWindow::self, "Save", "The file " + codeFile() + " could not be saved" );		}	    }	}    }    Resource resource( MainWindow::self );    resource.setWidget( formWindow() );    bool formCodeOnly = isModified( WFormCode ) && !isModified( WFormWindow ) && seperateSource;    if ( !resource.save( pro->makeAbsolute( filename ), formCodeOnly ) ) {	MainWindow::self->statusBar()->message( tr( "Failed to save file '%1'.").arg( filename ), 5000 );	return saveAs();    }    MainWindow::self->statusBar()->message( tr( "'%1' saved.").arg( formCodeOnly ? codeFile() : filename ), 3000 );    timeStamp.update();    setModified( FALSE );    return TRUE;}bool FormFile::saveAs(){    QString f = pro->makeAbsolute( fileName() );    if ( fileNameTemp )	f = pro->makeAbsolute( QString( formWindow()->name() ).lower() + ".ui" );    bool saved = FALSE;    while ( !saved ) {	QString fn = QFileDialog::getSaveFileName( f,					       tr( "Qt User-Interface Files (*.ui)" ) + ";;" +					       tr( "All Files (*)" ), MainWindow::self, 0,					       tr( "Save Form '%1' As ...").arg( formWindow()->name() ),					       &MainWindow::self->lastSaveFilter );	if ( fn.isEmpty() )	    return FALSE;	QFileInfo fi( fn );	if ( fi.extension() != "ui" )	    fn += ".ui";	fileNameTemp = FALSE;	filename = pro->makeRelative( fn );	QFileInfo relfi( filename );	if ( relfi.exists() ) {	    if ( QMessageBox::warning( MainWindow::self, tr( "File Already Exists" ),		tr( "The file already exists. Do you wish to overwrite it?" ),		QMessageBox::Yes,		QMessageBox::No ) == QMessageBox::Yes ) {		saved = TRUE;	    } else {		filename = f;	    }	} else {	    saved = TRUE;	}    }    if ( !checkFileName( TRUE ) ) {	filename = f;	return FALSE;    }    pro->setModified( TRUE );    timeStamp.setFileName( pro->makeAbsolute( codeFile() ) );    if ( ed )	ed->setCaption( tr( "Edit %1" ).arg( formWindow()->name() ) );    setModified( TRUE );    return save();}bool FormFile::close(){    if ( editor() ) {	editor()->save();	editor()->close();    }    if ( formWindow() )	return formWindow()->close();    return TRUE;}bool FormFile::closeEvent(){    if ( !isModified() && fileNameTemp ) {	pro->removeFormFile( this );	return TRUE;    }    if ( !isModified() )	return TRUE;    if ( editor() )	editor()->save();    switch ( QMessageBox::warning( MainWindow::self, tr( "Save Form" ),				   tr( "Save changes to form '%1'?" ).arg( filename ),				   tr( "&Yes" ), tr( "&No" ), tr( "&Cancel" ), 0, 2 ) ) {    case 0: // save	if ( !save() )	    return FALSE;    case 1: // don't save	loadCode();	if ( ed )	    ed->editorInterface()->setText( cod );	if ( fileNameTemp )	    pro->removeFormFile( this );	MainWindow::self->workspace()->update();	break;    case 2: // cancel	return FALSE;    default:	break;    }    setModified( FALSE );    MainWindow::self->updateFunctionList();    setCodeEdited( FALSE );    return TRUE;}void FormFile::setModified( bool m, int who ){    if ( ( who & WFormWindow ) == WFormWindow )	setFormWindowModified( m );    if ( ( who & WFormCode ) == WFormCode )	setCodeModified( m );}

⌨️ 快捷键说明

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