diff options
Diffstat (limited to 'tdecachegrind/tdecachegrind/configdlg.cpp')
-rw-r--r-- | tdecachegrind/tdecachegrind/configdlg.cpp | 398 |
1 files changed, 398 insertions, 0 deletions
diff --git a/tdecachegrind/tdecachegrind/configdlg.cpp b/tdecachegrind/tdecachegrind/configdlg.cpp new file mode 100644 index 00000000..e0b45470 --- /dev/null +++ b/tdecachegrind/tdecachegrind/configdlg.cpp @@ -0,0 +1,398 @@ +/* This file is part of KCachegrind. + Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de> + + KCachegrind is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + 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 General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +/* + * Configuration Dialog for KCachegrind + */ + +#include <tqcombobox.h> +#include <tqcheckbox.h> +#include <tqlineedit.h> +#include <tqlistview.h> +#include <tqdict.h> +#include <tqmessagebox.h> + +#include <kcolorbutton.h> +#include <kfiledialog.h> +#include <klocale.h> +#include <knumvalidator.h> + +#include "configdlg.h" +#include "tracedata.h" +#include "configuration.h" + + +ConfigDlg::ConfigDlg(Configuration* c, TraceData* data, + TQWidget* parent, const char* name) + :ConfigDlgBase(parent, name) +{ + _config = c; + _data = data; + _objectCS = 0; + _classCS = 0; + _fileCS = 0; + KIntValidator * numValidator = new KIntValidator( this ); + maxListEdit->setValidator(numValidator ); + symbolCount->setValidator(numValidator ); + symbolLength->setValidator(numValidator ); + precisionEdit->setValidator(numValidator ); + contextEdit->setValidator(numValidator ); + +#if 0 + TQListViewItem *oItem, *fItem, *cItem, *fnItem; + oItem = new(colorList, i18n("ELF Objects")); + + fItem = new(colorList, i18n("Source Files")); + cItem = new(colorList, i18n("C++ Classes")); + fnItem = new(colorList, i18n("Function (no Grouping)")); +#endif + + connect(objectCombo, TQT_SIGNAL(activated(const TQString &)), + this, TQT_SLOT(objectActivated(const TQString &))); + connect(objectCombo, TQT_SIGNAL(textChanged(const TQString &)), + this, TQT_SLOT(objectActivated(const TQString &))); + connect(objectCheck, TQT_SIGNAL(toggled(bool)), + this, TQT_SLOT(objectCheckChanged(bool))); + connect(objectColor, TQT_SIGNAL(changed(const TQColor &)), + this, TQT_SLOT(objectColorChanged(const TQColor &))); + + connect(classCombo, TQT_SIGNAL(activated(const TQString &)), + this, TQT_SLOT(classActivated(const TQString &))); + connect(classCombo, TQT_SIGNAL(textChanged(const TQString &)), + this, TQT_SLOT(classActivated(const TQString &))); + connect(classCheck, TQT_SIGNAL(toggled(bool)), + this, TQT_SLOT(classCheckChanged(bool))); + connect(classColor, TQT_SIGNAL(changed(const TQColor &)), + this, TQT_SLOT(classColorChanged(const TQColor &))); + + connect(fileCombo, TQT_SIGNAL(activated(const TQString &)), + this, TQT_SLOT(fileActivated(const TQString &))); + connect(fileCombo, TQT_SIGNAL(textChanged(const TQString &)), + this, TQT_SLOT(fileActivated(const TQString &))); + connect(fileCheck, TQT_SIGNAL(toggled(bool)), + this, TQT_SLOT(fileCheckChanged(bool))); + connect(fileColor, TQT_SIGNAL(changed(const TQColor &)), + this, TQT_SLOT(fileColorChanged(const TQColor &))); + + TQString objectPrefix = TraceCost::typeName(TraceCost::Object); + TQString classPrefix = TraceCost::typeName(TraceCost::Class); + TQString filePrefix = TraceCost::typeName(TraceCost::File); + + objectCombo->setDuplicatesEnabled(false); + classCombo->setDuplicatesEnabled(false); + fileCombo->setDuplicatesEnabled(false); + objectCombo->setAutoCompletion(true); + classCombo->setAutoCompletion(true); + fileCombo->setAutoCompletion(true); + + // first unspecified cost items from data + TraceObjectMap::Iterator oit; + TQStringList oList; + for ( oit = data->objectMap().begin(); + oit != data->objectMap().end(); ++oit ) + oList.append((*oit).prettyName()); + + TraceClassMap::Iterator cit; + TQStringList cList; + for ( cit = data->classMap().begin(); + cit != data->classMap().end(); ++cit ) + cList.append((*cit).prettyName()); + + TraceFileMap::Iterator fit; + TQStringList fList; + for ( fit = data->fileMap().begin(); + fit != data->fileMap().end(); ++fit ) + fList.append((*fit).prettyName()); + + // then already defined colors (have to check for duplicates!) + TQDictIterator<Configuration::ColorSetting> it( c->_colors ); + for( ; it.current(); ++it ) { + if ((*it)->automatic) continue; + + TQString n = it.currentKey(); + if (n.startsWith(objectPrefix)) { + n = n.remove(0, objectPrefix.length()+1); + if (oList.findIndex(n) == -1) oList.append(n); + } + else if (n.startsWith(classPrefix)) { + n = n.remove(0, classPrefix.length()+1); + if (cList.findIndex(n) == -1) cList.append(n); + } + else if (n.startsWith(filePrefix)) { + n = n.remove(0, filePrefix.length()+1); + if (fList.findIndex(n) == -1) fList.append(n); + } + } + + oList.sort(); + cList.sort(); + fList.sort(); + objectCombo->insertStringList(oList); + classCombo->insertStringList(cList); + fileCombo->insertStringList(fList); + + objectActivated(objectCombo->currentText()); + classActivated(classCombo->currentText()); + fileActivated(fileCombo->currentText()); + + maxListEdit->setText(TQString::number(c->_maxListCount)); + + _dirItem = 0; + + TQListViewItem* i = new TQListViewItem(dirList, i18n("(always)")); + i->setOpen(true); + TQStringList::Iterator sit = c->_generalSourceDirs.begin(); + for(; sit != c->_generalSourceDirs.end(); ++sit ) { + TQString d = (*sit); + if (d.isEmpty()) d = "/"; + new TQListViewItem(i, d); + } + for ( oit = data->objectMap().begin(); + oit != data->objectMap().end(); ++oit ) { + TQString n = (*oit).name(); + i = new TQListViewItem(dirList, n); + i->setOpen(true); + TQStringList* dirs = c->_objectSourceDirs[n]; + if (!dirs) continue; + + sit = dirs->begin(); + for(; sit != dirs->end(); ++sit ) { + TQString d = (*sit); + if (d.isEmpty()) d = "/"; + new TQListViewItem(i, d); + } + } + + connect(dirList, TQT_SIGNAL(selectionChanged(TQListViewItem*)), + this, TQT_SLOT(dirsItemChanged(TQListViewItem*))); + connect(addDirButton, TQT_SIGNAL(clicked()), + this, TQT_SLOT(dirsAddPressed())); + connect(deleteDirButton, TQT_SIGNAL(clicked()), + this, TQT_SLOT(dirsDeletePressed())); + dirList->setSelected(dirList->firstChild(), true); + + symbolCount->setText(TQString::number(c->_maxSymbolCount)); + symbolLength->setText(TQString::number(c->_maxSymbolLength)); + precisionEdit->setText(TQString::number(c->_percentPrecision)); + contextEdit->setText(TQString::number(c->_context)); +} + +ConfigDlg::~ConfigDlg() +{ +} + +bool ConfigDlg::configure(Configuration* c, TraceData* d, TQWidget* p) +{ + ConfigDlg dlg(c, d, p); + + if (dlg.exec()) { + + bool ok; + int newValue = dlg.maxListEdit->text().toUInt(&ok); + if (ok && newValue < 500) + c->_maxListCount = newValue; + else + TQMessageBox::warning(p, i18n("KCachegrind Configuration"), + i18n("The Maximum Number of List Items should be below 500." + "The previous set value (%1) will still be used.") + .arg(TQString::number(c->_maxListCount)), + TQMessageBox::Ok, 0); + + c->_maxSymbolCount = dlg.symbolCount->text().toInt(); + c->_maxSymbolLength = dlg.symbolLength->text().toInt(); + c->_percentPrecision = dlg.precisionEdit->text().toInt(); + c->_context = dlg.contextEdit->text().toInt(); + return true; + } + return false; +} + +void ConfigDlg::objectActivated(const TQString & s) +{ +// qDebug("objectActivated: %s", s.ascii()); + + if (s.isEmpty()) { _objectCS=0; return; } + + TQString n = TraceCost::typeName(TraceCost::Object) + "-" + s; + + Configuration* c = Configuration::config(); + Configuration::ColorSetting* cs = c->_colors[n]; + if (!cs) + cs = Configuration::color(n); +// else +// qDebug("found color %s", n.ascii()); + + _objectCS = cs; + + objectCheck->setChecked(cs->automatic); + objectColor->setColor(cs->color); + + /* + qDebug("Found Color %s, automatic to %s", + _objectCS->name.ascii(), + _objectCS->automatic ? "true":"false"); + */ +} + + +void ConfigDlg::objectCheckChanged(bool b) +{ + if (_objectCS) { + _objectCS->automatic = b; + /* + qDebug("Set Color %s automatic to %s", + _objectCS->name.ascii(), + _objectCS->automatic ? "true":"false"); + */ + } +} + +void ConfigDlg::objectColorChanged(const TQColor & c) +{ + if (_objectCS) _objectCS->color = c; +} + +void ConfigDlg::classActivated(const TQString & s) +{ +// qDebug("classActivated: %s", s.ascii()); + + if (s.isEmpty()) { _classCS=0; return; } + + TQString n = TraceCost::typeName(TraceCost::Class) + "-" + s; + + Configuration* c = Configuration::config(); + Configuration::ColorSetting* cs = c->_colors[n]; + if (!cs) + cs = Configuration::color(n); + + _classCS = cs; + + classCheck->setChecked(cs->automatic); + classColor->setColor(cs->color); + +} + + +void ConfigDlg::classCheckChanged(bool b) +{ + if (_classCS) _classCS->automatic = b; +} + +void ConfigDlg::classColorChanged(const TQColor & c) +{ + if (_classCS) _classCS->color = c; +} + + +void ConfigDlg::fileActivated(const TQString & s) +{ +// qDebug("fileActivated: %s", s.ascii()); + + if (s.isEmpty()) { _fileCS=0; return; } + + TQString n = TraceCost::typeName(TraceCost::File) + "-" + s; + + Configuration* c = Configuration::config(); + Configuration::ColorSetting* cs = c->_colors[n]; + if (!cs) + cs = Configuration::color(n); + + _fileCS = cs; + + fileCheck->setChecked(cs->automatic); + fileColor->setColor(cs->color); +} + + +void ConfigDlg::fileCheckChanged(bool b) +{ + if (_fileCS) _fileCS->automatic = b; +} + +void ConfigDlg::fileColorChanged(const TQColor & c) +{ + if (_fileCS) _fileCS->color = c; +} + + +void ConfigDlg::dirsItemChanged(TQListViewItem* i) +{ + _dirItem = i; + deleteDirButton->setEnabled(i->depth() == 1); + addDirButton->setEnabled(i->depth() == 0); +} + +void ConfigDlg::dirsDeletePressed() +{ + if (!_dirItem || (_dirItem->depth() == 0)) return; + TQListViewItem* p = _dirItem->parent(); + if (!p) return; + + Configuration* c = Configuration::config(); + TQString objName = p->text(0); + + TQStringList* dirs; + if (objName == i18n("(always)")) + dirs = &(c->_generalSourceDirs); + else + dirs = c->_objectSourceDirs[objName]; + if (!dirs) return; + + dirs->remove(_dirItem->text(0)); + delete _dirItem; + _dirItem = 0; + + deleteDirButton->setEnabled(false); +} + +void ConfigDlg::dirsAddPressed() +{ + if (!_dirItem || (_dirItem->depth() >0)) return; + + Configuration* c = Configuration::config(); + TQString objName = _dirItem->text(0); + + TQStringList* dirs; + if (objName == i18n("(always)")) + dirs = &(c->_generalSourceDirs); + else { + dirs = c->_objectSourceDirs[objName]; + if (!dirs) { + dirs = new TQStringList; + c->_objectSourceDirs.insert(objName, dirs); + } + } + + TQString newDir; + newDir = KFileDialog::getExistingDirectory(TQString(), + this, + i18n("Choose Source Folder")); + if (newDir.isEmpty()) return; + + // even for "/", we strip the tailing slash + if (newDir.endsWith("/")) + newDir = newDir.left(newDir.length()-1); + + if (dirs->findIndex(newDir)>=0) return; + + dirs->append(newDir); + if (newDir.isEmpty()) newDir = TQString("/"); + new TQListViewItem(_dirItem, newDir); +} + +#include "configdlg.moc" |