|
|
|
/*==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/>.
|
|
|
|
|
|
|
|
Additional permissions under GNU GPL version 3 section 7
|
|
|
|
|
|
|
|
If you modify this Program, or any covered work, by linking or
|
|
|
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
|
|
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
|
|
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
|
|
|
(or a modified version of those libraries),
|
|
|
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
|
|
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
|
|
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
|
|
|
licensors of this Program grant you additional
|
|
|
|
permission to convey the resulting work. Corresponding Source for a
|
|
|
|
non-source form of such a combination shall include the source code for
|
|
|
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
|
|
|
work.
|
|
|
|
|
|
|
|
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 "HeadSpin.h"
|
|
|
|
#include "hsStringTokenizer.h"
|
|
|
|
|
|
|
|
#include <max.h>
|
|
|
|
#include "resource.h"
|
|
|
|
#include <vector>
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
#include "plPickLocalizationDlg.h"
|
|
|
|
#include "pfLocalizationMgr/pfLocalizationDataMgr.h"
|
|
|
|
|
|
|
|
#include "MaxMain/plMaxCFGFile.h"
|
|
|
|
#include "MaxMain/plMaxAccelerators.h"
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
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<plString> ages = pfLocalizationDataMgr::Instance().GetAgeList();
|
|
|
|
|
|
|
|
for (int curAge = 0; curAge < ages.size(); curAge++)
|
|
|
|
{
|
|
|
|
HTREEITEM hAgeItem = IAddVar(ages[curAge].c_str(), ageName, TVI_ROOT);
|
|
|
|
|
|
|
|
std::vector<plString> sets = pfLocalizationDataMgr::Instance().GetSetList(ages[curAge]);
|
|
|
|
for (int curSet = 0; curSet < sets.size(); curSet++)
|
|
|
|
{
|
|
|
|
std::vector<plString> elements = pfLocalizationDataMgr::Instance().GetElementList(ages[curAge], sets[curSet]);
|
|
|
|
|
|
|
|
HTREEITEM hSetItem = IAddVar(sets[curSet].c_str(), setName, hAgeItem);
|
|
|
|
for (int curElement = 0; curElement < elements.size(); curElement++)
|
|
|
|
IAddVar(elements[curElement].c_str(), 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;
|
|
|
|
}
|