summaryrefslogtreecommitdiffstats
path: root/kcachegrind/kcachegrind/costtypeview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcachegrind/kcachegrind/costtypeview.cpp')
-rw-r--r--kcachegrind/kcachegrind/costtypeview.cpp310
1 files changed, 310 insertions, 0 deletions
diff --git a/kcachegrind/kcachegrind/costtypeview.cpp b/kcachegrind/kcachegrind/costtypeview.cpp
new file mode 100644
index 00000000..6c08a8c4
--- /dev/null
+++ b/kcachegrind/kcachegrind/costtypeview.cpp
@@ -0,0 +1,310 @@
+/* This file is part of KCachegrind.
+ Copyright (C) 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., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/*
+ * Cost Type View
+ */
+
+#include <qwhatsthis.h>
+#include <qpopupmenu.h>
+#include <klocale.h>
+
+#include "configuration.h"
+#include "costtypeitem.h"
+#include "costtypeview.h"
+#include "toplevel.h"
+
+
+//
+// CostTypeView
+//
+
+
+CostTypeView::CostTypeView(TraceItemView* parentView,
+ QWidget* parent, const char* name)
+ : QListView(parent, name), TraceItemView(parentView)
+{
+ addColumn( i18n( "Event Type" ) );
+ addColumn( i18n( "Incl." ) );
+ addColumn( i18n( "Self" ) );
+ addColumn( i18n( "Short" ) );
+ addColumn( QString::null );
+ addColumn( i18n( "Formula" ) );
+
+ setSorting(-1);
+ setAllColumnsShowFocus(true);
+ setColumnAlignment(1, Qt::AlignRight);
+ setColumnAlignment(2, Qt::AlignRight);
+ setColumnAlignment(3, Qt::AlignRight);
+ setMinimumHeight(50);
+
+ connect( this,
+ SIGNAL( selectionChanged(QListViewItem*) ),
+ SLOT( selectedSlot(QListViewItem*) ) );
+
+ connect( this,
+ SIGNAL(contextMenuRequested(QListViewItem*, const QPoint &, int)),
+ SLOT(context(QListViewItem*, const QPoint &, int)));
+
+ connect(this,
+ SIGNAL(doubleClicked(QListViewItem*)),
+ SLOT(activatedSlot(QListViewItem*)));
+
+ connect(this,
+ SIGNAL(returnPressed(QListViewItem*)),
+ SLOT(activatedSlot(QListViewItem*)));
+
+ connect(this,
+ SIGNAL(itemRenamed(QListViewItem*,int,const QString&)),
+ SLOT(renamedSlot(QListViewItem*,int,const QString&)));
+
+ QWhatsThis::add( this, whatsThis() );
+}
+
+QString CostTypeView::whatsThis() const
+{
+ return i18n( "<b>Cost Types List</b>"
+ "<p>This list shows all cost types available "
+ "and what the self/inclusive cost of the "
+ "current selected function is for that cost type.</p>"
+ "<p>By choosing a cost type from the list, "
+ "you change the cost type of costs shown "
+ "all over KCachegrind to be the selected one.</p>");
+}
+
+
+void CostTypeView::context(QListViewItem* i, const QPoint & p, int)
+{
+ QPopupMenu popup;
+
+ TraceCostType* ct = i ? ((CostTypeItem*) i)->costType() : 0;
+
+ if (ct)
+ popup.insertItem(i18n("Set Secondary Event Type"), 99);
+ if (_costType2)
+ popup.insertItem(i18n("Remove Secondary Event Type"), 98);
+ if (popup.count()>0)
+ popup.insertSeparator();
+
+ if (ct && !ct->isReal()) {
+ popup.insertItem(i18n("Edit Long Name"), 93);
+ popup.insertItem(i18n("Edit Short Name"), 94);
+ popup.insertItem(i18n("Edit Formula"), 95);
+ popup.insertItem(i18n("Remove"), 96);
+ popup.insertSeparator();
+ }
+
+ addGoMenu(&popup);
+
+ popup.insertSeparator();
+ popup.insertItem(i18n("New Cost Type ..."), 97);
+
+ int r = popup.exec(p);
+ if (r == 98) selectedCostType2(0);
+ else if (r == 99) selectedCostType2(ct);
+ else if (r == 93) i->startRename(0);
+ else if (r == 94) i->startRename(3);
+ else if (r == 95) i->startRename(5);
+ else if (r == 96) {
+
+ // search for a previous type
+ TraceCostType* prev = 0, *ct = 0;
+ TraceCostMapping* m = _data->mapping();
+ for (int i=0;i<m->realCount();i++) {
+ ct = m->realType(i);
+ if (ct) prev = ct;
+ }
+ for (int i=0;i<m->virtualCount();i++) {
+ ct = m->virtualType(i);
+ if (ct == _costType) break;
+ if (ct) prev = ct;
+ }
+
+ if (_data->mapping()->remove(ct)) {
+ // select previous cost type
+ selectedCostType(prev);
+ if (_costType2 == ct)
+ selectedCostType2(prev);
+ refresh();
+ }
+ }
+ else if (r == 97) {
+ int i = 1;
+ while(1) {
+ if (!TraceCostType::knownVirtualType(i18n("New%1").arg(i)))
+ break;
+ i++;
+ }
+ // add same new cost type to this mapping and to known types
+ QString shortName = i18n("New%1").arg(i);
+ QString longName = i18n("New Cost Type %1").arg(i);
+ TraceCostType::add(new TraceCostType(shortName, longName, "0"));
+ _data->mapping()->add(new TraceCostType(shortName, longName, "0"));
+ refresh();
+ }
+}
+
+void CostTypeView::selectedSlot(QListViewItem * i)
+{
+ TraceCostType* ct = i ? ((CostTypeItem*) i)->costType() : 0;
+ if (ct)
+ selectedCostType(ct);
+}
+
+void CostTypeView::activatedSlot(QListViewItem * i)
+{
+ TraceCostType* ct = i ? ((CostTypeItem*) i)->costType() : 0;
+ if (ct)
+ selectedCostType2(ct);
+}
+
+TraceItem* CostTypeView::canShow(TraceItem* i)
+{
+ if (!i) return 0;
+
+ switch(i->type()) {
+ case TraceCost::Object:
+ case TraceCost::Class:
+ case TraceCost::File:
+ case TraceCost::Call:
+ case TraceCost::FunctionCycle:
+ case TraceCost::Function:
+ break;
+ default:
+ return 0;
+ }
+ return i;
+}
+
+void CostTypeView::doUpdate(int changeType)
+{
+ // Special case ?
+ if (changeType == selectedItemChanged) return;
+
+ if (changeType == costType2Changed) return;
+
+ if (changeType == groupTypeChanged) {
+ QListViewItem *item;
+ for (item = firstChild();item;item = item->nextSibling())
+ ((CostTypeItem*)item)->setGroupType(_groupType);
+
+ return;
+ }
+
+ if (changeType == costTypeChanged) {
+ QListViewItem *item;
+ for (item = firstChild();item;item = item->nextSibling())
+ if ( ((CostTypeItem*)item)->costType() == _costType) {
+ setSelected(item, true);
+ ensureItemVisible(item);
+ break;
+ }
+
+ return;
+ }
+
+ if (changeType == partsChanged) {
+ QListViewItem *item;
+ for (item = firstChild();item;item = item->nextSibling())
+ ((CostTypeItem*)item)->update();
+
+ return;
+ }
+
+
+ refresh();
+}
+
+void CostTypeView::refresh()
+{
+ clear();
+ setColumnWidth(1, 50);
+ setColumnWidth(2, 50);
+
+ if (!_data || !_activeItem) return;
+ switch(_activeItem->type()) {
+ case TraceCost::Object:
+ case TraceCost::Class:
+ case TraceCost::File:
+ case TraceCost::FunctionCycle:
+ case TraceCost::Function:
+ break;
+ default:
+ return;
+ }
+ TraceCostItem* c = (TraceCostItem*) _activeItem;
+
+ TraceCostType* ct =0 ;
+ QListViewItem* item = 0;
+ QString sumStr, pureStr;
+ QListViewItem* costItem=0;
+
+ TraceCostMapping* m = _data->mapping();
+ for (int i=m->virtualCount()-1;i>=0;i--) {
+ ct = m->virtualType(i);
+ if (!ct) continue;
+ item = new CostTypeItem(this, c, ct, _groupType);
+ if (ct == _costType) costItem = item;
+ }
+ for (int i=m->realCount()-1;i>=0;i--) {
+ ct = m->realType(i);
+ item = new CostTypeItem(this, c, ct, _groupType);
+ if (ct == _costType) costItem = item;
+ }
+
+ if (costItem) {
+ setSelected(costItem, true);
+ ensureItemVisible(costItem);
+ }
+
+ if (item) setMinimumHeight(3*item->height());
+}
+
+
+void CostTypeView::renamedSlot(QListViewItem* item,int c,const QString& t)
+{
+ TraceCostType* ct = item ? ((CostTypeItem*) item)->costType() : 0;
+ if (!ct || ct->isReal()) return;
+
+ // search for matching known Type
+ int knownCount = TraceCostType::knownTypeCount();
+ TraceCostType* known = 0;
+ for (int i=0; i<knownCount; i++) {
+ known = TraceCostType::knownType(i);
+ if (known->name() == ct->name()) break;
+ }
+
+ if (c == 0) {
+ ct->setLongName(t);
+ if (known) known->setLongName(t);
+ }
+ else if (c == 3) {
+ ct->setName(t);
+ if (known) known->setName(t);
+ }
+ else if (c == 5) {
+ ct->setFormula(t);
+ if (known) known->setFormula(t);
+ }
+ else return;
+
+ if (_topLevel) _topLevel->configChanged();
+ refresh();
+}
+
+#include "costtypeview.moc"