summaryrefslogtreecommitdiffstats
path: root/tdecachegrind/tdecachegrind/partview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdecachegrind/tdecachegrind/partview.cpp')
-rw-r--r--tdecachegrind/tdecachegrind/partview.cpp235
1 files changed, 235 insertions, 0 deletions
diff --git a/tdecachegrind/tdecachegrind/partview.cpp b/tdecachegrind/tdecachegrind/partview.cpp
new file mode 100644
index 00000000..3f344bbc
--- /dev/null
+++ b/tdecachegrind/tdecachegrind/partview.cpp
@@ -0,0 +1,235 @@
+/* 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * Part View
+ */
+
+#include <tqwhatsthis.h>
+#include <tqpopupmenu.h>
+#include <tqheader.h>
+#include <klocale.h>
+
+#include "configuration.h"
+#include "partlistitem.h"
+#include "toplevel.h"
+#include "partview.h"
+
+
+
+//
+// PartView
+//
+
+
+PartView::PartView(TraceItemView* parentView,
+ TQWidget* parent, const char* name)
+ : TQListView(parent, name), TraceItemView(parentView)
+{
+ _inSelectionUpdate = false;
+
+ addColumn( i18n( "Profile Part" ) );
+ addColumn( i18n( "Incl." ) );
+ addColumn( i18n( "Self" ) );
+ addColumn( i18n( "Called" ) );
+ //addColumn( i18n( "Fixed" ) );
+ addColumn( i18n( "Comment" ) );
+
+ setAllColumnsShowFocus(true);
+ setColumnAlignment(1, TQt::AlignRight);
+ setColumnAlignment(2, TQt::AlignRight);
+ setColumnAlignment(3, TQt::AlignRight);
+ setMinimumHeight(50);
+ setSelectionMode(Extended);
+
+ connect( this,
+ TQT_SIGNAL( selectionChanged() ),
+ TQT_SLOT( selectionChangedSlot() ) );
+
+ connect( this,
+ TQT_SIGNAL(contextMenuRequested(TQListViewItem*, const TQPoint &, int)),
+ TQT_SLOT(context(TQListViewItem*, const TQPoint &, int)));
+
+ TQWhatsThis::add( this, whatsThis() );
+}
+
+TQString PartView::whatsThis() const
+{
+ return i18n( "<b>Trace Part List</b>"
+ "<p>This list shows all trace parts of the loaded "
+ "trace. For each part, the "
+ "self/inclusive cost of the current selected "
+ "function, spent in the part, is shown; "
+ "percentage costs are always relative to the "
+ "total cost <em>of the part</em> (not to the whole "
+ "trace as in the Trace Part Overview). "
+ "Also shown are the calls happening to/from the "
+ "current function inside of the trace part.</p>"
+ "<p>By choosing one or more trace parts from the "
+ "list, the costs shown all over KCachegrind will "
+ "only be the ones spent in the selected part(s). "
+ "If no list selection is shown, in fact all trace "
+ "parts are selected implicitly.</p>"
+ "<p>This is a multi-selection list. You can select "
+ "ranges by dragging the mouse or use SHIFT/CTRL "
+ "modifiers. "
+ "Selection/Deselection of trace parts can also be "
+ "done by using the Trace Part Overview Dockable. "
+ "This one also supports multiple selection.</p>"
+ "<p>Note that the list is hidden if only one trace "
+ "part is loaded.</p>");
+}
+
+
+void PartView::context(TQListViewItem* i, const TQPoint & pos, int)
+{
+ TQPopupMenu popup;
+
+ TracePart* p = i ? ((PartListItem*) i)->part() : 0;
+
+ if (p) {
+ popup.insertItem(i18n("Select '%1'").arg(p->name()), 93);
+ popup.insertItem(i18n("Hide '%1'").arg(p->name()), 94);
+ popup.insertSeparator();
+ }
+
+ popup.insertItem(i18n("Hide Selected"), 95);
+ popup.insertItem(i18n("Show All"), 96);
+ popup.insertSeparator();
+
+ addGoMenu(&popup);
+
+ int r = popup.exec(pos);
+ if (r == 95) {
+ ;
+ }
+
+ // TODO: ...
+}
+
+void PartView::selectionChangedSlot()
+{
+ if (_inSelectionUpdate) return;
+
+ TracePartList l;
+ TQListViewItem* item = firstChild();
+ for(;item;item = item->nextSibling())
+ if (item->isSelected())
+ l.append( ((PartListItem*)item)->part() );
+
+ selected(l);
+}
+
+
+TraceItem* PartView::canShow(TraceItem* i)
+{
+ if (!TraceItemView::data()) return 0;
+ if (TraceItemView::data()->parts().count()>1) return i;
+ return 0;
+}
+
+void PartView::doUpdate(int changeType)
+{
+ // Special case ?
+ if (changeType == costType2Changed) return;
+ if (changeType == selectedItemChanged) return;
+
+ if (changeType == groupTypeChanged) {
+ TQListViewItem *item;
+ for (item = firstChild();item;item = item->nextSibling())
+ ((PartListItem*)item)->setGroupType(_groupType);
+
+ return;
+ }
+
+ if (changeType == costTypeChanged) {
+ TQListViewItem *item;
+ for (item = firstChild();item;item = item->nextSibling())
+ ((PartListItem*)item)->setCostType(_costType);
+
+ return;
+ }
+
+ if (changeType == partsChanged) {
+
+ TracePart* part;
+
+ TQListViewItem* item;
+ _inSelectionUpdate = true;
+ item = firstChild();
+ for(;item;item = item->nextSibling()) {
+ part = ((PartListItem*)item)->part();
+
+ if (_partList.containsRef(part)>0) {
+ setSelected(item, true);
+ ensureItemVisible(item);
+ }
+ else
+ setSelected(item, false);
+ }
+ _inSelectionUpdate = false;
+
+ return;
+ }
+
+ refresh();
+}
+
+void PartView::refresh()
+{
+ clear();
+ setColumnWidth(1, 50);
+ setColumnWidth(2, 50);
+
+ if (!_data || !_activeItem) return;
+
+ TraceItem::CostType t = _activeItem->type();
+ TraceFunction* f = 0;
+ if (t == TraceItem::Function) f = (TraceFunction*) _activeItem;
+ if (!f) return;
+
+ TracePart* part;
+ TracePartList hidden;
+ if (_topLevel)
+ hidden = _topLevel->hiddenParts();
+
+ TracePartList allParts = _data->parts();
+
+ _inSelectionUpdate = true;
+
+ TQListViewItem* item = 0;
+ for (part = allParts.first(); part; part = allParts.next()) {
+ if (hidden.findRef(part)>=0) continue;
+ item = new PartListItem(this, f, _costType, _groupType, part);
+
+ if (part->isActive()) {
+ setSelected(item, true);
+ ensureItemVisible(item);
+ }
+ }
+
+ _inSelectionUpdate = false;
+
+ if (item) {
+ int headerHeight = header()->height();
+ int itemHeight = item->height();
+ setMinimumHeight(headerHeight + 2*itemHeight + 2);
+ }
+}
+
+#include "partview.moc"