// MultiLangCommandBars.cpp // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include "winnls.h" #include "MultiLangCommandBars.h" #include "MultiLangCommandBarsDoc.h" #include "WorkspaceView.h" #include "ChildFrm.h" #include "MainFrm.h" #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMultiLangCommandBarsApp BEGIN_MESSAGE_MAP(CMultiLangCommandBarsApp, CWinApp) //{{AFX_MSG_MAP(CMultiLangCommandBarsApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_LANGUAGE_ENGLISH, OnLanguageEnglish) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_ENGLISH, OnUpdateLanguageEnglish) ON_COMMAND(ID_LANGUAGE_RUSSIAN, OnLanguageRussian) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_RUSSIAN, OnUpdateLanguageRussian) ON_COMMAND(ID_LANGUAGE_GERMAN, OnLanguageGerman) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_GERMAN, OnUpdateLanguageGerman) ON_COMMAND(ID_LANGUAGE_JAPANESE, OnLanguageJapanese) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_JAPANESE, OnUpdateLanguageJapanese) ON_COMMAND(ID_LANGUAGE_ARABIC, OnLanguageArabic) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_ARABIC, OnUpdateLanguageArabic) ON_COMMAND(ID_FILE_NEW, OnFileNew) //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMultiLangCommandBarsApp construction CMultiLangCommandBarsApp::CMultiLangCommandBarsApp() : m_curLanguage(0) { m_bIsWinNT = XTPSystemVersion()->IsWinNT4OrGreater(); m_bIsWin2000OrLater = XTPSystemVersion()->IsWin2KOrGreater(); m_bIsRTL = FALSE; hRichEditDll = NULL; } ///////////////////////////////////////////////////////////////////////////// // The one and only CMultiLangCommandBarsApp object CMultiLangCommandBarsApp theApp; // This identifier was generated to be statistically unique for your app. // You may change it if you prefer to choose a specific identifier. // {7559FD90-9B93-11CE-B0F0-00AA006C28B3} static const CLSID clsid = { 0x7559fd90, 0x9b93, 0x11ce, { 0xb0, 0xf0, 0x0, 0xaa, 0x0, 0x6c, 0x28, 0xb3 } }; #define LANGID_ENGLISH MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) #define LANGID_GERMAN MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN) #define LANGID_JAPANESE MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT) #define LANGID_ARABIC MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA) #define LANGID_RUSSIAN MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT) ///////////////////////////////////////////////////////////////////////////// // CMultiLangCommandBarsApp initialization BOOL CMultiLangCommandBarsApp::InitInstance() { // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #if _MSC_VER <= 1200 // MFC 6.0 or earlier # ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL # else Enable3dControlsStatic(); // Call this when linking to MFC statically # endif #endif // MFC 6.0 or earlier CString ver; ver.Format(_T("Codejock %s v%d.%d.%d"), _XTP_PACKAGE_NAME, _XTPLIB_VERSION_MAJOR, _XTPLIB_VERSION_MINOR, _XTPLIB_VERSION_REVISION); SetRegistryKey(ver); LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_SCRIBBTYPE, RUNTIME_CLASS(CMultiLangCommandBarsDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CWorkspaceView)); AddDocTemplate(pDocTemplate); // Connect the COleTemplateServer to the document template. // The COleTemplateServer creates new documents on behalf // of requesting OLE containers by using information // specified in the document template. m_server.ConnectTemplate(clsid, pDocTemplate, FALSE); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; // Enable drag/drop open. We don't call this in Win32, since a // document file extension wasn't chosen while running AppWizard. m_pMainWnd->DragAcceptFiles(); // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Check to see if launched as OLE server if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) { // Application was run with /Embedding or /Automation. Don't show the // main window in this case. return TRUE; } // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; UINT curLanguage = GetProfileInt(_T("Settings"), _T("Current Language"), LANG_ENGLISH); switch (curLanguage & 0xFF) { case LANG_GERMAN: OnLanguageGerman(); break; case LANG_JAPANESE: OnLanguageJapanese(); break; case LANG_ARABIC: OnLanguageArabic(); break; case LANG_RUSSIAN: OnLanguageRussian(); break; default: OnLanguageEnglish(); break; } // The main window has been initialized, so show and update it. pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); #ifndef UNICODE ::MessageBox(pMainFrame->GetSafeHwnd(), _T("Compile the sample using UNICODE to see Japanese, German, Arabic and Russian ") _T("translations."), _T("Some Translations Not Available"), MB_ICONWARNING); #endif return TRUE; } int CMultiLangCommandBarsApp::ExitInstance() { WriteProfileInt(_T("Settings"), _T("Current Language"), m_curLanguage); XTPResourceManager()->Close(); if (hRichEditDll) FreeLibrary(hRichEditDll); return CXTPWinApp::ExitInstance(); } ///////////////////////////////////////////////////////////////////////////// // CMultiLangCommandBarsApp commands BOOL CMultiLangCommandBarsApp::IsUnicodeAndLayoutSupported() { #ifdef _UNICODE return m_bIsWin2000OrLater; #else return FALSE; #endif } BOOL CMultiLangCommandBarsApp::SetLocale(LCID Locale, LPCTSTR szLocale, LPCTSTR szFileName, BOOL bIsRTL) { if (szFileName) { if (CXTPPropExchangeXMLNode::IsXMLSupported()) // Try to load from XML. Needs IE 4.0 // installed { CString strPath; VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, strPath.GetBufferSetLength(_MAX_PATH), _MAX_PATH)); strPath.ReleaseBuffer(); int nIndex = strPath.ReverseFind(_T('\\')); if (nIndex > 0) strPath = strPath.Left(nIndex + 1); else strPath.Empty(); strPath = strPath + _T("Translations\\") + szFileName + _T(".xml"); if (!XTPResourceManager()->SetResourceManager(new CXTPResourceManagerXML(strPath))) return FALSE; } else { CString strPath; VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, strPath.GetBufferSetLength(_MAX_PATH), _MAX_PATH)); strPath.ReleaseBuffer(); int nIndex = strPath.ReverseFind(_T('\\')); if (nIndex > 0) strPath = strPath.Left(nIndex + 1); else strPath.Empty(); strPath = strPath + _T("Translations\\") + szFileName + _T(".dll"); XTPResourceManager()->SetResourceManager(new CXTPResourceManager()); XTPResourceManager()->SetResourceFile(strPath); } } else { if (!XTPResourceManager()->SetResourceManager(new CXTPResourceManager())) return FALSE; } ::SetThreadLocale(MAKELCID(Locale, SORT_DEFAULT)); ::_tsetlocale(LC_ALL, szLocale); m_curLanguage = Locale; SetRTLLayout(bIsRTL); ReloadDefaultMenu(); return TRUE; } void CMultiLangCommandBarsApp::OnLanguageEnglish() { if (::IsValidLocale(LANGID_ENGLISH, LCID_INSTALLED)) { SetLocale(LANGID_ENGLISH, _T("English.1252"), NULL, FALSE); } else { AfxMessageBox(_T("English language support is not installed on your operating system.")); } } void CMultiLangCommandBarsApp::OnUpdateLanguageEnglish(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_curLanguage == LANGID_ENGLISH); } void CMultiLangCommandBarsApp::OnLanguageGerman() { if (::IsValidLocale(LANGID_GERMAN, LCID_INSTALLED)) { SetLocale(LANGID_GERMAN, _T("German.1252"), _T("MultiLangCommandBars.ResourceDe"), FALSE); } else { AfxMessageBox(_T("German language support is not installed on your operating system.")); } } void CMultiLangCommandBarsApp::OnUpdateLanguageGerman(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_curLanguage == LANGID_GERMAN); } void CMultiLangCommandBarsApp::OnLanguageJapanese() { if (::IsValidLocale(LANGID_JAPANESE, LCID_INSTALLED)) { SetLocale(LANGID_JAPANESE, _T("Japanese.932"), _T("MultiLangCommandBars.ResourceJa"), FALSE); } else { AfxMessageBox(_T("Japanese language support is not installed on your operating system.")); } } void CMultiLangCommandBarsApp::OnUpdateLanguageJapanese(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_curLanguage == LANGID_JAPANESE); pCmdUI->Enable((IsUnicodeAndLayoutSupported() && m_bIsWinNT) || (GetSystemDefaultLangID() == 0x411)); } void CMultiLangCommandBarsApp::OnLanguageArabic() { if (::IsValidLocale(LANGID_ARABIC, LCID_INSTALLED)) { SetLocale(LANGID_ARABIC, _T("Arabic.1256"), _T("MultiLangCommandBars.ResourceArSa"), TRUE); } else { AfxMessageBox(_T("Arabic language support is not installed on your operating system.")); } } void CMultiLangCommandBarsApp::OnUpdateLanguageArabic(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_curLanguage == LANGID_ARABIC); pCmdUI->Enable((IsUnicodeAndLayoutSupported() && m_bIsWinNT) || (GetSystemDefaultLangID() == 0x401)); } void CMultiLangCommandBarsApp::OnLanguageRussian() { if (::IsValidLocale(LANGID_RUSSIAN, LCID_INSTALLED)) { SetLocale(LANGID_RUSSIAN, _T("Russian"), _T("MultiLangCommandBars.ResourceRu"), FALSE); } else { AfxMessageBox(_T("Russian language support is not installed on your operating system.")); } } void CMultiLangCommandBarsApp::OnUpdateLanguageRussian(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_curLanguage == LANGID_RUSSIAN); pCmdUI->Enable(IsUnicodeAndLayoutSupported() || (GetSystemDefaultLangID() == 0x419)); } void CMultiLangCommandBarsApp::ReloadDefaultMenu() { CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, m_pMainWnd); if (pMainFrame) { pMainFrame->ResetCommandBars(); } } void SetRTLLayout(CWnd* pWnd, BOOL bRTLLayout) { pWnd->ModifyStyleEx(bRTLLayout ? 0 : WS_EX_LAYOUTRTL, !bRTLLayout ? 0 : WS_EX_LAYOUTRTL, SWP_FRAMECHANGED); // walk through HWNDs to avoid creating temporary CWnd objects // unless we need to call this function recursively for (CWnd* pChild = pWnd->GetWindow(GW_CHILD); pChild != NULL; pChild = pChild->GetWindow(GW_HWNDNEXT)) { // send to child windows after parent SetRTLLayout(pChild, bRTLLayout); } } void CMultiLangCommandBarsApp::SetRTLLayout(BOOL bRTLLayout) { if (!XTPSystemVersion()->IsWinNT4OrGreater()) return; if (m_bIsRTL == bRTLLayout) return; m_bIsRTL = bRTLLayout; if (m_pMainWnd) { ::SetRTLLayout(m_pMainWnd, bRTLLayout); // then update the state of all floating windows owned by the parent HWND hWnd = ::GetWindow(::GetDesktopWindow(), GW_CHILD); while (hWnd != NULL) { if (m_pMainWnd->m_hWnd == ::GetParent(hWnd)) ::SetRTLLayout(CWnd::FromHandle(hWnd), bRTLLayout); hWnd = ::GetWindow(hWnd, GW_HWNDNEXT); } } XTPImageManager()->DrawReverted(bRTLLayout); } void CMultiLangCommandBarsApp::OnFileNew() { CWinApp::OnFileNew(); } // App command to run the dialog void CMultiLangCommandBarsApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); }