/* -*- C++ -*-
This file is part of ViPEC
Copyright (C) 1991-2001 Johan Rossouw (jrossouw@alcatel.altech.co.za)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Library General Public License as
published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "images/logo.xpm"
#include "images/vipec.xpm"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const char* version = "3.2.0";
MainWindow* MainWindow::instance_ = 0;
long int MainWindow::uniqueID_ = 0;
//-----------------------------------------------------------------
MainWindow* MainWindow::instance()
{
if (instance_ == 0)
{
new MainWindow();
}
return instance_;
}
//-----------------------------------------------------------------
long int MainWindow::getUniqueID()
{
return uniqueID_++;
}
//-----------------------------------------------------------------
MainWindow::MainWindow()
: QMainWindow( 0, tr( Strings::MainWindowTitle) ),
filename_( Strings::EmptyFileName ),
fileChanged_( FALSE ),
helpWindow_( 0 ),
translator_( 0 )
{
instance_ = this;
setIcon( QPixmap( vipec_xpm ) );
createApplicationMenus();
createMainToolbar();
createSymbolToolbar();
QSplitter* splitter = new QSplitter( QSplitter::Horizontal, this , "main" );
new SchematicWindow( splitter );
NavigationWindow* navigWindow = new NavigationWindow( splitter );
navigWindow->setMinimumSize( 50, 0 );
splitter->setResizeMode( navigWindow, QSplitter::KeepSize );
splitter->moveToFirst( navigWindow );
setCentralWidget( splitter );
graphs_.setAutoDelete( TRUE );
statusBar()->message( tr( Strings::StatusMessageReady ) , 2000 );
}
//-----------------------------------------------------------------
MainWindow::~MainWindow()
{
instance_ = 0;
}
//-----------------------------------------------------------------
void MainWindow::closeEvent( QCloseEvent* e )
{
e->ignore();
quit();
}
//-----------------------------------------------------------------
void MainWindow::quit()
{
if ( closeFile() )
{
qApp->quit();
}
}
//-----------------------------------------------------------------
void MainWindow::createApplicationMenus()
{
//Init menus
QPopupMenu* file = new QPopupMenu();
menuBar()->insertItem( Strings::translate(Strings::MenuLabelFile), file );
file->insertItem( Strings::translate(Strings::MenuLabelOpen), this, SLOT( loadSlot() ) );
file->insertItem( Strings::translate(Strings::MenuLabelSave), this, SLOT( saveSlot() ) );
file->insertItem( Strings::translate(Strings::MenuLabelSaveAs), this, SLOT( saveAsSlot() ) );
file->insertItem( Strings::translate(Strings::MenuLabelClose), this, SLOT( closeSlot() ) );
file->insertSeparator();
file->insertItem( Strings::translate(Strings::MenuLabelNewSchematic), this, SLOT( newSchematicSlot() ) );
file->insertSeparator();
file->insertItem( Strings::translate(Strings::MenuLabelPrint), this, SLOT( printSlot() ) );
file->insertSeparator();
file->insertItem( Strings::translate(Strings::MenuLabelQuit), this, SLOT( quit() ) );
QPopupMenu* tools = new QPopupMenu();
menuBar()->insertItem( Strings::translate(Strings::MenuLabelTools), tools );
tools->insertItem( Strings::translate(Strings::MenuLabelMicroStripCalc),
this, SLOT( microStripCalculator() ) );
tools->insertItem( Strings::translate(Strings::MenuLabelTuner),
this, SLOT( tuner() ) );
QPopupMenu* setup = new QPopupMenu();
menuBar()->insertItem( Strings::translate(Strings::MenuLabelSetup), setup );
setup->insertItem( Strings::translate(Strings::MenuLabelLanguage),
this, SLOT( setLanguage() ) );
QPopupMenu *help = new QPopupMenu;
help->insertItem( Strings::translate(Strings::MenuLabelIndex), this, SLOT( helpSlot() ), Key_F1 );
help->insertSeparator();
help->insertItem( Strings::translate(Strings::MenuLabelAbout), this, SLOT( aboutSlot() ) );
help->insertItem( Strings::translate(Strings::MenuLabelAboutQt), this, SLOT( aboutQtSlot() ) );
menuBar()->insertSeparator();
menuBar()->insertItem( Strings::translate(Strings::MenuLabelHelp), help );
menuBar()->setSeparator( QMenuBar::InWindowsStyle );
}
//-----------------------------------------------------------------
void MainWindow::createMainToolbar()
{
ToolBar* toolBar = new ToolBar( Strings::ToolBarName, this );
toolBar->initialize();
}
//-----------------------------------------------------------------
void MainWindow::createSymbolToolbar()
{
SymbolBar* symbolBar = new SymbolBar( Strings::SymbolBarName, this );
symbolBar->initialize();
}
//-----------------------------------------------------------------
void MainWindow::setFileChanged()
{
fileChanged_ = TRUE;
}
//-----------------------------------------------------------------
const QString& MainWindow::getFilename() const
{
return filename_;
}
//-----------------------------------------------------------------
void MainWindow::closeSlot()
{
closeFile();
}
//-----------------------------------------------------------------
bool MainWindow::closeFile()
{
if ( fileChanged_ )
{
bool ok = confirm( Strings::translate(Strings::MsgConfirmLooseChanges) );
if ( !ok )
{
return FALSE;
}
}
filename_ = Strings::EmptyFileName;
SchematicFrame::instance()->setActiveSchematic( 0 );
NavigationWindow::instance()->filenameChanged( filename_ );
NavigationWindow::instance()->reset();
schematicMap_.clear();
variableMap_.clear();
substrateMap_.clear();
fileBlockMap_.clear();
removeAllGraphs();
if ( !tunerWindow_.isNull() )
{
delete tunerWindow_;
}
fileChanged_ = FALSE;
return TRUE;
}
//-----------------------------------------------------------------
void MainWindow::loadSlot()
{
if ( !closeFile())
{
return;
}
QString fileName = QFileDialog::getOpenFileName( QString::null,
Strings::translate(Strings::LabelFilenameFilter),
this );
if ( fileName.isEmpty() )
{
return;
}
filename_ = fileName;
NavigationWindow::instance()->filenameChanged( fileName );
if ( !readFile() )
{
closeFile();
filename_ = Strings::EmptyFileName;
NavigationWindow::instance()->filenameChanged( fileName );
}
SchematicFrame::instance()->reDraw();
}
//-----------------------------------------------------------------
void MainWindow::saveSlot()
{
if ( filename_ == Strings::EmptyFileName )
{
saveAsSlot();
return;
}
#ifdef WIN_DEMO
QMessageBox::warning( this, Strings::LabelApplicationName,
"The save feature is disabled in the Windows demo",
Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
#else
writeFile();
#endif
}
//-----------------------------------------------------------------
void MainWindow::saveAsSlot()
{
QString fileName = QFileDialog::getSaveFileName( QString::null ,
Strings::translate(Strings::LabelFilenameFilter),
this );
if ( !fileName.isNull() )
{
filename_ = fileName;
NavigationWindow::instance()->filenameChanged( fileName );
#ifdef WIN_DEMO
QMessageBox::warning( this, Strings::LabelApplicationName,
"The save feature is disabled in the Windows demo",
Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
#else
writeFile();
#endif
}
}
//-----------------------------------------------------------------
void MainWindow::writeFile()
{
QFile file( filename_ );
file.remove();
if ( !file.open( IO_WriteOnly ) )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgCouldNotWriteFile),
Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
return;
}
QString docStr;
QTextStream filestream( &file );
QTextStream stream( docStr, IO_WriteOnly );
stream << "" << endl;
//Save all circuits
SchematicMap::Iterator it;
for( it = schematicMap_.begin(); it != schematicMap_.end(); ++it )
{
stream << "\n";
it.data().writeToStream( stream );
stream << "" << endl;
}
//Save variables
if ( variableMap_.count() > 0 )
{
stream << "" << endl;
VariableMap::Iterator it;
for( it = variableMap_.begin(); it != variableMap_.end(); ++it )
{
stream << "" << endl;
}
stream << "" << endl;
}
//Save dimension settings
stream << "" << endl;
DimensionMap& map = Setup::instance()->getDimensionMap();
DimensionMap::Iterator it2;
for( it2 = map.begin(); it2 != map.end(); ++it2 )
{
const QString& entry = it2.key();
const QString& value = it2.data().getActiveValueName();
stream << "" << endl;
}
stream << "" << endl;
//Save sweep settings
Setup* setup = Setup::instance();
stream << "getStartFrequency() << "\" STOP=\"";
stream << setup->getStopFrequency() << "\" POINTS=\"";
stream << setup->getNumberOfFrequencyPoints() << "\" LINEAR=\"";
stream << (int) setup->isLinearSweep() << "\" />" << endl;
//Save graph settings
stream << "" << endl;
GraphDefinition* definition = 0;
for ( definition = graphs_.first(); definition != 0; definition = graphs_.next() )
{
definition->writeToStream( stream );
}
stream << "" << endl;
//Save substrate definitions
stream << "" << endl;
SubstrateMap::Iterator it3;
for ( it3 = substrateMap_.begin(); it3 != substrateMap_.end(); ++it3 )
{
it3.data().writeToStream( it3.key(), stream );
}
stream << "" << endl;
//Save file blocks
stream << "" << endl;
FileBlockMap::Iterator it4;
for ( it4 = fileBlockMap_.begin(); it4 != fileBlockMap_.end(); ++it4 )
{
stream << "" << endl;
}
stream << "" << endl;
stream << "" << endl;
//Use QDomDocument to format output nicely
QDomDocument doc( "temp" );
doc.setContent( docStr );
QString tempStr = doc.toString();
//Fix for Qt bug under Windows
if ( tempStr.find("VIPEC_CIRCUIT_FILE") < 0 )
{
tempStr.replace( QRegExp("DOCTYPE"), "DOCTYPE VIPEC_CIRCUIT_FILE" );
}
filestream << tempStr;
file.flush();
file.close();
statusBar()->message( Strings::translate(Strings::StatusMessageFileSaved), 2000 );
fileChanged_ = FALSE;
}
//-----------------------------------------------------------------
bool MainWindow::readFile()
{
QFile file( filename_ );
if ( !file.open( IO_ReadOnly ) )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgCouldNotOpenFile),
Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
return FALSE;
}
QFileInfo fileInfo( file );
QDomDocument doc( fileInfo.baseName() );
if ( !doc.setContent( &file ) )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgCouldNotOpenFile),
Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
file.close();
return FALSE;
}
file.close();
QDomElement docElement = doc.documentElement();
QDomNode docNode = docElement.firstChild();
while ( !docNode.isNull() )
{
QDomElement element = docNode.toElement();
if ( !element.isNull() )
{
QString tagName = element.tagName();
if ( tagName == "CIRCUIT" )
{
QString circuitName = element.attribute( "NAME" );
QString sizeStr = element.attribute( "SIZE" );
Schematic::SchematicSize size = Schematic::mediumSize;
if ( !sizeStr.isNull() )
{
size = (Schematic::SchematicSize) (sizeStr.toInt());
}
Schematic& schematic = schematicMap_[circuitName];
schematic.setName( circuitName );
schematic.setSize( size );
NavigationWindow::instance()->addSchematic( circuitName );
bool success = schematic.readFromDOM( element );
if ( !success )
return FALSE;
}
else if ( tagName == "VARIABLES" )
{
bool success = readVariablesFromDOM( element );
if ( !success )
return FALSE;
}
else if ( tagName == "DIMENSIONS" )
{
bool success = readDimensionsFromDOM( element );
if ( !success )
return FALSE;
}
else if ( tagName == "SWEEP" )
{
bool success = readSweepSettingsFromDOM( element );
if ( !success )
return FALSE;
}
else if ( tagName == "GRAPHDEFINITIONS" )
{
bool success = readGraphDefinitionsFromDOM( element );
if ( !success )
return FALSE;
}
else if ( tagName == "SUBSTRATES" )
{
bool success = readSubstrateDefinitionsFromDOM( element );
if ( !success )
return FALSE;
}
else if ( tagName == "FILEBLOCKS" )
{
bool success = readFileBlocksFromDOM( element );
if ( !success )
return FALSE;
}
}
docNode = docNode.nextSibling();
}
statusBar()->message( Strings::translate(Strings::StatusMessageFileLoaded), 2000 );
return TRUE;
}
//-----------------------------------------------------------------
bool MainWindow::readVariablesFromDOM( QDomElement& element )
{
QDomNode node = element.firstChild();
while( !node.isNull() )
{
QDomElement childElement = node.toElement();
if( !childElement.isNull() )
{
if ( childElement.tagName() == "VAR" )
{
QString name = childElement.attribute( "NAME" );
QString value = childElement.attribute( "VALUE" );
variableMap_[name] = value;
NavigationWindow::instance()->addVariable( name, value );
}
else
{
return FALSE;
}
}
node = node.nextSibling();
}
return TRUE;
}
//-----------------------------------------------------------------
bool MainWindow::readDimensionsFromDOM( QDomElement& element )
{
DimensionMap& map = Setup::instance()->getDimensionMap();
QDomNode node = element.firstChild();
while( !node.isNull() )
{
QDomElement childElement = node.toElement();
if( !childElement.isNull() )
{
if ( childElement.tagName() == "DIM" )
{
QString name = childElement.attribute( "NAME" );
QString value = childElement.attribute( "VALUE" );
map[name].setActiveValue( value );
NavigationWindow::instance()->updateDimension( name, value );
}
else
{
return FALSE;
}
}
node = node.nextSibling();
}
return TRUE;
}
//-----------------------------------------------------------------
bool MainWindow::readSweepSettingsFromDOM( QDomElement& element )
{
QString linearStr = element.attribute( "LINEAR" );
QString startStr = element.attribute( "START" );
QString stopStr = element.attribute( "STOP" );
QString pointsStr = element.attribute( "POINTS" );
Setup* setup = Setup::instance();
uint linear = (bool) linearStr.toInt();
TReal start = startStr.toFloat();
TReal stop = stopStr.toFloat();
uint nrPoints = pointsStr.toInt();
setup->setLinearSweep( linear );
setup->setNumberOfFrequencyPoints( nrPoints );
setup->setStartFrequency( start );
setup->setStopFrequency( stop );
NavigationWindow::instance()->updateSweep();
return TRUE;
}
//-----------------------------------------------------------------
bool MainWindow::readGraphDefinitionsFromDOM( QDomElement& element )
{
GraphDefinition* definition = 0;
QDomNode node = element.firstChild();
while( !node.isNull() )
{
QDomElement childElement = node.toElement();
if( !childElement.isNull() )
{
QString name = childElement.attribute( "NAME" );
QString title = childElement.attribute( "TITLE" );
if ( childElement.tagName() == "GRID" )
{
definition = addGrid( name, title );
}
else if ( childElement.tagName() == "SMITH" )
{
definition = addSmith( name, title );
}
else if ( childElement.tagName() == "TABLE" )
{
definition = addTable( name, title );
}
else
{
return FALSE;
}
definition->readFromDOM( childElement );
}
node = node.nextSibling();
}
return TRUE;
}
//-----------------------------------------------------------------
bool MainWindow::readSubstrateDefinitionsFromDOM( QDomElement& element )
{
QDomNode node = element.firstChild();
while( !node.isNull() )
{
QDomElement childElement = node.toElement();
if( !childElement.isNull() )
{
if ( childElement.tagName() != "SUB" )
{
return FALSE;
}
QString name = childElement.attribute( "NAME" );
substrateMap_[name].readFromDOM( childElement );
NavigationWindow::instance()->updateSubstrate( name,
substrateMap_[name].type() );
}
node = node.nextSibling();
}
return TRUE;
}
//-----------------------------------------------------------------
bool MainWindow::readFileBlocksFromDOM( QDomElement& element )
{
QDomNode node = element.firstChild();
while( !node.isNull() )
{
QDomElement childElement = node.toElement();
if( !childElement.isNull() )
{
if ( childElement.tagName() != "BLOCK" )
{
return FALSE;
}
QString name = childElement.attribute( "NAME" );
QFileInfo info( name );
if ( !info.exists() )
{
//Look for parameter file in circuit file directory
QFileInfo circuitFileInfo( filename_ );
info.setFile( circuitFileInfo.dir(), info.fileName() );
name = info.filePath();
}
readFileBlock( name );
}
node = node.nextSibling();
}
return TRUE;
}
//-----------------------------------------------------------------
void MainWindow::printSlot()
{
#ifdef WIN_DEMO
QMessageBox::warning( this, Strings::LabelApplicationName,
"The print feature is disabled in the Windows demo",
Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
#else
SchematicFrame::instance()->print();
#endif
}
//-----------------------------------------------------------------
void MainWindow::newSchematicSlot()
{
bool ok = FALSE;
QString text = QInputDialog::getText( Strings::translate( Strings::NewSchematicWindowTitle ),
Strings::translate( Strings::MsgNewSchematicName ),
QLineEdit::Normal,
QString::null, &ok, this );
text = text.upper();
if ( ok && !text.isEmpty() )
{
if ( schematicMap_.contains( text ) )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgSchematicAlreadyExists));
}
else
{
Schematic& schematic = schematicMap_[text];
schematic.setName(text);
NavigationWindow::instance()->addSchematic( text );
SchematicFrame::instance()->setActiveSchematic( &schematic );
fileChanged_ = TRUE;
}
}
}
//-----------------------------------------------------------------
void MainWindow::renameSchematic( const QString& name )
{
bool ok = FALSE;
QString newName = QInputDialog::getText( Strings::translate(Strings::RenameSchematicWindowTitle),
Strings::translate(Strings::MsgRenameSchematic)
.arg(name),
QLineEdit::Normal,
QString::null, &ok, this );
newName = newName.upper();
if ( ok && !newName.isEmpty() )
{
schematicMap_[newName] = schematicMap_[name];
schematicMap_[newName].setName( newName );
schematicMap_.remove( name );
NavigationWindow::instance()->removeSchematic( name );
NavigationWindow::instance()->addSchematic( newName );
SchematicFrame::instance()->setActiveSchematic( &schematicMap_[newName] );
fileChanged_ = TRUE;
}
}
//-----------------------------------------------------------------
void MainWindow::deleteSchematic( const QString& name )
{
if ( confirm( Strings::translate(Strings::MsgConfirmDeleteSchematic).arg(name) ) )
{
QString activeName = SchematicFrame::instance()->getActiveSchematicName();
if ( activeName == name )
{
SchematicFrame::instance()->setActiveSchematic( 0 );
}
schematicMap_.remove( name );
NavigationWindow::instance()->removeSchematic( name );
fileChanged_ = TRUE;
}
}
//-----------------------------------------------------------------
void MainWindow::setActiveSchematic( const QString& name )
{
ASSERT( schematicMap_.contains( name ) );
Schematic& schematic = schematicMap_[name];
SchematicFrame::instance()->setActiveSchematic( &schematic );
}
//-----------------------------------------------------------------
void MainWindow::getSchematicNames( QStringList& list )
{
list.clear();
SchematicMap::Iterator it;
for( it = schematicMap_.begin(); it != schematicMap_.end(); ++it )
{
list.append( it.key() );
}
}
//-----------------------------------------------------------------
void MainWindow::changeSchematicSize( const QString& name )
{
if ( schematicSizeWindow_.isNull() )
{
schematicSizeWindow_
= new SchematicSizeWindow( 0, Strings::translate(Strings::SchematicSizeWindowTitle) );
}
schematicSizeWindow_->setSchematicName( name );
schematicSizeWindow_->setSchematicSize( schematicMap_[name].getSize() );
schematicSizeWindow_->raise();
schematicSizeWindow_->exec();
}
//-----------------------------------------------------------------
void MainWindow::setSchematicSize( const QString& name,
Schematic::SchematicSize newSize )
{
ASSERT( schematicMap_.contains( name ) );
schematicMap_[name].setSize( newSize );
}
//-----------------------------------------------------------------
void MainWindow::helpSlot()
{
if ( helpWindow_.isNull() )
{
helpWindow_ = new HelpWindow( 0, Strings::translate(Strings::HelpWindowTitle) );
}
helpWindow_->show();
}
//-----------------------------------------------------------------
void MainWindow::aboutSlot()
{
QString msg;
msg.sprintf( "ViPEC %s
"
"Copyright © 1991-2001
"
"Authors:
"
"- J. Rossouw
(johanrossouw@users.sourceforge.net) "
"- E. Jansen
(eugenejansen@users.sourceforge.net)
"
"Contributions by:
"
""
""
""
""
"Homepage:
"
"- http://vipec.sourceforge.net
", version);
msg += "Compiled on " __DATE__ " " __TIME__ "
";
QPixmap aboutIcon( logo_xpm );
QMessageBox mb( Strings::translate(Strings::AboutWindowTitle),
msg,
QMessageBox::NoIcon,
QMessageBox::Ok | QMessageBox::Default,
0, 0, this);
mb.setIconPixmap(aboutIcon);
mb.adjustSize();
mb.setFixedSize(mb.width(), mb.height());
mb.exec();
}
//-----------------------------------------------------------------
void MainWindow::aboutQtSlot()
{
QMessageBox::aboutQt( this, Strings::translate(Strings::AboutQtWindowTitle) );
}
//-----------------------------------------------------------------
void MainWindow::newVariableSlot()
{
bool ok = FALSE;
QString name = QInputDialog::getText( Strings::translate(Strings::NewVariableWindowTitle),
Strings::translate(Strings::MsgNewVariableName),
QLineEdit::Normal,
QString::null, &ok, this );
name = name.upper();
if ( ok && !name.isEmpty() )
{
if ( variableMap_.contains( name ) )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgVariableAlreadyExists));
}
else
{
QString value = QInputDialog::getText( Strings::translate(Strings::NewVariableWindowTitle),
Strings::translate(Strings::MsgEnterVariableValue),
QLineEdit::Normal,
QString::null, &ok, this );
value = value.upper();
if ( ok && !value.isEmpty() )
{
variableMap_[name] = value;
NavigationWindow::instance()->addVariable( name, value );
fileChanged_ = TRUE;
}
}
}
}
//-----------------------------------------------------------------
void MainWindow::changeVariable( const QString& name )
{
bool ok = FALSE;
QString value = QInputDialog::getText( Strings::translate(Strings::ChangeVariableWindowTitle),
Strings::translate(Strings::MsgChangeVariableValue)
.arg(name),
QLineEdit::Normal,
variableMap_[name], &ok, this );
value = value.upper();
if ( ok && !value.isEmpty() )
{
variableMap_[name] = value;
NavigationWindow::instance()->updateVariable( name, value );
fileChanged_ = TRUE;
}
}
//-----------------------------------------------------------------
void MainWindow::renameVariable( const QString& name )
{
bool ok = FALSE;
QString newName = QInputDialog::getText( Strings::translate(Strings::RenameVariableWindowTitle),
Strings::translate(Strings::MsgRenameVariable)
.arg(name),
QLineEdit::Normal,
QString::null, &ok, this );
newName = newName.upper();
if ( ok && !newName.isEmpty() )
{
QString value = variableMap_[name];
variableMap_.remove( name );
NavigationWindow::instance()->removeVariable( name );
variableMap_[newName] = value;
NavigationWindow::instance()->addVariable( newName, value );
fileChanged_ = TRUE;
}
}
//-----------------------------------------------------------------
void MainWindow::deleteVariable( const QString& name )
{
if ( confirm( Strings::translate(Strings::MsgConfirmDeleteVariable).arg(name) ) )
{
variableMap_.remove( name );
NavigationWindow::instance()->removeVariable( name );
fileChanged_ = TRUE;
}
}
//-----------------------------------------------------------------
void MainWindow::updateVariable( const QString& name,
const QString& value )
{
variableMap_[name] = value;
NavigationWindow::instance()->updateVariable( name, value );
fileChanged_ = TRUE;
}
//-----------------------------------------------------------------
TReal MainWindow::getVariableValue( const QString& name )
{
if ( !variableMap_.contains( name ) )
{
throw Exception::VariableNotDefined();
}
bool ok = FALSE;
TReal value = 0;
QString valueStr = variableMap_[name];
if ( valueStr.contains( ':' ) == 2 )
{
value = Utils::getNumericRangePart( valueStr, 1 );
}
else
{
value = valueStr.toDouble(&ok);
if ( !ok )
{
throw Exception::VariableHasNoValue();
}
}
return value;
}
//-----------------------------------------------------------------
Schematic* MainWindow::getSchematic( const QString& name )
{
Schematic* circuit = 0;
if ( schematicMap_.contains( name ) )
{
circuit = &schematicMap_[name];
}
return circuit;
}
//-----------------------------------------------------------------
bool MainWindow::confirm( const QString& message )
{
bool result = FALSE;
switch( QMessageBox::information( this, Strings::LabelApplicationName,
message,
Strings::translate(Strings::LabelYes),
Strings::translate(Strings::LabelCancel),
0,
1 ) )
{
case 0:
result = TRUE;
break;
case 1:
result = FALSE;
break;
}
return result;
}
//-----------------------------------------------------------------
void MainWindow::setTranslator(QTranslator* translator)
{
translator_ = translator;
}
//-----------------------------------------------------------------
QTranslator* MainWindow::getTranslator()
{
return translator_;
}
//-----------------------------------------------------------------
void MainWindow::resetCircuits()
{
SchematicMap::Iterator it;
for( it = schematicMap_.begin(); it != schematicMap_.end(); ++it )
{
Schematic& circuit = it.data();
circuit.reset();
}
}
//-----------------------------------------------------------------
bool MainWindow::checkSchematics()
{
SchematicMap::Iterator it;
for( it = schematicMap_.begin(); it != schematicMap_.end(); ++it )
{
Schematic& circuit = it.data();
try
{
QString msg = Strings::translate( Strings::StatusMessageCheckingSchematic ).arg( it.key() );
statusBar()->message( msg, 2000 );
qApp->processEvents();
circuit.numberAllNodes();
circuit.initSweep();
}
catch (Exception::FloatingNode)
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgFloatingNodes) );
return FALSE;
}
catch (Exception::ShortedPorts)
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgPortNodesShorted) );
return FALSE;
}
catch (Exception::AttributeHasNoValue)
{
QString msg = Strings::translate( Strings::MsgMissingAttrValue ).arg( it.key() );
QMessageBox::warning( this, Strings::LabelApplicationName, msg );
return FALSE;
}
catch (Exception::VariableNotDefined)
{
QString msg = Strings::translate( Strings::MsgUndefinedVariable ).arg( it.key() );
QMessageBox::warning( this, Strings::LabelApplicationName, msg );
return FALSE;
}
catch (Exception::VariableHasNoValue)
{
QString msg = Strings::translate( Strings::MsgVariableHasNoValue ).arg( it.key() );
QMessageBox::warning( this, Strings::LabelApplicationName, msg );
return FALSE;
}
catch (Exception::NoSuchSubstrate)
{
QString msg = Strings::translate( Strings::MsgUndefinedSubstrate ).arg( it.key() );
QMessageBox::warning( this, Strings::LabelApplicationName, msg );
return FALSE;
}
catch (...)
{
QString msg = Strings::translate( Strings::MsgUnknownException );
QMessageBox::warning( this, Strings::LabelApplicationName, msg );
return FALSE;
}
}
statusBar()->message( Strings::translate( Strings::StatusMessageSchematicsOk ), 2000 );
return TRUE;
}
//-----------------------------------------------------------------
void MainWindow::calculateResponse()
{
if ( !checkSchematics() )
{
return;
}
Setup& setup = *Setup::instance();
setup.buildFrequencyVector();
Vector& frequencies = setup.getFrequencyVector();
SchematicMap::Iterator it;
try
{
for( it = schematicMap_.begin(); it != schematicMap_.end(); ++it )
{
Schematic& circuit = it.data();
QString msg = Strings::translate( Strings::StatusMessageSweepingSchematic ).arg( it.key() );
statusBar()->message( msg );
qApp->processEvents();
circuit.sweep( frequencies );
}
showAllGraphs();
computeAllGraphOutputs();
}
catch ( Exception::NoSuchCircuit )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate( Strings::MsgOutputContainsInvalidCircuit ) );
}
catch ( Exception::StabilityFactorNotDefined )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate( Strings::MsgStabilityFactorOnlyFor2Port ) );
}
catch ( Matrix::ExceptionMatrixSingular )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate( Strings::MsgNoSolutionForCircuit ) );
}
catch ( Exception::NumberOfPortsDoesNotMatch )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate( Strings::MsgNumberOfPortsDoesNotMatch ) );
}
catch (Exception::NoSuchBlock)
{
QString msg = Strings::translate( Strings::MsgUndefinedBlock ).arg( it.key() );
QMessageBox::warning( this, Strings::LabelApplicationName, msg );
}
catch (Exception::FrequencyOutOfRange)
{
QString msg = Strings::translate( Strings::MsgSweepBeyondBlockRange ).arg( it.key() );
QMessageBox::warning( this, Strings::LabelApplicationName, msg );
}
QString msg = Strings::translate( Strings::StatusMessageSweepingDone );
statusBar()->message( msg, 2000 );
}
//-----------------------------------------------------------------
GraphDefinition* MainWindow::findGraph( const QString& name )
{
GraphDefinition* graph = 0;
//Find graph view
for ( graph = graphs_.first(); graph != 0; graph = graphs_.next() )
{
if ( graph->getName() == name )
{
break;
}
}
return graph;
}
//-----------------------------------------------------------------
void MainWindow::graphFontChanged()
{
GraphDefinition* graph = 0;
for ( graph = graphs_.first(); graph != 0; graph = graphs_.next() )
{
graph->reDraw();
}
}
//-----------------------------------------------------------------
void MainWindow::removeAllGraphs()
{
graphs_.clear();
}
//-----------------------------------------------------------------
void MainWindow::showAllGraphs()
{
GraphDefinition* graph = 0;
for ( graph = graphs_.first(); graph != 0; graph = graphs_.next() )
{
graph->show();
}
}
//-----------------------------------------------------------------
void MainWindow::computeAllGraphOutputs()
{
GraphDefinition* graph = 0;
for ( graph = graphs_.first(); graph != 0; graph = graphs_.next() )
{
graph->fill();
}
}
//-----------------------------------------------------------------
void MainWindow::renameGraph( const QString& oldName,
const QString& newName )
{
GraphDefinition* graph = findGraph( oldName );
if ( graph )
{
graph->setName( newName );
NavigationWindow::instance()->renameGraph( oldName, newName );
}
fileChanged_ = TRUE;
}
//-----------------------------------------------------------------
void MainWindow::deleteGraph( const QString& name )
{
if ( !confirm( Strings::translate(Strings::MsgConfirmDeleteGraphView).arg(name) ) )
{
return;
}
GraphDefinition* graph = 0;
for ( graph = graphs_.first(); graph != 0; graph = graphs_.next() )
{
if ( graph->getName() == name )
{
break;
}
}
ASSERT( graph != 0 );
NavigationWindow::instance()->removeGraph( name );
graphs_.remove( graph );
fileChanged_ = TRUE;
}
//-----------------------------------------------------------------
void MainWindow::newGraphSlot()
{
if ( newGraphWindow_.isNull() )
{
newGraphWindow_ =
new NewGraphWindow( this, Strings::translate(Strings::NewGraphViewWindowTitle) );
}
newGraphWindow_->show();
}
//-----------------------------------------------------------------
void MainWindow::addGraph( const QString& name, NewGraphWindow::GraphType graphType )
{
if ( findGraph( name ) != 0 )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgGraphAlreadyExists).arg(name) );
}
else
{
switch ( graphType )
{
case NewGraphWindow::graphType:
addGrid( name, "" );
break;
case NewGraphWindow::smithType:
addSmith( name, "" );
break;
case NewGraphWindow::tableType:
addTable( name, "" );
break;
default:
ASSERT( "Unknown graph type!" == 0 );
}
fileChanged_ = TRUE;
}
cout << "addGraph" << endl;
}
//-----------------------------------------------------------------
void MainWindow::renameGraph( const QString& name )
{
bool ok = FALSE;
QString newName = QInputDialog::getText( Strings::translate(Strings::RenameGraphViewWindowTitle),
Strings::translate(Strings::MsgRenameGraphView)
.arg(name),
QLineEdit::Normal,
QString::null, &ok, this );
newName = newName.upper();
if ( ok && !newName.isEmpty() )
{
if ( findGraph( newName ) != 0 )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgGraphAlreadyExists).arg( newName ) );
}
else
{
renameGraph( name, newName );
}
}
}
//-----------------------------------------------------------------
GridDefinition* MainWindow::addGrid( const QString& name,
const QString& title )
{
GridDefinition* grid = new GridDefinition();
grid->setName( name );
grid->setTitle( title );
graphs_.append( grid );
NavigationWindow::instance()->addGraph( *grid );
return grid;
}
//-----------------------------------------------------------------
GridDefinition* MainWindow::findGrid( const QString& name )
{
GraphDefinition* graph = findGraph( name );
GridDefinition* grid = 0;
if ( graph )
{
ASSERT( graph->graphType() == GraphDefinition::gridType );
grid = (GridDefinition*) graph;
}
return grid;
}
//-----------------------------------------------------------------
SmithDefinition* MainWindow::addSmith( const QString& name,
const QString& title )
{
SmithDefinition* smith = new SmithDefinition();
smith->setName( name );
smith->setTitle( title );
graphs_.append( smith );
NavigationWindow::instance()->addGraph( *smith );
return smith;
}
//-----------------------------------------------------------------
SmithDefinition* MainWindow::findSmith( const QString& name )
{
GraphDefinition* graph = findGraph( name );
SmithDefinition* smith = 0;
if ( graph )
{
ASSERT( graph->graphType() == GraphDefinition::smithType );
smith = (SmithDefinition*) graph;
}
return smith;
}
//-----------------------------------------------------------------
TableDefinition* MainWindow::addTable( const QString& name,
const QString& title )
{
TableDefinition* table = new TableDefinition();
table->setName( name );
table->setTitle( title );
graphs_.append( table );
NavigationWindow::instance()->addGraph( *table );
return table;
}
//-----------------------------------------------------------------
TableDefinition* MainWindow::findTable( const QString& name )
{
GraphDefinition* graph = findGraph( name );
TableDefinition* table = 0;
if ( graph )
{
ASSERT( graph->graphType() == GraphDefinition::tableType );
table = (TableDefinition*) graph;
}
return table;
}
//-----------------------------------------------------------------
void MainWindow::microStripCalculator()
{
if ( microStripCalculator_.isNull() )
{
QString title = Strings::translate( Strings::MicroStripCalcWindowTitle );
microStripCalculator_ = new MicroStripCalcWindow( this,
title );
}
microStripCalculator_->show();
}
//-----------------------------------------------------------------
void MainWindow::tuner()
{
if ( !tunerWindow_.isNull() )
{
delete tunerWindow_;
}
QList nameList;
QList valueList;
nameList.setAutoDelete( TRUE );
valueList.setAutoDelete( TRUE );
VariableMap::Iterator it;
for( it = variableMap_.begin(); it != variableMap_.end(); ++it )
{
QString name = it.key();
QString value = it.data();
if ( value.contains( ':' ) == 2 )
{
nameList.append( new QString(name) );
valueList.append( new QString(value) );
}
}
if ( nameList.count() == 0 )
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgNoRangeVariables));
}
else
{
if ( tunerWindow_.isNull() )
{
QString title = Strings::translate( Strings::CircuitTunerWindowTitle );
tunerWindow_ = new TunerWindow( this, title );
}
tunerWindow_->setRangeList( nameList, valueList );
tunerWindow_->show();
}
}
//-----------------------------------------------------------------
void MainWindow::newSubstrateSlot()
{
if ( substrateWindow_.isNull() )
{
QString title = Strings::translate( Strings::DefineSubstrateWindowTitle );
substrateWindow_ = new SubstrateWindow( this, title );
}
substrateWindow_->enableNameField( TRUE );
substrateWindow_->show();
}
//-----------------------------------------------------------------
void MainWindow::changeSubstrate( const QString& name )
{
ASSERT( substrateMap_.contains( name ) );
if ( substrateWindow_.isNull() )
{
QString title = Strings::translate( Strings::DefineSubstrateWindowTitle );
substrateWindow_ = new SubstrateWindow( this, title );
}
substrateWindow_->enableNameField( FALSE );
substrateWindow_->update( name, substrateMap_[name] );
substrateWindow_->show();
}
//-----------------------------------------------------------------
void MainWindow::updateSubstrate( const QString& name,
const SubstrateDefinition& definition )
{
NavigationWindow::instance()->updateSubstrate( name,
definition.type() );
substrateMap_[ name ] = definition;
}
//-----------------------------------------------------------------
void MainWindow::renameSubstrate( const QString& name )
{
ASSERT( substrateMap_.contains( name ) );
bool ok = FALSE;
QString newName = QInputDialog::getText( Strings::translate(Strings::RenameSubstrateWindowTitle),
Strings::translate(Strings::MsgRenameSubstrate)
.arg(name),
QLineEdit::Normal,
QString::null, &ok, this );
newName = newName.upper();
if ( ok && !newName.isEmpty() )
{
SubstrateDefinition sub = substrateMap_[name];
substrateMap_.remove( name );
NavigationWindow::instance()->removeSubstrate( name );
substrateMap_[newName] = sub;
NavigationWindow::instance()->updateSubstrate( newName, sub.type() );
fileChanged_ = TRUE;
}
}
//-----------------------------------------------------------------
void MainWindow::deleteSubstrate( const QString& name )
{
ASSERT( substrateMap_.contains( name ) );
if ( confirm( Strings::translate(Strings::MsgConfirmDeleteSubstrate).arg(name) ) )
{
substrateMap_.remove( name );
NavigationWindow::instance()->removeSubstrate( name );
fileChanged_ = TRUE;
}
}
//-----------------------------------------------------------------
SubstrateDefinition* MainWindow::getSubstrate( const QString& name )
{
SubstrateDefinition* sub = 0;
if ( substrateMap_.contains( name ) )
{
sub = &substrateMap_[name];
}
return sub;
}
//-----------------------------------------------------------------
void MainWindow::newDataFileSlot()
{
QString filter = Strings::translate( Strings::ParameterFileFilter );
QString filename = QFileDialog::getOpenFileName( QString::null, filter, this );
if ( filename.isEmpty() )
{
return;
}
readFileBlock( filename );
}
//-----------------------------------------------------------------
void MainWindow::readFileBlock( const QString& filename )
{
try
{
FileBlock fileblock;
if ( fileblock.openFile( filename ) )
{
QFileInfo fileinfo( filename );
QString mapName = fileinfo.fileName().upper();
NavigationWindow::instance()->addFileBlock( mapName );
fileBlockMap_[ mapName ] = fileblock;
}
else
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgCouldNotOpenFile), Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
}
}
catch (...)
{
QMessageBox::warning( this, Strings::LabelApplicationName,
Strings::translate(Strings::MsgCouldNotOpenFile), Strings::translate(Strings::LabelOk),
0, 0, 0, 0);
}
}
//-----------------------------------------------------------------
void MainWindow::deleteDataFile( const QString& name )
{
ASSERT( fileBlockMap_.contains( name ) );
fileBlockMap_.remove( name );
NavigationWindow::instance()->removeFileBlock( name );
}
//-----------------------------------------------------------------
QList* MainWindow::getFileData( const QString& name )
{
QList* list = 0;
if ( fileBlockMap_.contains( name ) )
{
list = & (fileBlockMap_[ name ].data());
}
return list;
}
//-----------------------------------------------------------------
void MainWindow::setLanguage()
{
if ( setupLanguageWindow_.isNull() )
{
QString title = Strings::translate( Strings::SetupLanguageWindowTitle );
setupLanguageWindow_ = new SetupLanguageWindow( this,
title );
}
if (setupLanguageWindow_->init())
{
setupLanguageWindow_->show();
}
}
//-----------------------------------------------------------------
void MainWindow::notifyConfigChange()
{
QMessageBox::information( this, Strings::LabelApplicationName,
Strings::translate( Strings::MsgTakeEffectWhenRestarted ) );
}