perfapps/memspyui/ui/hb/src/memspythreadview.cpp
author hgs
Fri, 03 Sep 2010 17:11:21 +0300
changeset 51 b048e15729d6
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 *  
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <HbAbstractViewItem>
hgs
parents:
diff changeset
    19
#include <HbMenu>
hgs
parents:
diff changeset
    20
#include <QAction>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "memspythreadview.h"
hgs
parents:
diff changeset
    23
#include "viewmanager.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
MemSpyThreadModel::MemSpyThreadModel(EngineWrapper &engine, ProcessId processId, QObject *parent) :
hgs
parents:
diff changeset
    26
	QAbstractListModel(parent),
hgs
parents:
diff changeset
    27
	mProcessId(processId),
hgs
parents:
diff changeset
    28
	mEngine(engine),
hgs
parents:
diff changeset
    29
	mThreads(engine.getThreads(processId))
hgs
parents:
diff changeset
    30
{
hgs
parents:
diff changeset
    31
	mPriorityMap.insert(ThreadPriorityNull, tr("[Null]"));
hgs
parents:
diff changeset
    32
	mPriorityMap.insert(ThreadPriorityMuchLess, tr("[Much Less]"));
hgs
parents:
diff changeset
    33
	mPriorityMap.insert(ThreadPriorityLess, tr("[Less]"));
hgs
parents:
diff changeset
    34
	mPriorityMap.insert(ThreadPriorityNormal, tr("[Normal]"));
hgs
parents:
diff changeset
    35
	mPriorityMap.insert(ThreadPriorityMore, tr("[More]"));
hgs
parents:
diff changeset
    36
	mPriorityMap.insert(ThreadPriorityMuchMore, tr("[Much More]"));
hgs
parents:
diff changeset
    37
	mPriorityMap.insert(ThreadPriorityRealTime, tr("[Real Time]"));
hgs
parents:
diff changeset
    38
	mPriorityMap.insert(ThreadPriorityAbsoluteVeryLow, tr("[Abs. Very Low]"));
hgs
parents:
diff changeset
    39
	mPriorityMap.insert(ThreadPriorityAbsoluteLowNormal, tr("[Abs. Low Normal]"));
hgs
parents:
diff changeset
    40
	mPriorityMap.insert(ThreadPriorityAbsoluteLow, tr("[Abs. Low]"));
hgs
parents:
diff changeset
    41
	mPriorityMap.insert(ThreadPriorityAbsoluteBackgroundNormal, tr("[Abs. Background Normal]"));
hgs
parents:
diff changeset
    42
	mPriorityMap.insert(ThreadPriorityAbsoluteBackground, tr("[Abs. Background]"));
hgs
parents:
diff changeset
    43
	mPriorityMap.insert(ThreadPriorityAbsoluteForegroundNormal, tr("[Abs. Foreground Normal]"));
hgs
parents:
diff changeset
    44
	mPriorityMap.insert(ThreadPriorityAbsoluteForeground, tr("[Abs. Foreground]"));
hgs
parents:
diff changeset
    45
	mPriorityMap.insert(ThreadPriorityAbsoluteHighNormal, tr("[Abs. Hight Normal]"));
hgs
parents:
diff changeset
    46
	mPriorityMap.insert(ThreadPriorityAbsoluteHigh, tr("[Abs. High]"));
hgs
parents:
diff changeset
    47
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime1, tr("[Abs. RT 1]"));
hgs
parents:
diff changeset
    48
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime2, tr("[Abs. RT 2]"));
hgs
parents:
diff changeset
    49
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime3, tr("[Abs. RT 3]"));
hgs
parents:
diff changeset
    50
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime4, tr("[Abs. RT 4]"));
hgs
parents:
diff changeset
    51
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime5, tr("[Abs. RT 5]"));
hgs
parents:
diff changeset
    52
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime6, tr("[Abs. RT 6]"));
hgs
parents:
diff changeset
    53
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime7, tr("[Abs. RT 7]"));
hgs
parents:
diff changeset
    54
	mPriorityMap.insert(ThreadPriorityAbsoluteRealTime8, tr("[Abs. RT 8]"));
