• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdesdk API Reference
  • KDE Home
  • Contact Us
 

kcachegrind

  • sources
  • kde-4.12
  • kdesdk
  • kcachegrind
  • libviews
eventtypeview.cpp
Go to the documentation of this file.
1 /* This file is part of KCachegrind.
2  Copyright (C) 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
3 
4  KCachegrind is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public
6  License as published by the Free Software Foundation, version 2.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; see the file COPYING. If not, write to
15  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  Boston, MA 02110-1301, USA.
17 */
18 
19 /*
20  * Event Type View
21  */
22 
23 
24 #include "eventtypeview.h"
25 
26 #include <QAction>
27 #include <QMenu>
28 #include <QHeaderView>
29 
30 #include "eventtypeitem.h"
31 #include "toplevelbase.h"
32 
33 
34 //
35 // EventTypeView
36 //
37 
38 EventTypeView::EventTypeView(TraceItemView* parentView,
39  QWidget* parent, const char* name)
40  : QTreeWidget(parent), TraceItemView(parentView)
41 {
42  setObjectName(name);
43  // forbid scaling icon pixmaps to smaller size
44  setIconSize(QSize(99,99));
45  setColumnCount(6);
46  QStringList labels;
47  labels << tr( "Event Type" )
48  << tr( "Incl." )
49  << tr( "Self" )
50  << tr( "Short" )
51  << QString()
52  << tr( "Formula" );
53  setHeaderLabels(labels);
54  // reduce minimum width for '=' column
55  header()->setMinimumSectionSize(10);
56 
57  setRootIsDecorated(false);
58  setSortingEnabled(false);
59  setAllColumnsShowFocus(true);
60  setMinimumHeight(50);
61 
62 
63  setContextMenuPolicy(Qt::CustomContextMenu);
64  connect( this,
65  SIGNAL(customContextMenuRequested(const QPoint &)),
66  SLOT(context(const QPoint &)));
67 
68  // FIXME: Endless jumping among 2 types possible!
69  connect( this,
70  SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
71  SLOT(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)) );
72 
73  connect(this,
74  SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
75  SLOT(itemDoubleClicked(QTreeWidgetItem*,int)));
76 
77  connect(this,
78  SIGNAL(itemChanged(QTreeWidgetItem*,int)),
79  SLOT(itemChanged(QTreeWidgetItem*,int)));
80 
81  setWhatsThis( whatsThis() );
82 }
83 
84 QString EventTypeView::whatsThis() const
85 {
86  return tr( "<b>Cost Types List</b>"
87  "<p>This list shows all cost types available "
88  "and what the self/inclusive cost of the "
89  "current selected function is for that cost type.</p>"
90  "<p>By choosing a cost type from the list, "
91  "you change the cost type of costs shown "
92  "all over KCachegrind to be the selected one.</p>");
93 }
94 
95 
96 void EventTypeView::context(const QPoint & p)
97 {
98  QMenu popup;
99 
100  QTreeWidgetItem* i = itemAt(p);
101  EventType* ct = i ? ((EventTypeItem*) i)->eventType() : 0;
102 
103  QAction* selectType2Action = 0;
104  QAction* hideType2Action = 0;
105  if (ct)
106  selectType2Action = popup.addAction(tr("Set as Secondary Event Type"));
107  if (_eventType2)
108  hideType2Action = popup.addAction(tr("Hide Secondary Event Type"));
109  if (!popup.isEmpty())
110  popup.addSeparator();
111 
112  QAction* editLongNameAction = 0;
113  QAction* editShortNameAction = 0;
114  QAction* editFormulaAction = 0;
115  QAction* removeTypeAction = 0;
116  if (ct && !ct->isReal()) {
117  editLongNameAction = popup.addAction(tr("Edit Long Name"));
118  editShortNameAction = popup.addAction(tr("Edit Short Name"));
119  editFormulaAction = popup.addAction(tr("Edit Formula"));
120  removeTypeAction = popup.addAction(tr("Remove"));
121  popup.addSeparator();
122  }
123 
124  addGoMenu(&popup);
125 
126  QAction* newTypeAction = 0;
127  if( _data) {
128  popup.addSeparator();
129  newTypeAction = popup.addAction(tr("New Event Type..."));
130  }
131 
132  QAction* a = popup.exec(viewport()->mapToGlobal(p));
133  if (a == hideType2Action) selectedEventType2(0);
134  else if (a == selectType2Action) selectedEventType2(ct);
135  else if (a == editLongNameAction) editItem(i, 0);
136  else if (a == editShortNameAction) editItem(i, 3);
137  else if (a == editFormulaAction) editItem(i, 5);
138  else if (a == removeTypeAction) {
139 
140  // search for a previous type
141  EventType* prev = 0, *ct = 0;
142  EventTypeSet* m = _data->eventTypes();
143  for (int i=0;i<m->realCount();i++) {
144  ct = m->realType(i);
145  if (ct) prev = ct;
146  }
147  for (int i=0;i<m->derivedCount();i++) {
148  ct = m->derivedType(i);
149  if (ct == _eventType) break;
150  if (ct) prev = ct;
151  }
152 
153  if (_data->eventTypes()->remove(ct)) {
154  // select previous cost type
155  selectedEventType(prev);
156  if (_eventType2 == ct)
157  selectedEventType2(prev);
158  refresh();
159  }
160  }
161  else if (a == newTypeAction) {
162  int i = 1;
163  while(1) {
164  if (!EventType::knownDerivedType(tr("New%1").arg(i)))
165  break;
166  i++;
167  }
168  // add same new cost type to this set and to known types
169  QString shortName = tr("New%1").arg(i);
170  QString longName = tr("New Event Type %1").arg(i);
171  EventType* et;
172  et = new EventType(shortName, longName);
173  et->setFormula(QString()); // event is derived
174  EventType::add(et);
175  // EventType::add() took ownership, need new object
176  et = new EventType(shortName, longName);
177  et->setFormula(QString()); // event is derived
178  _data->eventTypes()->add(et);
179  refresh();
180  }
181 }
182 
183 
184 void EventTypeView::currentItemChanged(QTreeWidgetItem* i, QTreeWidgetItem*)
185 {
186  EventType* ct = i ? ((EventTypeItem*) i)->eventType() : 0;
187  if (ct)
188  selectedEventType(ct);
189 }
190 
191 void EventTypeView::itemDoubleClicked(QTreeWidgetItem* i, int)
192 {
193  EventType* ct = i ? ((EventTypeItem*) i)->eventType() : 0;
194  if (ct)
195  selectedEventType2(ct);
196 }
197 
198 CostItem* EventTypeView::canShow(CostItem* i)
199 {
200  if (!i) return 0;
201 
202  switch(i->type()) {
203  case ProfileContext::Object:
204  case ProfileContext::Class:
205  case ProfileContext::File:
206  case ProfileContext::Call:
207  case ProfileContext::FunctionCycle:
208  case ProfileContext::Function:
209  break;
210  default:
211  return 0;
212  }
213  return i;
214 }
215 
216 void EventTypeView::doUpdate(int changeType, bool)
217 {
218  // Special case ?
219  if (changeType == selectedItemChanged) return;
220 
221  if (changeType == eventType2Changed) return;
222 
223  if (changeType == groupTypeChanged) {
224  for(int i = 0; i < topLevelItemCount(); i++)
225  ((EventTypeItem*)topLevelItem(i))->setGroupType(_groupType);
226 
227  return;
228  }
229 
230  if (changeType == eventTypeChanged) {
231  for(int i = 0; i < topLevelItemCount(); i++) {
232  EventTypeItem* item = (EventTypeItem*)topLevelItem(i);
233  if ( item->eventType() == _eventType) {
234  setCurrentItem(item);
235  scrollToItem(item);
236  break;
237  }
238  }
239 
240  return;
241  }
242 
243  if (changeType == partsChanged) {
244  for(int i = 0; i < topLevelItemCount(); i++)
245  ((EventTypeItem*)topLevelItem(i))->update();
246 
247  return;
248  }
249 
250 
251  refresh();
252 }
253 
254 void EventTypeView::refresh()
255 {
256  clear();
257  setColumnWidth(1, 50);
258  setColumnWidth(2, 50);
259 
260  if (!_data || !_activeItem) return;
261  switch(_activeItem->type()) {
262  case ProfileContext::Object:
263  case ProfileContext::Class:
264  case ProfileContext::File:
265  case ProfileContext::FunctionCycle:
266  case ProfileContext::Function:
267  break;
268  default:
269  return;
270  }
271  TraceCostItem* c = (TraceCostItem*) _activeItem;
272 
273  EventType* ct =0;
274  QTreeWidgetItem* item = 0;
275  QTreeWidgetItem* selected = 0;
276  QList<QTreeWidgetItem*> items;
277  QString sumStr, pureStr;
278 
279  EventTypeSet* m = _data->eventTypes();
280  for (int i=0; i<m->realCount();i++) {
281  ct = m->realType(i);
282  item = new EventTypeItem(c, ct, _groupType);
283  if (ct == _eventType) selected = item;
284  items.append(item);
285  }
286  for (int i=0; i<m->derivedCount();i++) {
287  ct = m->derivedType(i);
288  if (!ct) continue;
289  item = new EventTypeItem(c, ct, _groupType);
290  if (ct == _eventType) selected = item;
291  items.append(item);
292  }
293  insertTopLevelItems(0,items);
294 
295  if (selected) {
296  setCurrentItem(selected);
297  scrollToItem(selected);
298  }
299 
300  for(int c = 0; c<6; c++)
301  resizeColumnToContents(c);
302 }
303 
304 void EventTypeView::itemChanged(QTreeWidgetItem* item, int c)
305 {
306  EventType* ct = item ? ((EventTypeItem*) item)->eventType() : 0;
307  if (!ct || ct->isReal()) return;
308 
309  // search for matching known Type
310  int knownCount = EventType::knownTypeCount();
311  EventType* known = 0;
312  for (int i=0; i<knownCount; i++) {
313  known = EventType::knownType(i);
314  if (known->name() == ct->name()) break;
315  }
316 
317  QString t = item->text(c);
318  if (c == 0) {
319  ct->setLongName(t);
320  if (known) known->setLongName(t);
321  }
322  else if (c == 3) {
323  ct->setName(t);
324  if (known) known->setName(t);
325  }
326  else if (c == 5) {
327  ct->setFormula(t);
328  if (known) known->setFormula(t);
329  }
330  else return;
331 
332  if (_topLevel) _topLevel->configChanged();
333  refresh();
334 }
335 
336 #include "eventtypeview.moc"
TraceItemView::selectedItemChanged
Definition: traceitemview.h:86
TraceItemView::_topLevel
TopLevelBase * _topLevel
Definition: traceitemview.h:207
EventTypeSet::realCount
int realCount()
Definition: eventtype.h:133
TraceItemView::selectedEventType2
virtual void selectedEventType2(TraceItemView *sender, EventType *)
Definition: traceitemview.cpp:366
ProfileContext::FunctionCycle
Definition: context.h:46
QTreeWidget
ProfileContext::File
Definition: context.h:48
CostItem::type
ProfileContext::Type type() const
Definition: costitem.h:45
QWidget
TraceItemView::_data
TraceData * _data
Definition: traceitemview.h:209
TraceCostItem
Definition: tracedata.h:980
TraceItemView::addGoMenu
void addGoMenu(QMenu *)
Definition: traceitemview.cpp:461
EventType::setFormula
void setFormula(const QString &)
Definition: eventtype.cpp:47
ProfileContext::Call
Definition: context.h:44
CostItem
Base class for cost items.
Definition: costitem.h:37
TraceData::eventTypes
EventTypeSet * eventTypes()
Definition: tracedata.h:1407
TraceItemView::_groupType
ProfileContext::Type _groupType
Definition: traceitemview.h:213
EventTypeItem::eventType
EventType * eventType()
Definition: eventtypeitem.h:39
EventType
A cost type, e.g.
Definition: eventtype.h:43
ProfileContext::Class
Definition: context.h:47
EventType::knownDerivedType
static EventType * knownDerivedType(const QString &)
Definition: eventtype.cpp:249
TraceItemView::_eventType2
EventType * _eventType2
Definition: traceitemview.h:212
TraceItemView
Abstract Base Class for KCachegrind Views.
Definition: traceitemview.h:70
EventTypeItem
Definition: eventtypeitem.h:30
TraceItemView::_eventType
EventType * _eventType
Definition: traceitemview.h:212
TraceItemView::partsChanged
Definition: traceitemview.h:84
toplevelbase.h
eventtypeitem.h
EventTypeView::whatsThis
QString whatsThis() const
Definition: eventtypeview.cpp:84
EventType::knownTypeCount
static int knownTypeCount()
Definition: eventtype.cpp:291
TraceItemView::_activeItem
CostItem * _activeItem
Definition: traceitemview.h:211
EventTypeSet::remove
bool remove(EventType *)
Definition: eventtype.cpp:433
EventTypeSet::derivedCount
int derivedCount()
Definition: eventtype.h:134
EventType::isReal
bool isReal()
Definition: eventtype.h:70
TraceItemView::eventTypeChanged
Definition: traceitemview.h:81
EventTypeSet::add
int add(EventType *)
Definition: eventtype.cpp:403
TraceItemView::selected
virtual void selected(TraceItemView *sender, CostItem *)
Notification from child views.
Definition: traceitemview.cpp:313
QTreeWidgetItem
EventTypeSet::realType
EventType * realType(int)
Definition: eventtype.cpp:462
EventType::knownType
static EventType * knownType(int)
Definition: eventtype.cpp:312
EventType::add
static void add(EventType *, bool overwriteExisting=true)
Definition: eventtype.cpp:263
EventType::setName
void setName(const QString &n)
Definition: eventtype.h:57
eventtypeview.h
TraceItemView::groupTypeChanged
Definition: traceitemview.h:83
EventTypeSet
A class for managing a set of event types.
Definition: eventtype.h:117
TraceItemView::eventType2Changed
Definition: traceitemview.h:82
EventType::setLongName
void setLongName(const QString &n)
Definition: eventtype.h:58
ProfileContext::Object
Definition: context.h:49
TopLevelBase::configChanged
virtual void configChanged()=0
EventTypeSet::derivedType
EventType * derivedType(int)
Definition: eventtype.cpp:468
EventTypeView::EventTypeView
EventTypeView(TraceItemView *parentView, QWidget *parent=0, const char *name=0)
Definition: eventtypeview.cpp:38
TraceItemView::selectedEventType
virtual void selectedEventType(TraceItemView *sender, EventType *)
Definition: traceitemview.cpp:358
EventType::name
const QString & name()
Definition: eventtype.h:65
ProfileContext::Function
Definition: context.h:46
QList
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:03:27 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kcachegrind

Skip menu "kcachegrind"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • umbrello
  •   umbrello

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal