summaryrefslogtreecommitdiffstats
path: root/kdevdesigner/designer/formfile.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit114a878c64ce6f8223cfd22d76a20eb16d177e5e (patch)
treeacaf47eb0fa12142d3896416a69e74cbf5a72242 /kdevdesigner/designer/formfile.cpp
downloadtdevelop-114a878c64ce6f8223cfd22d76a20eb16d177e5e.tar.gz
tdevelop-114a878c64ce6f8223cfd22d76a20eb16d177e5e.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdevelop@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kdevdesigner/designer/formfile.cpp')
-rw-r--r--kdevdesigner/designer/formfile.cpp905
1 files changed, 905 insertions, 0 deletions
diff --git a/kdevdesigner/designer/formfile.cpp b/kdevdesigner/designer/formfile.cpp
new file mode 100644
index 00000000..cde7eb8b
--- /dev/null
+++ b/kdevdesigner/designer/formfile.cpp
@@ -0,0 +1,905 @@
+/**********************************************************************
+** 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 "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 <qstatusbar.h>
+#include "propertyeditor.h"
+#include <qworkspace.h>
+#include <stdlib.h>
+#include "designerappiface.h"
+#include <qapplication.h>
+
+#include <kfiledialog.h>
+#include <klocale.h>
+#include "kdevdesigner_part.h"
+
+static QString make_func_pretty( const QString &s )
+{
+ QString res = s;
+ if ( res.find( ")" ) - res.find( "(" ) == 1 )
+ return res;
+ res.replace( "(", "( " );
+ res.replace( ")", " )" );
+ res.replace( "&", " &" );
+ res.replace( "*", " *" );
+ res.replace( ",", ", " );
+ res.replace( ":", " : " );
+ res = res.simplifyWhiteSpace();
+ res.replace( " : : ", "::" );
+ res.replace( ">>", "> >" );
+ return res;
+}
+
+FormFile::FormFile( const QString &fn, bool temp, Project *p, const char *name )
+ : filename( fn ), fileNameTemp( temp ), pro( p ), fw( 0 ), ed( 0 ),
+ timeStamp( 0, fn + codeExtension() ), codeEdited( FALSE ), pkg( FALSE ),
+ cm( FALSE ), codeFileStat( None )
+{
+ MetaDataBase::addEntry( this );
+ fake = qstrcmp( name, "qt_fakewindow" ) == 0;
+ //codeFileStat = FormFile::None;
+ pro->addFormFile( this );
+ loadCode();
+ if ( !temp )
+ checkFileName( FALSE );
+
+ connect(this, SIGNAL(somethingChanged(FormFile* )), this, SLOT(emitNewStatus(FormFile* )));
+}
+
+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 );
+ parseCode( cod, FALSE );
+ QTimer::singleShot( 0, this, SLOT( notifyFormWindowChange() ) );
+}
+
+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;
+ } else {
+ fileNameTemp = FALSE;
+ }
+ 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
+{
+ QString codeExt = codeExtension();
+ if ( codeExt.isEmpty() )
+ return "";
+ return filename + codeExt;
+}
+
+QString FormFile::code()
+{
+ return cod;
+}
+
+bool FormFile::save( bool withMsgBox, bool ignoreModified )
+{
+ if ( fileNameTemp )
+ return saveAs();
+ if ( !ignoreModified && !isModified() )
+ return TRUE;
+ if ( ed )
+ ed->save();
+
+ if ( formWindow() && 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 | IO_Translate ) ) {
+ QCString data( f.size() );
+ f.readBlock( data.data(), f.size() );
+ f2.writeBlock( data );
+ } else {
+ QMessageBox::warning( MainWindow::self, i18n( "Save" ),
+ i18n( "The file %1 could not be saved" ).arg( codeFile() ) );
+ }
+ }
+ }
+ }
+
+ if ( isModified( WFormCode ) ) {
+ 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 | IO_Translate) ) {
+ QCString data( f.size() );
+ f.readBlock( data.data(), f.size() );
+ f2.writeBlock( data );
+ } else if ( qApp->type() != QApplication::Tty ) {
+ QMessageBox::warning( MainWindow::self, i18n( "Save" ),
+ i18n( "The file %1 could not be saved" ).arg( codeFile() ) );
+ }
+ }
+ }
+ }
+
+ if ( formWindow() ) {
+ Resource resource( MainWindow::self );
+ resource.setWidget( formWindow() );
+ bool formCodeOnly = isModified( WFormCode ) && !isModified( WFormWindow );
+ if ( !resource.save( pro->makeAbsolute( filename ), formCodeOnly ) ) {
+ if ( MainWindow::self )
+ MainWindow::self->statusMessage( i18n( "Failed to save file '%1'.").arg( formCodeOnly ? codeFile(): filename ) );
+ if ( formCodeOnly )
+ return FALSE;
+ return saveAs();
+ }
+ if ( MainWindow::self )
+ MainWindow::self->statusMessage( i18n( "'%1' saved.").
+ arg( formCodeOnly ? codeFile() : filename ));
+ } else {
+ if ( !Resource::saveFormCode(this, MetaDataBase::languageInterface(pro->language())) )
+ return FALSE;
+ }
+ timeStamp.update();
+ setModified( FALSE );
+ return TRUE;
+}
+
+bool FormFile::saveAs( bool ignoreModified )
+{
+ QString f = pro->makeAbsolute( fileName() );
+ if ( fileNameTemp && formWindow() ) {
+ f = QString( formWindow()->name() ).lower();
+ f.replace( "::", "_" );
+ f = pro->makeAbsolute( f + ".ui" );
+ }
+ bool saved = FALSE;
+ if ( ignoreModified ) {
+ QString dir = QStringList::split( ':', pro->iFace()->customSetting( "QTSCRIPT_PACKAGES" ) ).first();
+ f = QFileInfo( f ).fileName();
+ f.prepend( dir + "/" );
+ }
+ QString fn;
+ while ( !saved ) {
+ fn = KFileDialog::getSaveFileName( f,
+ i18n( "*.ui|Qt User-Interface Files" ) + "\n" +
+ i18n( "*|All Files" ), MainWindow::self, /*0,*/
+ i18n( "Save Form '%1' As").arg( formName() )/*,
+ MainWindow::self ? &MainWindow::self->lastSaveFilter : 0*/ );
+ 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, i18n( "File Already Exists" ),
+ i18n( "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 && formWindow() )
+ ed->setCaption( i18n( "Edit %1" ).arg( formWindow()->name() ) );
+ setModified( TRUE );
+ if ( pro->isDummy() )
+ fw->mainWindow()->addRecentlyOpenedFile( fn );
+ return save( TRUE, ignoreModified );
+}
+
+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, i18n( "Save Form" ),
+ i18n( "Save changes to form '%1'?" ).arg( filename ),
+ i18n( "&Yes" ), i18n( "&No" ), i18n( "&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 );
+ if ( MainWindow::self )
+ MainWindow::self->workspace()->update();
+ break;
+ case 2: // cancel
+ return FALSE;
+ default:
+ break;
+ }
+
+ setModified( FALSE );
+ if ( MainWindow::self )
+ 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 );
+}
+
+bool FormFile::isModified( int who )
+{
+ if ( who == WFormWindow )
+ return isFormWindowModified();
+ if ( who == WFormCode )
+ return isCodeModified();
+ return isCodeModified() || isFormWindowModified();
+}
+
+bool FormFile::isFormWindowModified() const
+{
+ if ( !formWindow() || !formWindow()->commandHistory() )
+ return FALSE;
+ return formWindow()->commandHistory()->isModified();
+}
+
+bool FormFile::isCodeModified() const
+{
+ if ( !editor() )
+ return cm;
+ return editor()->isModified();
+}
+
+void FormFile::setFormWindowModified( bool m )
+{
+ bool b = isFormWindowModified();
+ if ( m == b )
+ return;
+ if ( !formWindow() || !formWindow()->commandHistory() )
+ return;
+ formWindow()->commandHistory()->setModified( m );
+ emit somethingChanged( this );
+}
+
+void FormFile::setCodeModified( bool m )
+{
+ bool b = isCodeModified();
+ if ( m == b )
+ return;
+ emit somethingChanged( this );
+ cm = m;
+ if ( !editor() )
+ return;
+ editor()->setModified( m );
+}
+
+void FormFile::showFormWindow()
+{
+ if ( !MainWindow::self )
+ return;
+ if ( formWindow() ) {
+ if ( ( formWindow()->hasFocus() ||
+ MainWindow::self->qWorkspace()->activeWindow() == formWindow() ) &&
+ MainWindow::self->propertyeditor()->formWindow() != formWindow() ) {
+ MainWindow::self->propertyeditor()->setWidget( formWindow()->currentWidget(), formWindow() );
+ MainWindow::self->objectHierarchy()->setFormWindow( formWindow(),
+ formWindow()->currentWidget() );
+ }
+ formWindow()->setFocus();
+ return;
+ }
+ MainWindow::self->openFormWindow( pro->makeAbsolute( filename ), TRUE, this );
+}
+
+bool FormFile::setupUihFile( bool askForUih )
+{
+ if ( !pro->isCpp() || !askForUih ) {
+ if ( !hasFormCode() ) {
+ createFormCode();
+ setModified( TRUE );
+ }
+ codeFileStat = FormFile::Ok;
+ return TRUE;
+ }
+ if ( codeFileStat != FormFile::Ok && !ed ) {
+ if ( hasFormCode() ) {
+ int i = QMessageBox::information( MainWindow::self, i18n( "Using ui.h File" ),
+ i18n( "An \"ui.h\" file for this form already exists.\n"
+ "Do you want to use it or create a new one?" ),
+ i18n( "Use Existing" ), i18n( "Create New" ),
+ i18n( "Cancel" ), 2, 2 );
+ if ( i == 2 )
+ return FALSE;
+ if ( i == 1 )
+ createFormCode();
+ } else {
+ if ( QMessageBox::Yes != QMessageBox::information( MainWindow::self, i18n( "Creating ui.h file" ),
+ i18n( "Do you want to create an new \"ui.h\" file?" ),
+ QMessageBox::Yes, QMessageBox::No ) )
+ return FALSE;
+ createFormCode();
+ }
+ setModified( TRUE );
+ }
+ codeFileStat = FormFile::Ok;
+ return TRUE;
+}
+
+SourceEditor *FormFile::showEditor( bool askForUih )
+{
+ if ( !MainWindow::self )
+ return 0;
+ showFormWindow();
+ //emit signal to the embedding IDE if there is one and return 0 because
+ //no source editing is possible
+ emit fw->mainWindow()->part()->emitEditSource(fw->fileName());
+ return 0;
+/* if ( !setupUihFile( askForUih ) )
+ return 0;
+ return MainWindow::self->openSourceEditor();*/
+}
+
+static int ui_counter = 0;
+QString FormFile::createUnnamedFileName()
+{
+ return QString( "unnamed" ) + QString::number( ++ui_counter ) + QString( ".ui" );
+}
+
+QString FormFile::codeExtension() const
+{
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( iface )
+ return iface->formCodeExtension();
+ return "";
+}
+
+QString FormFile::codeComment() const
+{
+ return QString( "/****************************************************************************\n"
+ "** ui.h extension file, included from the uic-generated form implementation.\n"
+ "**\n"
+ "** If you want to add, delete, or rename functions or slots, use\n"
+ "** Qt Designer to update this file, preserving your code.\n"
+ "**\n"
+ "** You should not define a constructor or destructor in this file.\n"
+ "** Instead, write your code in functions called init() and destroy().\n"
+ "** These will automatically be called by the form's constructor and\n"
+ "** destructor.\n"
+ "*****************************************************************************/\n" );
+}
+
+bool FormFile::hasFormCode() const
+{
+ return !cod.isEmpty() && cod != QString( codeComment() );
+}
+
+int FormFile::codeFileState() const
+{
+ return hasFormCode() ? codeFileStat : None;
+}
+
+void FormFile::setCodeFileState( UihState s )
+{
+ codeFileStat = s;
+}
+
+void FormFile::createFormCode()
+{
+ if ( !formWindow() )
+ return;
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+ if ( pro->isCpp() )
+ cod = codeComment();
+ QValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( formWindow() );
+ for ( QValueList<MetaDataBase::Function>::Iterator it = functionList.begin(); it != functionList.end(); ++it ) {
+ cod += (!cod.isEmpty() ? "\n\n" : "") +
+ iface->createFunctionStart( formWindow()->name(), make_func_pretty((*it).function),
+ (*it).returnType.isEmpty() ?
+ QString( "void" ) :
+ (*it).returnType, (*it).access ) +
+ "\n" + iface->createEmptyFunction();
+ }
+ parseCode( cod, FALSE );
+}
+
+void FormFile::load()
+{
+ showFormWindow();
+ code();
+}
+
+bool FormFile::loadCode()
+{
+ QFile f( pro->makeAbsolute( codeFile() ) );
+ if ( !f.open( IO_ReadOnly ) ) {
+ cod = "";
+ setCodeFileState( FormFile::None );
+ return FALSE;
+ }
+ QTextStream ts( &f );
+ cod = ts.read();
+ parseCode( cod, FALSE );
+ if ( hasFormCode() && codeFileStat != FormFile::Ok )
+ setCodeFileState( FormFile::Deleted );
+ timeStamp.update();
+ return TRUE;
+}
+
+bool FormFile::isCodeEdited() const
+{
+ return codeEdited;
+}
+
+void FormFile::setCodeEdited( bool b )
+{
+ codeEdited = b;
+}
+
+void FormFile::parseCode( const QString &txt, bool allowModify )
+{
+ if ( !formWindow() )
+ return;
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+ QValueList<LanguageInterface::Function> functions;
+ QValueList<MetaDataBase::Function> newFunctions, oldFunctions;
+ oldFunctions = MetaDataBase::functionList( formWindow() );
+ iface->functions( txt, &functions );
+ QMap<QString, QString> funcs;
+ for ( QValueList<LanguageInterface::Function>::Iterator it = functions.begin();
+ it != functions.end(); ++it ) {
+ bool found = FALSE;
+ for ( QValueList<MetaDataBase::Function>::Iterator fit = oldFunctions.begin();
+ fit != oldFunctions.end(); ++fit ) {
+ QString f( (*fit).function );
+ if ( MetaDataBase::normalizeFunction( f ) ==
+ MetaDataBase::normalizeFunction( (*it).name ) ) {
+ found = TRUE;
+ MetaDataBase::Function function;
+ function.function = make_func_pretty( (*it).name );
+ function.specifier = (*fit).specifier;
+ function.type = (*fit).type;
+ if ( !pro->isCpp() )
+ function.access = (*it).access;
+ else
+ function.access = (*fit).access;
+ function.language = (*fit).language;
+ function.returnType = (*it).returnType;
+ newFunctions << function;
+ funcs.insert( (*it).name, (*it).body );
+ oldFunctions.remove( fit );
+ break;
+ }
+ }
+ if ( !found ) {
+ MetaDataBase::Function function;
+ function.function = make_func_pretty( (*it).name );
+ function.specifier = "virtual";
+ function.access = "public";
+ function.language = pro->language();
+ function.returnType = (*it).returnType;
+ if ( function.returnType == "void" )
+ function.type = "slot";
+ else
+ function.type = "function";
+ if ( function.function == "init()" || function.function == "destroy()" ) {
+ function.type = "function";
+ function.access = "private";
+ function.specifier = "non virtual";
+ }
+ newFunctions << function;
+ funcs.insert( (*it).name, (*it).body );
+ if ( allowModify )
+ setFormWindowModified( TRUE );
+ }
+ }
+
+ if ( allowModify && oldFunctions.count() > 0 )
+ setFormWindowModified( TRUE );
+
+ MetaDataBase::setFunctionList( formWindow(), newFunctions );
+}
+
+void FormFile::syncCode()
+{
+ if ( !editor() )
+ return;
+ parseCode( editor()->editorInterface()->text(), TRUE );
+ cod = editor()->editorInterface()->text();
+}
+
+void FormFile::checkTimeStamp()
+{
+ if ( timeStamp.isUpToDate() )
+ return;
+ timeStamp.update();
+ if ( codeEdited ) {
+ 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( timeStamp.fileName() ),
+ i18n( "&Yes" ), i18n( "&No" ) ) == 0 ) {
+ QFile f( timeStamp.fileName() );
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ editor()->editorInterface()->setText( ts.read() );
+ editor()->save();
+ if ( MainWindow::self )
+ MainWindow::self->functionsChanged();
+ }
+ }
+ } else {
+ loadCode();
+ }
+}
+
+bool FormFile::isUihFileUpToDate()
+{
+ if ( timeStamp.isUpToDate() )
+ return TRUE;
+ if ( !editor() ) {
+ MainWindow::self->editSource();
+ qDebug( "parse Code" );
+ parseCode( editor()->editorInterface()->text(), TRUE );
+ }
+ checkTimeStamp();
+ return FALSE;
+}
+
+void FormFile::addFunctionCode( MetaDataBase::Function function )
+{
+ if ( pro->isCpp() && !hasFormCode() && !codeEdited )
+ return;
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+
+ QValueList<LanguageInterface::Function> funcs;
+ iface->functions( cod, &funcs );
+ bool hasFunc = FALSE;
+ for ( QValueList<LanguageInterface::Function>::Iterator it = funcs.begin();
+ it != funcs.end(); ++it ) {
+ if ( MetaDataBase::normalizeFunction( (*it).name ) == MetaDataBase::normalizeFunction( function.function ) ) {
+ hasFunc = TRUE;
+ break;
+ }
+ }
+
+ if ( !hasFunc ) {
+ if ( !codeEdited && !timeStamp.isUpToDate() )
+ loadCode();
+ MetaDataBase::MetaInfo mi = MetaDataBase::metaInfo( formWindow() );
+ QString cn;
+ if ( mi.classNameChanged )
+ cn = mi.className;
+ if ( cn.isEmpty() )
+ cn = formWindow()->name();
+ QString body = "\n\n" + iface->createFunctionStart( cn,
+ make_func_pretty( function.function ),
+ function.returnType.isEmpty() ?
+ QString( "void" ) :
+ function.returnType, function.access ) +
+ "\n" + iface->createEmptyFunction();
+ cod += body;
+ if ( codeEdited ) {
+ setModified( TRUE );
+ emit somethingChanged( this );
+ }
+ }
+}
+
+void FormFile::removeFunctionCode( MetaDataBase::Function function )
+{
+ if ( pro->isCpp() && !hasFormCode() && !codeEdited )
+ return;
+
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+
+ checkTimeStamp();
+ QString sourceCode = code();
+ if ( sourceCode.isEmpty() )
+ return;
+ QValueList<LanguageInterface::Function> functions;
+ iface->functions( sourceCode, &functions );
+ QString fu = MetaDataBase::normalizeFunction( function.function );
+ for ( QValueList<LanguageInterface::Function>::Iterator fit = functions.begin(); fit != functions.end(); ++fit ) {
+ if ( MetaDataBase::normalizeFunction( (*fit).name ) == fu ) {
+ int line = 0;
+ int start = 0;
+ while ( line < (*fit).start - 1 ) {
+ start = sourceCode.find( '\n', start );
+ if ( start == -1 )
+ return;
+ start++;
+ line++;
+ }
+ if ( start == -1 )
+ return;
+ int end = start;
+ while ( line < (*fit).end + 1 ) {
+ end = sourceCode.find( '\n', end );
+ if ( end == -1 ) {
+ if ( line <= (*fit).end )
+ end = sourceCode.length() - 1;
+ else
+ return;
+ }
+ end++;
+ line++;
+ }
+ if ( end < start )
+ return;
+ sourceCode.remove( start, end - start );
+ setCode( sourceCode );
+ }
+ }
+}
+
+void FormFile::functionNameChanged( const QString &oldName, const QString &newName )
+{
+ if ( !cod.isEmpty() ) {
+ QString funcStart = QString( formWindow()->name() ) + QString( "::" );
+ int i = cod.find( funcStart + oldName );
+ if ( i != -1 ) {
+ cod.remove( i + funcStart.length(), oldName.length() );
+ cod.insert( i + funcStart.length(), newName );
+ }
+ }
+}
+
+void FormFile::functionRetTypeChanged( const QString &fuName, const QString &oldType, const QString &newType )
+{
+ if ( !cod.isEmpty() ) {
+ QString oldFunct = oldType + " " + QString( formWindow()->name() ) + "::" + fuName;
+ QString newFunct = newType + " " + QString( formWindow()->name() ) + "::" + fuName;
+
+ int i = cod.find( oldFunct );
+ if ( i != -1 ) {
+ cod.remove( i, oldFunct.length() );
+ cod.insert( i, newFunct );
+ }
+ }
+}
+
+QString FormFile::formName() const
+{
+ FormFile* that = (FormFile*) this;
+ if ( formWindow() ) {
+ that->cachedFormName = formWindow()->name();
+ return cachedFormName;
+ }
+ if ( !cachedFormName.isNull() )
+ return cachedFormName;
+ QFile f( pro->makeAbsolute( filename ) );
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ QString line;
+ QString className;
+ while ( !ts.eof() ) {
+ line = ts.readLine();
+ if ( !className.isEmpty() ) {
+ int end = line.find( "</class>" );
+ if ( end == -1 ) {
+ className += line;
+ } else {
+ className += line.left( end );
+ break;
+ }
+ continue;
+ }
+ int start;
+ if ( ( start = line.find( "<class>" ) ) != -1 ) {
+ int end = line.find( "</class>" );
+ if ( end == -1 ) {
+ className = line.mid( start + 7 );
+ } else {
+ className = line.mid( start + 7, end - ( start + 7 ) );
+ break;
+ }
+ }
+ }
+ that->cachedFormName = className;
+ }
+ if ( cachedFormName.isEmpty() )
+ that->cachedFormName = filename;
+ return cachedFormName;
+}
+
+void FormFile::formWindowChangedSomehow()
+{
+ emit somethingChanged( this );
+}
+
+bool FormFile::checkFileName( bool allowBreak )
+{
+ FormFile *ff = pro->findFormFile( filename, this );
+ if ( ff )
+ QMessageBox::warning( MainWindow::self, i18n( "Invalid Filename" ),
+ i18n( "The project already contains a form with a\n"
+ "filename of '%1'. Please choose a new filename." ).arg( filename ) );
+ while ( ff ) {
+ QString fn;
+ while ( fn.isEmpty() ) {
+ fn = KFileDialog::getSaveFileName( pro->makeAbsolute( fileName() ),
+ i18n( "*.ui|Qt User-Interface Files" ) + "\n" +
+ i18n( "*|All Files" ), MainWindow::self,/* 0,*/
+ i18n( "Save Form '%1' As").
+ arg( formWindow()->name() )/*,
+ MainWindow::self ? &MainWindow::self->lastSaveFilter : 0 */);
+ if ( allowBreak && fn.isEmpty() )
+ return FALSE;
+ }
+ filename = pro->makeRelative( fn );
+ ff = pro->findFormFile( filename, this );
+ }
+ return TRUE;
+}
+
+void FormFile::addConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot )
+{
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( iface )
+ iface->addConnection( sender, signal, receiver, slot, &cod );
+ if ( ed )
+ ed->editorInterface()->setText( cod );
+}
+
+void FormFile::removeConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot )
+{
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( iface )
+ iface->removeConnection( sender, signal, receiver, slot, &cod );
+ if ( ed )
+ ed->editorInterface()->setText( cod );
+}
+
+void FormFile::notifyFormWindowChange()
+{
+ if ( fw )
+ pro->formOpened( fw );
+}
+
+void FormFile::emitNewStatus(FormFile *file)
+{
+ fw->mainWindow()->part()->emitNewStatus(fileName(), isModified());
+}