#include "stdafx.h" #include "DnNameAutoComplete.h" #include "DnTableDB.h" #include "DNTableFile.h" #include "DnUIString.h" #ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE CNameAutoComplete::CNameAutoComplete() { } CNameAutoComplete::~CNameAutoComplete() { m_mNameItemList.clear(); } void CNameAutoComplete::LoadData(int nLimit) { if (m_mNameItemList.empty() == false) return; DNTableFileFormat *pItemSox = GetDNTable( CDnTableDB::TITEM ); int _NameID = pItemSox->GetFieldNum( "_NameID" ); int _NameIDParam = pItemSox->GetFieldNum( "_NameIDParam" ); int _Type = pItemSox->GetFieldNum( "_Type" ); int _Rank = pItemSox->GetFieldNum( "_Rank" ); int _Reversion = pItemSox->GetFieldNum( "_Reversion" ); int _LevelLimit = pItemSox->GetFieldNum( "_LevelLimit" ); int _IsUse = pItemSox->GetFieldNum( "_isUse" ); int nItemID = 0; int nNameID = 0; int nType = 0; int nRank = 0; int nReversion = 0; int nLevelLimit = 0; bool bIsUse = false; char *szNameParam = NULL; wstring wszName; std::vector > vPartialNames; std::vector >::iterator itorPartial; std::vector tokens; for (int i = 0; i < pItemSox->GetItemCount(); i++) { wszName.clear(); vPartialNames.clear(); nItemID = pItemSox->GetItemID(i); int iIdx = pItemSox->GetIDXprimary( nItemID ); nNameID = pItemSox->GetFieldFromLablePtr( iIdx, _NameID )->GetInteger(); szNameParam = pItemSox->GetFieldFromLablePtr( iIdx, _NameIDParam )->GetString(); nType = pItemSox->GetFieldFromLablePtr( iIdx, _Type )->GetInteger(); nRank = pItemSox->GetFieldFromLablePtr( iIdx, _Rank )->GetInteger(); nReversion = pItemSox->GetFieldFromLablePtr( iIdx, _Reversion )->GetInteger(); nLevelLimit = pItemSox->GetFieldFromLablePtr( iIdx, _LevelLimit )->GetInteger(); bIsUse = pItemSox->GetFieldFromLablePtr( iIdx, _IsUse )->GetBool(); if (bIsUse == false) continue; if (nLevelLimit > nLimit) continue; MakeUIStringUseVariableParam( wszName, nNameID, szNameParam, &vPartialNames ); if (_CheckExceptCharacter(wszName)) continue; if (_CheckOnlyNumber(wszName.c_str())) continue; if (nReversion != ITEMREVERSION_GUILD) _InsertItem(wszName, nNameID, nType, nRank, nItemID); tokens.clear(); TokenizeW(wszName, tokens, L" "); for (int tokencnt = 0; tokencnt < (int)tokens.size(); tokencnt++) { int nMessageId = GetEtUIXML().GetUIMessageID(tokens[tokencnt].c_str()); if (nMessageId != -1) { if (_CheckExceptCharacter(tokens[tokencnt])) continue; if (_CheckOnlyNumber(tokens[tokencnt].c_str())) continue; _InsertItem(tokens[tokencnt], nMessageId, -1, -1, 0); } } } } void CNameAutoComplete::GetMatchNameList(const WCHAR * pwszSrc, std::vector >> &vList) { if (pwszSrc == NULL) return; std::wstring wstrSrc(pwszSrc); std::transform(wstrSrc.begin(), wstrSrc.end(), wstrSrc.begin(), towlower); size_t pwszSrcLen = wcslen(pwszSrc); std::vector tokens; TokenizeW(pwszSrc, tokens, L" "); bool bFirstMatched = false; std::vector::iterator ipartial; std::map ::iterator ii; std::vector vPartialList; if (tokens.size() > 1) { for (int nPartial = 0; nPartial < static_cast(tokens.size()); nPartial++) { if (nPartial != static_cast(tokens.size()) - 1) { ii = m_mNameItemList.find(tokens[nPartial]); if (ii == m_mNameItemList.end()) break; if (!wcsicmp((*ii).first.c_str(), tokens[nPartial].c_str())) vPartialList.push_back(&(*ii).second); } else { for (ii = m_mNameItemList.begin(); ii != m_mNameItemList.end(); ii++) { if (tokens[nPartial].size() > (*ii).first.size()) continue; std::wstring::size_type pos = (*ii).first.find_first_of(L" "); if (pos != static_cast(-1)) continue; if (!_wcsnicmp((*ii).first.c_str(), tokens[nPartial].c_str(), tokens[nPartial].size())) { vPartialList.push_back(&(*ii).second); vList.push_back(std::make_pair(reinterpret_cast(NULL), vPartialList)); break; } } if (ii == m_mNameItemList.end()) vList.push_back(std::make_pair(reinterpret_cast(NULL), vPartialList)); } } } if (vList.empty() == false) { bool bErase = false; std::vector >>::iterator iVerify; for (iVerify = vList.begin(); iVerify != vList.end(); ) { if ((*iVerify).first == NULL) { std::wstring wstrVerify; for (int nCheck = 0; nCheck < static_cast((*iVerify).second.size()); nCheck++) { wstrVerify += (*iVerify).second[nCheck]->wstrName; if (nCheck != static_cast((*iVerify).second.size()) - 1) wstrVerify += L" "; } if (wstrVerify.empty() == false) { if (_VerifyItem(wstrVerify) == false || static_cast(wstrVerify.size()) < pwszSrcLen) { iVerify = vList.erase(iVerify); bErase = true; } } } if (bErase == false) iVerify++; bErase = false; } } vPartialList.clear(); for (ii = m_mNameItemList.begin(); ii != m_mNameItemList.end(); ii++) { if (pwszSrcLen > (*ii).first.size()) continue; if (wcsstr((*ii).first.c_str(), wstrSrc.c_str())) vList.push_back(std::make_pair(&(*ii).second, vPartialList)); } } const CNameAutoComplete::TNameAutoItem * CNameAutoComplete::GetAutoNameData(const WCHAR * pwszSrc, std::vector &vList) { if (pwszSrc == NULL) return NULL; std::wstring wstrName = pwszSrc; std::transform(wstrName.begin(), wstrName.end(), wstrName.begin(), towlower); size_t pwszSrcLen = wcslen(pwszSrc); std::map ::iterator ii = m_mNameItemList.find(wstrName); if (ii != m_mNameItemList.end()) return &(*ii).second; std::vector tokens; TokenizeW(pwszSrc, tokens, L" "); bool bFirstMatched = false; std::vector::iterator ipartial; if (tokens.size() > 1) { for (int nPartial = 0; nPartial < static_cast(tokens.size()); nPartial++) { if (nPartial != static_cast(tokens.size()) - 1) { ii = m_mNameItemList.find(tokens[nPartial]); if (ii == m_mNameItemList.end()) break; if (!wcsicmp((*ii).first.c_str(), tokens[nPartial].c_str())) vList.push_back(&(*ii).second); } else { for (ii = m_mNameItemList.begin(); ii != m_mNameItemList.end(); ii++) { if (tokens[nPartial].size() > (*ii).first.size()) continue; std::wstring::size_type pos = (*ii).first.find_first_of(L" "); if (pos != static_cast(-1)) continue; if (!_wcsnicmp((*ii).first.c_str(), tokens[nPartial].c_str(), tokens[nPartial].size())) { vList.push_back(&(*ii).second); break; } } } } } return NULL; } bool CNameAutoComplete::_InsertItem(std::wstring &wstrName, int nNameID, int nItemType, int nItemRank, int nItemID) { return _InsertItem(wstrName.c_str(), nNameID, nItemType, nItemRank, nItemID); } bool CNameAutoComplete::_InsertItem(const WCHAR * pwszName, int nNameID, int nItemType, int nItemRank, int nItemID) { if (pwszName == NULL || wcslen(pwszName) <= 0) return false; if (_IsExistItem(pwszName)) return false; std::wstring wstrName = pwszName; std::transform(wstrName.begin(), wstrName.end(), wstrName.begin(), towlower); TNameAutoItem NameInfo; NameInfo.wstrName = wstrName; NameInfo.nNameID = nNameID; NameInfo.nItemType = nItemType; NameInfo.nItemRank = nItemRank; NameInfo.nItemID = nItemID; m_mNameItemList.insert(std::make_pair(wstrName, NameInfo)); return true; } bool CNameAutoComplete::_IsExistItem(const WCHAR * pwszSrc) { if (pwszSrc == NULL) return NULL; std::wstring wstrName = pwszSrc; std::transform(wstrName.begin(), wstrName.end(), wstrName.begin(), towlower); std::map ::iterator ii = m_mNameItemList.find(wstrName); if (ii != m_mNameItemList.end()) return true; return false; } bool CNameAutoComplete::_VerifyItem(std::wstring &wstrName) { std::transform(wstrName.begin(), wstrName.end(), wstrName.begin(), towlower); std::map ::iterator ii; for (ii = m_mNameItemList.begin(); ii != m_mNameItemList.end(); ii++) { if (wcsstr((*ii).second.wstrName.c_str(), wstrName.c_str())) return true; } return false; } bool CNameAutoComplete::_CheckOnlyNumber(const WCHAR * pwszCheck) { if (pwszCheck == NULL) return false; wchar_t wszChar; for (int i = 0; i < (int)wcslen(pwszCheck); i++) { wszChar = pwszCheck[i]; if (IS_IN_UNICODERANGE(UNICODE_TYPE_NUMBERS_START, UNICODE_TYPE_NUMBERS_END, wszChar) == false) return false; } return true; } bool CNameAutoComplete::_CheckExceptCharacter(std::wstring &wstrCheck) { if (wstrCheck.size() <= 1) return true; std::wstring wstrName = wstrCheck; std::transform(wstrName.begin(), wstrName.end(), wstrName.begin(), towlower); if (wstrName.size() <= 0 || wstrName[0] == ' ' || wstrName[0] == '+' || (wstrName[0] == '/' && wstrName[1] == '/')) return true; if (wcsstr(wstrName.c_str(), L"m:")) return true; wchar_t wszChar; for (int i = 0; i < (int)wstrName.size(); i++) { wszChar = wstrName[i]; if (IS_IN_UNICODERANGE(UNICODE_TYPE_EXCEPTPERCENT, UNICODE_TYPE_EXCEPTPERCENT, wszChar)) return true; if (IS_IN_UNICODERANGE(UNICODE_TYPE_EXCEPT_CHAR1_START, UNICODE_TYPE_EXCEPT_CHAR1_END, wszChar)) return true; if (IS_IN_UNICODERANGE(UNICODE_TYPE_EXCEPT_CHAR2, UNICODE_TYPE_EXCEPT_CHAR2, wszChar)) return true; if (IS_IN_UNICODERANGE(UNICODE_TYPE_EXCEPT_CHAR3, UNICODE_TYPE_EXCEPT_CHAR3, wszChar)) return true; if (IS_IN_UNICODERANGE(UNICODE_TYPE_EXCEPT_CHAR4, UNICODE_TYPE_EXCEPT_CHAR4, wszChar)) return true; if (IS_IN_UNICODERANGE(UNICODE_TYPE_KOREAN_START, UNICODE_TYPE_KOREAN_END, wszChar)) return true; } return false; } #endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE