用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

532 lines
13 KiB

5 months ago
#pragma once
#include <helper/SAdapterBase.h>
class CTestAdapterFix : public SAdapterBase
{
int * m_pCbxSel;
public:
CTestAdapterFix()
{
m_pCbxSel = new int[getCount()];
memset(m_pCbxSel, 0, sizeof(int)*getCount());
}
~CTestAdapterFix()
{
delete[]m_pCbxSel;
}
virtual int getCount()
{
return 50000;
}
virtual void getView(int position, SWindow * pItem, pugi::xml_node xmlTemplate)
{
if (pItem->GetChildrenCount() == 0)
{
pItem->InitFromXml(xmlTemplate);
}
SButton *pBtn = pItem->FindChildByName2<SButton>(L"btn_test");
pBtn->SetWindowText(SStringT().Format(_T("button %d"), position));
pBtn->GetRoot()->SetUserData(position);
//由网友“从未来过” 修改的新事件订阅方式,采用模板函数从响应函数中自动提取事件类型,2016.12.13
pBtn->GetEventSet()->subscribeEvent(&CTestAdapterFix::OnButtonClick, this);
SComboBox * pCbx = pItem->FindChildByName2<SComboBox>(L"cbx_in_lv");
if (pCbx)
{
pCbx->SetCurSel(m_pCbxSel[position]);
pCbx->GetEventSet()->subscribeEvent(&CTestAdapterFix::OnCbxSelChange, this);
}
}
bool OnCbxSelChange(EventCBSelChange *pEvt)
{
SComboBox *pCbx = sobj_cast<SComboBox>(pEvt->sender);
int iItem = pCbx->GetRoot()->GetUserData();
m_pCbxSel[iItem] = pCbx->GetCurSel();
return true;
}
bool OnButtonClick(EventCmd *pEvt)
{
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
int iItem = pBtn->GetRoot()->GetUserData();
SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked"), iItem), _T("haha"), MB_OK);
return true;
}
};
class CTestAdapterFixHorz : public SAdapterBase
{
public:
CTestAdapterFixHorz()
{
}
~CTestAdapterFixHorz()
{
}
virtual int getCount()
{
return 300;
}
virtual void getView(int position, SWindow * pItem, pugi::xml_node xmlTemplate)
{
if (pItem->GetChildrenCount() == 0)
{
pItem->InitFromXml(xmlTemplate);
}
SImageWnd *pImg = pItem->FindChildByName2<SImageWnd>(L"btn_icon");
pImg->SetIcon(position%9);
SWindow *pText = pItem->FindChildByName(L"btn_text");
pText->SetWindowText(SStringT().Format(_T("item_%d"),position+1));
pImg->GetParent()->GetEventSet()->subscribeEvent(&CTestAdapterFixHorz::OnButtonClick, this);
}
bool OnButtonClick(EventCmd *pEvt)
{
SWindow *pBtn = sobj_cast<SWindow>(pEvt->sender);
SItemPanel *pItem = (SItemPanel*)pBtn->GetRoot();
int iItem = pItem->GetItemIndex();
SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked"), iItem), _T("haha"), MB_OK);
return true;
}
};
const wchar_t * KAttrName_Height[] = {
L"oddHeight",
L"evenHeight",
L"evenSelHeight"
};
const wchar_t* KNodeName_Item[] = {
L"itemOdd",
L"itemEven",
L"itemEvenHover"
};
class CTestAdapterFlex : public SAdapterBase
{
public:
int m_nItemHeight[3];
CTestAdapterFlex()
{
}
virtual void InitByTemplate(pugi::xml_node xmlTemplate) override
{
m_nItemHeight[0] = xmlTemplate.attribute(KAttrName_Height[0]).as_int(50);
m_nItemHeight[1] = xmlTemplate.attribute(KAttrName_Height[1]).as_int(60);
m_nItemHeight[2] = xmlTemplate.attribute(KAttrName_Height[2]).as_int(70);
}
virtual int getCount() override
{
return 12340;
}
virtual int getViewTypeCount() override{ return 3; }
virtual int getItemViewType(int position, DWORD dwState) override
{
if (position % 2 == 0)
return 0;//1,3,5,... odd lines
else if (dwState & WndState_Hover)
return 2;//even lines with check state
else
return 1;//even lines
}
virtual SIZE getViewDesiredSize(int position, SWindow *pItem, int nWid,int nHei) override
{
DWORD dwState = pItem->GetState();
int viewType = getItemViewType(position, dwState);
return CSize(0, m_nItemHeight[viewType]);//cx在listview,mclistview中没有使用,不需要计算
}
virtual void getView(int position, SWindow * pItem, pugi::xml_node xmlTemplate)
{
if (pItem->GetChildrenCount() == 0)
{
int nViewType = getItemViewType(position, pItem->GetState());
pItem->InitFromXml(xmlTemplate.child(KNodeName_Item[nViewType]));
}
pItem->GetEventSet()->subscribeEvent(EventSwndStateChanged::EventID, Subscriber(&CTestAdapterFlex::OnItemStateChanged, this));
SButton *pBtn = pItem->FindChildByName2<SButton>(L"btn_test");
pBtn->SetWindowText(SStringT().Format(_T("button %d"), position));
pBtn->SetUserData(position);
pBtn->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTestAdapterFlex::OnButtonClick, this));
}
bool OnItemStateChanged(EventArgs *e)
{
EventSwndStateChanged *e2 = sobj_cast<EventSwndStateChanged>(e);
if (!e2->CheckState(WndState_Hover)) return false;
//通知界面重绘
notifyDataSetInvalidated();
return true;
}
bool OnButtonClick(EventArgs *pEvt)
{
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
int iItem = pBtn->GetUserData();
SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked"), iItem), _T("haha"), MB_OK);
return true;
}
};
class CTestMcAdapterFix : public SMcAdapterBase
{
#define NUMSCALE 100000
public:
struct SOFTINFO
{
const wchar_t * pszSkinName;
const wchar_t * pszName;
const wchar_t * pszDesc;
float fScore;
DWORD dwSize;
const wchar_t * pszInstallTime;
const wchar_t * pszUseTime;
};
SArray<SOFTINFO> m_softInfo;
public:
CTestMcAdapterFix()
{
SOFTINFO info[] =
{
{
L"skin_icon1",
L"鲁大师",
L"鲁大师是一款专业的硬件检测,驱动安装工具",
5.4f,
15 * (1 << 20),
L"2015-8-5",
L"今天"
},
{
L"skin_icon2",
L"PhotoShop",
L"强大的图片处理工具",
9.0f,
150 * (1 << 20),
L"2015-8-5",
L"今天"
},
{
L"skin_icon3",
L"QQ7.0",
L"腾讯公司出品的即时聊天工具",
8.0f,
40 * (1 << 20),
L"2015-8-5",
L"今天"
},
{
L"skin_icon4",
L"Visual Studio 2008",
L"Microsoft公司的程序开发套件",
9.0f,
40 * (1 << 20),
L"2015-8-5",
L"今天"
},
{
L"skin_icon5",
L"YY8",
L"YY语音",
9.0f,
20 * (1 << 20),
L"2015-8-5",
L"今天"
},
{
L"skin_icon6",
L"火狐浏览器",
L"速度最快的浏览器",
8.5f,
35 * (1 << 20),
L"2015-8-5",
L"今天"
},
{
L"skin_icon7",
L"迅雷",
L"迅雷下载软件",
7.3f,
17 * (1 << 20),
L"2015-8-5",
L"今天"
}
};
for (int i = 0; i < ARRAYSIZE(info); i++)
{
m_softInfo.Add(info[i]);
}
}
virtual int getCount()
{
return m_softInfo.GetCount()*NUMSCALE;
}
SStringT getSizeText(DWORD dwSize)
{
int num1 = dwSize / (1 << 20);
dwSize -= num1 *(1 << 20);
int num2 = dwSize * 100 / (1 << 20);
return SStringT().Format(_T("%d.%02dM"), num1, num2);
}
virtual void getView(int position, SWindow * pItem, pugi::xml_node xmlTemplate)
{
if (pItem->GetChildrenCount() == 0)
{
pItem->InitFromXml(xmlTemplate);
}
SOFTINFO *psi = m_softInfo.GetData() + position%m_softInfo.GetCount();
pItem->FindChildByName(L"img_icon")->SetAttribute(L"skin", psi->pszSkinName);
pItem->FindChildByName(L"txt_name")->SetWindowText(S_CW2T(psi->pszName));
pItem->FindChildByName(L"txt_desc")->SetWindowText(S_CW2T(psi->pszDesc));
pItem->FindChildByName(L"txt_score")->SetWindowText(SStringT().Format(_T("%1.2f 分"), psi->fScore));
pItem->FindChildByName(L"txt_installtime")->SetWindowText(S_CW2T(psi->pszInstallTime));
pItem->FindChildByName(L"txt_usetime")->SetWindowText(S_CW2T(psi->pszUseTime));
pItem->FindChildByName(L"txt_size")->SetWindowText(getSizeText(psi->dwSize));
SRatingBar *pRatingBar = pItem->FindChildByName2<SRatingBar>(L"rating_score");
pRatingBar->SetValue(psi->fScore / 2);
pItem->FindChildByName(L"txt_index")->SetWindowText(SStringT().Format(_T("第%d行"), position + 1));
SButton *pBtnUninstall = pItem->FindChildByName2<SButton>(L"btn_uninstall");
CRect rcBtn = pBtnUninstall->GetWindowRect();
SMatrix mtx;
mtx.setRotate(45);
mtx.preTranslate(-rcBtn.Width()/2,-rcBtn.Height()/2);
mtx.postTranslate(rcBtn.Width()/2,rcBtn.Height()/2);
pBtnUninstall->SetMatrix(mtx);
pBtnUninstall->SetUserData(position);
pBtnUninstall->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTestMcAdapterFix::OnButtonClick, this));
}
bool OnButtonClick(EventArgs *pEvt)
{
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
int iItem = pBtn->GetUserData();
if (SMessageBox(NULL, SStringT().Format(_T("Are you sure to uninstall the selected [%d] software?"), iItem), _T("uninstall"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
{//删除一条记录
DeleteItem(iItem);
}
return true;
}
//删除一行,提供外部调用。
void DeleteItem(int iPosition)
{
if (iPosition >= 0 && iPosition < getCount())
{
int iItem = iPosition % m_softInfo.GetCount();
m_softInfo.RemoveAt(iItem);
notifyDataSetChanged();
}
}
SStringW GetColumnName(int iCol) const {
return SStringW().Format(L"col%d", iCol + 1);
}
struct SORTCTX
{
int iCol;
SHDSORTFLAG stFlag;
};
bool OnSort(int iCol, SHDSORTFLAG * stFlags, int nCols)
{
if (iCol == 5) //最后一列“操作”不支持排序
return false;
SHDSORTFLAG stFlag = stFlags[iCol];
switch (stFlag)
{
case ST_NULL:stFlag = ST_UP; break;
case ST_DOWN:stFlag = ST_UP; break;
case ST_UP:stFlag = ST_DOWN; break;
}
for (int i = 0; i < nCols; i++)
{
stFlags[i] = ST_NULL;
}
stFlags[iCol] = stFlag;
SORTCTX ctx = { iCol,stFlag };
qsort_s(m_softInfo.GetData(), m_softInfo.GetCount(), sizeof(SOFTINFO), SortCmp, &ctx);
return true;
}
static int __cdecl SortCmp(void *context, const void * p1, const void * p2)
{
SORTCTX *pctx = (SORTCTX*)context;
const SOFTINFO *pSI1 = (const SOFTINFO*)p1;
const SOFTINFO *pSI2 = (const SOFTINFO*)p2;
int nRet = 0;
switch (pctx->iCol)
{
case 0://name
nRet = wcscmp(pSI1->pszName, pSI2->pszName);
break;
case 1://score
{
float fCmp = (pSI1->fScore - pSI2->fScore);
if (fabs(fCmp) < 0.0000001) nRet = 0;
else if (fCmp > 0.0f) nRet = 1;
else nRet = -1;
}
break;
case 2://size
nRet = (int)(pSI1->dwSize - pSI2->dwSize);
break;
case 3://install time
nRet = wcscmp(pSI1->pszInstallTime, pSI2->pszInstallTime);
break;
case 4://user time
nRet = wcscmp(pSI1->pszUseTime, pSI2->pszUseTime);
break;
}
if (pctx->stFlag == ST_UP)
nRet = -nRet;
return nRet;
}
};
SStringW skins[5] = {
L"skin_icon1",
L"skin_icon2",
L"skin_icon3",
L"skin_icon4",
L"skin_icon5"
};
class CTestTileAdapter : public SAdapterBase
{
public:
CTestTileAdapter()
{
}
virtual int getCount()
{
return 50000;
}
virtual void getView(int position, SWindow *pItem, pugi::xml_node xmlTemplate)
{
if (pItem->GetChildrenCount() == 0)
{
pItem->InitFromXml(xmlTemplate);
}
SImageWnd *pImg = pItem->FindChildByName2<SImageWnd>(L"img_file_icon");
pImg->SetSkin(GETSKIN(skins[position % 5], pImg->GetScale()));
SButton *pBtn = pItem->FindChildByName2<SButton>(L"btn_test");
pBtn->SetWindowText(SStringT().Format(_T("btn %d"), position));
pBtn->GetRoot()->SetUserData(position);
pBtn->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTestTileAdapter::OnButtonClick, this));
}
bool OnButtonClick(EventArgs *pEvt)
{
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
int iItem = pBtn->GetRoot()->GetUserData();
SMessageBox(NULL, SStringT().Format(_T("button of %d item was clicked"), iItem), _T("haha"), MB_OK);
return true;
}
};
struct TreeItemData
{
SStringW strName;
int nAge;
SStringT strTstLong;
};
class CTreeViewAdapter :public STreeAdapterBase<TreeItemData>
{
public:
CTreeViewAdapter() {
TreeItemData data;
data.strName = L"name root";
data.nAge = 100;
HSTREEITEM hRoot = InsertItem(data);
SetItemExpanded(hRoot, FALSE);
for (int i = 0; i < 100; i++)
{
data.strName.Format(L"branch_%d", i);
data.nAge++;
data.strTstLong = _T("red text");
if (i == 50) data.strTstLong = _T("Long Text Test. When this item is shown, the treeview size should be extended automatically.");
InsertItem(data, hRoot);
}
//ExpandItem(hRoot,ITvAdapter::TV_TOGGLE);
}
~CTreeViewAdapter() {}
virtual void getView(SOUI::HTREEITEM loc, SWindow * pItem, pugi::xml_node xmlTemplate) {
if (pItem->GetChildrenCount() == 0)
{
pItem->InitFromXml(xmlTemplate);
}
ItemInfo & ii = m_tree.GetItemRef((HSTREEITEM)loc);
SWindow * pWnd = pItem->FindChildByID(R.id.btn_test);
SASSERT(pWnd);
pWnd->SetWindowText(S_CW2T(ii.data.strName));
SWindow *pTxtRed = pItem->FindChildByID(R.id.txt_red);
SASSERT(pTxtRed);
pTxtRed->SetWindowText(ii.data.strTstLong);
SToggle *pSwitch = pItem->FindChildByID2<SToggle>(R.id.tgl_switch);
SASSERT(pSwitch);
pSwitch->SetVisible(HasChildren(loc));
pSwitch->SetToggle(IsItemExpanded(loc));
pSwitch->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTreeViewAdapter::OnSwitchClick, this));
}
bool OnSwitchClick(EventArgs *pEvt)
{
SToggle *pToggle = sobj_cast<SToggle>(pEvt->sender);
SASSERT(pToggle);
SItemPanel *pItem = sobj_cast<SItemPanel>(pToggle->GetRoot());
SASSERT(pItem);
SOUI::HTREEITEM loc = (SOUI::HTREEITEM)pItem->GetItemIndex();
ExpandItem(loc, ITvAdapter::TVC_TOGGLE);
return true;
}
};