| Attribute VB_Name = "modWizard" | |
| '************************************************************************* | |
| ' | |
| ' Licensed to the Apache Software Foundation (ASF) under one | |
| ' or more contributor license agreements. See the NOTICE file | |
| ' distributed with this work for additional information | |
| ' regarding copyright ownership. The ASF licenses this file | |
| ' to you under the Apache License, Version 2.0 (the | |
| ' "License"); you may not use this file except in compliance | |
| ' with the License. You may obtain a copy of the License at | |
| ' | |
| ' http://www.apache.org/licenses/LICENSE-2.0 | |
| ' | |
| ' Unless required by applicable law or agreed to in writing, | |
| ' software distributed under the License is distributed on an | |
| ' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| ' KIND, either express or implied. See the License for the | |
| ' specific language governing permissions and limitations | |
| ' under the License. | |
| ' | |
| '************************************************************************* | |
| Option Explicit | |
| Global Const WIZARD_NAME = "Analysis" | |
| 'Implementation details - not required for localisation | |
| Public Const CWORD_DRIVER_FILE = "_OOoDocAnalysisWordDriver.doc" | |
| Public Const CEXCEL_DRIVER_FILE = "_OOoDocAnalysisExcelDriver.xls" | |
| Public Const CPP_DRIVER_FILE = "_OOoDocAnalysisPPTDriver.ppt" | |
| Public Const CRESULTS_TEMPLATE_FILE = "results.xlt" | |
| Public Const CISSUES_LIST_FILE = "issues.list" | |
| Public Const CANALYSIS_INI_FILE = "analysis.ini" | |
| Public Const CLAUNCH_DRIVERS_EXE = "LaunchDrivers.exe" | |
| Public Const CMSO_KILL_EXE = "msokill.exe" | |
| Public Const CRESOURCE_DLL = "Resources.dll" | |
| ' Preparation String ID's from DocAnalysisWizard.rc | |
| Public Const RID_STR_ENG_TITLE_PREP_ID = 1030 | |
| Public Const RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID = 1074 | |
| Public Const RID_STR_ENG_INTRODUCTION_INTRO1_PREP_ID = 1131 | |
| Public Const RID_STR_ENG_INTRODUCTION_INTRO2_PREP_ID = 1132 | |
| Public Const RID_STR_ENG_INTRODUCTION_INTRO3_PREP_ID = 1134 | |
| Public Const RID_STR_ENG_DOCUMENTS_CHOOSE_DOCUMENTS_PREP_ID = 1230 | |
| Public Const RID_STR_ENG_DOCUMENTS_CHOOSE_DOC_TYPES_PREP_ID = 1236 | |
| Public Const RID_STR_ENG_DOCUMENTS_INCLUDE_SUBDIRECTORIES_PREP_ID = 1232 | |
| Public Const RID_STR_IGNORE_OLDER_CB_ID = 1231 | |
| Public Const RID_STR_IGNORE_OLDER_3_MONTHS_ID = 1233 | |
| Public Const RID_STR_IGNORE_OLDER_6_MONTHS_ID = 1234 | |
| Public Const RID_STR_IGNORE_OLDER_12_MONTHS_ID = 1235 | |
| Public Const RID_STR_ENG_RESULTS_CHOOSE_OPTIONS_PREP_ID = 1330 | |
| Public Const RID_STR_ENG_RESULTS_ANALYSIS_XLS_PREP_ID = 1332 | |
| Public Const RID_STR_ENG_ANALYZE_NUM_DOCS_PREP_ID = 1431 | |
| Public Const RID_STR_ENG_ANALYZE_SETUP_COMPLETE_PREP_ID = 1430 | |
| Public Const RID_STR_ENG_ANALYZE_IGNORED_DOCS_ID = 1435 | |
| Public Const RID_STR_ENG_ANALYZE_START_ID = 1413 | |
| Public Const RID_STR_ENG_ANALYZE_COMPLETED_ID = 1412 | |
| Public Const RID_STR_ENG_ANALYZE_VIEW_NOW_ID = 1414 | |
| Public Const RID_STR_ENG_ANALYZE_VIEW_LATER_ID = 1415 | |
| Public Const RID_STR_ENG_ANALYSE_NOT_RUN = 1416 | |
| Public Const RID_STR_ENG_OTHER_PLEASE_REFER_TO_README_PREP_ID = 1838 | |
| Public Const RID_STR_ENG_OTHER_XML_RESULTS_PREP_ID = 1845 | |
| Public Const RID_STR_ENG_OTHER_PREPARE_PROMPT_PREP_ID = 1846 | |
| Public Const RID_STR_ENG_OTHER_PREPARE_COMPLETED_PREP_ID = 1847 | |
| 'Resource Strings Codes | |
| ' NOTE: to make a resource the default it must be the first string table inserted | |
| ' in the resource table - if it is not, just create several new string tables and | |
| ' copy what you want as default into the first new one you create, copy the others | |
| ' then delete the originals. | |
| ' | |
| ' To provide same string table for all English variants or all German variants | |
| ' I have added code to set LANG_BASE_ID dependent on current locale | |
| ' Refer to p.414 VBA in a Nutshell, Lomax | |
| ' I now have a single string table with each lang variant suitably offset: | |
| ' New locale - increase ofsets by 1000 - refer to DocAnalysisWizard.rc | |
| ' | |
| ' English - eng - Start at 1000 | |
| ' German - ger - Start at 2000 | |
| ' BrazilianPortugese - por - Start at 4000 | |
| ' French - fre - Start at 5000 | |
| ' Italian - ita - Start at 6000 | |
| ' Spanish - spa - Start at 7000 | |
| ' Swedish - swe - Start at 8000 | |
| ' String ID's must match those in DocAnalysisWizard.rc | |
| Const LANG_BASE_ID = 1000 | |
| Const INTERNAL_RESOURCE_BASE_ID = LANG_BASE_ID + 800 | |
| ' Setup Doc Preparation specific strings | |
| #If PREPARATION Then | |
| Global Const gBoolPreparation = True | |
| Public Const TITLE_ID = RID_STR_ENG_TITLE_PREP_ID | |
| Public Const CHK_SUBDIRS_ID = RID_STR_ENG_DOCUMENTS_INCLUDE_SUBDIRECTORIES_PREP_ID | |
| Public Const SETUP_ANALYSIS_XLS_ID = RID_STR_ENG_RESULTS_ANALYSIS_XLS_PREP_ID | |
| Public Const ANALYZE_TOTAL_NUM_DOCS_ID = RID_STR_ENG_ANALYZE_NUM_DOCS_PREP_ID | |
| Public Const XML_RESULTS_ID = RID_STR_ENG_OTHER_XML_RESULTS_PREP_ID | |
| #Else | |
| Global Const gBoolPreparation = False | |
| Public Const TITLE_ID = LANG_BASE_ID + 0 | |
| Public Const CHK_SUBDIRS_ID = LANG_BASE_ID + 202 | |
| Public Const SETUP_ANALYSIS_XLS_ID = LANG_BASE_ID + 302 | |
| Public Const ANALYZE_TOTAL_NUM_DOCS_ID = LANG_BASE_ID + 401 | |
| Public Const XML_RESULTS_ID = INTERNAL_RESOURCE_BASE_ID + 15 | |
| #End If | |
| Public Const PRODUCTNAME_ID = LANG_BASE_ID + 1 | |
| Public Const LBL_STEPS_ID = LANG_BASE_ID + 40 | |
| Public Const INTRO1_ID = LANG_BASE_ID + 101 | |
| Public Const ANALYZE_DOCUMENTS_ID = LANG_BASE_ID + 402 | |
| Public Const ANALYZE_TEMPLATES_ID = LANG_BASE_ID + 403 | |
| Public Const ANALYZE_DOCUMENTS_XLS_ID = LANG_BASE_ID + 408 | |
| Public Const ANALYZE_DOCUMENTS_PPT_ID = LANG_BASE_ID + 409 | |
| Public Const RUNBTN_START_ID = LANG_BASE_ID + 404 | |
| Public Const PREPAREBTN_START_ID = LANG_BASE_ID + 411 | |
| Public Const README_FILE_ID = INTERNAL_RESOURCE_BASE_ID + 5 'Readme.doc | |
| Public Const BROWSE_FOR_DOC_DIR_ID = INTERNAL_RESOURCE_BASE_ID + 6 | |
| Public Const BROWSE_FOR_RES_DIR_ID = INTERNAL_RESOURCE_BASE_ID + 7 | |
| Public Const RUNBTN_RUNNING_ID = INTERNAL_RESOURCE_BASE_ID + 10 | |
| Public Const PROGRESS_CAPTION = INTERNAL_RESOURCE_BASE_ID + 20 | |
| Public Const PROGRESS_ABORTING = INTERNAL_RESOURCE_BASE_ID + 21 | |
| Public Const PROGRESS_PATH_LABEL = INTERNAL_RESOURCE_BASE_ID + 22 | |
| Public Const PROGRESS_FILE_LABEL = INTERNAL_RESOURCE_BASE_ID + 23 | |
| Public Const PROGRESS_INFO_LABEL = INTERNAL_RESOURCE_BASE_ID + 24 | |
| Public Const PROGRESS_WAIT_LABEL = INTERNAL_RESOURCE_BASE_ID + 25 | |
| Public Const SEARCH_PATH_LABEL = PROGRESS_PATH_LABEL | |
| Public Const SEARCH_CAPTION = INTERNAL_RESOURCE_BASE_ID + 26 | |
| Public Const SEARCH_INFO_LABEL = INTERNAL_RESOURCE_BASE_ID + 27 | |
| Public Const SEARCH_FOUND_LABEL = INTERNAL_RESOURCE_BASE_ID + 28 | |
| Public Const TERMINATE_CAPTION = INTERNAL_RESOURCE_BASE_ID + 30 | |
| Public Const TERMINATE_INFO = INTERNAL_RESOURCE_BASE_ID + 31 | |
| Public Const TERMINATE_YES = INTERNAL_RESOURCE_BASE_ID + 32 | |
| Public Const TERMINATE_NO = INTERNAL_RESOURCE_BASE_ID + 33 | |
| 'Error Resource Strings Codes | |
| Const ERROR_BASE_ID = LANG_BASE_ID + 900 | |
| Public Const ERR_MISSING_RESULTS_DOC = ERROR_BASE_ID + 0 | |
| Public Const ERR_NO_DOC_DIR = ERROR_BASE_ID + 1 | |
| Public Const ERR_NO_DOC_TYPES = ERROR_BASE_ID + 2 | |
| Public Const ERR_NO_RES_DIR = ERROR_BASE_ID + 3 | |
| Public Const ERR_CREATE_DIR = ERROR_BASE_ID + 4 | |
| Public Const ERR_MISSING_RESULTS_TEMPLATE = ERROR_BASE_ID + 5 | |
| Public Const ERR_MISSING_EXCEL_DRIVER = ERROR_BASE_ID + 6 | |
| Public Const ERR_EXCEL_DRIVER_CRASH = ERROR_BASE_ID + 7 | |
| Public Const ERR_MISSING_WORD_DRIVER = ERROR_BASE_ID + 8 | |
| Public Const ERR_WORD_DRIVER_CRASH = ERROR_BASE_ID + 9 | |
| Public Const ERR_MISSING_README = ERROR_BASE_ID + 10 | |
| Public Const ERR_MISSING_PP_DRIVER = ERROR_BASE_ID + 11 | |
| Public Const ERR_PP_DRIVER_CRASH = ERROR_BASE_ID + 12 | |
| Public Const ERR_SUPPORTED_VERSION = ERROR_BASE_ID + 13 | |
| Public Const ERR_ISSUES_VERSION_MISMATCH = ERROR_BASE_ID + 14 | |
| Public Const ERR_ISSUES_LIST_MISSING = ERROR_BASE_ID + 15 | |
| Public Const ERR_SUPPORTED_OSVERSION = ERROR_BASE_ID + 16 | |
| Public Const ERR_OPEN_RESULTS_SPREADSHEET = ERROR_BASE_ID + 17 | |
| Public Const ERR_EXCEL_OPEN = ERROR_BASE_ID + 18 | |
| Public Const ERR_NO_ACCESS_TO_VBPROJECT = ERROR_BASE_ID + 19 | |
| Public Const ERR_AUTOMATION_FAILURE = ERROR_BASE_ID + 20 | |
| Public Const ERR_NO_RESULTS_DIRECTORY = ERROR_BASE_ID + 21 | |
| Public Const ERR_CREATE_FILE = ERROR_BASE_ID + 22 | |
| Public Const ERR_XML_RESULTS_ONLY = ERROR_BASE_ID + 23 | |
| Public Const ERR_NOT_INSTALLED = ERROR_BASE_ID + 24 | |
| Public Const ERR_CDROM_NOT_ALLOWED = ERROR_BASE_ID + 25 | |
| Public Const ERR_CDROM_NOT_READY = ERROR_BASE_ID + 26 | |
| Public Const ERR_NO_WRITE_TO_READ_ONLY_FOLDER = ERROR_BASE_ID + 27 | |
| Public Const ERR_APPLICATION_IN_USE = ERROR_BASE_ID + 28 | |
| Public Const ERR_MISSING_IMPORTANT_FILE = ERROR_BASE_ID + 29 | |
| Private Const LOCALE_ILANGUAGE As Long = &H1 'language id | |
| Private Const LOCALE_SLANGUAGE As Long = &H2 'localized name of language | |
| Private Const LOCALE_SENGLANGUAGE As Long = &H1001 'English name of language | |
| Private Const LOCALE_SABBREVLANGNAME As Long = &H3 'abbreviated language name | |
| Private Const LOCALE_SCOUNTRY As Long = &H6 'localized name of country | |
| Private Const LOCALE_SENGCOUNTRY As Long = &H1002 'English name of country | |
| Private Const LOCALE_SABBREVCTRYNAME As Long = &H7 'abbreviated country name | |
| Private Const LOCALE_SISO639LANGNAME As Long = &H59 'ISO abbreviated language name | |
| Private Const LOCALE_SISO3166CTRYNAME As Long = &H5A 'ISO abbreviated country name | |
| Private Const LOCALE_JAPAN As Long = &H411 | |
| Private Const LOCALE_KOREA As Long = &H412 | |
| Private Const LOCALE_ZH_CN As Long = &H404 | |
| Private Const LOCALE_ZH_TW As Long = &H804 | |
| Private Const RES_PREFIX = ".\Resources\Resources.dll" | |
| Declare Function GetLocaleInfo Lib "kernel32" Alias _ | |
| "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, _ | |
| ByVal cchData As Long) As Long | |
| Declare Function WritePrivateProfileString& Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal fileName$) | |
| Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long | |
| Private Declare Function LoadString Lib "user32" Alias "LoadStringA" _ | |
| (ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As String, _ | |
| ByVal nBufferMax As Long) As Long | |
| 'WinHelp Commands | |
| 'Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hWnd As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData As Long) As Long | |
| 'Public Const HELP_QUIT = &H2 ' Terminate help | |
| 'Public Const HELP_CONTENTS = &H3& ' Display index/contents | |
| 'Public Const HELP_CONTEXT = &H1 ' Display topic in ulTopic | |
| 'Public Const HELP_INDEX = &H3 ' Display index | |
| Public Const CBASE_RESOURCE_DIR = ".\resources" | |
| Private mStrTrue As String | |
| Private mLocaleDir As String | |
| Private ghInst As Long | |
| Function getLocaleDir() As String | |
| If mLocaleDir = "" Then | |
| getLocaleLangBaseIDandSetLocaleDir | |
| End If | |
| getLocaleDir = mLocaleDir | |
| End Function | |
| Public Function GetLocaleLanguage() As String | |
| Dim lReturn As Long | |
| Dim lLocID As Long | |
| Dim sData As String | |
| Dim lDataLen As Long | |
| lDataLen = 0 | |
| lReturn = GetLocaleInfo(lLocID, LOCALE_SENGLANGUAGE, sData, lDataLen) | |
| sData = String(lReturn, 0) & vbNullChar | |
| lDataLen = lReturn | |
| lReturn = GetLocaleInfo(lLocID, LOCALE_SENGLANGUAGE, sData, lDataLen) | |
| End Function | |
| Function getLocaleLangBaseIDandSetLocaleDir() As Integer | |
| On Error GoTo HandleErrors | |
| Dim currentFunctionName As String | |
| currentFunctionName = "getLocaleLangBaseIDandSetLocaleDir" | |
| Dim baseID As Long | |
| Dim bUseLocale As Boolean | |
| Dim fso As FileSystemObject | |
| Set fso = New FileSystemObject | |
| Dim isoLangStr As String | |
| Dim isoCountryStr As String | |
| Dim langStr As String | |
| Dim userLCID As Long | |
| userLCID = GetUserDefaultLCID() | |
| Dim sysLCID As Long | |
| sysLCID = GetSystemDefaultLCID() | |
| isoLangStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO639LANGNAME) | |
| isoCountryStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO3166CTRYNAME) | |
| langStr = GetUserLocaleInfo(sysLCID, LOCALE_SENGLANGUAGE) | |
| baseID = 0 | |
| mLocaleDir = "" | |
| If fso.FileExists(fso.GetAbsolutePathName("debug.ini")) Then | |
| Dim overrideLangStr As String | |
| overrideLangStr = ProfileGetItem("debug", "langoverride", "", fso.GetAbsolutePathName("debug.ini")) | |
| If overrideLangStr <> "" Then | |
| Debug.Print "Overriding language " & isoLangStr & " with " & overrideLangStr & "\n" | |
| isoLangStr = overrideLangStr | |
| End If | |
| End If | |
| 'check for locale dirs in following order: | |
| ' CBASE_RESOURCE_DIR & "\" & isoLangStr | |
| ' CBASE_RESOURCE_DIR & "\" & isoLangStr & "-" & isoCountryStr | |
| ' CBASE_RESOURCE_DIR & "\" & "eng" | |
| 'If fso.FolderExists(fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & isoLangStr)) Then | |
| ' mLocaleDir = CBASE_RESOURCE_DIR & "\" & isoLangStr | |
| ' baseID = getBaseID(isoLangStr) | |
| 'ElseIf fso.FolderExists(fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & isoLangStr & "-" & isoCountryStr)) Then | |
| ' mLocaleDir = CBASE_RESOURCE_DIR & "\" & isoLangStr & "-" & isoCountryStr | |
| ' baseID = getBaseID(isoLangStr & "-" & isoCountryStr) | |
| 'Else | |
| mLocaleDir = CBASE_RESOURCE_DIR | |
| baseID = 1000 | |
| 'End If | |
| getLocaleLangBaseIDandSetLocaleDir = CInt(baseID) | |
| FinalExit: | |
| Set fso = Nothing | |
| Exit Function | |
| HandleErrors: | |
| Debug.Print currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source | |
| Resume FinalExit | |
| End Function | |
| '-------------------------------------------------------------------------- | |
| 'this sub must be executed from the immediate window | |
| 'it will add the entry to VBADDIN.INI if it doesn't already exist | |
| 'so that the add-in is on available next time VB is loaded | |
| '-------------------------------------------------------------------------- | |
| Sub AddToINI() | |
| Debug.Print WritePrivateProfileString("Add-Ins32", WIZARD_NAME & ".Wizard", "0", "VBADDIN.INI") | |
| End Sub | |
| Function GetResString(nRes As Integer) As String | |
| Dim sTmp As String | |
| Dim sRes As String * 1024 | |
| Dim sRetStr As String | |
| Dim nRet As Long | |
| Do | |
| 'sTmp = LoadResString(nRes) | |
| nRet = LoadString(ghInst, nRes, sRes, 1024) | |
| sTmp = Left$(sRes, nRet) | |
| If Right(sTmp, 1) = "_" Then | |
| sRetStr = sRetStr + VBA.Left(sTmp, Len(sTmp) - 1) | |
| Else | |
| sRetStr = sRetStr + sTmp | |
| End If | |
| nRes = nRes + 1 | |
| Loop Until Right(sTmp, 1) <> "_" | |
| GetResString = sRetStr | |
| End Function | |
| Function GetField(sBuffer As String, sSep As String) As String | |
| Dim p As Integer | |
| p = InStr(sBuffer & sSep, sSep) | |
| GetField = VBA.Left(sBuffer, p - 1) | |
| sBuffer = Mid(sBuffer, p + Len(sSep)) | |
| End Function | |
| ' Parts of the following code are from: | |
| ' http://support.microsoft.com/default.aspx?scid=kb;en-us;232625&Product=vb6 | |
| Private Function GetCharSet(sCdpg As String) As Integer | |
| Select Case sCdpg | |
| Case "932" ' Japanese | |
| GetCharSet = 128 | |
| Case "936" ' Simplified Chinese | |
| GetCharSet = 134 | |
| Case "949" ' Korean | |
| GetCharSet = 129 | |
| Case "950" ' Traditional Chinese | |
| GetCharSet = 136 | |
| Case "1250" ' Eastern Europe | |
| GetCharSet = 238 | |
| Case "1251" ' Russian | |
| GetCharSet = 204 | |
| Case "1252" ' Western European Languages | |
| GetCharSet = 0 | |
| Case "1253" ' Greek | |
| GetCharSet = 161 | |
| Case "1254" ' Turkish | |
| GetCharSet = 162 | |
| Case "1255" ' Hebrew | |
| GetCharSet = 177 | |
| Case "1256" ' Arabic | |
| GetCharSet = 178 | |
| Case "1257" ' Baltic | |
| GetCharSet = 186 | |
| Case Else | |
| GetCharSet = 0 | |
| End Select | |
| End Function | |
| Private Function StripNullTerminator(sCP As String) | |
| Dim posNull As Long | |
| posNull = InStr(sCP, Chr$(0)) | |
| StripNullTerminator = Left$(sCP, posNull - 1) | |
| End Function | |
| Private Function GetResourceDataFileName() As String | |
| On Error GoTo HandleErrors | |
| Dim currentFunctionName As String | |
| currentFunctionName = "GetResourceDataFileName" | |
| Dim fileName As String | |
| Dim fso As FileSystemObject | |
| Set fso = New FileSystemObject | |
| GetResourceDataFileName = fso.GetAbsolutePathName(RES_PREFIX) | |
| GoTo FinalExit | |
| ' use the following code when we have one resource file for each language | |
| Dim isoLangStr As String | |
| Dim isoCountryStr As String | |
| Dim userLCID As Long | |
| userLCID = GetUserDefaultLangID() | |
| Dim sysLCID As Long | |
| sysLCID = GetSystemDefaultLangID() | |
| isoLangStr = GetUserLocaleInfo(userLCID, LOCALE_SISO639LANGNAME) | |
| isoCountryStr = GetUserLocaleInfo(userLCID, LOCALE_SISO3166CTRYNAME) | |
| 'check for locale data in following order: | |
| ' user language | |
| ' isoLangStr & "_" & isoCountryStr & ".dll" | |
| ' isoLangStr & ".dll" | |
| ' system language | |
| ' isoLangStr & "_" & isoCountryStr & ".dll" | |
| ' isoLangStr & ".dll" | |
| ' "en_US" & ".dll" | |
| fileName = fso.GetAbsolutePathName(RES_PREFIX & isoLangStr & "-" & isoCountryStr & ".dll") | |
| If fso.FileExists(fileName) Then | |
| GetResourceDataFileName = fileName | |
| Else | |
| fileName = fso.GetAbsolutePathName(RES_PREFIX & isoLangStr & ".dll") | |
| If fso.FileExists(fileName) Then | |
| GetResourceDataFileName = fileName | |
| Else | |
| isoLangStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO639LANGNAME) | |
| isoCountryStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO3166CTRYNAME) | |
| fileName = fso.GetAbsolutePathName(RES_PREFIX & isoLangStr & "-" & isoCountryStr & ".dll") | |
| If fso.FileExists(fileName) Then | |
| GetResourceDataFileName = fileName | |
| Else | |
| fileName = fso.GetAbsolutePathName(RES_PREFIX & isoLangStr & ".dll") | |
| If fso.FileExists(fileName) Then | |
| GetResourceDataFileName = fileName | |
| Else | |
| GetResourceDataFileName = fso.GetAbsolutePathName(RES_PREFIX & "en-US.dll") | |
| End If | |
| End If | |
| End If | |
| End If | |
| FinalExit: | |
| Set fso = Nothing | |
| Exit Function | |
| HandleErrors: | |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source | |
| Resume FinalExit | |
| End Function | |
| Sub LoadResStrings(frm As Form) | |
| Dim ctl As Control | |
| Dim obj As Object | |
| Dim LCID As Long, X As Long | |
| Dim sCodePage As String | |
| Dim nCharSet As Integer | |
| Dim currentFunctionName As String | |
| currentFunctionName = "LoadResStrings" | |
| On Error GoTo HandleErrors | |
| ghInst = LoadLibrary(GetResourceDataFileName()) | |
| On Error Resume Next | |
| sCodePage = String$(16, " ") | |
| LCID = GetThreadLocale() 'Get Current locale | |
| X = GetLocaleInfo(LCID, LOCALE_IDEFAULTANSICODEPAGE, _ | |
| sCodePage, Len(sCodePage)) 'Get code page | |
| sCodePage = StripNullTerminator(sCodePage) | |
| nCharSet = GetCharSet(sCodePage) 'Convert code page to charset | |
| 'set the form's caption | |
| If IsNumeric(frm.Tag) Then | |
| frm.Caption = LoadResString(CInt(frm.Tag)) | |
| End If | |
| 'set the controls' captions using the caption | |
| 'property for menu items and the Tag property | |
| 'for all other controls | |
| For Each ctl In frm.Controls | |
| Err = 0 | |
| If (nCharSet <> 0) Then | |
| ctl.Font.Charset = nCharSet | |
| End If | |
| If TypeName(ctl) = "Menu" Then | |
| If IsNumeric(ctl.Caption) Then | |
| ctl.Caption = LoadResString(CInt(ctl.Caption)) | |
| End If | |
| ElseIf TypeName(ctl) = "TabStrip" Then | |
| For Each obj In ctl.Tabs | |
| If IsNumeric(obj.Tag) Then | |
| obj.Caption = LoadResString(CInt(obj.Tag)) | |
| End If | |
| 'check for a tooltip | |
| If IsNumeric(obj.ToolTipText) Then | |
| If Err = 0 Then | |
| obj.ToolTipText = LoadResString(CInt(obj.ToolTipText)) | |
| End If | |
| End If | |
| Next | |
| ElseIf TypeName(ctl) = "Toolbar" Then | |
| For Each obj In ctl.Buttons | |
| If IsNumeric(obj.Tag) Then | |
| obj.ToolTipText = LoadResString(CInt(obj.Tag)) | |
| End If | |
| Next | |
| ElseIf TypeName(ctl) = "ListView" Then | |
| For Each obj In ctl.ColumnHeaders | |
| If IsNumeric(obj.Tag) Then | |
| obj.Text = LoadResString(CInt(obj.Tag)) | |
| End If | |
| Next | |
| ElseIf TypeName(ctl) = "TextBox" Then | |
| If IsNumeric(ctl.Tag) Then | |
| ctl.Text = LoadResString(CInt(ctl.Tag)) | |
| End If | |
| Else | |
| If IsNumeric(ctl.Tag) Then | |
| ctl.Caption = GetResString(CInt(ctl.Tag)) | |
| End If | |
| 'check for a tooltip | |
| If IsNumeric(ctl.ToolTipText) Then | |
| If Err = 0 Then | |
| ctl.ToolTipText = LoadResString(CInt(ctl.ToolTipText)) | |
| End If | |
| End If | |
| End If | |
| Next | |
| FinalExit: | |
| Exit Sub | |
| HandleErrors: | |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source | |
| Resume FinalExit | |
| End Sub | |
| '================================================== | |
| 'Purpose: Replace the sToken string(s) in | |
| ' res file string for correct placement | |
| ' of localized tokens | |
| ' | |
| 'Inputs: sString = String to search and replace in | |
| ' sToken = token to replace | |
| ' sReplacement = String to replace token with | |
| ' | |
| 'Outputs: New string with token replaced throughout | |
| '================================================== | |
| Function ReplaceTopicTokens(sString As String, _ | |
| sToken As String, _ | |
| sReplacement As String) As String | |
| On Error Resume Next | |
| Dim p As Integer | |
| Dim sTmp As String | |
| sTmp = sString | |
| Do | |
| p = InStr(sTmp, sToken) | |
| If p Then | |
| sTmp = VBA.Left(sTmp, p - 1) + sReplacement + Mid(sTmp, p + Len(sToken)) | |
| End If | |
| Loop While p | |
| ReplaceTopicTokens = sTmp | |
| End Function | |
| '================================================== | |
| 'Purpose: Replace the sToken1 and sToken2 strings in | |
| ' res file string for correct placement | |
| ' of localized tokens | |
| ' | |
| 'Inputs: sString = String to search and replace in | |
| ' sToken1 = 1st token to replace | |
| ' sReplacement1 = 1st String to replace token with | |
| ' sToken2 = 2nd token to replace | |
| ' sReplacement2 = 2nd String to replace token with | |
| ' | |
| 'Outputs: New string with token replaced throughout | |
| '================================================== | |
| Function ReplaceTopic2Tokens(sString As String, _ | |
| sToken1 As String, _ | |
| sReplacement1 As String, _ | |
| sToken2 As String, _ | |
| sReplacement2 As String) As String | |
| On Error Resume Next | |
| ReplaceTopic2Tokens = _ | |
| ReplaceTopicTokens(ReplaceTopicTokens(sString, sToken1, sReplacement1), _ | |
| sToken2, sReplacement2) | |
| End Function | |
| Public Function GetResData(sResName As String, sResType As String) As String | |
| Dim sTemp As String | |
| Dim p As Integer | |
| sTemp = StrConv(LoadResData(sResName, sResType), vbUnicode) | |
| p = InStr(sTemp, vbNullChar) | |
| If p Then sTemp = VBA.Left$(sTemp, p - 1) | |
| GetResData = sTemp | |
| End Function | |
| Function AddToAddInCommandBar(VBInst As Object, sCaption As String, oBitmap As Object) As Object 'Office.CommandBarControl | |
| On Error GoTo AddToAddInCommandBarErr | |
| Dim c As Integer | |
| Dim cbMenuCommandBar As Object 'Office.CommandBarControl 'command bar object | |
| Dim cbMenu As Object | |
| 'see if we can find the Add-Ins menu | |
| Set cbMenu = VBInst.CommandBars("Add-Ins") | |
| If cbMenu Is Nothing Then | |
| 'not available so we fail | |
| Exit Function | |
| End If | |
| 'add it to the command bar | |
| Set cbMenuCommandBar = cbMenu.Controls.add(1) | |
| c = cbMenu.Controls.count - 1 | |
| If cbMenu.Controls(c).BeginGroup And _ | |
| Not cbMenu.Controls(c - 1).BeginGroup Then | |
| 'this s the first addin being added so it needs a separator | |
| cbMenuCommandBar.BeginGroup = True | |
| End If | |
| 'set the caption | |
| cbMenuCommandBar.Caption = sCaption | |
| 'undone:set the onaction (required at this point) | |
| cbMenuCommandBar.OnAction = "hello" | |
| 'copy the icon to the clipboard | |
| Clipboard.SetData oBitmap | |
| 'set the icon for the button | |
| cbMenuCommandBar.PasteFace | |
| Set AddToAddInCommandBar = cbMenuCommandBar | |
| Exit Function | |
| AddToAddInCommandBarErr: | |
| End Function | |