void CFavoriteOrganizeDlg::OnLvnGetInfoTipList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR); CAtlList<CString> args; ExplodeEsc(m_sl[m_tab.GetCurSel()].GetAt((POSITION)m_list.GetItemData(pGetInfoTip->iItem)), args, _T(';')); CString path = args.RemoveTail(); // Relative to drive value is always third. If less args are available that means it is not included. int rootLength = (args.GetCount() == 3 && args.RemoveTail() != _T("0")) ? CPath(path).SkipRoot() : 0; StringCchCopy(pGetInfoTip->pszText, pGetInfoTip->cchTextMax, path.Mid(rootLength)); *pResult = 0; }
void CShaderAutoCompleteDlg::OnLbnSelchangeList1() { ::SendMessage(m_hToolTipWnd, TTM_TRACKACTIVATE, FALSE, (LPARAM)&m_ti); int i = m_list.GetCurSel(); if (i < 0) { return; } if (POSITION pos = (POSITION)m_list.GetItemData(i)) { CString str, desc; m_inst.GetNextAssoc(pos, str, desc); CAtlList<CString> sl; Explode(desc, sl, '|', 2); if (sl.GetCount() != 2) { return; } _tcscpy_s(m_ti.lpszText, _countof(m_text), sl.RemoveTail()); CRect r; GetWindowRect(r); ::SendMessage(m_hToolTipWnd, TTM_UPDATETIPTEXT, 0, (LPARAM)&m_ti); ::SendMessage(m_hToolTipWnd, TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(r.left, r.bottom + 1)); ::SendMessage(m_hToolTipWnd, TTM_TRACKACTIVATE, TRUE, (LPARAM)&m_ti); } }
void ParseDirs(CAtlList<CString>& paths) { POSITION pos = paths.GetHeadPosition(); while (pos) { POSITION prevPos = pos; CString fn = paths.GetNext(pos); // Try to follow link files that point to a directory if (IsLinkFile(fn)) { fn = ResolveLinkFile(fn); } if (IsDir(fn)) { CAtlList<CString> subDirs; RecurseAddDir(fn, subDirs); // Add the subdirectories just after their parent // so that the tree is not parsed multiple times while (!subDirs.IsEmpty()) { paths.InsertAfter(prevPos, subDirs.RemoveTail()); } } } }
void SZYamlDocument::Dump(CString& strText, int nDumpIndent/* = SZYAML_DUMP_INDENT*/) { POSITION pos = m_YamlItemList.GetHeadPosition(); struct _KeyStackNode { _KeyStackNode() : nIndent(0) , nChildIndent(0) , bIsList(FALSE) { } int nIndent; int nChildIndent; CString strKey; BOOL bIsList; }; CAtlList<_KeyStackNode> listKeyStack; int nLastIndent = -1; BOOL bListItem = FALSE, bPrintThisLine = TRUE; CString strLine; strText = _T(""); while (pos) { _YamlItem &item = m_YamlItemList.GetAt(pos); if (listKeyStack.IsEmpty()) bListItem = FALSE; else bListItem = listKeyStack.GetTail().bIsList; if (item.nIndent == nLastIndent + 1) { _KeyStackNode &newkey = listKeyStack.GetAt(listKeyStack.AddTail()); POSITION posNext = _GetNextPos(pos, TRUE); newkey.nIndent = item.nIndent; newkey.strKey = item.node.Key(); newkey.bIsList = (posNext != NULL); } else if (item.nIndent == nLastIndent) { _KeyStackNode &newkey = listKeyStack.GetTail(); POSITION posNext = _GetNextPos(pos, TRUE); newkey.nIndent = item.nIndent; newkey.strKey = item.node.Key(); newkey.bIsList = (posNext != NULL); } else if (item.nIndent < nLastIndent) { for (nLastIndent -= item.nIndent; nLastIndent > 0; -- nLastIndent) listKeyStack.RemoveTail(); if (listKeyStack.IsEmpty()) bPrintThisLine = TRUE; else { _KeyStackNode &newkey = listKeyStack.GetTail(); newkey.nIndent = item.nIndent; if (newkey.strKey != item.node.Key()) { newkey.strKey = item.node.Key(); POSITION posNext = _GetNextPos(pos, TRUE); newkey.bIsList = (posNext != NULL); } else bPrintThisLine = !newkey.bIsList; } } #ifdef _SZYAML_DEBUG_TRACE { // Trace Key Stack kconsole::printf(_T(" ")); for (POSITION pos = listKeyStack.GetHeadPosition(); pos != NULL; listKeyStack.GetNext(pos)) { _KeyStackNode key = listKeyStack.GetAt(pos); kconsole::settextcolor(TRUE, TRUE, TRUE, FALSE); kconsole::printf(_T("(%d, '%s', %d)"), key.nIndent, key.strKey, key.bIsList); kconsole::settextcolor(TRUE, TRUE, TRUE, TRUE); } kconsole::printf(_T("\r\n")); } #endif // 这里对不确定长度的%s不使用Format,是因为MIN_CRT的格式化输出限制长度为1024,见atlstr.h // by bbcallen 2009-07-02 if (bPrintThisLine) { if (bListItem) { strLine.Format( _T("%s-%s"), CString(_T(' '), (item.nIndent - 1) * nDumpIndent), CString(_T(' '), nDumpIndent - 1) ); strLine.Append(item.node.Key()); strLine.Append(_T(": ")); strLine.Append(item.node.String()); strLine.Append(_T("\r\n")); } else { strLine.Format( _T("%s"), CString(_T(' '), item.nIndent * nDumpIndent) ); strLine.Append(item.node.Key()); strLine.Append(_T(": ")); strLine.Append(item.node.String()); strLine.Append(_T("\r\n")); } #ifdef _SZYAML_DEBUG_TRACE kconsole::printf(strLine); #endif strText += strLine; } else bPrintThisLine = TRUE; nLastIndent = item.nIndent; m_YamlItemList.GetNext(pos); } }
BOOL SZYamlDocument::Load(LPCTSTR lpszText) { BOOL bResult = FALSE; BOOL bNotFinish = TRUE; CString strText = lpszText, strLine, strKey, strValue; int nThisLinePos = 0, nNextLinePos = 0, nColonPos = 0; int nIndent = 0, nLineNum = 1; struct _KeyStackNode { _KeyStackNode() : nIndent(0) , nChildIndent(0) , bIsList(FALSE) { } int nIndent; int nChildIndent; CString strKey; BOOL bIsList; }; CAtlList<_KeyStackNode> listKeyStack; BOOL bNewChild = FALSE, bIsListItem = FALSE; m_YamlItemList.RemoveAll(); if (!lpszText) goto Exit0; while (bNotFinish) { nNextLinePos = strText.Find(_T('\n'), nThisLinePos); if (-1 == nNextLinePos) { bNotFinish = FALSE; strLine = strText.Mid(nThisLinePos); } else strLine = strText.Mid(nThisLinePos, nNextLinePos - nThisLinePos); nIndent = 0; // Get indent while (_T(' ') == strLine[nIndent]) nIndent ++; nColonPos = strLine.Find(_T(':')); strKey = strLine.Left(nColonPos).Trim(); strValue = strLine.Mid(nColonPos + 1).Trim(); if (_T('-') == strKey[0]) { int nIndentMore = 1; while (_T(' ') == strKey[nIndentMore]) nIndentMore ++; nIndent += nIndentMore; strKey = strKey.Mid(nIndentMore); bIsListItem = TRUE; } else bIsListItem = FALSE; if (bNewChild) { _KeyStackNode &LastKey = listKeyStack.GetTail(); LastKey.nChildIndent = nIndent; if (bIsListItem) LastKey.bIsList = TRUE; #ifdef _SZYAML_DEBUG_TRACE { // Trace Key Stack kconsole::printf(_T(" ")); for (POSITION pos = listKeyStack.GetHeadPosition(); pos != NULL; listKeyStack.GetNext(pos)) { _KeyStackNode key = listKeyStack.GetAt(pos); kconsole::printf(_T("(%d, '%s', %d)"), key.nChildIndent, key.strKey, key.bIsList); } kconsole::printf(_T("\r\n")); } #endif } strLine = strLine.Mid(nIndent); if (strLine.IsEmpty()) continue; while (!listKeyStack.IsEmpty()) { _KeyStackNode &LastKey = listKeyStack.GetTail(); if (LastKey.nChildIndent == nIndent) break; #ifdef _SZYAML_DEBUG_TRACE kconsole::printf(_T(" ### (%d, %d)\r\n"), LastKey.nChildIndent, nIndent); #endif if (LastKey.nChildIndent < nIndent) { #ifdef _SZYAML_DEBUG_TRACE kconsole::printf(_T(" * ERROR: Line %d, Indent Error\r\n"), nLineNum); #endif goto Exit0; } listKeyStack.RemoveTail(); #ifdef _SZYAML_DEBUG_TRACE { // Trace Key Stack kconsole::printf(_T(" ")); for (POSITION pos = listKeyStack.GetHeadPosition(); pos != NULL; listKeyStack.GetNext(pos)) { _KeyStackNode key = listKeyStack.GetAt(pos); kconsole::printf(_T("(%d, '%s', %d)"), key.nChildIndent, key.strKey, key.bIsList); } kconsole::printf(_T("\r\n")); } #endif } if (bIsListItem && !bNewChild) { _KeyStackNode &LastKey = listKeyStack.GetTail(); SZYamlNode newNode; newNode.SetKey(LastKey.strKey); _AppendNode((int)listKeyStack.GetCount() - 1, newNode); } if (1 < strValue.GetLength() && strValue[0] == strValue[strValue.GetLength() - 1] && (_T('\'') == strValue[0] || _T('\"') == strValue[0])) strValue = strValue.Mid(1, strValue.GetLength() - 2); if (strValue.IsEmpty()) { _KeyStackNode &NewKey = listKeyStack.GetAt(listKeyStack.AddTail()); NewKey.nIndent = nIndent; NewKey.strKey = strKey; bNewChild = TRUE; } else bNewChild = FALSE; { SZYamlNode newNode; newNode.SetKey(strKey); newNode.SetValue(strValue); _AppendNode((int)listKeyStack.GetCount() - (bNewChild ? 1 : 0), newNode); } nThisLinePos = nNextLinePos + 1; ++ nLineNum; } SZYamlHandle::_SetPosition(this, m_YamlItemList.GetHeadPosition()); bResult = TRUE; Exit0: return bResult; }