Sandboxie/SandboxiePlus/SandMan/Views/StackView.cpp

106 lines
3.1 KiB
C++

#include "stdafx.h"
#include "..\SandMan.h"
#include "StackView.h"
#include "..\..\MiscHelpers\Common\Common.h"
CStackView::CStackView(QWidget *parent)
: CPanelView(parent)
{
m_pMainLayout = new QVBoxLayout();
m_pMainLayout->setContentsMargins(0, 0, 0, 0);
this->setLayout(m_pMainLayout);
// Stack List
m_pStackList = new QTreeWidgetEx();
m_pStackList->setItemDelegate(new CTreeItemDelegate());
//m_pStackList->setHeaderLabels(tr("#|Symbol|Stack address|Frame address|Control address|Return address|Stack parameters|File info").split("|"));
m_pStackList->setHeaderLabels(tr("#|Symbol").split("|"));
m_pStackList->setMinimumHeight(50);
m_pStackList->setSelectionMode(QAbstractItemView::ExtendedSelection);
m_pStackList->setSortingEnabled(false);
m_pStackList->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_pStackList, SIGNAL(customContextMenuRequested( const QPoint& )), this, SLOT(OnMenu(const QPoint &)));
m_pMainLayout->addWidget(CFinder::AddFinder(m_pStackList, this, true, &m_pFinder));
//
m_bIsInvalid = false;
//m_pMenu = new QMenu();
AddPanelItemsToMenu();
m_pStackList->header()->restoreState(theConf->GetBlob("MainWindow/StackView_Columns"));
}
CStackView::~CStackView()
{
theConf->SetBlob("MainWindow/StackView_Columns", m_pStackList->header()->saveState());
}
void CStackView::Invalidate()
{
m_bIsInvalid = true;
for (int i = 0; i < m_pStackList->topLevelItemCount(); i++)
{
for(int j=0; j < m_pStackList->columnCount(); j++)
m_pStackList->topLevelItem(i)->setForeground(j, Qt::lightGray);
}
}
void CStackView::SetFilter(const QRegularExpression& Exp, bool bHighLight, int Col)
{
CPanelWidgetEx::ApplyFilter(m_pStackList, &Exp/*, bHighLight, Col*/);
}
void CStackView::SetFilter(const QString& Exp, int iOptions, int Col) // -1 = any
{
QScopedPointer<QRegularExpression> pRegExp;
if (!Exp.isEmpty()) {
QString ExpStr = ((iOptions & CFinder::eRegExp) == 0) ? Exp : (".*" + QRegularExpression::escape(Exp) + ".*");
pRegExp.reset(new QRegularExpression(ExpStr, (iOptions & CFinder::eCaseSens) != 0 ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption));
}
CPanelWidgetEx::ApplyFilter(m_pStackList, pRegExp.data()/*, bHighLight, Col*/);
}
void CStackView::ShowStack(const QVector<quint64>& Stack, const CBoxedProcessPtr& pProcess)
{
int i = 0;
for (; i < Stack.count(); i++)
{
quint64 Address = Stack[i];
QTreeWidgetItem* pItem;
if (i >= m_pStackList->topLevelItemCount())
{
pItem = new QTreeWidgetItem();
pItem->setData(eStack, Qt::UserRole, i);
pItem->setText(eStack, QString::number(i));
m_pStackList->addTopLevelItem(pItem);
}
else
pItem = m_pStackList->topLevelItem(i);
if (m_bIsInvalid)
{
for (int j = 0; j < m_pStackList->columnCount(); j++)
pItem->setForeground(j, Qt::black);
}
QString Symbol = pProcess->GetSymbol(Address);
if (Symbol.isNull()) Symbol = FormatAddress(Address);
pItem->setText(eSymbol, Symbol);
}
for (; i < m_pStackList->topLevelItemCount(); )
delete m_pStackList->topLevelItem(i);
if (!m_pFinder->GetSearchExp().pattern().isEmpty())
SetFilter(m_pFinder->GetSearchExp());
m_bIsInvalid = false;
}