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.

250 lines
6.7 KiB

/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
#include "plPickLocalizationDlg.h"
#include "pfLocalizationMgr/pfLocalizationDataMgr.h"
#include "MaxMain/plMaxCFGFile.h"
#include "MaxMain/plMaxAccelerators.h"
#include "hsUtils.h"
#include "hsStringTokenizer.h"
#include "resource.h"
#include <vector>
////////////////////////////////////////////////////////////////////
bool plPickLocalizationDlg::DoPick()
{
plMaxAccelerators::Disable();
BOOL ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_PICK_LOCALIZATION),
GetCOREInterface()->GetMAXHWnd(), IDlgProc, (LPARAM)this);
plMaxAccelerators::Enable();
return (ret != 0);
}
hsStringTokenizer locIzer;
char locToken[200];
bool plPickLocalizationDlg::IInitDlg(HWND hDlg)
{
if (!pfLocalizationDataMgr::InstanceValid())
{
MessageBox(hDlg, "Localization data manger is not initialized! (BTW, this is BAD)", "Error", MB_ICONERROR + MB_OK);
return false;
}
fTree = GetDlgItem(hDlg, IDC_LOCALIZATIONTREE);
TreeView_DeleteAllItems(fTree);
std::string ageName = "", setName = "", itemName = "";
locIzer.Reset(fPath.c_str(), ".");
if (locIzer.Next(locToken, 200))
ageName = locToken;
if (locIzer.Next(locToken, 200))
setName = locToken;
if (locIzer.Next(locToken, 200))
itemName = locToken;
IAddLocalizations(ageName, setName, itemName);
IUpdateValue(hDlg);
return true;
}
std::string WStringToString(std::wstring val)
{
std::string retVal;
char *buff = hsWStringToString(val.c_str());
retVal = buff;
delete [] buff;
return retVal;
}
HTREEITEM plPickLocalizationDlg::IAddVar(std::string name, std::string match, HTREEITEM hParent)
{
TVINSERTSTRUCT tvi = {0};
tvi.hParent = hParent;
tvi.hInsertAfter = TVI_LAST;
tvi.item.mask = TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = (char*)name.c_str();
tvi.item.cchTextMax = name.length();
tvi.item.lParam = (LPARAM)nil;
HTREEITEM hItem = TreeView_InsertItem(fTree, &tvi);
if (name == match)
{
TreeView_SelectItem(fTree, hItem);
TreeView_EnsureVisible(fTree, hItem);
}
return hItem;
}
void plPickLocalizationDlg::IAddLocalizations(std::string ageName, std::string setName, std::string itemName)
{
std::vector<std::wstring> ages = pfLocalizationDataMgr::Instance().GetAgeList();
for (int curAge = 0; curAge < ages.size(); curAge++)
{
HTREEITEM hAgeItem = IAddVar(WStringToString(ages[curAge]), ageName, TVI_ROOT);
std::vector<std::wstring> sets = pfLocalizationDataMgr::Instance().GetSetList(ages[curAge]);
for (int curSet = 0; curSet < sets.size(); curSet++)
{
std::vector<std::wstring> elements = pfLocalizationDataMgr::Instance().GetElementList(ages[curAge], sets[curSet]);
HTREEITEM hSetItem = IAddVar(WStringToString(sets[curSet]), setName, hAgeItem);
for (int curElement = 0; curElement < elements.size(); curElement++)
IAddVar(WStringToString(elements[curElement]), itemName, hSetItem);
}
}
}
void plPickLocalizationDlg::IUpdateValue(HWND hDlg)
{
fPath = "";
HTREEITEM hItem = TreeView_GetSelection(fTree);
std::vector<std::string> path;
while (hItem)
{
char s[200];
TVITEM tvi = {0};
tvi.hItem = hItem;
tvi.mask = TVIF_TEXT;
tvi.pszText = s;
tvi.cchTextMax = 200;
TreeView_GetItem(fTree, &tvi);
path.push_back(tvi.pszText);
hItem = TreeView_GetParent(fTree, hItem);
}
while (!path.empty())
{
fPath.append(path.back());
path.pop_back();
if (!path.empty())
fPath.append(".");
}
SetDlgItemText(hDlg, IDC_LOCALIZATIONSTRING, fPath.c_str());
IUpdateOkBtn(hDlg);
}
void plPickLocalizationDlg::IUpdateOkBtn(HWND hDlg)
{
HWND hOk = GetDlgItem(hDlg, IDOK);
char s[512];
GetDlgItemText(hDlg, IDC_LOCALIZATIONSTRING, s, 511);
EnableWindow(hOk, strlen(s)>0 && IValidatePath());
}
bool plPickLocalizationDlg::IValidatePath()
{
std::string ageName = "", setName = "", itemName = "";
locIzer.Reset(fPath.c_str(), ".");
if (locIzer.Next(locToken, 200))
ageName = locToken;
if (locIzer.Next(locToken, 200))
setName = locToken;
if (locIzer.Next(locToken, 200))
itemName = locToken;
if (ageName == "")
return false; // no age, so not valid
if (setName == "")
return false; // no set, so not valid
if (itemName == "")
return false; // no item, so not valid
return true;
}
BOOL CALLBACK plPickLocalizationDlg::IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static plPickLocalizationDlg* pthis = nil;
switch (msg)
{
case WM_INITDIALOG:
pthis = (plPickLocalizationDlg*)lParam;
if (!pthis->IInitDlg(hDlg))
EndDialog(hDlg, 0);
return FALSE;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK)
{
EndDialog(hDlg, 1);
return TRUE;
}
else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, 0);
return TRUE;
}
break;
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_CLOSE:
EndDialog(hDlg, 0);
return TRUE;
}
break;
case WM_NOTIFY:
NMHDR *nmhdr = (NMHDR*)lParam;
if (nmhdr->idFrom == IDC_LOCALIZATIONTREE)
{
switch (nmhdr->code)
{
case TVN_SELCHANGED:
pthis->IUpdateValue(hDlg);
return TRUE;
case NM_DBLCLK:
if (pthis->IValidatePath()) // only close the dialog if it's a valid path
EndDialog(hDlg, 1);
return TRUE;
}
}
break;
}
return FALSE;
}