📄 statisticstree.cpp
字号:
return returnText;
}
// This is the primary function for generating HTML output of the statistics tree.
// It is recursive.
CString CStatisticsTree::GetHTML(bool onlyVisible, HTREEITEM theItem, int theItemLevel, bool firstItem)
{
HTREEITEM hCurrent;
if (theItem == NULL)
{
if (!onlyVisible)
theApp.emuledlg->statisticswnd->ShowStatistics(true);
hCurrent = GetRootItem(); // Copy All Vis or Copy All
}
else
hCurrent = theItem;
CString strBuffer;
if (firstItem)
strBuffer.Format(_T("<font face=\"Tahoma,Verdana,Courier New,Helvetica\" size=\"2\">\r\n<b>eMule v%s %s [%s]</b>\r\n<br><br>\r\n"), theApp.m_strCurVersionLong, GetResString(IDS_SF_STATISTICS), thePrefs.GetUserNick());
while (hCurrent != NULL)
{
CString strItem;
if (IsBold(hCurrent))
strItem = _T("<b>") + GetItemText(hCurrent) + _T("</b>");
else
strItem = GetItemText(hCurrent);
for (int i = 0; i < theItemLevel; i++)
strBuffer += _T(" ");
if (theItemLevel == 0)
strBuffer.Append(_T("\n"));
strBuffer += strItem + _T("<br>");
if (ItemHasChildren(hCurrent) && (!onlyVisible || IsExpanded(hCurrent)))
strBuffer += GetHTML(onlyVisible, GetChildItem(hCurrent), theItemLevel+1, false);
hCurrent = GetNextItem(hCurrent, TVGN_NEXT);
if (firstItem && theItem != NULL)
break; // Copy Selected Branch was used, so we don't want to copy all branches at this level. Only the one that was selected.
}
if (firstItem)
strBuffer += _T("</font>");
return strBuffer;
}
// Takes the HTML output generated by GetHTML
// and puts it on the clipboard. Simplenuff.
bool CStatisticsTree::CopyHTML(int copyMode)
{
switch (copyMode) {
case MP_STATTREE_HTMLCOPYSEL:
{
HTREEITEM selectedItem = GetSelectedItem();
if (selectedItem != NULL) {
CString theHTML = GetHTML(true, selectedItem);
if (theHTML.IsEmpty())
return false;
theApp.CopyTextToClipboard(theHTML);
return true;
}
return false;
}
case MP_STATTREE_HTMLCOPYVIS:
{
CString theHTML = GetHTML();
if (theHTML.IsEmpty())
return false;
theApp.CopyTextToClipboard(theHTML);
return true;
}
case MP_STATTREE_HTMLCOPYALL:
{
CString theHTML = GetHTML(false);
if (theHTML.IsEmpty())
return false;
theApp.CopyTextToClipboard(theHTML);
return true;
}
}
return false;
}
CString CStatisticsTree::GetText(bool onlyVisible, HTREEITEM theItem, int theItemLevel, bool firstItem)
{
bool bPrintHeader = firstItem;
HTREEITEM hCurrent;
if (theItem == NULL)
{
hCurrent = GetRootItem(); // Copy All Vis or Copy All
}
else
{
if (bPrintHeader && (!ItemHasChildren(theItem) || !IsExpanded(theItem)))
bPrintHeader = false;
hCurrent = theItem;
}
CString strBuffer;
if (bPrintHeader)
strBuffer.Format(_T("eMule v%s %s [%s]\r\n\r\n"), theApp.m_strCurVersionLong, GetResString(IDS_SF_STATISTICS) ,thePrefs.GetUserNick());
while (hCurrent != NULL)
{
for (int i = 0; i < theItemLevel; i++)
strBuffer += _T(" ");
strBuffer += GetItemText(hCurrent);
if (bPrintHeader || !firstItem)
strBuffer += _T("\r\n");
if (ItemHasChildren(hCurrent) && (!onlyVisible || IsExpanded(hCurrent)))
strBuffer += GetText(onlyVisible, GetChildItem(hCurrent), theItemLevel+1, false);
hCurrent = GetNextItem(hCurrent, TVGN_NEXT);
if (firstItem && theItem != NULL)
break; // Copy Selected Branch was used, so we don't want to copy all branches at this level. Only the one that was selected.
}
return strBuffer;
}
// Doh-nuts.
bool CStatisticsTree::CopyText(int copyMode)
{
switch (copyMode) {
case MP_STATTREE_COPYSEL:
{
HTREEITEM selectedItem = GetSelectedItem();
if (selectedItem != NULL) {
CString theText = GetText(true, selectedItem);
if (theText.IsEmpty())
return false;
theApp.CopyTextToClipboard(theText);
return true;
}
return false;
}
case MP_STATTREE_COPYVIS:
{
CString theText = GetText();
if (theText.IsEmpty())
return false;
theApp.CopyTextToClipboard(theText);
return true;
}
case MP_STATTREE_COPYALL:
{
CString theText = GetText(false);
if (theText.IsEmpty())
return false;
theApp.CopyTextToClipboard(theText);
return true;
}
}
return false;
}
// This function generates the HTML output for ExportHTML. The reason this was made separate
// from GetHTML is because it uses style sheets. This lets the user easily customize the look
// of the HTML file after it is saved, just by changing a value here and there.
// Styled ID Tags: pghdr = This is used for the header that gives the eMule build and date.
// sec = Sections, ie Transfer, Connection, Session, Cumulative
// item = Items, ie UL:DL Ratio, Peak Connections, Downloaded Data
// bdy = The BODY tag. Used to control the background color.
CString CStatisticsTree::GetHTMLForExport(bool onlyVisible, HTREEITEM theItem, int theItemLevel, bool firstItem)
{
HTREEITEM hCurrent;
if (firstItem)
hCurrent = GetRootItem();
else
hCurrent = theItem;
CString strBuffer, strItem;
while (hCurrent != NULL)
{
if (IsBold(hCurrent))
strItem = _T("<span id=\"sec\">") + GetItemText(hCurrent) + _T("</span>\r\n");
else
strItem = _T("<span id=\"item\">") + GetItemText(hCurrent) + _T("</span>\r\n");
for (int i = 0; i < theItemLevel; i++)
strBuffer += _T(" ");
if (theItemLevel == 0)
strBuffer.Append(_T("\r\n"));
strBuffer += strItem + _T("<br>");
if (ItemHasChildren(hCurrent) && (!onlyVisible || IsExpanded(hCurrent)))
strBuffer += GetHTMLForExport(onlyVisible, GetChildItem(hCurrent), theItemLevel+1, false);
hCurrent = GetNextItem(hCurrent, TVGN_NEXT);
}
return strBuffer;
}
// Get a file name from the user, obtain the generated HTML and then save it in that file.
void CStatisticsTree::ExportHTML(bool onlyvisible)
{
CFile htmlFile;
CString htmlFileName;
CString theHTML;
theApp.emuledlg->statisticswnd->ShowStatistics(!onlyvisible);
CFileDialog saveAsDlg (false, _T("html"), _T("eMule Statistics.html"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, _T("HTML Files (*.html)|*.html|All Files (*.*)|*.*||"), this, 0);
if (saveAsDlg.DoModal() == IDOK)
{
theHTML.Format(_T("<html>\r\n<head>\r\n<title>eMule v%s %s [%s]</title>\r\n"), theApp.m_strCurVersionLong, GetResString(IDS_SF_STATISTICS), thePrefs.GetUserNick());
theHTML += _T("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n");
theHTML += _T("<meta name=vs_targetSchema content=\"http://schemas.microsoft.com/intellisense/ie5\">\r\n");
theHTML += _T("<style type=\"text/css\">\r\n#pghdr { color: #000F80; font: bold 12pt/14pt Tahoma, Verdana, Courier New, Helvetica; }\r\n");
theHTML += _T("#sec { color: #000000; font: bold 11pt/13pt Tahoma, Verdana, Courier New, Helvetica; }\r\n");
theHTML += _T("#item { color: #000000; font: normal 10pt/12pt Tahoma, Verdana, Courier New, Helvetica; }\r\n");
theHTML += _T("#bdy { color: #000000; font: normal 10pt/12pt Tahoma, Verdana, Courier New, Helvetica; background-color: #FFFFFF; }\r\n</style>\r\n</head>\r\n");
theHTML += _T("<body id=\"bdy\">\r\n");
theHTML.Format(_T("%s<span id=\"pghdr\">eMule v%s %s [%s]</span>\r\n<br><br>\r\n"), theHTML, theApp.m_strCurVersionLong, GetResString(IDS_SF_STATISTICS), thePrefs.GetUserNick());
theHTML += GetHTMLForExport(onlyvisible) + _T("</body></html>");
htmlFileName = saveAsDlg.GetPathName();
htmlFile.Open(htmlFileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite);
CStringA strHtmlA(wc2utf8(theHTML));
htmlFile.Write(strHtmlA, strHtmlA.GetLength());
htmlFile.Close();
}
}
// Expand all the tree sections. Recursive.
// Can also expand only bold items (Main Sections)
void CStatisticsTree::ExpandAll(bool onlyBold, HTREEITEM theItem)
{
HTREEITEM hCurrent;
if (theItem == NULL) {
if (onlyBold) CollapseAll();
hCurrent = GetRootItem();
m_bExpandingAll = true;
}
else
hCurrent = theItem;
while (hCurrent != NULL)
{
if (ItemHasChildren(hCurrent) && (!onlyBold || IsBold(hCurrent))) {
Expand(hCurrent, TVE_EXPAND);
ExpandAll(onlyBold, GetChildItem(hCurrent));
}
hCurrent = GetNextItem(hCurrent, TVGN_NEXT);
}
if (theItem == NULL) m_bExpandingAll = false;
}
// Collapse all the tree sections. This is recursive
// so that we can collapse submenus. SetRedraw should
// be FALSE while this is executing.
void CStatisticsTree::CollapseAll(HTREEITEM theItem)
{
HTREEITEM hCurrent;
if (theItem == NULL) {
hCurrent = GetRootItem();
m_bExpandingAll = true;
}
else
hCurrent = theItem;
while (hCurrent != NULL)
{
if (ItemHasChildren(hCurrent))
CollapseAll(GetChildItem(hCurrent));
Expand(hCurrent, TVE_COLLAPSE);
hCurrent = GetNextItem(hCurrent, TVGN_NEXT);
}
if (theItem == NULL) m_bExpandingAll = false;
}
// This returns a string of 1's and 0's indicating
// which parent items are expanded. Only saves the
// bold items.
CString CStatisticsTree::GetExpandedMask(HTREEITEM theItem)
{
HTREEITEM hCurrent;
CString tempMask;
tempMask.Empty();
if (theItem == NULL)
hCurrent = GetRootItem();
else
hCurrent = theItem;
while (hCurrent != NULL)
{
if (ItemHasChildren(hCurrent) && IsBold(hCurrent)) {
if (IsExpanded(hCurrent))
tempMask += "1";
if (!IsExpanded(hCurrent))
tempMask += "0";
tempMask += GetExpandedMask(GetChildItem(hCurrent));
}
hCurrent = GetNextItem(hCurrent, TVGN_NEXT);
}
return tempMask;
}
// This takes a string and uses it to set the expanded or
// collapsed state of the tree items.
int CStatisticsTree::ApplyExpandedMask(CString theMask, HTREEITEM theItem, int theStringIndex)
{
HTREEITEM hCurrent;
if (theItem == NULL) {
hCurrent = GetRootItem();
SetRedraw(false);
ExpandAll(true);
m_bExpandingAll = true;
}
else
hCurrent = theItem;
while (hCurrent != NULL && theStringIndex < theMask.GetLength())
{
if (ItemHasChildren(hCurrent) && IsBold(hCurrent)) {
if (theMask.GetAt(theStringIndex) == '0') Expand(hCurrent, TVE_COLLAPSE);
theStringIndex++;
theStringIndex = ApplyExpandedMask(theMask, GetChildItem(hCurrent), theStringIndex);
}
hCurrent = GetNextItem(hCurrent, TVGN_NEXT);
}
if (theItem == NULL) {
SetRedraw(true);
m_bExpandingAll = true;
}
return theStringIndex;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -