You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqt3/tools/designer/designer/sourceeditor.cpp

326 lines
7.8 KiB

/**********************************************************************
** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
**
** This file is part of TQt Designer.
**
** This file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free
** Software Foundation and appearing in the files LICENSE.GPL2
** and LICENSE.GPL3 included in the packaging of this file.
** Alternatively you may (at your option) use any later version
** of the GNU General Public License if such license has been
** publicly approved by Trolltech ASA (or its successors, if any)
** and the KDE Free TQt Foundation.
**
** Please review the following information to ensure GNU General
** Public Licensing requirements will be met:
** http://trolltech.com/products/qt/licenses/licensing/opensource/.
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
** or contact the sales department at sales@trolltech.com.
**
** Licensees holding valid TQt Commercial licenses may use this file in
** accordance with the TQt Commercial License Agreement provided with
** the Software.
**
** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
** herein.
**
**********************************************************************/
#include "sourceeditor.h"
#include "formwindow.h"
#include "metadatabase.h"
#include "project.h"
#include "mainwindow.h"
#include "../interfaces/languageinterface.h"
#include <ntqregexp.h>
#include "project.h"
#include "sourcefile.h"
#include "hierarchyview.h"
#include <ntqmessagebox.h>
#include <ntqtextstream.h>
SourceEditor::SourceEditor( TQWidget *parent, EditorInterface *iface, LanguageInterface *liface )
: TQVBox( parent, 0, WDestructiveClose ), iFace( iface ), lIface( liface ), obj( 0 ), pro( 0 )
{
iFace->addRef();
lIface->addRef();
editor = iFace->editor( MainWindow::self->areEditorsReadOnly(),
this, MainWindow::self->designerInterface() );
iFace->onBreakPointChange( MainWindow::self, SLOT( breakPointsChanged() ) );
resize( 600, 400 );
setIcon( TQPixmap::fromMimeSource( "designer_filenew.png" ) );
}
SourceEditor::~SourceEditor()
{
saveBreakPoints();
editor = 0;
if ( formWindow() ) {
formWindow()->formFile()->setCodeEdited( FALSE );
formWindow()->formFile()->setEditor( 0 );
} else if ( sourceFile() ) {
sourceFile()->setEditor( 0 );
if ( MainWindow::self->objectHierarchy()->sourceEditor() == this )
MainWindow::self->objectHierarchy()->setFormWindow( 0, 0 );
}
iFace->release();
lIface->release();
MainWindow::self->editorClosed( this );
}
void SourceEditor::setObject( TQObject *o, Project *p )
{
if ( sourceFile() )
sourceFile()->setEditor( 0 );
if ( formWindow() ) {
formWindow()->formFile()->setCodeEdited( FALSE );
formWindow()->formFile()->setEditor( 0 );
}
if ( ::tqt_cast<FormWindow*>(o) )
( (FormWindow*)o )->formFile()->setCodeEdited( TRUE );
save();
bool changed = FALSE;
if ( &(*obj) != o ) {
saveBreakPoints();
changed = TRUE;
}
obj = o;
pro = p;
if ( formWindow() ) {
if ( formWindow()->isFake() )
setCaption( formWindow()->project()->objectForFakeForm( formWindow() )->name() );
else
setCaption( obj->name() );
} else {
setCaption( sourceFile()->fileName() );
}
if ( sourceFile() )
sourceFile()->setEditor( this );
else if ( formWindow() )
formWindow()->formFile()->setEditor( this );
iFace->setText( sourceOfObject( obj, lang, iFace, lIface ) );
if ( pro && formWindow() ) {
if ( formWindow()->isFake() )
iFace->setContext( pro->objectForFakeFormFile( formWindow()->formFile() ) );
else
iFace->setContext( formWindow()->mainContainer() );
} else {
iFace->setContext( 0 );
}
if ( changed || sourceFile() )
iFace->setBreakPoints( MetaDataBase::breakPoints( o ) );
MainWindow::self->objectHierarchy()->showClasses( this );
}
TQString SourceEditor::sourceOfObject( TQObject *o, const TQString &,
EditorInterface *, LanguageInterface * )
{
TQString txt;
if ( !o )
return txt;
if ( ::tqt_cast<FormWindow*>(o) )
txt = ( (FormWindow*)o )->formFile()->code();
else if ( ::tqt_cast<SourceFile*>(o) )
txt = ( (SourceFile*)o )->text();
return txt;
}
void SourceEditor::setFunction( const TQString &func, const TQString &clss )
{
iFace->scrollTo( lIface->createFunctionStart( obj->name(), func, "", "" ), clss );
}
void SourceEditor::setClass( const TQString &clss )
{
iFace->scrollTo( clss, TQString::null );
}
void SourceEditor::closeEvent( TQCloseEvent *e )
{
e->accept();
if ( !obj )
return;
if ( formWindow() ) {
save();
formWindow()->formFile()->cm = formWindow()->formFile()->isModified();
} else {
if ( !sourceFile()->closeEvent() )
e->ignore();
}
}
void SourceEditor::save()
{
if ( !obj )
return;
if ( formWindow() )
formWindow()->formFile()->syncCode();
else if ( sourceFile() && sourceFile()->editor() )
sourceFile()->setText( iFace->text() );
}
TQString SourceEditor::language() const
{
return lang;
}
void SourceEditor::setLanguage( const TQString &l )
{
lang = l;
}
void SourceEditor::editCut()
{
iFace->cut();
}
void SourceEditor::editCopy()
{
iFace->copy();
}
void SourceEditor::editPaste()
{
iFace->paste();
}
bool SourceEditor::editIsUndoAvailable()
{
return iFace->isUndoAvailable();
}
bool SourceEditor::editIsRedoAvailable()
{
return iFace->isRedoAvailable();
}
void SourceEditor::editUndo()
{
iFace->undo();
}
void SourceEditor::editRedo()
{
iFace->redo();
}
void SourceEditor::editSelectAll()
{
iFace->selectAll();
}
void SourceEditor::configChanged()
{
iFace->readSettings();
}
void SourceEditor::setModified( bool b )
{
iFace->setModified( b );
}
void SourceEditor::refresh( bool allowSave )
{
if ( allowSave )
save();
bool oldMod = iFace->isModified();
iFace->setText( sourceOfObject( obj, lang, iFace, lIface ) );
iFace->setModified( oldMod );
}
void SourceEditor::resetContext()
{
if ( pro && formWindow() ) {
if ( formWindow()->isFake() )
iFace->setContext( pro->objectForFakeFormFile( formWindow()->formFile() ) );
else
iFace->setContext( formWindow()->mainContainer() );
} else {
iFace->setContext( 0 );
}
}
void SourceEditor::setFocus()
{
if ( formWindow() )
formWindow()->formFile()->setCodeEdited( TRUE );
if ( editor )
editor->setFocus();
}
int SourceEditor::numLines() const
{
return iFace->numLines();
}
void SourceEditor::saveBreakPoints()
{
if ( !obj )
return;
TQValueList<uint> l;
iFace->breakPoints( l );
MetaDataBase::setBreakPoints( obj, l );
}
void SourceEditor::clearStep()
{
iFace->clearStep();
}
void SourceEditor::clearStackFrame()
{
iFace->clearStackFrame();
}
void SourceEditor::resetBreakPoints()
{
iFace->setBreakPoints( MetaDataBase::breakPoints( obj ) );
}
TQString SourceEditor::text() const
{
return iFace->text();
}
bool SourceEditor::isModified() const
{
return iFace->isModified();
}
void SourceEditor::checkTimeStamp()
{
if ( formWindow() )
formWindow()->formFile()->checkTimeStamp();
else if ( sourceFile() )
sourceFile()->checkTimeStamp();
}
bool SourceEditor::saveAs()
{
if ( formWindow() )
return formWindow()->formFile()->saveAs();
else if ( sourceFile() )
return sourceFile()->saveAs();
return FALSE;
}
SourceFile *SourceEditor::sourceFile() const
{
if ( !::tqt_cast<SourceFile*>((TQObject *)obj) )
return 0;
return (SourceFile*)(TQObject*)obj;
}
FormWindow *SourceEditor::formWindow() const
{
if ( !::tqt_cast<FormWindow*>((TQObject *)obj) )
return 0;
return (FormWindow*)(TQObject*)obj;
}