//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "LocalizationDialog.h" #include "CreateTokenDialog.h" #include "vgui_controls/Button.h" #include "vgui_controls/ListPanel.h" #include"vgui_controls/TextEntry.h" #include "VGUI/IVGui.h" #include "VGUI/ILocalize.h" #include "VGUI/ISurface.h" #include "tier1/KeyValues.h" #include "vgui_controls/Menu.h" #include "vgui_controls/MenuButton.h" #include "vgui_controls/MessageBox.h" #include "vgui_controls/FileOpenDialog.h" #include using namespace vgui; //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CLocalizationDialog::CLocalizationDialog(const char *fileName) : Frame(NULL, "LocalizationDialog") { m_iCurrentToken = -1; m_pTokenList = new ListPanel(this, "TokenList"); m_pTokenList->AddColumnHeader(0, "Token", "Token Name", 128, 128, 1024, 0 ); m_pLanguageEdit = new TextEntry(this, "LanguageEdit"); m_pLanguageEdit->SetMultiline(true); m_pLanguageEdit->SetVerticalScrollbar(true); m_pLanguageEdit->SetCatchEnterKey(true); m_pEnglishEdit = new TextEntry(this, "EnglishEdit"); m_pEnglishEdit->SetMultiline(true); m_pEnglishEdit->SetVerticalScrollbar(true); m_pEnglishEdit->SetVerticalScrollbar(true); m_pFileMenu = new Menu(this, "FileMenu"); m_pFileMenu->AddMenuItem(" &Open File ", new KeyValues("FileOpen"), this); m_pFileMenu->AddMenuItem(" &Save File ", new KeyValues("FileSave"), this); m_pFileMenu->AddMenuItem(" E&xit Localizer ", new KeyValues("Close"), this); m_pFileMenuButton = new MenuButton(this, "FileMenuButton", "File"); m_pFileMenuButton->SetMenu(m_pFileMenu); m_pApplyButton = new Button(this, "ApplyButton", "Apply"); m_pApplyButton->SetCommand(new KeyValues("ApplyChanges")); m_pTestLabel = new Label(this, "TestLabel", ""); LoadControlSettings("Resource/LocalizationDialog.res"); strcpy(m_szFileName, fileName); char buf[512]; Q_snprintf(buf, sizeof( buf ), "%s - Localization Editor", m_szFileName); SetTitle(buf, true); // load in the string table if (!g_pVGuiLocalize->AddFile( m_szFileName ) ) { MessageBox *msg = new MessageBox("Fatal error", "couldn't load specified file"); msg->SetCommand("Close"); msg->AddActionSignalTarget(this); msg->DoModal(); return; } // populate the dialog with the strings StringIndex_t idx = g_pVGuiLocalize->GetFirstStringIndex(); while ( idx != vgui::INVALID_STRING_INDEX ) { // adds the strings into the table, along with the indexes m_pTokenList->AddItem(new KeyValues("LString", "Token", g_pVGuiLocalize->GetNameByIndex(idx)), idx, false, false); // move to the next string idx = g_pVGuiLocalize->GetNextStringIndex(idx); } // sort the table m_pTokenList->SetSortColumn(0); m_pTokenList->SortList(); } //----------------------------------------------------------------------------- // Purpose: Destructor //----------------------------------------------------------------------------- CLocalizationDialog::~CLocalizationDialog() { } //----------------------------------------------------------------------------- // Purpose: Handles closing of the dialog - shuts down the whole app //----------------------------------------------------------------------------- void CLocalizationDialog::OnClose() { BaseClass::OnClose(); // Stop vgui running vgui::ivgui()->Stop(); } //----------------------------------------------------------------------------- // Purpose: lays out the dialog //----------------------------------------------------------------------------- void CLocalizationDialog::PerformLayout() { OnTextChanged(); BaseClass::PerformLayout(); } //----------------------------------------------------------------------------- // Purpose: Sets the currently selected token //----------------------------------------------------------------------------- void CLocalizationDialog::OnTokenSelected() { if (m_pTokenList->GetSelectedItemsCount() != 1) { // clear the list m_pLanguageEdit->SetText(""); m_pEnglishEdit->SetText(""); //!! unicode test label m_pTestLabel->SetText(""); m_iCurrentToken = -1; } else { // get the data int itemId = m_pTokenList->GetSelectedItem(0); vgui::ListPanelItem *data = m_pTokenList->GetItemData( itemId ); Assert( data ); m_iCurrentToken = data->userData; wchar_t *unicodeString = g_pVGuiLocalize->GetValueByIndex(m_iCurrentToken); char value[2048]; g_pVGuiLocalize->ConvertUnicodeToANSI(unicodeString, value, sizeof(value)); //!! unicode test label m_pTestLabel->SetText(unicodeString); // set the text m_pLanguageEdit->SetText(value); m_pEnglishEdit->SetText(value); } m_pApplyButton->SetEnabled(false); } //----------------------------------------------------------------------------- // Purpose: Checks to see if any text has changed //----------------------------------------------------------------------------- void CLocalizationDialog::OnTextChanged() { static char buf1[1024], buf2[1024]; m_pLanguageEdit->GetText( buf1, sizeof( buf1 ) ); m_pEnglishEdit->GetText( buf2, sizeof( buf2 ) ); if (!strcmp(buf1, buf2)) { m_pApplyButton->SetEnabled(false); } else { m_pApplyButton->SetEnabled(true); } } //----------------------------------------------------------------------------- // Purpose: Copies any changes made into the main database //----------------------------------------------------------------------------- void CLocalizationDialog::OnApplyChanges() { if (m_iCurrentToken < 0) return; static char buf1[1024]; static wchar_t unicodeString[1024]; m_pLanguageEdit->GetText( buf1, sizeof( buf1 ) ); g_pVGuiLocalize->ConvertANSIToUnicode(buf1, unicodeString, sizeof(unicodeString) / sizeof(wchar_t)); //!! unicode test label m_pTestLabel->SetText(unicodeString); // apply the text change to the database g_pVGuiLocalize->SetValueByIndex(m_iCurrentToken, unicodeString); // disable the apply button m_pApplyButton->SetEnabled(false); // reselect the token OnTokenSelected(); } //----------------------------------------------------------------------------- // Purpose: Message handler for saving current file //----------------------------------------------------------------------------- void CLocalizationDialog::OnFileSave() { if (g_pVGuiLocalize->SaveToFile( m_szFileName ) ) { // success MessageBox *box = new MessageBox("Save Successful - VLocalize", "File was successfully saved.", false); box->DoModal(); } else { // failure MessageBox *box = new MessageBox("Error during save - VLocalize", "Error - File was not successfully saved.", false); box->DoModal(); } } //----------------------------------------------------------------------------- // Purpose: Message handler for loading a file //----------------------------------------------------------------------------- void CLocalizationDialog::OnFileOpen() { FileOpenDialog *box = new FileOpenDialog( this, "Open", true ); box->SetStartDirectory("u:\\"); box->AddFilter("*.*", "All Files (*.*)", true ); box->DoModal(false); } //----------------------------------------------------------------------------- // Purpose: Handles a token created message // Input : *tokenName - the name of the newly created token //----------------------------------------------------------------------------- void CLocalizationDialog::OnTokenCreated(const char *tokenName) { // add the new string table token to the token list int idx = g_pVGuiLocalize->FindIndex(tokenName); int itemId = m_pTokenList->AddItem(new KeyValues("LString", "Token", g_pVGuiLocalize->GetNameByIndex(idx)), idx, true, true ); // make that currently selected m_pTokenList->SetSingleSelectedItem( itemId ); OnTokenSelected(); } //----------------------------------------------------------------------------- // Purpose: Creates a new token //----------------------------------------------------------------------------- void CLocalizationDialog::OnCreateToken() { CCreateTokenDialog *dlg = new CCreateTokenDialog( this ); dlg->AddActionSignalTarget(this); dlg->CreateSingleToken(); } char const *CLocalizationDialog::GetFileName() const { return m_szFileName; } //----------------------------------------------------------------------------- // Purpose: // Input : *command - //----------------------------------------------------------------------------- void CLocalizationDialog::OnCommand(const char *command) { if (!stricmp(command, "CreateToken")) { OnCreateToken(); } else { BaseClass::OnCommand(command); } } //----------------------------------------------------------------------------- // Purpose: empty message map //----------------------------------------------------------------------------- MessageMapItem_t CLocalizationDialog::m_MessageMap[] = { MAP_MESSAGE( CLocalizationDialog, "RowSelected", OnTokenSelected ), // message from the m_pTokenList MAP_MESSAGE( CLocalizationDialog, "TextChanged", OnTextChanged ), // message from the text entry MAP_MESSAGE( CLocalizationDialog, "ApplyChanges", OnApplyChanges ), // message from the text entry MAP_MESSAGE( CLocalizationDialog, "FileSave", OnFileSave ), MAP_MESSAGE( CLocalizationDialog, "FileOpen", OnFileOpen ), MAP_MESSAGE_CONSTCHARPTR( CLocalizationDialog, "TokenCreated", OnTokenCreated, "name" ), }; IMPLEMENT_PANELMAP(CLocalizationDialog, BaseClass);