diff options
Diffstat (limited to 'kdevdesigner/designer/sourcefile.cpp')
-rw-r--r-- | kdevdesigner/designer/sourcefile.cpp | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/kdevdesigner/designer/sourcefile.cpp b/kdevdesigner/designer/sourcefile.cpp new file mode 100644 index 00000000..327dc58c --- /dev/null +++ b/kdevdesigner/designer/sourcefile.cpp @@ -0,0 +1,298 @@ +/********************************************************************** +** 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. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** 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. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "sourcefile.h" +#include <qfile.h> +#include <qtextstream.h> +#include "designerappiface.h" +#include "sourceeditor.h" +#include "metadatabase.h" +#include "../interfaces/languageinterface.h" +#include <qfiledialog.h> +#include <qmessagebox.h> +#include "mainwindow.h" +#include "workspace.h" +#include <stdlib.h> + +#include <kfiledialog.h> +#include <klocale.h> + +SourceFile::SourceFile( const QString &fn, bool temp, Project *p ) + : filename( fn ), ed( 0 ), fileNameTemp( temp ), + timeStamp( 0, p->makeAbsolute( fn ) ), pro( p ), pkg( FALSE ) + , accepted( TRUE ) +{ + iface = 0; + + if ( !temp ) + accepted = checkFileName( TRUE ); + + if (accepted) { + load(); + pro->addSourceFile( this ); + MetaDataBase::addEntry( this ); + } + +} + +SourceFile::~SourceFile() +{ + if (iface) + delete iface; +} + +QString SourceFile::text() const +{ + return txt; +} + +void SourceFile::setText( const QString &s ) +{ + txt = s; +} + +bool SourceFile::save( bool ignoreModified ) +{ + if ( fileNameTemp ) + return saveAs(); + if ( !ignoreModified && !isModified() ) + return TRUE; + if ( ed ) + ed->save(); + + 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 | IO_Translate ) ) { + QCString data( f.size() ); + f.readBlock( data.data(), f.size() ); + f2.writeBlock( data ); + } + } + } + + QFile f( pro->makeAbsolute( filename ) ); + if ( !f.open( IO_WriteOnly | IO_Translate ) ) + return saveAs(); + + QTextStream ts( &f ); + ts << txt; + timeStamp.update(); + setModified( FALSE ); + return TRUE; +} + +bool SourceFile::saveAs( bool ignoreModified ) +{ + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + QString filter; + if ( iface ) + filter = iface->fileFilterList().join("\n"); + + QString old = filename; + QString initFn = pro->makeAbsolute( filename ); + if ( ignoreModified ) { + QString dir = QStringList::split( ':', project()->iFace()->customSetting( "QTSCRIPT_PACKAGES" ) ).first(); + initFn = QFileInfo( initFn ).fileName(); + initFn.prepend( dir + "/" ); + } + QString fn = KFileDialog::getSaveFileName( initFn, filter ); + if ( fn.isEmpty() ) + return FALSE; + fileNameTemp = FALSE; + filename = pro->makeRelative( fn ); + if ( !checkFileName( TRUE ) ) { + filename = old; + return FALSE; + } + pro->setModified( TRUE ); + timeStamp.setFileName( pro->makeAbsolute( filename ) ); + if ( ed ) + ed->setCaption( i18n( "Edit %1" ).arg( filename ) ); + setModified( TRUE ); + if ( pro->isDummy() ) { + QObject *o = ed->parent(); + while ( o && !o->isA( "MainWindow" ) ) + o = o->parent(); + if ( o ) + ((MainWindow *)o)->addRecentlyOpenedFile( fn ); + } + return save( ignoreModified ); +} + +bool SourceFile::load() +{ + QFile f( pro->makeAbsolute( filename ) ); + if ( !f.open( IO_ReadOnly ) ) + return FALSE; + QTextStream ts( &f ); + txt = ts.read(); + timeStamp.update(); + return TRUE; +} + +DesignerSourceFile *SourceFile::iFace() +{ + if ( !iface ) + iface = new DesignerSourceFileImpl( this ); + return iface; +} + +void SourceFile::setEditor( SourceEditor *e ) +{ + ed = e; +} + +bool SourceFile::isModified() const +{ + if ( !ed ) + return FALSE; + return ed->isModified(); +} + +static QMap<QString, int> *extensionCounter; +QString SourceFile::createUnnamedFileName( const QString &extension ) +{ + if ( !extensionCounter ) + extensionCounter = new QMap<QString, int>; + int count = -1; + QMap<QString, int>::Iterator it; + if ( ( it = extensionCounter->find( extension ) ) != extensionCounter->end() ) { + count = *it; + ++count; + extensionCounter->replace( extension, count ); + } else { + count = 1; + extensionCounter->insert( extension, count ); + } + + return "unnamed" + QString::number( count ) + "." + extension; +} + +void SourceFile::setModified( bool m ) +{ + if ( !ed ) + return; + ed->setModified( m ); +} + +bool SourceFile::closeEvent() +{ + if ( !isModified() && fileNameTemp ) { + pro->removeSourceFile( this ); + return TRUE; + } + + if ( !isModified() ) + return TRUE; + + if ( ed ) + ed->save(); + + switch ( QMessageBox::warning( MainWindow::self, i18n( "Save Code" ), + i18n( "Save changes to '%1'?" ).arg( filename ), + i18n( "&Yes" ), i18n( "&No" ), i18n( "&Cancel" ), 0, 2 ) ) { + case 0: // save + if ( !save() ) + return FALSE; + break; + case 1: // don't save + load(); + if ( ed ) + ed->editorInterface()->setText( txt ); + if ( fileNameTemp ) { + pro->removeSourceFile( this ); + return TRUE; + } + if ( MainWindow::self ) + MainWindow::self->workspace()->update(); + break; + case 2: // cancel + return FALSE; + default: + break; + } + setModified( FALSE ); + return TRUE; +} + +bool SourceFile::close() +{ + if ( !ed ) + return TRUE; + return ed->close(); +} + +Project *SourceFile::project() const +{ + return pro; +} + +void SourceFile::checkTimeStamp() +{ + if ( timeStamp.isUpToDate() ) + return; + timeStamp.update(); + if ( QMessageBox::information( MainWindow::self, i18n( "Qt Designer" ), + i18n( "File '%1' has been changed outside Qt Designer.\n" + "Do you want to reload it?" ).arg( filename ), + i18n( "&Yes" ), i18n( "&No" ) ) == 0 ) { + load(); + if ( ed ) + ed->editorInterface()->setText( txt ); + } +} + +bool SourceFile::checkFileName( bool allowBreak ) +{ + SourceFile *sf = pro->findSourceFile( filename, this ); + if ( sf ) + QMessageBox::warning( MainWindow::self, i18n( "Invalid Filename" ), + i18n( "The project already contains a source file with \n" + "filename '%1'. Please choose a new filename." ).arg( filename ) ); + while ( sf ) { + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + QString filter; + if ( iface ) + filter = iface->fileFilterList().join("\n"); + QString fn; + while ( fn.isEmpty() ) { + fn = KFileDialog::getSaveFileName( pro->makeAbsolute( filename ), filter ); + if ( allowBreak && fn.isEmpty() ) + return FALSE; + } + filename = pro->makeRelative( fn ); + sf = pro->findSourceFile( filename, this ); + } + return TRUE; +} |