hgs
parents:
diff changeset
    55
}
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
MemSpyThreadModel::~MemSpyThreadModel()
hgs
parents:
diff changeset
    58
{
hgs
parents:
diff changeset
    59
	qDeleteAll(mThreads);
hgs
parents:
diff changeset
    60
}
hgs
parents:
diff changeset
    61
	
hgs
parents:
diff changeset
    62
int MemSpyThreadModel::rowCount(const QModelIndex &parent) const
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
	Q_UNUSED(parent);
hgs
parents:
diff changeset
    65
	return mThreads.count();
hgs
parents:
diff changeset
    66
}
hgs
parents:
diff changeset
    67
	
hgs
parents:
diff changeset
    68
QVariant MemSpyThreadModel::data(const QModelIndex &index, int role) const
hgs
parents:
diff changeset
    69
{
hgs
parents:
diff changeset
    70
	if (role == Qt::DisplayRole) {
hgs
parents:
diff changeset
    71
		QStringList lines;
hgs
parents:
diff changeset
    72
		lines << mThreads.at(index.row())->name();
hgs
parents:
diff changeset
    73
		lines << mPriorityMap.value(mThreads.at(index.row())->priority(), tr("[Unknown]"));
hgs
parents:
diff changeset
    74
		return lines;
hgs
parents:
diff changeset
    75
	}
hgs
parents:
diff changeset
    76
	
hgs
parents:
diff changeset
    77
	if (role == Qt::UserRole)
hgs
parents:
diff changeset
    78
		return mThreads.at(index.row())->id();
hgs
parents:
diff changeset
    79
	
hgs
parents:
diff changeset
    80
	return QVariant();
hgs
parents:
diff changeset
    81
}
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
void MemSpyThreadModel::refresh()
hgs
parents:
diff changeset
    84
{
hgs
parents:
diff changeset
    85
    beginResetModel();
hgs
parents:
diff changeset
    86
    QList<MemSpyThread*> data = mEngine.getThreads(mProcessId);
hgs
parents:
diff changeset
    87
    qDeleteAll(mThreads);
hgs
parents:
diff changeset
    88
    mThreads = data;
hgs
parents:
diff changeset
    89
    endResetModel();
hgs
parents:
diff changeset
    90
}
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
MemSpyThreadView::MemSpyThreadView(EngineWrapper &engine, ViewManager &viewManager) : 
hgs
parents:
diff changeset
    93
	MemSpyListView(engine, viewManager), 
hgs
parents:
diff changeset
    94
	mContextMenu(0), 
hgs
parents:
diff changeset
    95
	mPriorityMenu(0),
hgs
parents:
diff changeset
    96
	mThreadId(0),
hgs
parents:
diff changeset
    97
	mModel(0)
hgs
parents:
diff changeset
    98
{
hgs
parents:
diff changeset
    99
}
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
MemSpyThreadView::~MemSpyThreadView()
hgs
parents:
diff changeset
   102
{
hgs
parents:
diff changeset
   103
	delete mContextMenu;
hgs
parents:
diff changeset
   104
	delete mPriorityMenu;
hgs
parents:
diff changeset
   105
}
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
void MemSpyThreadView::initialize(const QVariantMap& params)
hgs
parents:
diff changeset
   108
{
hgs
parents:
diff changeset
   109
    setTitle(tr("Threads"));
hgs
parents:
diff changeset
   110
    
hgs
parents:
diff changeset
   111
    mProcessId = qVariantValue<ProcessId>(params["pid"]);    
hgs
parents:
diff changeset
   112
	mProcessName = params["pname"].toString();
hgs
parents:
diff changeset
   113
	
hgs
parents:
diff changeset
   114
	MemSpyView::initialize(params);
hgs
parents:
diff changeset
   115
	
hgs
parents:
diff changeset
   116
	mModel = new MemSpyThreadModel(mEngine, mProcessId, this);
hgs
parents:
diff changeset
   117
	mListView.setModel(mModel);
hgs
parents:
diff changeset
   118
	
hgs
parents:
diff changeset
   119
	connect(&mListView, SIGNAL(activated(QModelIndex)), this, SLOT(itemClicked(QModelIndex)));
hgs
parents:
diff changeset
   120
	connect(&mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)),
hgs
parents:
diff changeset
   121
	        this, SLOT(catchLongPress(HbAbstractViewItem*,QPointF)));
hgs
parents:
diff changeset
   122
	
hgs
parents:
diff changeset
   123
	mContextMenu = new HbMenu;
hgs
parents:
diff changeset
   124
	mPriorityMenu = mContextMenu->addMenu("Change Priority");
hgs
parents:
diff changeset
   125
	
hgs
parents:
diff changeset
   126
	mPriorityMenu->addAction(tr("Abs. Very Low"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   127
	mPriorityMenu->addAction(tr("Abs. Low Normal"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   128
	mPriorityMenu->addAction(tr("Abs. Low"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   129
	mPriorityMenu->addAction(tr("Abs. Background Normal"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   130
	mPriorityMenu->addAction(tr("Abs. Background"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   131
	mPriorityMenu->addAction(tr("Abs. Foreground Normal"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   132
	mPriorityMenu->addAction(tr("Abs. Foreground"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   133
	mPriorityMenu->addAction(tr("Abs. High Normal"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   134
	mPriorityMenu->addAction(tr("Abs. High"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   135
	mPriorityMenu->addAction(tr("Abs. Real Time 1"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   136
	mPriorityMenu->addAction(tr("Abs. Real Time 2"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   137
	mPriorityMenu->addAction(tr("Abs. Real Time 3"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   138
	mPriorityMenu->addAction(tr("Abs. Real Time 4"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   139
	mPriorityMenu->addAction(tr("Abs. Real Time 5"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   140
	mPriorityMenu->addAction(tr("Abs. Real Time 6"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   141
	mPriorityMenu->addAction(tr("Abs. Real Time 7"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   142
	mPriorityMenu->addAction(tr("Abs. Real Time 8"), this, SLOT(changePriority()));
hgs
parents:
diff changeset
   143
}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
bool MemSpyThreadView::isBreadCrumbVisible() const
hgs
parents:
diff changeset
   147
{
hgs
parents:
diff changeset
   148
    return true;
hgs
parents:
diff changeset
   149
}
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
QString MemSpyThreadView::getBreadCrumbText() const
hgs
parents:
diff changeset
   152
{
hgs
parents:
diff changeset
   153
    return tr("Processes > %1").arg(mProcessName);
hgs
parents:
diff changeset
   154
}
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
HbMenu* MemSpyThreadView::createToolMenu()
hgs
parents:
diff changeset
   157
{
hgs
parents:
diff changeset
   158
    HbMenu* menu = new HbMenu(tr("Process"));
hgs
parents:
diff changeset
   159
    menu->addAction("Kill", this, SLOT(kill()));
hgs
parents:
diff changeset
   160
    menu->addAction("Panic", this, SLOT(panic()));
hgs
parents:
diff changeset
   161
    menu->addAction("Terminate", this, SLOT(terminate()));
hgs
parents:
diff changeset
   162
    return menu;
hgs
parents:
diff changeset
   163
}
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
void MemSpyThreadView::itemClicked(const QModelIndex& index)
hgs
parents:
diff changeset
   166
{
hgs
parents:
diff changeset
   167
	QVariantMap map;
hgs
parents:
diff changeset
   168
	map["tid"] = index.data(Qt::UserRole);
hgs
parents:
diff changeset
   169
	map.insert("pname", mProcessName);
hgs
parents:
diff changeset
   170
	map.insert("tname", index.data(Qt::DisplayRole).toStringList().at(0));
hgs
parents:
diff changeset
   171
	
hgs
parents:
diff changeset
   172
	mViewManager.showView(ThreadDetailIndexView, map);
hgs
parents:
diff changeset
   173
}
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
void MemSpyThreadView::catchLongPress(HbAbstractViewItem *item, const QPointF &coords)
hgs
parents:
diff changeset
   176
{
hgs
parents:
diff changeset
   177
	mThreadId = qVariantValue<ThreadId>(item->modelIndex().data(Qt::UserRole));
hgs
parents:
diff changeset
   178
	mContextMenu->setPreferredPos(coords);
hgs
parents:
diff changeset
   179
	mContextMenu->open();
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
void MemSpyThreadView::changePriority()
hgs
parents:
diff changeset
   183
{
hgs
parents:
diff changeset
   184
	QAction *s = qobject_cast<QAction*>(sender());
hgs
parents:
diff changeset
   185
	int index = mPriorityMenu->actions().indexOf(s);
hgs
parents:
diff changeset
   186
	
hgs
parents:
diff changeset
   187
	ThreadPriority priorities[] = {
hgs
parents:
diff changeset
   188
		ThreadPriorityAbsoluteVeryLow,
hgs
parents:
diff changeset
   189
		ThreadPriorityAbsoluteLowNormal,
hgs
parents:
diff changeset
   190
		ThreadPriorityAbsoluteLow,
hgs
parents:
diff changeset
   191
		ThreadPriorityAbsoluteBackgroundNormal,
hgs
parents:
diff changeset
   192
		ThreadPriorityAbsoluteBackground,
hgs
parents:
diff changeset
   193
		ThreadPriorityAbsoluteForegroundNormal,
hgs
parents:
diff changeset
   194
		ThreadPriorityAbsoluteForeground,
hgs
parents:
diff changeset
   195
		ThreadPriorityAbsoluteHighNormal,
hgs
parents:
diff changeset
   196
		ThreadPriorityAbsoluteHigh,
hgs
parents:
diff changeset
   197
		ThreadPriorityAbsoluteRealTime1,
hgs
parents:
diff changeset
   198
		ThreadPriorityAbsoluteRealTime2,
hgs
parents:
diff changeset
   199
		ThreadPriorityAbsoluteRealTime3,
hgs
parents:
diff changeset
   200
		ThreadPriorityAbsoluteRealTime4,
hgs
parents:
diff changeset
   201
		ThreadPriorityAbsoluteRealTime5,
hgs
parents:
diff changeset
   202
		ThreadPriorityAbsoluteRealTime6,
hgs
parents:
diff changeset
   203
		ThreadPriorityAbsoluteRealTime7, 
hgs
parents:
diff changeset
   204
		ThreadPriorityAbsoluteRealTime8 };
hgs
parents:
diff changeset
   205
	
hgs
parents:
diff changeset
   206
	if (index >= 0)	{
hgs
parents:
diff changeset
   207
	    mEngine.setThreadPriority(mThreadId, priorities[index]);
hgs
parents:
diff changeset
   208
	    refresh();
hgs
parents:
diff changeset
   209
	}
hgs
parents:
diff changeset
   210
}
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
void MemSpyThreadView::kill()
hgs
parents:
diff changeset
   213
{
hgs
parents:
diff changeset
   214
    mEngine.killProcess(mProcessId);
hgs
parents:
diff changeset
   215
    refresh();
hgs
parents:
diff changeset
   216
}
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
void MemSpyThreadView::panic()
hgs
parents:
diff changeset
   219
{
hgs
parents:
diff changeset
   220
    mEngine.panicProcess(mProcessId);
hgs
parents:
diff changeset
   221
    refresh();
hgs
parents:
diff changeset
   222
}
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
void MemSpyThreadView::terminate()
hgs
parents:
diff changeset
   225
{
hgs
parents:
diff changeset
   226
    mEngine.terminateProcess(mProcessId);
hgs
parents:
diff changeset
   227
    refresh();
hgs
parents:
diff changeset
   228
}
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
void MemSpyThreadView::refresh()
hgs
parents:
diff changeset
   232
{ 
hgs
parents:
diff changeset
   233
    mModel->refresh(); 
hgs
parents:
diff changeset
   234
}