OSDN Git Service

heksedit - UI translation continued
authorJochen Tucht <jtuc@users.sourceforge.net>
Tue, 2 Sep 2008 12:03:37 +0000 (12:03 +0000)
committerJochen Tucht <jtuc@users.sourceforge.net>
Tue, 2 Sep 2008 12:03:37 +0000 (12:03 +0000)
26 files changed:
Externals/heksedit/ChooseDiffDlg.cpp
Externals/heksedit/LangArray.cpp
Externals/heksedit/LangArray.h
Externals/heksedit/ReplaceDlg.cpp
Externals/heksedit/StringTable.cpp [new file with mode: 0644]
Externals/heksedit/StringTable.h [new file with mode: 0644]
Externals/heksedit/ViewSettingsDlg.cpp [new file with mode: 0644]
Externals/heksedit/dllmain.cpp
Externals/heksedit/frhed.vcproj
Externals/heksedit/heksedit.dsp
Externals/heksedit/heksedit.h
Externals/heksedit/heksedit.rc
Externals/heksedit/heksedit.vcproj
Externals/heksedit/hexwdlg.cpp
Externals/heksedit/hexwdlg.h
Externals/heksedit/hexwnd.cpp
Externals/heksedit/hexwnd.h
Externals/heksedit/ido.cpp
Externals/heksedit/ido.h
Externals/heksedit/ids.cpp
Externals/heksedit/ids.h
Externals/heksedit/main.cpp
Externals/heksedit/resource.h
Externals/heksedit/toolbar.cpp
Externals/heksedit/version.h
Externals/heksedit/version.rc

index 79c7f52..70ed32a 100644 (file)
@@ -1,17 +1,32 @@
 #include "precomp.h"\r
 #include "resource.h"\r
+#include "StringTable.h"\r
 #include "clipboard.h"\r
 #include "hexwnd.h"\r
 #include "hexwdlg.h"\r
 \r
 void ChooseDiffDlg::add_diff(HWND hwndList, int diff, int lower, int upper)\r
 {\r
-       char buf[100];\r
-       sprintf(buf, "%d) 0x%x=%n%d to 0x%x=%n%d (%d bytes)", diff,\r
+       wchar_t buf[100];\r
+       swprintf(buf,\r
+               S.DiffListItemFormat, //"%d) 0x%x=%n%d to 0x%x=%n%d (%d bytes)",\r
+               diff,\r
                lower, &lower, lower,\r
                upper, &upper, upper,\r
                upper - lower + 1);\r
-       int i = SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)buf);\r
+       int i;\r
+       if (IsWindowUnicode(hwndList))\r
+       {\r
+               i = SendMessageW(hwndList, LB_ADDSTRING, 0, (LPARAM)buf);\r
+       }\r
+       else\r
+       {\r
+               char bufA[100];\r
+               WideCharToMultiByte(CP_ACP, 0, buf, -1, bufA, sizeof bufA, 0, 0);\r
+               lower = WideCharToMultiByte(CP_ACP, 0, buf, lower, 0, 0, 0, 0);\r
+               upper = WideCharToMultiByte(CP_ACP, 0, buf, upper, 0, 0, 0, 0);\r
+               i = SendMessageA(hwndList, LB_ADDSTRING, 0, (LPARAM)bufA);\r
+       }\r
        SendMessage(hwndList, LB_SETITEMDATA, i, MAKELONG(lower, upper));\r
 }\r
 \r
@@ -119,6 +134,93 @@ BOOL ChooseDiffDlg::OnInitDialog(HWND hDlg)
        return bDone;\r
 }\r
 \r
+BOOL ChooseDiffDlg::OnCommand(HWND hDlg, WPARAM wParam, LPARAM)\r
+{\r
+       switch (wParam)\r
+       {\r
+       // By pabs.\r
+       case IDCOPY:\r
+               {//copy button was pressed\r
+                       if (!OpenClipboard(hwnd)) //open clip\r
+                       {\r
+                               MessageBox(hwnd,"Cannot get access to clipboard.", "Copy", MB_ICONERROR);\r
+                               return TRUE;\r
+                       }\r
+                       EmptyClipboard(); //empty clip\r
+                       IStream *piStream = 0;\r
+                       if (SUCCEEDED(CreateStreamOnHGlobal(0, FALSE, &piStream)))\r
+                       {\r
+                               HWND hwndList = GetDlgItem(hDlg, IDC_LIST1);//get the list\r
+                               CLIPFORMAT cf = IsWindowUnicode(hwndList) ? CF_UNICODETEXT : CF_TEXT;\r
+                               int num = SendMessage(hwndList, LB_GETCOUNT, 0, 0);//get the # items in the list\r
+                               for (int i = 0 ; i < num ; i++)\r
+                               {\r
+                                       //add '\r\n' to the end of each line - this is '\r\n' rather than '\n' so that it can be pasted into notepad & dos programs\r
+                                       if (cf == CF_UNICODETEXT)\r
+                                       {\r
+                                               wchar_t buf[100];\r
+                                               int cch = SendMessageW(hwndList, LB_GETTEXT, i, (LPARAM)buf);\r
+                                               piStream->Write(buf, cch * sizeof *buf, 0);\r
+                                               static const wchar_t eol[] = L"\r\n";\r
+                                               piStream->Write(eol, i < num ? sizeof eol - sizeof *eol : sizeof eol, 0);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               char buf[100];\r
+                                               int cch = SendMessageA(hwndList, LB_GETTEXT, i, (LPARAM)buf);\r
+                                               piStream->Write(buf, cch * sizeof *buf, 0);\r
+                                               static const char eol[] = "\r\n";\r
+                                               piStream->Write(eol, i < num ? sizeof eol - sizeof *eol : sizeof eol, 0);\r
+                                       }\r
+                               }\r
+                               HGLOBAL hMem = 0;\r
+                               if (SUCCEEDED(GetHGlobalFromStream(piStream, &hMem)))\r
+                               {\r
+                                       SetClipboardData(cf, hMem); //copy to clip\r
+                               }\r
+                               piStream->Release();\r
+                       }\r
+                       CloseClipboard(); //close clip\r
+               }\r
+               return TRUE;\r
+\r
+       case IDOK:\r
+               {\r
+                       HWND hwndList = GetDlgItem(hDlg, IDC_LIST1);\r
+                       int i = SendMessage(hwndList, LB_GETCURSEL, 0, 0);\r
+                       if (i != -1)\r
+                       {\r
+                               DWORD dw = SendMessage(hwndList, LB_GETITEMDATA, i, 0);\r
+                               if (IsWindowUnicode(hwndList))\r
+                               {\r
+                                       wchar_t buf[100];\r
+                                       SendMessageW(hwndList, LB_GETTEXT, i, (LPARAM)buf);\r
+                                       iStartOfSelection = StrToIntW(buf + LOWORD(dw));\r
+                                       iEndOfSelection = StrToIntW(buf + HIWORD(dw));\r
+                               }\r
+                               else\r
+                               {\r
+                                       char buf[100];\r
+                                       SendMessageA(hwndList, LB_GETTEXT, i, (LPARAM)buf);\r
+                                       iStartOfSelection = StrToIntA(buf + LOWORD(dw));\r
+                                       iEndOfSelection = StrToIntA(buf + HIWORD(dw));\r
+                               }\r
+                               iStartOfSelection += iCurByte;\r
+                               iEndOfSelection += iCurByte;\r
+                               iCurByte = iStartOfSelection;\r
+                               bSelected = TRUE;\r
+                               adjust_view_for_selection();\r
+                               repaint();\r
+                       }\r
+               }\r
+               // fall through\r
+       case IDCANCEL:\r
+               EndDialog(hDlg, wParam);\r
+               return TRUE;\r
+       }\r
+       return FALSE;\r
+}\r
+\r
 //-------------------------------------------------------------------\r
 INT_PTR ChooseDiffDlg::DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
 {\r
@@ -129,60 +231,7 @@ INT_PTR ChooseDiffDlg::DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lPara
                        EndDialog(hDlg, IDCANCEL);\r
                return TRUE;\r
        case WM_COMMAND:\r
-               switch (wParam)\r
-               {\r
-                       // By pabs.\r
-                       case IDCOPY:\r
-                               {//copy button was pressed\r
-                                       int sumlen=1;//length of buffer initially is 1 for the '\0'\r
-                                       int len=0;//length of current string\r
-                                       char*buf=(char*)malloc(1);//buffer = '\0'\r
-                                       buf[0]=0;//init buffer with '\0'\r
-                                       char*bt=NULL;//temporary pointer - used so that if realloc returns NULL buf does not lose its value\r
-                                       HWND hwndList = GetDlgItem (hDlg, IDC_LIST1);//get the list\r
-                                       int num = SendMessage(hwndList,LB_GETCOUNT,0,0);//get the # items in the list\r
-                                       for(int i=0;i<num;i++)\r
-                                       {       //loop num times\r
-                                               len=SendMessage(hwndList,LB_GETTEXTLEN,i,0)+2;//get sise of next line +2 is for '\r\n' at the end of each line\r
-                                               sumlen+=len;//add len to the buffer sise\r
-                                               bt = (char*)realloc(buf,sumlen);//resise buffer\r
-                                               if (bt == NULL)//not enough mem to re-alloc buffer\r
-                                                       break;//exit loop without changing buffer address\r
-                                               buf = bt;//realloc succesful overwrite buffer address\r
-                                               // the -1 is to counteract the initialisation of sumlen\r
-                                               SendMessage(hwndList,LB_GETTEXT,i,(LPARAM)&buf[sumlen-len-1]);//get the string & add it to the end of the buffer\r
-                                               strcat(buf,"\r\n");//add '\r\n' to the end of the line - this is '\r\n' rather than '\n' so that it can be pasted into notepad & dos programs\r
-                                       }//end of the loop\r
-                                       TextToClipboard(hwnd, buf);//copy the stuff to the clip ( this function needs work to clean it up )(len=1+strlen)\r
-                                       free(buf);//free the buffer mem\r
-                                       return TRUE;//yes we did process the message\r
-                               }\r
-                               break;\r
-\r
-\r
-               case IDOK:\r
-                       {\r
-                               TCHAR buf[100];\r
-                               HWND hwndList = GetDlgItem(hDlg, IDC_LIST1);\r
-                               int i = SendMessage(hwndList, LB_GETCURSEL, 0, 0);\r
-                               if (i != -1)\r
-                               {\r
-                                       SendMessage(hwndList, LB_GETTEXT, i, (LPARAM)buf);\r
-                                       DWORD dw = SendMessage(hwndList, LB_GETITEMDATA, i, 0);\r
-                                       iStartOfSelection = iCurByte + StrToInt(buf + LOWORD(dw));\r
-                                       iEndOfSelection = iCurByte + StrToInt(buf + HIWORD(dw));\r
-                                       iCurByte = iStartOfSelection;\r
-                                       bSelected = TRUE;\r
-                                       adjust_view_for_selection();\r
-                                       repaint();\r
-                               }\r
-                       }\r
-                       // fall through\r
-               case IDCANCEL:\r
-                       EndDialog(hDlg, wParam);\r
-                       return TRUE;\r
-               }\r
-               break;\r
+               return OnCommand(hDlg, wParam, lParam);\r
        }\r
        return FALSE;\r
 }\r
index 829abb1..b4a97e3 100644 (file)
@@ -3,6 +3,8 @@
 #include "LangArray.h"\r
 #include "VersionData.h"\r
 \r
+const LANGID LangArray::DefLangId = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);\r
+\r
 /**\r
  * @brief Remove prefix from the string.\r
  * @param [in] text String from which to jump over prefix.\r
@@ -139,7 +141,7 @@ BOOL LangArray::Load(HINSTANCE hMainInstance, LANGID langid)
        int unresolved = 0;\r
        int mismatched = 0;\r
        FILE *f = 0;\r
-       if (langid)\r
+       if (langid && langid != DefLangId)\r
        {\r
                TCHAR path[MAX_PATH];\r
                GetModuleFileName(hMainInstance, path, MAX_PATH);\r
@@ -232,9 +234,9 @@ BOOL LangArray::Load(HINSTANCE hMainInstance, LANGID langid)
                // (3) Country inspecific translation, e.g. de.po\r
                do\r
                {\r
-                       if (int i = GetLocaleInfo(langid, LOCALE_SISO639LANGNAME, name, 4))\r
+                       if (int i = LangCodeMajor(langid, name))\r
                        {\r
-                               int j = GetLocaleInfo(langid, LOCALE_SISO3166CTRYNAME, name + i, 4);\r
+                               int j = LangCodeMinor(langid, name + i);\r
                                name[--i] = '-';\r
                                do\r
                                {\r
@@ -449,3 +451,28 @@ void LangArray::TranslateDialogW(HWND h)
                gw = GW_HWNDNEXT;\r
        } while (h);\r
 }\r
+\r
+int LangArray::LangCodeMajor(LANGID langid, LPTSTR name)\r
+{\r
+       return GetLocaleInfo(langid, LOCALE_SISO639LANGNAME, name, 4);\r
+}\r
+\r
+int LangArray::LangCodeMinor(LANGID langid, LPTSTR name)\r
+{\r
+       static const TCHAR cyrl[] = _T("Cyrl");\r
+       static const TCHAR latn[] = _T("Latn");\r
+       switch (langid)\r
+       {\r
+       case MAKELANGID(LANG_AZERI, SUBLANG_AZERI_LATIN):\r
+       case MAKELANGID(LANG_SERBIAN, SUBLANG_SERBIAN_LATIN):\r
+       case MAKELANGID(LANG_UZBEK, SUBLANG_UZBEK_LATIN):\r
+               memcpy(name, latn, sizeof latn);\r
+               return sizeof latn;\r
+       case MAKELANGID(LANG_AZERI, SUBLANG_AZERI_CYRILLIC):\r
+       case MAKELANGID(LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC):\r
+       case MAKELANGID(LANG_UZBEK, SUBLANG_UZBEK_CYRILLIC):\r
+               memcpy(name, cyrl, sizeof cyrl);\r
+               return sizeof cyrl;\r
+       }\r
+       return GetLocaleInfo(langid, LOCALE_SISO3166CTRYNAME, name, 4);\r
+}\r
index ad5989c..d9b2279 100644 (file)
@@ -1,6 +1,7 @@
 class LangArray : public SimpleArray<char *>\r
 {\r
 public:\r
+       static const LANGID DefLangId;\r
        struct StringData\r
        {\r
                int refcount;\r
@@ -21,4 +22,6 @@ public:
        BSTR TranslateStringW(int line);\r
        void TranslateDialogA(HWND);\r
        void TranslateDialogW(HWND);\r
+       static int LangCodeMajor(LANGID, LPTSTR);\r
+       static int LangCodeMinor(LANGID, LPTSTR);\r
 };\r
index ad1379c..c370b0a 100644 (file)
@@ -9,19 +9,6 @@ SimpleString ReplaceDlg::strToReplaceData;
 // String containing data to replace with.\r
 SimpleString ReplaceDlg::strReplaceWithData;\r
 \r
-static void GetWindowText(HWND hwnd, SimpleString &str)\r
-{\r
-       int len = GetWindowTextLength(hwnd) + 1;\r
-       str.SetSize(len);\r
-       GetWindowText(hwnd, str, len);\r
-}\r
-\r
-static void GetDlgItemText(HWND hwnd, int id, SimpleString &str)\r
-{\r
-       hwnd = GetDlgItem(hwnd, id);\r
-       GetWindowText(hwnd, str);\r
-}\r
-\r
 //-------------------------------------------------------------------\r
 // Translate the text in the string to binary data and store in the array.\r
 int ReplaceDlg::transl_text_to_binary(SimpleArray<char> &out)\r
diff --git a/Externals/heksedit/StringTable.cpp b/Externals/heksedit/StringTable.cpp
new file mode 100644 (file)
index 0000000..96ce5bc
--- /dev/null
@@ -0,0 +1,10 @@
+#include "precomp.h"\r
+#include "StringTable.h"\r
+#include "resource.h"\r
+\r
+StringTable<LPWSTR> S;\r
+\r
+StringTable<WORD> IDS =\r
+{\r
+       IDS_DiffListItemFormat\r
+};\r
diff --git a/Externals/heksedit/StringTable.h b/Externals/heksedit/StringTable.h
new file mode 100644 (file)
index 0000000..35ec04d
--- /dev/null
@@ -0,0 +1,9 @@
+template <class T>\r
+struct StringTable\r
+{\r
+       operator T *() { return reinterpret_cast<T *>(this); }\r
+       T DiffListItemFormat;\r
+};\r
+\r
+extern StringTable<LPWSTR> S;\r
+extern StringTable<WORD> IDS;\r
diff --git a/Externals/heksedit/ViewSettingsDlg.cpp b/Externals/heksedit/ViewSettingsDlg.cpp
new file mode 100644 (file)
index 0000000..e1c9fc5
--- /dev/null
@@ -0,0 +1,256 @@
+#include "precomp.h"\r
+#include "resource.h"\r
+#include "hexwnd.h"\r
+#include "hexwdlg.h"\r
+#include "LangArray.h"\r
+\r
+#define AW(h, f) (IsWindowUnicode(h) ? f##W : f##A)\r
+\r
+static WNDPROC NTAPI SubclassAW(HWND hWnd, WNDPROC wndproc)\r
+{\r
+       return (WNDPROC)AW(hWnd, SetWindowLong)(hWnd, GWL_WNDPROC, (LONG)wndproc);\r
+}\r
+\r
+static WNDPROC DefWndProcDroppedComboBox = 0;\r
+\r
+static LRESULT CALLBACK WndProcDroppedComboBox(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (uMsg)\r
+       {\r
+       case WM_CTLCOLORLISTBOX:\r
+               {\r
+                       int cxScreen = GetSystemMetrics(SM_CXSCREEN);\r
+                       HWND hLb = (HWND)lParam;\r
+                       RECT rcLb;\r
+                       ::GetWindowRect(hLb, &rcLb);\r
+                       if (rcLb.right > cxScreen)\r
+                               rcLb.left -= rcLb.right - cxScreen;\r
+                       if (rcLb.left < 0)\r
+                               rcLb.left = 0;\r
+                       ::SetWindowPos(hLb, 0, rcLb.left, rcLb.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER);\r
+               }\r
+               break;\r
+       }\r
+       return AW(hWnd, CallWindowProc)(DefWndProcDroppedComboBox, hWnd, uMsg, wParam, lParam);\r
+}\r
+\r
+HWND ViewSettingsDlg::hCbLang;\r
+\r
+BOOL ViewSettingsDlg::EnumLocalesProc(LPTSTR lpLocaleString)\r
+{\r
+       TCHAR path[MAX_PATH];\r
+       GetModuleFileName(hMainInstance, path, MAX_PATH);\r
+       PathRenameExtension(path, _T(".lng"));\r
+       LPTSTR name = PathAddBackslash(path);\r
+       LCID lcid = 0;\r
+       if (sscanf(lpLocaleString, "%x", &lcid) == 1)\r
+       {\r
+               LANGID langid = (LANGID)lcid;\r
+               if (int i = GetLocaleInfo(langid, LOCALE_SISO639LANGNAME, name, 4))\r
+               {\r
+                       int j = GetLocaleInfo(langid, LOCALE_SISO3166CTRYNAME, name + i, 4);\r
+                       name[--i] = '-';\r
+                       BOOL f = langid == LangArray::DefLangId;\r
+                       while (f == 0)\r
+                       {\r
+                               strcpy(name + i + j, ".po");\r
+                               f = PathFileExists(path);\r
+                               if (j == 0 || SUBLANGID(langid) != SUBLANG_DEFAULT)\r
+                                       break;\r
+                               j = 0;\r
+                       }\r
+                       int k = SendMessage(hCbLang, CB_ADDSTRING, 0, MAKELONG(langid, f));\r
+                       if (langid == (langArray.m_langid ? langArray.m_langid : LangArray::DefLangId))\r
+                               SendMessage(hCbLang, CB_SETCURSEL, k, 0);\r
+               }\r
+       }\r
+       return TRUE;\r
+}\r
+\r
+int ViewSettingsDlg::FormatLangId(LPWSTR bufW, LANGID langid, int verbose)\r
+{\r
+       char bufA[200];\r
+       int i = LangArray::LangCodeMajor(langid, bufA);\r
+       if (i)\r
+       {\r
+               bufA[i - 1] = '-';\r
+               i += LangArray::LangCodeMinor(langid, bufA + i);\r
+               switch (verbose)\r
+               {\r
+               case sizeof(WCHAR):\r
+                       MultiByteToWideChar(CP_ACP, 0, bufA, i, bufW, i);\r
+                       bufW[i - 1] = '\t';\r
+                       i += GetLocaleInfoW(langid, LOCALE_SNATIVELANGNAME|LOCALE_USE_CP_ACP, bufW + i, 40);\r
+                       bufW[i - 1] = '\t';\r
+                       i += GetLocaleInfoW(langid, LOCALE_SNATIVECTRYNAME|LOCALE_USE_CP_ACP, bufW + i, 40);\r
+                       bufW[i - 1] = '\t';\r
+                       i += GetLocaleInfoW(langid, LOCALE_SENGLANGUAGE, bufW + i, 40);\r
+                       bufW[i - 1] = '\t';\r
+                       i += GetLocaleInfoW(langid, LOCALE_SENGCOUNTRY, bufW + i, 40);\r
+                       break;\r
+               case sizeof(CHAR):\r
+                       bufA[i - 1] = '\t';\r
+                       i += GetLocaleInfoA(langid, LOCALE_SNATIVELANGNAME|LOCALE_USE_CP_ACP, bufA + i, 40);\r
+                       bufA[i - 1] = '\t';\r
+                       i += GetLocaleInfoA(langid, LOCALE_SNATIVECTRYNAME|LOCALE_USE_CP_ACP, bufA + i, 40);\r
+                       bufA[i - 1] = '\t';\r
+                       i += GetLocaleInfoA(langid, LOCALE_SENGLANGUAGE, bufA + i, 40);\r
+                       bufA[i - 1] = '\t';\r
+                       i += GetLocaleInfoA(langid, LOCALE_SENGCOUNTRY, bufA + i, 40);\r
+                       // fall through\r
+               case 0:\r
+                       MultiByteToWideChar(CP_ACP, 0, bufA, i, bufW, i);\r
+                       break;\r
+               }\r
+               --i;\r
+       }\r
+       else\r
+       {\r
+               i = swprintf(bufW, L"%04x", langid);\r
+       }\r
+       return i;\r
+}\r
+\r
+void ViewSettingsDlg::OnDrawitemLangId(DRAWITEMSTRUCT *pdis)\r
+{\r
+       int iColorText = COLOR_WINDOWTEXT;\r
+       int iColorTextBk = COLOR_WINDOW;\r
+       if (pdis->itemState & ODS_SELECTED)\r
+       {\r
+               iColorText = COLOR_HIGHLIGHTTEXT;\r
+               iColorTextBk =  COLOR_HIGHLIGHT;\r
+       }\r
+       if (HIWORD(pdis->itemData) == 0)\r
+       {\r
+               iColorText = COLOR_GRAYTEXT;\r
+       }\r
+       SetTextColor(pdis->hDC, GetSysColor(iColorText));\r
+       SetBkColor(pdis->hDC, GetSysColor(iColorTextBk));\r
+       int x = pdis->rcItem.left + 2;\r
+       int y = pdis->rcItem.top + 2;\r
+       static const int rgcx[] = { 50, 120, 180, 120, 220, 0 };\r
+       const int *pcx = rgcx;\r
+       UINT flags = ETO_OPAQUE;\r
+       WCHAR buffer[200];\r
+       int length = FormatLangId(buffer, LOWORD(pdis->itemData),\r
+               IsWindowUnicode(pdis->hwndItem) ? sizeof(WCHAR) : sizeof(CHAR));\r
+       LPWSTR p = buffer;\r
+       while (LPWSTR q = StrChrW(p, L'\t'))\r
+       {\r
+               ExtTextOutW(pdis->hDC, x, y, flags, &pdis->rcItem, p, q - p, 0);\r
+               x += *pcx ? *pcx++ : 100;\r
+               p = q + 1;\r
+               flags = 0;\r
+       }\r
+       ExtTextOutW(pdis->hDC, x, y, flags, &pdis->rcItem, p, length - (p - buffer), 0);\r
+       if (pdis->itemState & ODS_FOCUS)\r
+       {\r
+               DrawFocusRect(pdis->hDC, &pdis->rcItem);\r
+       }\r
+}\r
+\r
+INT_PTR ViewSettingsDlg::OnCompareitemLangId(COMPAREITEMSTRUCT *pcis)\r
+{\r
+       WCHAR name1[20];\r
+       FormatLangId(name1, LOWORD(pcis->itemData1));\r
+       WCHAR name2[20];\r
+       FormatLangId(name2, LOWORD(pcis->itemData2));\r
+       int cmp = StrCmpIW(name1, name2);\r
+       return cmp < 0 ? -1 : cmp > 0 ? +1 : 0;\r
+       //Code below would yield numeric sort order by first PRIMARYLANGID, then SUBLANGID\r
+       /*WORD w1 = LOWORD(pcis->itemData1);\r
+       w1 = w1 << 10 | w1 >> 10;\r
+       WORD w2 = LOWORD(pcis->itemData2);\r
+       w2 = w2 << 10 | w2 >> 10;\r
+       return w1 < w2 ? -1 : w1 > w2 ? 1 : 0;*/\r
+}\r
+\r
+BOOL ViewSettingsDlg::OnInitDialog(HWND hDlg)\r
+{\r
+       SetDlgItemInt(hDlg, IDC_EDIT1, iBytesPerLine, TRUE);\r
+       SetDlgItemInt(hDlg, IDC_EDIT2, iMinOffsetLen, TRUE);\r
+       CheckDlgButton(hDlg, IDC_CHECK1, iAutomaticBPL);\r
+       CheckDlgButton(hDlg, bUnsignedView ? IDC_RADIO1 : IDC_RADIO2, BST_CHECKED);\r
+       CheckDlgButton(hDlg, IDC_CHECK5, bOpenReadOnly);\r
+       CheckDlgButton(hDlg, IDC_CHECK2, bAutoOffsetLen);\r
+       SetDlgItemText(hDlg, IDC_EDIT3, TexteditorName);\r
+       hCbLang = GetDlgItem(hDlg, IDC_COMBO1);\r
+       SendMessage(hCbLang, CB_SETDROPPEDWIDTH, 698, 0);\r
+       EnumSystemLocales(EnumLocalesProc, LCID_SUPPORTED);\r
+       return TRUE;\r
+}\r
+\r
+BOOL ViewSettingsDlg::Apply(HWND hDlg)\r
+{\r
+       iBytesPerLine = GetDlgItemInt(hDlg, IDC_EDIT1, 0, TRUE);\r
+       if (iBytesPerLine < 1)\r
+               iBytesPerLine = 1;\r
+       iMinOffsetLen = GetDlgItemInt(hDlg, IDC_EDIT2, 0, TRUE);\r
+       if (iMinOffsetLen < 1)\r
+               iMinOffsetLen = 1;\r
+       // Get the text editor path and name.\r
+       GetDlgItemText(hDlg, IDC_EDIT3, TexteditorName);\r
+       iAutomaticBPL = IsDlgButtonChecked(hDlg, IDC_CHECK1);\r
+       bAutoOffsetLen = IsDlgButtonChecked(hDlg, IDC_CHECK2);\r
+       bUnsignedView = IsDlgButtonChecked(hDlg, IDC_RADIO1);\r
+       bOpenReadOnly = IsDlgButtonChecked(hDlg, IDC_CHECK5);\r
+       int i = SendMessage(hCbLang, CB_GETCURSEL, 0, 0);\r
+       if (i != -1)\r
+       {\r
+               DWORD itemData = (DWORD)SendMessage(hCbLang, CB_GETITEMDATA, i, 0);\r
+               load_lang((LANGID)itemData);\r
+       }\r
+       save_ini_data();\r
+       resize_window();\r
+       return TRUE;\r
+}\r
+\r
+INT_PTR ViewSettingsDlg::DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (iMsg)\r
+       {\r
+       case WM_INITDIALOG:\r
+               return OnInitDialog(hDlg);\r
+       case WM_COMMAND:\r
+               switch (wParam)\r
+               {\r
+               case IDOK:\r
+                       if (Apply(hDlg))\r
+                       {\r
+                       case IDCANCEL:\r
+                               EndDialog(hDlg, wParam);\r
+                       }\r
+                       return TRUE;\r
+               case MAKEWPARAM(IDC_COMBO1, CBN_DROPDOWN):\r
+                       if (DefWndProcDroppedComboBox == 0)\r
+                       {\r
+                               DefWndProcDroppedComboBox = SubclassAW((HWND)lParam, WndProcDroppedComboBox);\r
+                       }\r
+                       return TRUE;\r
+               case MAKEWPARAM(IDC_COMBO1, CBN_CLOSEUP):\r
+                       if (DefWndProcDroppedComboBox)\r
+                       {\r
+                               SubclassAW((HWND)lParam, DefWndProcDroppedComboBox);\r
+                               DefWndProcDroppedComboBox = 0;\r
+                       }\r
+                       return TRUE;\r
+               }\r
+               break;\r
+       case WM_DRAWITEM:\r
+               switch (wParam)\r
+               {\r
+               case IDC_COMBO1:\r
+                       OnDrawitemLangId(reinterpret_cast<DRAWITEMSTRUCT *>(lParam));\r
+                       return TRUE;\r
+               }\r
+               break;\r
+       case WM_COMPAREITEM:\r
+               switch (wParam)\r
+               {\r
+               case IDC_COMBO1:\r
+                       return OnCompareitemLangId(reinterpret_cast<COMPAREITEMSTRUCT *>(lParam));\r
+               }\r
+               break;\r
+       }\r
+       return FALSE;\r
+}\r
index efec120..6fcdfc5 100644 (file)
@@ -11,12 +11,14 @@ LRESULT CALLBACK HexWndProc(HWND, UINT, WPARAM, LPARAM);
 static const char szHexClassA[] = "hekseditA_"\r
        SHARPEN(A,FRHED_MAJOR_VERSION) "."\r
        SHARPEN(A,FRHED_MINOR_VERSION) "."\r
-       SHARPEN(A,FRHED_SUB_RELEASE_NO);\r
+       SHARPEN(A,FRHED_SUB_RELEASE_NO) "."\r
+       SHARPEN(A,FRHED_BUILD_NO);\r
 \r
 static const WCHAR szHexClassW[] = L"hekseditW_"\r
        SHARPEN(W,FRHED_MAJOR_VERSION) L"."\r
        SHARPEN(W,FRHED_MINOR_VERSION) L"."\r
-       SHARPEN(W,FRHED_SUB_RELEASE_NO);\r
+       SHARPEN(W,FRHED_SUB_RELEASE_NO) L"."\r
+       SHARPEN(W,FRHED_BUILD_NO);\r
 \r
 //--------------------------------------------------------------------------------------------\r
 // WinMain: the starting point.\r
@@ -40,8 +42,13 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
                RegisterClassExA(&wndclass.a);\r
                wndclass.w.lpszClassName = szHexClassW;\r
                RegisterClassExW(&wndclass.w);\r
+               HexEditorWindow::LoadStringTable();\r
                return TRUE;\r
        }\r
+       if (dwReason == DLL_PROCESS_DETACH)\r
+       {\r
+               HexEditorWindow::FreeStringTable();\r
+       }\r
        return FALSE;\r
 }\r
 \r
index b52051b..b202816 100644 (file)
                                RelativePath="frhed.rc">\r
                        </File>\r
                        <File\r
-                               RelativePath="icon1.ico">\r
+                               RelativePath=".\res\icon1.ico">\r
                        </File>\r
                        <File\r
                                RelativePath="resource.h">\r
index 8d5b179..0f7157d 100644 (file)
@@ -275,8 +275,16 @@ SOURCE=.\Simparr.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\StringTable.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\UpgradeDlg.cpp\r
 # End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ViewSettingsDlg.cpp\r
+# End Source File\r
 # End Group\r
 # Begin Group "Header Files"\r
 \r
@@ -379,6 +387,10 @@ SOURCE=.\Simparr.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\StringTable.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\toolbar.h\r
 # End Source File\r
 # Begin Source File\r
index 2e09822..bd268d1 100644 (file)
@@ -62,4 +62,6 @@ public:
        virtual BOOL STDMETHODCALLTYPE select_next_diff(BOOL bFromStart) = 0;\r
        virtual BOOL STDMETHODCALLTYPE select_prev_diff(BOOL bFromEnd) = 0;\r
        virtual BOOL STDMETHODCALLTYPE load_lang(LANGID) = 0;\r
+       virtual BSTR STDMETHODCALLTYPE load_string(UINT) = 0;\r
+       virtual void STDMETHODCALLTYPE free_string(BSTR) = 0;\r
 };\r
index b8d4c94..6b11e9c 100644 (file)
@@ -13,7 +13,7 @@
 #undef APSTUDIO_READONLY_SYMBOLS\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
-// English (U.S.) resources\r
+// Englisch (USA) resources\r
 \r
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
 #ifdef _WIN32\r
@@ -499,8 +499,9 @@ BEGIN
     PUSHBUTTON      "Cancel",IDCANCEL,82,131,50,14\r
 END\r
 \r
-IDD_VIEWSETTINGSDIALOG DIALOGEX 0, 0, 229, 167\r
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+IDD_VIEWSETTINGSDIALOG DIALOGEX 0, 0, 249, 167\r
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | \r
+    WS_SYSMENU\r
 CAPTION "View Settings"\r
 FONT 8, "MS Shell Dlg", 0, 0, 0x0\r
 BEGIN\r
@@ -509,13 +510,13 @@ BEGIN
     EDITTEXT        IDC_EDIT1,7,16,68,12,ES_AUTOHSCROLL\r
     CONTROL         "Automatically adjust number of bytes per line (uncheck this if you want frhed to use your own choice for bytes per line)",\r
                     IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | \r
-                    WS_TABSTOP,7,31,214,19\r
+                    WS_TABSTOP,7,31,234,19\r
     LTEXT           "Display length of offset in how many characters:",\r
                     IDC_STATIC,7,51,151,8\r
     EDITTEXT        IDC_EDIT2,7,61,68,12,ES_AUTOHSCROLL\r
     CONTROL         "Adjust offset len to that of the max offset",IDC_CHECK2,\r
-                    "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,80,\r
-                    61,140,12\r
+                    "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,78,\r
+                    61,163,12\r
     GROUPBOX        "Display values at caret position as:",IDC_STATIC,7,76,\r
                     128,25,WS_GROUP\r
     CONTROL         "unsigned",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | \r
@@ -526,9 +527,12 @@ BEGIN
                     BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,106,128,10\r
     LTEXT           "Path and filename of the text editor to call:",\r
                     IDC_STATIC,7,122,133,8\r
-    EDITTEXT        IDC_EDIT3,7,132,214,13,ES_AUTOHSCROLL\r
-    DEFPUSHBUTTON   "OK",IDOK,171,80,50,14\r
-    PUSHBUTTON      "Cancel",IDCANCEL,171,97,50,14\r
+    EDITTEXT        IDC_EDIT3,7,132,234,13,ES_AUTOHSCROLL\r
+    LTEXT           "Language:",IDC_STATIC,7,151,50,8\r
+    COMBOBOX        IDC_COMBO1,69,147,172,189,CBS_DROPDOWNLIST | \r
+                    CBS_OWNERDRAWFIXED | CBS_SORT | WS_VSCROLL | WS_TABSTOP\r
+    DEFPUSHBUTTON   "OK",IDOK,191,80,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,191,97,50,14\r
 END\r
 \r
 IDD_APPENDDIALOG DIALOGEX 0, 0, 192, 46\r
@@ -1054,7 +1058,6 @@ BEGIN
         LEFTMARGIN, 7\r
         RIGHTMARGIN, 205\r
         TOPMARGIN, 7\r
-        BOTTOMMARGIN, 192\r
     END\r
 \r
     IDD_HEXDUMPDIALOG, DIALOG\r
@@ -1100,7 +1103,7 @@ BEGIN
     IDD_VIEWSETTINGSDIALOG, DIALOG\r
     BEGIN\r
         LEFTMARGIN, 7\r
-        RIGHTMARGIN, 221\r
+        RIGHTMARGIN, 241\r
         TOPMARGIN, 7\r
         BOTTOMMARGIN, 160\r
     END\r
@@ -1264,6 +1267,7 @@ BEGIN
 END\r
 #endif    // APSTUDIO_INVOKED\r
 \r
+\r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
 // Bitmap\r
@@ -1305,6 +1309,11 @@ BEGIN
     ID_DISK_GOTOLASTTRACK   "Goto last sector"\r
 END\r
 \r
+STRINGTABLE \r
+BEGIN\r
+    IDS_DiffListItemFormat  "%d) 0x%x=%n%d to 0x%x=%n%d (%d bytes)"\r
+END\r
+\r
 #endif    // Englisch (USA) resources\r
 /////////////////////////////////////////////////////////////////////////////\r
 \r
index aa9309a..eeee446 100644 (file)
                                </FileConfiguration>\r
                        </File>\r
                        <File\r
+                               RelativePath=".\StringTable.cpp">\r
+                       </File>\r
+                       <File\r
                                RelativePath="UpgradeDlg.cpp">\r
                                <FileConfiguration\r
                                        Name="Debug|Win32">\r
                                                BrowseInformation="1"/>\r
                                </FileConfiguration>\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\ViewSettingsDlg.cpp">\r
+                       </File>\r
                </Filter>\r
                <Filter\r
                        Name="Header Files"\r
                                RelativePath="Simparr.h">\r
                        </File>\r
                        <File\r
+                               RelativePath=".\StringTable.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="toolbar.h">\r
                        </File>\r
                        <File\r
                                RelativePath="heksedit.rc">\r
                        </File>\r
                        <File\r
-                               RelativePath="icon1.ico">\r
-                       </File>\r
-                       <File\r
                                RelativePath="resource.h">\r
                        </File>\r
                        <File\r
-                               RelativePath="Toolbar.bmp">\r
+                               RelativePath=".\res\Toolbar.bmp">\r
                        </File>\r
                </Filter>\r
                <Filter\r
                </Filter>\r
        </Files>\r
        <Globals>\r
+               <Global\r
+                       Name="RESOURCE_FILE"\r
+                       Value="heksedit.rc"/>\r
        </Globals>\r
 </VisualStudioProject>\r
index b2625b7..d0b04e3 100644 (file)
@@ -2,6 +2,20 @@
 #include "resource.h"\r
 #include "hexwnd.h"\r
 #include "hexwdlg.h"\r
+#include "LangArray.h"\r
+\r
+void GetWindowText(HWND hwnd, SimpleString &str)\r
+{\r
+       int len = GetWindowTextLength(hwnd) + 1;\r
+       str.SetSize(len);\r
+       GetWindowText(hwnd, str, len);\r
+}\r
+\r
+void GetDlgItemText(HWND hwnd, int id, SimpleString &str)\r
+{\r
+       hwnd = GetDlgItem(hwnd, id);\r
+       GetWindowText(hwnd, str);\r
+}\r
 \r
 C_ASSERT(sizeof(DragDropOptionsDlg) == sizeof(HexEditorWindow)); // disallow instance members\r
 \r
@@ -60,57 +74,6 @@ INT_PTR DragDropOptionsDlg::DlgProc(HWND h, UINT m, WPARAM w, LPARAM l)
        return FALSE;\r
 }\r
 \r
-INT_PTR ViewSettingsDlg::DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
-{\r
-       char buf[512];\r
-       switch (iMsg)\r
-       {\r
-       case WM_INITDIALOG:\r
-               SetDlgItemInt(hDlg, IDC_EDIT1, iBytesPerLine, TRUE);\r
-               SetDlgItemInt(hDlg, IDC_EDIT2, iMinOffsetLen, TRUE);\r
-               CheckDlgButton(hDlg, IDC_CHECK1, iAutomaticBPL);\r
-               CheckDlgButton(hDlg, bUnsignedView ? IDC_RADIO1 : IDC_RADIO2, BST_CHECKED);\r
-               CheckDlgButton(hDlg, IDC_CHECK5, bOpenReadOnly);\r
-//Pabs inserted\r
-               CheckDlgButton( hDlg, IDC_CHECK2, bAutoOffsetLen);\r
-//end\r
-               SetDlgItemText(hDlg, IDC_EDIT3, TexteditorName);\r
-               return TRUE;\r
-\r
-       case WM_COMMAND:\r
-               switch (wParam)\r
-               {\r
-               case IDOK:\r
-                       iBytesPerLine = GetDlgItemInt(hDlg, IDC_EDIT1, 0, TRUE);\r
-                       if (iBytesPerLine < 1)\r
-                               iBytesPerLine = 1;\r
-                       iMinOffsetLen = GetDlgItemInt(hDlg, IDC_EDIT2, 0, TRUE);\r
-                       if (iMinOffsetLen < 1)\r
-                               iMinOffsetLen = 1;\r
-                       // Get the text editor path and name.\r
-                       if (GetDlgItemText(hDlg, IDC_EDIT3, buf, 512))\r
-                               TexteditorName.SetToString(buf);\r
-                       else\r
-                               MessageBox(hDlg, "Field for text editor name was empty: name not changed.", "View settings", MB_OK | MB_ICONERROR);\r
-//end\r
-                       iAutomaticBPL = IsDlgButtonChecked(hDlg, IDC_CHECK1);\r
-//Pabs inserted\r
-                       bAutoOffsetLen = IsDlgButtonChecked(hDlg, IDC_CHECK2);\r
-//end\r
-                       bUnsignedView = IsDlgButtonChecked(hDlg, IDC_RADIO1);\r
-                       bOpenReadOnly = IsDlgButtonChecked(hDlg, IDC_CHECK5);\r
-                       save_ini_data();\r
-                       resize_window();\r
-                       // fall through\r
-               case IDCANCEL:\r
-                       EndDialog(hDlg, wParam);\r
-                       return TRUE;\r
-               }\r
-               break;\r
-       }\r
-       return FALSE;\r
-}\r
-\r
 INT_PTR CharacterSetDlg::DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (iMsg)\r
@@ -202,11 +165,11 @@ INT_PTR ChangeInstDlg::DlgProc(HWND hw, UINT m, WPARAM w, LPARAM l)
                        LONG range = MAKELONG(iLoadInst, iSaveInst);\r
                        LONG pos = MAKELONG(iInstCount, 0);\r
                        HWND hWndUpDown = GetDlgItem(hw, IDC_SINST);\r
-                       SendMessage( hWndUpDown, UDM_SETRANGE, 0L, range);\r
-                       SendMessage( hWndUpDown, UDM_SETPOS, 0L, pos);\r
+                       SendMessage(hWndUpDown, UDM_SETRANGE, 0L, range);\r
+                       SendMessage(hWndUpDown, UDM_SETPOS, 0L, pos);\r
                        hWndUpDown = GetDlgItem(hw, IDC_LINST);\r
-                       SendMessage( hWndUpDown, UDM_SETRANGE, 0L, range);\r
-                       SendMessage( hWndUpDown, UDM_SETPOS, 0L, pos);\r
+                       SendMessage(hWndUpDown, UDM_SETRANGE, 0L, range);\r
+                       SendMessage(hWndUpDown, UDM_SETPOS, 0L, pos);\r
                        return TRUE;\r
                }\r
        case WM_COMMAND:\r
index b71710e..61726ee 100644 (file)
@@ -1,3 +1,6 @@
+void GetWindowText(HWND, SimpleString &);\r
+void GetDlgItemText(HWND, int, SimpleString &);\r
+\r
 class DragDropOptionsDlg : public HexEditorWindow\r
 {\r
 public:\r
@@ -10,6 +13,14 @@ class ViewSettingsDlg : public HexEditorWindow
 public:\r
        enum { IDD = IDD_VIEWSETTINGSDIALOG };\r
        INT_PTR DlgProc(HWND, UINT, WPARAM, LPARAM);\r
+private:\r
+       static HWND hCbLang;\r
+       static BOOL CALLBACK EnumLocalesProc(LPTSTR);\r
+       static int FormatLangId(LPWSTR, LANGID, int verbose = 0);\r
+       void OnDrawitemLangId(DRAWITEMSTRUCT *);\r
+       INT_PTR OnCompareitemLangId(COMPAREITEMSTRUCT *);\r
+       BOOL OnInitDialog(HWND);\r
+       BOOL Apply(HWND);\r
 };\r
 \r
 class CharacterSetDlg : public HexEditorWindow\r
@@ -123,6 +134,7 @@ public:
        INT_PTR DlgProc(HWND, UINT, WPARAM, LPARAM);\r
 private:\r
        BOOL OnInitDialog(HWND);\r
+       BOOL OnCommand(HWND, WPARAM, LPARAM);\r
        void add_diff(HWND hwndList, int diff, int lower, int upper);\r
        int get_diffs(HWND hwndList, char *ps, int sl, char *pd, int dl);\r
 };\r
index 157e6c2..0ae8fcd 100644 (file)
@@ -2,6 +2,7 @@
 // Frhed main definition file.\r
 #include "precomp.h"\r
 #include "resource.h"\r
+#include "StringTable.h"\r
 #include "VersionData.h"\r
 #include "hexwnd.h"\r
 #include "hexwdlg.h"\r
 #include "LoadHexFile.h"\r
 #include "LangArray.h"\r
 \r
-/*In the following headers:\r
-       ULONG m_cRefCount; //The reference count that all objects based on IUnknown must have\r
-       //The following have to do with the automatic destruction IUnknown::Release is supposed to do\r
-       bool deleteself; //Should we delete ourself on zero reference count\r
-       C<SomeObject>** pthis; //A pointer to a pointer that we should set to NULL on destruction*/\r
 #include "idt.h"\r
 #include "ids.h"\r
 #include "ido.h"\r
@@ -52,12 +48,6 @@ SimpleString HexEditorWindow::EncodeDlls;
 //Temporary stuff for CMD_move_copy\r
 int iMovePos;\r
 OPTYP iMoveOpTyp;\r
-//end\r
-//inserted to allow 32-bit scrolling\r
-//end\r
-//Pabs inserted\r
-//char bPasteBinary, bPasteUnicode;\r
-//end\r
 \r
 // RK: function by pabs.\r
 BOOL contextpresent();\r
@@ -99,20 +89,20 @@ HexEditorWindow::HexEditorWindow()
        iWindowHeight = CW_USEDEFAULT;\r
        iWindowShowCmd = SW_SHOW;\r
 \r
-       // iClipboardEncode = TRUE;\r
-       iBmkColor = RGB( 255, 0, 0 );\r
-       iSelBkColorValue = RGB( 255, 255, 0 );\r
-       iSelTextColorValue = RGB( 0, 0, 0 );\r
+       iBmkColor = RGB(255, 0, 0);\r
+       iSelBkColorValue = RGB(255, 255, 0);\r
+       iSelTextColorValue = RGB(0, 0, 0);\r
 \r
        bOpenReadOnly = bReadOnly = FALSE;\r
        iPartialOffset = 0;\r
        bPartialStats = 0;\r
        bPartialOpen = FALSE;\r
        iBmkCount = 0;\r
-       int i;\r
-       for (i = 0 ; i < MRUMAX ; i++)\r
-               sprintf(strMRU[i], "dummy%d", i);\r
-       iMRU_count = 0;\r
+\r
+       iMRU_count = MRUMAX;\r
+       while (iMRU_count)\r
+               sprintf(strMRU[--iMRU_count], "dummy%d", iMRU_count);\r
+\r
        bFilestatusChanged = TRUE;\r
        iBinaryMode = LITTLEENDIAN_MODE;\r
        bUnsignedView = TRUE;\r
@@ -214,11 +204,86 @@ int HexEditorWindow::translate_accelerator(MSG *pMsg)
        return TranslateAccelerator(hwnd, hAccel, pMsg);\r
 }\r
 \r
-static LangArray langArray;\r
+LangArray langArray;\r
+\r
+static LPWSTR NTAPI LoadStringResource(HMODULE hModule, UINT uStringID)\r
+{\r
+       LPWSTR pwchMem = 0;\r
+       HRSRC hResource = FindResourceEx(\r
+               hModule, RT_STRING,\r
+               MAKEINTRESOURCE(uStringID / 16 + 1),\r
+               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT));\r
+       if (hResource)\r
+       {\r
+               pwchMem = (LPWSTR)LoadResource(hModule, hResource);\r
+               if (pwchMem)\r
+               {\r
+                       while (uStringID & 15)\r
+                       {\r
+                               pwchMem += *pwchMem + 1;\r
+                               --uStringID;\r
+                       }\r
+               }\r
+       }\r
+       return pwchMem;\r
+}\r
+\r
+static LPWSTR NTAPI LoadResString(UINT uStringID)\r
+{\r
+       HINSTANCE hinst = langArray.m_hLangDll ? langArray.m_hLangDll : hMainInstance;\r
+       LPWSTR text = LoadStringResource(hinst, uStringID);\r
+       if (text)\r
+       {\r
+               text = SysAllocStringLen(text + 1, (WORD)*text);\r
+               if (langArray.m_hLangDll)\r
+               {\r
+                       int line = 0;\r
+                       if (LPWSTR p = wcschr(text, L':'))\r
+                               line = _wtoi(p + 1);\r
+                       SysFreeString(text);\r
+                       text = langArray.TranslateStringW(line);\r
+               }\r
+       }\r
+       return text;\r
+}\r
+\r
+void HexEditorWindow::LoadStringTable()\r
+{\r
+       for (int i = 0 ; i < RTL_NUMBER_OF(S) ; ++i)\r
+               S[i] = LoadResString(IDS[i]);\r
+}\r
+\r
+void HexEditorWindow::FreeStringTable()\r
+{\r
+       for (int i = 0 ; i < RTL_NUMBER_OF(S) ; ++i)\r
+               SysFreeString(S[i]);\r
+}\r
 \r
+/**\r
+ * @brief Load translations for given language if present.\r
+ */\r
 BOOL HexEditorWindow::load_lang(LANGID langid)\r
 {\r
-       return langArray.Load(hMainInstance, langid);\r
+       FreeStringTable();\r
+       BOOL bDone = langArray.Load(hMainInstance, langid);\r
+       LoadStringTable();\r
+       return bDone;\r
+}\r
+\r
+/**\r
+ * @brief Load a string.\r
+ */\r
+BSTR HexEditorWindow::load_string(UINT uStringID)\r
+{\r
+       return LoadResString(uStringID);\r
+}\r
+\r
+/**\r
+ * @brief Free a string obtained through load_string().\r
+ */\r
+void HexEditorWindow::free_string(BSTR text)\r
+{\r
+       SysFreeString(text);\r
 }\r
 \r
 //--------------------------------------------------------------------------------------------\r
@@ -2311,7 +2376,7 @@ BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM)
                // Set the version information.\r
                SetDlgItemText(hDlg, IDC_STATIC1,\r
                        "frhed - free hex editor for 32-bit Windows\nVersion "CURRENT_VERSION"."\r
-                       SUB_RELEASE_NO"\n(c) Raihan Kibria 2000"\r
+                       SUB_RELEASE_NO"."BUILD_NO"\n(c) Raihan Kibria 2000"\r
                        "\nFill with by Pabs Dec 1999"\r
                        "\nDisk-Access, Code/Decode Extension and some other bits by Gerson Kurz."\r
                        "\nDLL interface by Jochen Neubeck.");\r
@@ -3485,8 +3550,12 @@ void HexEditorWindow::read_ini_data(char *key)
                res = RegQueryValueEx( key1, "output_CF_TEXT", NULL, NULL, (BYTE*) &output_CF_TEXT, &datasize );\r
                res = RegQueryValueEx( key1, "output_text_special", NULL, NULL, (BYTE*) &output_text_special, &datasize );\r
                res = RegQueryValueEx( key1, "output_text_hexdump_display", NULL, NULL, (BYTE*) &output_text_hexdump_display, &datasize );\r
-               res = RegQueryValueEx( key1, "output_CF_RTF", NULL, NULL, (BYTE*) &output_CF_RTF, &datasize );\r
 //end\r
+               res = RegQueryValueEx( key1, "always_pick_move_copy", NULL, NULL, (BYTE*) &always_pick_move_copy, &datasize );\r
+\r
+               LCID lcid = 0;\r
+               res = RegQueryValueEx( key1, "locale", NULL, NULL, (BYTE*) &lcid, &datasize );\r
+               load_lang((LANGID)lcid);\r
 \r
                char szPath[ _MAX_PATH + 1 ];\r
                datasize = _MAX_PATH + 1;\r
@@ -3534,11 +3603,11 @@ void HexEditorWindow::save_ini_data()
        HKEY key1;\r
 \r
        char keyname[64];\r
-       sprintf( keyname, "Software\\frhed\\v"CURRENT_VERSION"." SUB_RELEASE_NO "\\%d", iInstCount );\r
+       sprintf(keyname, "Software\\frhed\\v" CURRENT_VERSION "." SUB_RELEASE_NO "\\%d", iInstCount);\r
 \r
-       LONG res = RegCreateKey( HKEY_CURRENT_USER, keyname, &key1 );\r
+       LONG res = RegCreateKey(HKEY_CURRENT_USER, keyname, &key1);\r
 \r
-       if( res == ERROR_SUCCESS )\r
+       if (res == ERROR_SUCCESS)\r
        {\r
                RegSetValueEx( key1, "iTextColorValue", 0, REG_DWORD, (CONST BYTE*) &iTextColorValue, sizeof( int ) );\r
                RegSetValueEx( key1, "iBkColorValue", 0, REG_DWORD, (CONST BYTE*) &iBkColorValue, sizeof( int ) );\r
@@ -3571,6 +3640,9 @@ void HexEditorWindow::save_ini_data()
                RegSetValueEx( key1, "output_text_hexdump_display", 0, REG_DWORD, (CONST BYTE*) &output_text_hexdump_display, sizeof( int ) );\r
                RegSetValueEx( key1, "output_CF_RTF", 0, REG_DWORD, (CONST BYTE*) &output_CF_RTF, sizeof( int ) );\r
 //end\r
+               LCID lcid = MAKELCID(langArray.m_langid, 0);\r
+               RegSetValueEx( key1, "locale", 0, REG_DWORD, (CONST BYTE*) &lcid, sizeof lcid);\r
+\r
                RegSetValueEx( key1, "TexteditorName", 0, REG_SZ, (CONST BYTE*) (char*) TexteditorName, TexteditorName.StrLen() + 1 );\r
 \r
                RegSetValueEx( key1, "iWindowShowCmd", 0, REG_DWORD, (CONST BYTE*) &iWindowShowCmd, sizeof( int ) );\r
index 7cc55ae..aa2a006 100644 (file)
@@ -11,6 +11,7 @@
 \r
 #define CURRENT_VERSION SHARPEN(A,FRHED_MAJOR_VERSION) "." SHARPEN(A,FRHED_MINOR_VERSION)\r
 #define SUB_RELEASE_NO SHARPEN(A,FRHED_SUB_RELEASE_NO)\r
+#define BUILD_NO SHARPEN(A,FRHED_BUILD_NO)\r
 \r
 #include "PhysicalDrive.h"\r
 #include "PMemoryBlock.h"\r
@@ -55,6 +56,9 @@ class hexfile_stream;
 class load_hexfile_0;\r
 class load_hexfile_1;\r
 \r
+class LangArray;\r
+extern LangArray langArray;\r
+\r
 interface CDropTarget;\r
 \r
 class HexEditorWindow\r
@@ -224,6 +228,8 @@ public:
        Status *STDMETHODCALLTYPE get_status();\r
        int STDMETHODCALLTYPE translate_accelerator(MSG *);\r
        BOOL STDMETHODCALLTYPE load_lang(LANGID);\r
+       BSTR STDMETHODCALLTYPE load_string(UINT);\r
+       void STDMETHODCALLTYPE free_string(BSTR);\r
 \r
        virtual int STDMETHODCALLTYPE load_file(const char* fname);\r
        int file_is_loadable(const char* fname);\r
@@ -244,6 +250,9 @@ public:
        void print_text(HDC hdc, int x, int y, char *pch, int cch);\r
        virtual HRESULT STDMETHODCALLTYPE ResolveIt(LPCSTR lpszLinkFile, LPSTR lpszPath);\r
 \r
+       static void LoadStringTable();\r
+       static void FreeStringTable();\r
+\r
 public:\r
        int iWindowShowCmd, iWindowX, iWindowY, iWindowWidth, iWindowHeight;\r
        int iInstCount;\r
@@ -265,6 +274,7 @@ protected:
        static int iPasteAsText;\r
        static int iPasteTimes;\r
        static int iPasteSkip;\r
+\r
        int bOpenReadOnly;//Pabs inserted ", iPartialOpenLen, iPartialFileLen, bPartialStats"\r
        int iPartialOffset, bPartialOpen, iPartialOpenLen, iPartialFileLen, bPartialStats;\r
        int iBmkCount;\r
index 52566a6..a4c1dc4 100644 (file)
@@ -7,96 +7,69 @@ certain APIs in their import libraries. Specifically _wremove, _wopen & GetEnhMe
 \r
 //CDataObject\r
 //Members\r
-CDataObject::CDataObject( bool delself, CDataObject** p )//When using C++ new need to call like so someptr = new CDataObject(1,someptr);\r
+CDataObject::CDataObject()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::IDataObject\n");\r
-#endif //_DEBUG\r
        m_cRefCount = 0;\r
-       deleteself = delself;\r
-       pthis = p;\r
-\r
        allowSetData = true;\r
        data = NULL;\r
        enums = NULL;\r
        numdata = numenums = 0;\r
 }\r
 \r
-CDataObject::~CDataObject( void )\r
+CDataObject::~CDataObject()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::~IDataObject\n");\r
-       if( m_cRefCount != 0 )\r
-               printf("Deleting %s too early 0x%x.m_cRefCount = %d\n", "IDataObject", this, m_cRefCount);\r
-#endif //_DEBUG\r
+       assert(m_cRefCount == 0);\r
        Empty();\r
-       if(enums){\r
-               for(UINT i = 0;i<numenums;i++)\r
-                       if(enums[i]) delete enums[i];\r
+       if (enums)\r
+       {\r
+               while (numenums)\r
+                       delete enums[--numenums];\r
                free(enums);\r
-               enums = NULL; numenums = 0;\r
        }\r
-       if( pthis ) *pthis = NULL;\r
 }\r
 \r
-void CDataObject::DisableSetData( void ){\r
+void CDataObject::DisableSetData()\r
+{\r
        allowSetData = false;\r
 }\r
 \r
-void CDataObject::Empty( void ){\r
-       if(data){\r
-               for( UINT i = 0;i<numdata;i++)\r
-                       ReleaseStgMedium(&data[i].medium);\r
+void CDataObject::Empty()\r
+{\r
+       if (data)\r
+       {\r
+               while (numdata)\r
+                       ReleaseStgMedium(&data[--numdata].medium);\r
                free(data);\r
                data = NULL;\r
        }\r
 }\r
 \r
-\r
 //IUnknown members\r
-STDMETHODIMP CDataObject::QueryInterface( REFIID iid, void** ppvObject )\r
+STDMETHODIMP CDataObject::QueryInterface(REFIID iid, void **ppvObject)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::QueryInterface\n");\r
-#endif //_DEBUG\r
-\r
-       *ppvObject = NULL;\r
-\r
-       if ( iid == IID_IUnknown ) *ppvObject = (IUnknown*)this;\r
-       else if ( iid == IID_IDataObject ) *ppvObject = (IDataObject*)this;\r
-\r
-       if(*ppvObject){\r
-               ((IUnknown*)*ppvObject)->AddRef();\r
+       if (iid == IID_IUnknown || iid == IID_IDataObject)\r
+       {\r
+               *ppvObject = static_cast<IDataObject *>(this);\r
+               AddRef();\r
                return S_OK;\r
        }\r
-\r
+       *ppvObject = NULL;\r
        return E_NOINTERFACE;\r
 }\r
 \r
-STDMETHODIMP_(ULONG) CDataObject::AddRef( void )\r
+STDMETHODIMP_(ULONG) CDataObject::AddRef()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::AddRef\n");\r
-#endif //_DEBUG\r
        return ++m_cRefCount;\r
 }\r
 \r
-STDMETHODIMP_(ULONG) CDataObject::Release( void )\r
+STDMETHODIMP_(ULONG) CDataObject::Release()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::Release\n");\r
-#endif //_DEBUG\r
-       if( --m_cRefCount == 0 && deleteself ) delete this;\r
-       return m_cRefCount;\r
+       return --m_cRefCount;\r
 }\r
 \r
-\r
 //IDataObject members\r
 STDMETHODIMP CDataObject::GetData( FORMATETC* pFormatetc, STGMEDIUM* pmedium )\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::GetData\n");\r
-#endif //_DEBUG\r
        //Error handling\r
        if (pFormatetc == 0 || pmedium == 0)\r
                return E_INVALIDARG;\r
@@ -123,48 +96,28 @@ STDMETHODIMP CDataObject::GetData( FORMATETC* pFormatetc, STGMEDIUM* pmedium )
        return hr;\r
 }\r
 \r
-STDMETHODIMP CDataObject::GetDataHere( FORMATETC* pFormatetc, STGMEDIUM* pmedium )\r
+STDMETHODIMP CDataObject::GetDataHere(FORMATETC *, STGMEDIUM *pmedium)\r
 {\r
-       UNREFERENCED_PARAMETER( pFormatetc );\r
-       UNREFERENCED_PARAMETER( pmedium );\r
-#ifdef _DEBUG\r
-       printf("IDataObject::GetDataHere\n");\r
-#endif //_DEBUG\r
        pmedium->pUnkForRelease = NULL;\r
        return E_NOTIMPL;\r
 }\r
 \r
-STDMETHODIMP CDataObject::QueryGetData( FORMATETC* pFormatetc )\r
+STDMETHODIMP CDataObject::QueryGetData(FORMATETC *pFormatetc)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::QueryGetData\n");\r
-#endif //_DEBUG\r
-       for( UINT i = 0; i < numdata; i++ ){\r
-               if( data[i].format.cfFormat == pFormatetc->cfFormat ){\r
-                       if( data[i].format.dwAspect == pFormatetc->dwAspect){\r
+       for (UINT i = 0 ; i < numdata ; i++)\r
+               if (data[i].format.cfFormat == pFormatetc->cfFormat)\r
+                       if (data[i].format.dwAspect == pFormatetc->dwAspect)\r
                                return S_OK;\r
-                       }\r
-               }\r
-       }\r
        return DV_E_FORMATETC;\r
 }\r
 \r
-STDMETHODIMP CDataObject::GetCanonicalFormatEtc( FORMATETC* pFormatetcIn, FORMATETC* pFormatetcOut )\r
+STDMETHODIMP CDataObject::GetCanonicalFormatEtc(FORMATETC *, FORMATETC *)\r
 {\r
-       UNREFERENCED_PARAMETER( pFormatetcIn );\r
-       UNREFERENCED_PARAMETER( pFormatetcOut );\r
-#ifdef _DEBUG\r
-       printf("IDataObject::GetCanonicalFormatEtc\n");\r
-#endif //_DEBUG\r
        return E_NOTIMPL;\r
 }\r
 \r
-STDMETHODIMP CDataObject::SetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium, BOOL fRelease)\r
+STDMETHODIMP CDataObject::SetData(FORMATETC *pFormatetc, STGMEDIUM *pmedium, BOOL fRelease)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::SetData\n");\r
-#endif //_DEBUG\r
-\r
        if (!allowSetData)\r
                return E_NOTIMPL;\r
 \r
@@ -190,10 +143,6 @@ STDMETHODIMP CDataObject::SetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium, BOO
 \r
 STDMETHODIMP CDataObject::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc )\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDataObject::EnumFormatEtc\n");\r
-#endif //_DEBUG\r
-\r
        //Don't support DATADIR_SET since we accept any format\r
        if(dwDirection!=DATADIR_GET) return E_NOTIMPL;\r
 \r
@@ -203,90 +152,66 @@ STDMETHODIMP CDataObject::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC** ppe
          or resize the array to make space for one*/\r
        unsigned int i = numenums;\r
        if(enums) for( i = 0; i < numenums && enums[i] != NULL; i++ );\r
-       CEnumFORMATETC** t;\r
-       if( i == numenums ) t = (CEnumFORMATETC**) realloc(enums,sizeof(CEnumFORMATETC*)*(numenums+1));\r
-       else t = enums;\r
-       if(t){\r
-               enums = t; t[i] = new CEnumFORMATETC(this,true,&t[i]);\r
-               if(t[i]){\r
-                       HRESULT ret = t[i]->QueryInterface(IID_IEnumFORMATETC,(void**)ppenumFormatetc);\r
-                       if( i == numenums ) numenums++;\r
-                       if( ret != S_OK || *ppenumFormatetc == NULL )\r
-                               //FIXME: Should we return E_INVALIDARG or E_OUTOFMEMORY or what?\r
-                               return E_OUTOFMEMORY;\r
-               }\r
-               else return E_OUTOFMEMORY;\r
-       } else return E_OUTOFMEMORY;\r
+       CEnumFORMATETC **t;\r
+       if (i == numenums)\r
+               t = (CEnumFORMATETC**) realloc(enums, sizeof(CEnumFORMATETC *) * (numenums + 1));\r
+       else\r
+               t = enums;\r
+       if (t == 0)\r
+               return E_OUTOFMEMORY;\r
+       enums = t;\r
+       t[i] = new CEnumFORMATETC(this);\r
+       if (t[i] == 0)\r
+               return E_OUTOFMEMORY;\r
+       HRESULT ret = t[i]->QueryInterface(IID_IEnumFORMATETC, (void**)ppenumFormatetc);\r
+       if (i == numenums)\r
+               numenums++;\r
+       if (ret != S_OK || *ppenumFormatetc == NULL)\r
+               //FIXME: Should we return E_INVALIDARG or E_OUTOFMEMORY or what?\r
+               return E_OUTOFMEMORY;\r
        return S_OK;\r
 }\r
 \r
 //CEnumFORMATETC\r
 //Members\r
-CEnumFORMATETC::CEnumFORMATETC( CDataObject*par, bool delself, CEnumFORMATETC** p )\r
+CEnumFORMATETC::CEnumFORMATETC(CDataObject *par)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::IEnumFORMATETC\n");\r
-#endif //_DEBUG\r
        m_cRefCount = 0;\r
-       deleteself = delself;\r
-       pthis = p;\r
-\r
        parent = par;\r
        index = 0;\r
 }\r
 \r
-CEnumFORMATETC::~CEnumFORMATETC( void )\r
+CEnumFORMATETC::~CEnumFORMATETC()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::~IEnumFORMATETC\n");\r
-       if( m_cRefCount != 0 )\r
-               printf("Deleting %s too early 0x%x.m_cRefCount = %d\n", "IEnumFORMATETC", this, m_cRefCount);\r
-#endif //_DEBUG\r
-       if( pthis ) *pthis = NULL;\r
+       assert(m_cRefCount == 0);\r
 }\r
 \r
 //IUnknown members\r
-STDMETHODIMP CEnumFORMATETC::QueryInterface( REFIID iid, void** ppvObject )\r
+STDMETHODIMP CEnumFORMATETC::QueryInterface(REFIID iid, void **ppvObject)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::QueryInterface\n");\r
-#endif //_DEBUG\r
-\r
-       *ppvObject = NULL;\r
-\r
-       if ( iid == IID_IUnknown ) *ppvObject = (IUnknown*)this;\r
-       else if ( iid == IID_IEnumFORMATETC ) *ppvObject = (IEnumFORMATETC*)this;\r
-\r
-       if(*ppvObject){\r
-               ((IUnknown*)*ppvObject)->AddRef();\r
+       if (iid == IID_IUnknown || iid == IID_IEnumFORMATETC)\r
+       {\r
+               *ppvObject = static_cast<IEnumFORMATETC *>(this);\r
+               AddRef();\r
                return S_OK;\r
        }\r
-\r
+       *ppvObject = NULL;\r
        return E_NOINTERFACE;\r
 }\r
 \r
-STDMETHODIMP_(ULONG) CEnumFORMATETC::AddRef( void )\r
+STDMETHODIMP_(ULONG) CEnumFORMATETC::AddRef()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::AddRef\n");\r
-#endif //_DEBUG\r
        return ++m_cRefCount;\r
 }\r
 \r
-STDMETHODIMP_(ULONG) CEnumFORMATETC::Release( void )\r
+STDMETHODIMP_(ULONG) CEnumFORMATETC::Release()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::Release\n");\r
-#endif //_DEBUG\r
-       if( --m_cRefCount == 0 && deleteself ) delete this;\r
-       return m_cRefCount;\r
+       return --m_cRefCount;\r
 }\r
 \r
 //IEnumFORMATETC members\r
-STDMETHODIMP CEnumFORMATETC::Next( ULONG celt, FORMATETC* rgelt, ULONG* pceltFetched ){\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::Next\n");\r
-#endif //_DEBUG\r
+STDMETHODIMP CEnumFORMATETC::Next(ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched)\r
+{\r
        if (rgelt == 0)\r
                return E_INVALIDARG;\r
        ULONG fetched = 0;\r
@@ -300,57 +225,35 @@ STDMETHODIMP CEnumFORMATETC::Next( ULONG celt, FORMATETC* rgelt, ULONG* pceltFet
        return fetched == celt ? S_OK : S_FALSE;\r
 }\r
 \r
-STDMETHODIMP CEnumFORMATETC::Skip( ULONG celt ){\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::Skip\n");\r
-#endif //_DEBUG\r
+STDMETHODIMP CEnumFORMATETC::Skip(ULONG celt)\r
+{\r
        index += celt;\r
        return S_FALSE;\r
 }\r
 \r
-STDMETHODIMP CEnumFORMATETC::Reset( void ){\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::Reset\n");\r
-#endif //_DEBUG\r
+STDMETHODIMP CEnumFORMATETC::Reset()\r
+{\r
        index = 0;\r
        return S_OK;\r
 }\r
 \r
-STDMETHODIMP CEnumFORMATETC::Clone( IEnumFORMATETC** ppenum ){\r
-#ifdef _DEBUG\r
-       printf("IEnumFORMATETC::Clone\n");\r
-#endif //_DEBUG\r
-       return parent->EnumFormatEtc( DATADIR_GET, ppenum );\r
+STDMETHODIMP CEnumFORMATETC::Clone(IEnumFORMATETC **ppenum)\r
+{\r
+       return parent->EnumFormatEtc(DATADIR_GET, ppenum);\r
 }\r
 \r
-\r
 //Following methods not implemented yet\r
-STDMETHODIMP CDataObject::DAdvise( FORMATETC* pFormatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection )\r
+STDMETHODIMP CDataObject::DAdvise(FORMATETC *, DWORD, IAdviseSink *, DWORD *)\r
 {\r
-       UNREFERENCED_PARAMETER( pFormatetc );\r
-       UNREFERENCED_PARAMETER( advf );\r
-       UNREFERENCED_PARAMETER( pAdvSink );\r
-       UNREFERENCED_PARAMETER( pdwConnection );\r
-#ifdef _DEBUG\r
-       printf("IDataObject::DAdvise\n");\r
-#endif //_DEBUG\r
        return E_NOTIMPL;\r
 }\r
 \r
-STDMETHODIMP CDataObject::DUnadvise( DWORD dwConnection )\r
+STDMETHODIMP CDataObject::DUnadvise(DWORD)\r
 {\r
-       UNREFERENCED_PARAMETER( dwConnection );\r
-#ifdef _DEBUG\r
-       printf("IDataObject::DUnadvise\n");\r
-#endif //_DEBUG\r
        return E_NOTIMPL;\r
 }\r
 \r
-STDMETHODIMP CDataObject::EnumDAdvise( IEnumSTATDATA** ppenumAdvise )\r
+STDMETHODIMP CDataObject::EnumDAdvise(IEnumSTATDATA **)\r
 {\r
-       UNREFERENCED_PARAMETER( ppenumAdvise );\r
-#ifdef _DEBUG\r
-       printf("IDataObject::EnumDAdvise\n");\r
-#endif //_DEBUG\r
        return E_NOTIMPL;\r
 }\r
index 2d0e048..bd7f46a 100644 (file)
@@ -15,37 +15,35 @@ class CDataObject: public IDataObject
        friend CEnumFORMATETC;\r
 private:\r
        ULONG m_cRefCount;\r
-       bool deleteself;\r
-       CDataObject** pthis;\r
 \r
        bool allowSetData;      //Allow the IDataObject::SetData call\r
-       DataSpecifierdata;    //Pointer to an array of STGMEDIUM+FORMATETC pairs\r
+       DataSpecifier *data;    //Pointer to an array of STGMEDIUM+FORMATETC pairs\r
        unsigned int numdata;   //Number of data objects in data\r
-       CEnumFORMATETC** enums; //An array of pointers to IEnumFORMATETC objects\r
+       CEnumFORMATETC **enums; //An array of pointers to IEnumFORMATETC objects\r
        unsigned int numenums;  //Number of pointers in enums\r
 \r
 public:\r
        //Members\r
-       CDataObject( bool delself = false, CDataObject** p = NULL );\r
-       ~CDataObject( void );\r
-       void DisableSetData( void );\r
-       void Empty( void );\r
+       CDataObject();\r
+       ~CDataObject();\r
+       void DisableSetData();\r
+       void Empty();\r
 \r
        //IUnknown members\r
-       STDMETHODIMP QueryInterface( REFIID iid, void** ppvObject );\r
-       STDMETHODIMP_(ULONG) AddRef( void );\r
-       STDMETHODIMP_(ULONG) Release( void );\r
+       STDMETHODIMP QueryInterface(REFIID iid, void **ppvObject);\r
+       STDMETHODIMP_(ULONG) AddRef();\r
+       STDMETHODIMP_(ULONG) Release();\r
 \r
        //IDataObject members\r
-       STDMETHODIMP GetData( FORMATETC* pFormatetc, STGMEDIUM* pmedium );\r
-       STDMETHODIMP GetDataHere( FORMATETC* pFormatetc, STGMEDIUM* pmedium );\r
-       STDMETHODIMP QueryGetData( FORMATETC* pFormatetc );\r
-       STDMETHODIMP GetCanonicalFormatEtc( FORMATETC* pFormatetcIn, FORMATETC* pFormatetcOut );\r
-       STDMETHODIMP SetData( FORMATETC* pFormatetc, STGMEDIUM* pmedium, BOOL fRelease );\r
-       STDMETHODIMP EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc );\r
-       STDMETHODIMP DAdvise( FORMATETC* pFormatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection );\r
-       STDMETHODIMP DUnadvise( DWORD dwConnection );\r
-       STDMETHODIMP EnumDAdvise( IEnumSTATDATA** ppenumAdvise );\r
+       STDMETHODIMP GetData(FORMATETC *pFormatetc, STGMEDIUM *pmedium);\r
+       STDMETHODIMP GetDataHere(FORMATETC *pFormatetc, STGMEDIUM* pmedium);\r
+       STDMETHODIMP QueryGetData(FORMATETC *pFormatetc);\r
+       STDMETHODIMP GetCanonicalFormatEtc(FORMATETC *pFormatetcIn, FORMATETC *pFormatetcOut);\r
+       STDMETHODIMP SetData(FORMATETC *pFormatetc, STGMEDIUM *pmedium, BOOL fRelease);\r
+       STDMETHODIMP EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppenumFormatetc);\r
+       STDMETHODIMP DAdvise(FORMATETC *pFormatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection);\r
+       STDMETHODIMP DUnadvise(DWORD dwConnection);\r
+       STDMETHODIMP EnumDAdvise(IEnumSTATDATA **ppenumAdvise);\r
 };\r
 \r
 class CEnumFORMATETC : public IEnumFORMATETC\r
@@ -60,19 +58,19 @@ private:
 \r
 public:\r
        //Members\r
-       CEnumFORMATETC( CDataObject*par, bool delself = false, CEnumFORMATETC** p = NULL );\r
-       ~CEnumFORMATETC( void );\r
+       CEnumFORMATETC(CDataObject *);\r
+       ~CEnumFORMATETC();\r
 \r
        //IUnknown members\r
-       STDMETHODIMP QueryInterface( REFIID iid, void** ppvObject );\r
-       STDMETHODIMP_(ULONG) AddRef( void );\r
-       STDMETHODIMP_(ULONG) Release( void );\r
+       STDMETHODIMP QueryInterface(REFIID iid, void **ppvObject);\r
+       STDMETHODIMP_(ULONG) AddRef();\r
+       STDMETHODIMP_(ULONG) Release();\r
 \r
        //IEnumFORMATETC members\r
-       STDMETHODIMP Next( ULONG celt, FORMATETC* rgelt, ULONG* pceltFetched );\r
-       STDMETHODIMP Skip( ULONG celt );\r
-       STDMETHODIMP Reset( void );\r
-       STDMETHODIMP Clone( IEnumFORMATETC** ppenum );\r
+       STDMETHODIMP Next(ULONG celt, FORMATETC *rgelt, ULONG* pceltFetched);\r
+       STDMETHODIMP Skip(ULONG celt);\r
+       STDMETHODIMP Reset();\r
+       STDMETHODIMP Clone(IEnumFORMATETC ** ppenum);\r
 };\r
 \r
 #endif // ido_h
\ No newline at end of file
index fdd1d41..cb0517c 100644 (file)
@@ -2,86 +2,53 @@
 #include "ids.h"\r
 #include "hexwnd.h"\r
 \r
-\r
 //Members\r
-CDropSource::CDropSource( bool delself, CDropSource** p )//When using C++ new need to call like so someptr = new CDataObject(1,someptr);\r
+CDropSource::CDropSource()\r
+: m_cRefCount(0)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDropSource::IDropSource\n");\r
-#endif //_DEBUG\r
-       m_cRefCount = 0;\r
-       deleteself = delself;\r
-       pthis = p;\r
 }\r
 \r
-CDropSource::~CDropSource( void )\r
+CDropSource::~CDropSource()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDropSource::~IDropSource\n");\r
-       if( m_cRefCount != 0 )\r
-               printf("Deleting %s too early 0x%x.m_cRefCount = %d\n", "IDropSource", this, m_cRefCount);\r
-#endif //_DEBUG\r
-       if( pthis ) *pthis = NULL;\r
+       assert(m_cRefCount == 0);\r
 }\r
 \r
-\r
 //IUnknown members\r
-STDMETHODIMP CDropSource::QueryInterface( REFIID iid, void** ppvObject )\r
+STDMETHODIMP CDropSource::QueryInterface(REFIID iid, void **ppvObject)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDropSource::QueryInterface\n");\r
-#endif //_DEBUG\r
-\r
-       *ppvObject = NULL;\r
-\r
-       if ( iid == IID_IUnknown ) *ppvObject = (IUnknown*)this;\r
-       else if ( iid == IID_IDropSource ) *ppvObject = (IDropSource*)this;\r
-\r
-       if(*ppvObject){\r
-               ((IUnknown*)*ppvObject)->AddRef();\r
+       if (iid == IID_IUnknown || iid == IID_IDropSource)\r
+       {\r
+               *ppvObject = static_cast<IDropSource *>(this);\r
+               AddRef();\r
                return S_OK;\r
        }\r
-\r
+       *ppvObject = NULL;\r
        return E_NOINTERFACE;\r
 }\r
 \r
-STDMETHODIMP_(ULONG) CDropSource::AddRef( void )\r
+STDMETHODIMP_(ULONG) CDropSource::AddRef()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDropSource::AddRef\n");\r
-#endif //_DEBUG\r
        return ++m_cRefCount;\r
 }\r
 \r
-STDMETHODIMP_(ULONG) CDropSource::Release( void )\r
+STDMETHODIMP_(ULONG) CDropSource::Release()\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDropSource::Release\n");\r
-#endif //_DEBUG\r
-       if( --m_cRefCount == 0 && deleteself ) delete this;\r
-       return m_cRefCount;\r
+       return --m_cRefCount;\r
 }\r
 \r
-\r
 //IDropSource members\r
-STDMETHODIMP CDropSource::GiveFeedback( DWORD dwEffect )\r
+STDMETHODIMP CDropSource::GiveFeedback(DWORD)\r
 {\r
-       UNREFERENCED_PARAMETER( dwEffect );\r
-#ifdef _DEBUG\r
-       printf("IDropSource::GiveFeedback\n");\r
-#endif //_DEBUG\r
        return DRAGDROP_S_USEDEFAULTCURSORS;\r
 }\r
 \r
-STDMETHODIMP CDropSource::QueryContinueDrag( BOOL fEscapePressed, DWORD grfKeyState )\r
+STDMETHODIMP CDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)\r
 {\r
-#ifdef _DEBUG\r
-       printf("IDropSource::QueryContinueDrag\n");\r
-#endif //_DEBUG\r
        //Cancel when escape is pressed\r
-       if(fEscapePressed) return DRAGDROP_S_CANCEL;\r
+       if (fEscapePressed)\r
+               return DRAGDROP_S_CANCEL;\r
        //Complete if there are no mouse buttons pressed\r
-       if(!(grfKeyState&(MK_LBUTTON|MK_MBUTTON|MK_RBUTTON)))\r
+       if(!(grfKeyState & (MK_LBUTTON|MK_MBUTTON|MK_RBUTTON)))\r
                return DRAGDROP_S_DROP;\r
        //Otherwise continue the drag operation\r
        return S_OK;\r
index 237ea27..c5eeaf8 100644 (file)
@@ -6,22 +6,20 @@ class CDropSource: public IDropSource
 {\r
 private:\r
        ULONG m_cRefCount;\r
-       bool deleteself;\r
-       CDropSource** pthis;\r
 \r
 public:\r
        //Members\r
-       CDropSource( bool delself = false, CDropSource** p = NULL);\r
-       ~CDropSource( void );\r
+       CDropSource();\r
+       ~CDropSource();\r
 \r
        //IUnknown members\r
-       STDMETHODIMP QueryInterface( REFIID iid, void** ppvObject );\r
-       STDMETHODIMP_(ULONG) AddRef( void );\r
-       STDMETHODIMP_(ULONG) Release( void );\r
+       STDMETHODIMP QueryInterface(REFIID iid, void **ppvObject);\r
+       STDMETHODIMP_(ULONG) AddRef();\r
+       STDMETHODIMP_(ULONG) Release();\r
 \r
        //IDataObject members\r
-       STDMETHODIMP GiveFeedback( DWORD dwEffect );\r
-       STDMETHODIMP QueryContinueDrag( BOOL fEscapePressed,DWORD grfKeyState );\r
+       STDMETHODIMP GiveFeedback(DWORD dwEffect);\r
+       STDMETHODIMP QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);\r
 };\r
 \r
 \r
index a08641a..a309065 100644 (file)
@@ -7,10 +7,11 @@
 #include "toolbar.h"\r
 \r
 static const char szMainClass[] = "frhed wndclass";\r
-static const char szHexClassA[] = "hekseditA_" CURRENT_VERSION "." SUB_RELEASE_NO;\r
-static const char szHexClassW[] = "hekseditW_" CURRENT_VERSION "." SUB_RELEASE_NO;\r
+static const char szHexClassA[] = "hekseditA_" CURRENT_VERSION "." SUB_RELEASE_NO "." BUILD_NO;\r
+static const char szHexClassW[] = "hekseditW_" CURRENT_VERSION "." SUB_RELEASE_NO "." BUILD_NO;\r
 \r
 HINSTANCE hMainInstance;\r
+\r
 LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);\r
 \r
 static BOOL NTAPI IsNT()\r
@@ -23,7 +24,6 @@ static BOOL NTAPI IsNT()
        return osvi.dwPlatformId == VER_PLATFORM_WIN32_NT;\r
 }\r
 \r
-\r
 static BOOL CALLBACK WndEnumProcCountInstances(HWND hwnd, LPARAM lParam)\r
 {\r
        char buf[64];\r
@@ -78,11 +78,10 @@ int WINAPI WinMain(HINSTANCE hIconInstance, HINSTANCE, char *szCmdLine, int)
        pHexWnd->iInstCount = iInstCount;\r
        pHexWnd->read_ini_data();\r
 \r
-       /*The if prevents the window from being resized to 0x0\r
-        it becomes just a title bar*/\r
+       // The if prevents the window from being resized to 0x0 it becomes just a title bar\r
        if (pHexWnd->iWindowX != CW_USEDEFAULT)\r
        {\r
-               //Prevent window creep when Taskbar is at top or left of screen\r
+               // Prevent window creep when Taskbar is at top or left of screen\r
                WINDOWPLACEMENT wp;\r
                wp.length = sizeof wp;\r
                GetWindowPlacement(hwndMain, &wp);\r
@@ -188,6 +187,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
                hwndMain = hwnd;\r
                DragAcceptFiles(hwnd, TRUE); // Accept files dragged into main window.\r
                hwndToolBar = CreateTBar(hwnd, hMainInstance);\r
+               SendMessage(hwndToolBar, CCM_SETUNICODEFORMAT, TRUE, 0);\r
                hwndHex = CreateWindowEx(WS_EX_CLIENTEDGE,\r
                        IsNT() ? szHexClassW : szHexClassA, 0,\r
                        WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL,\r
@@ -201,6 +201,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
                pHexWnd->hwndStatusBar = hwndStatusBar;\r
                pHexWnd->bSaveIni = TRUE;\r
                pHexWnd->bCenterCaret = TRUE;\r
+               pHexWnd->load_lang((LANGID)GetThreadLocale());\r
                pHexWnd->set_wnd_title();\r
                return 0;\r
        case WM_COMMAND:\r
@@ -221,22 +222,29 @@ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
                break;\r
        case WM_SIZE:\r
                {\r
-                       SendMessage(hwndStatusBar, WM_SIZE, 0 , 0); //Moves status bar back to the bottom\r
-                       SendMessage(hwndToolBar, WM_SIZE, 0 , 0); //Moves tool bar back to the top\r
-\r
+                       int cx = GET_X_LPARAM(lParam);\r
+                       int cy = GET_Y_LPARAM(lParam);\r
+                       RECT rect;\r
+                       // Adjust tool bar width so buttons will wrap accordingly.\r
+                       MoveWindow(hwndToolBar, 0, 0, cx, 0, TRUE);\r
+                       // Set tool bar height to bottom of last button plus some padding.\r
+                       if (int n = SendMessage(hwndToolBar, TB_BUTTONCOUNT, 0, 0))\r
+                       {\r
+                               SendMessage(hwndToolBar, TB_GETITEMRECT, n - 1, (LPARAM)&rect);\r
+                               MoveWindow(hwndToolBar, 0, 0, cx, rect.bottom + 2, TRUE);\r
+                       }\r
+                       GetWindowRect(hwndToolBar, &rect);\r
+                       int cyToolBar = rect.bottom - rect.top;\r
+                       // Moves status bar back to the bottom\r
+                       SendMessage(hwndStatusBar, WM_SIZE, 0, 0);\r
+                       GetWindowRect(hwndStatusBar, &rect);\r
+                       int cyStatusBar = rect.bottom - rect.top;\r
                        //--------------------------------------------\r
                        // Set statusbar divisions.\r
-                       int statbarw = LOWORD(lParam);\r
                        // Calculate the right edge coordinate for each part\r
-                       int parts[] = { statbarw * 4 / 6, statbarw * 5 / 6, statbarw };\r
-\r
-                       SendMessage(hwndStatusBar, SB_SETPARTS, (WPARAM) 3, (LPARAM)parts);\r
-\r
-                       RECT rect;\r
-                       GetClientRect(hwndToolBar, &rect);\r
-                       int iToolbarHeight = rect.bottom - rect.top;\r
-                       GetClientRect(hwndStatusBar, &rect);\r
-                       MoveWindow(hwndHex, 0, iToolbarHeight, LOWORD(lParam), HIWORD(lParam)-rect.bottom-iToolbarHeight, TRUE);\r
+                       int parts[] = { MulDiv(cx, 4, 6), MulDiv(cx, 5, 6), cx };\r
+                       SendMessage(hwndStatusBar, SB_SETPARTS, RTL_NUMBER_OF(parts), (LPARAM)parts);\r
+                       MoveWindow(hwndHex, 0, cyToolBar, cx, cy - cyToolBar - cyStatusBar, TRUE);\r
                }\r
                break;\r
        case WM_NOTIFY:\r
@@ -251,15 +259,14 @@ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
                        }\r
                        else if (hwndFrom == hwndToolBar)\r
                        {\r
-                               if (code == TBN_GETINFOTIPA)\r
-                               {\r
-                                       NMTBGETINFOTIPA *pi = (NMTBGETINFOTIPA *)lParam;\r
-                                       LoadStringA(hMainInstance, pi->iItem, pi->pszText, pi->cchTextMax);\r
-                               }\r
-                               else if (code == TBN_GETINFOTIPW)\r
+                               if (code == TBN_GETINFOTIPW)\r
                                {\r
                                        NMTBGETINFOTIPW *pi = (NMTBGETINFOTIPW *)lParam;\r
-                                       LoadStringW(hMainInstance, pi->iItem, pi->pszText, pi->cchTextMax);\r
+                                       if (BSTR text = pHexWnd->load_string(pi->iItem))\r
+                                       {\r
+                                               StrCpyNW(pi->pszText, text, pi->cchTextMax);\r
+                                               pHexWnd->free_string(text);\r
+                                       }\r
                                }\r
                        }\r
                }\r
index 2045f53..597ee7b 100644 (file)
 #define IDC_ENABLE_DROP                 1080\r
 #define IDC_EXPORTDIGITS                1081\r
 #define IDC_APPICON                     1082\r
+#define IDC_COMBO1                      1083\r
+#define IDS_DiffListItemFormat          10001\r
 #define IDM_OLE_DRAG_DROP               40142\r
 \r
 // Next default values for new objects\r
 #define _APS_NO_MFC                     1\r
 #define _APS_NEXT_RESOURCE_VALUE        145\r
 #define _APS_NEXT_COMMAND_VALUE         40143\r
-#define _APS_NEXT_CONTROL_VALUE         1083\r
+#define _APS_NEXT_CONTROL_VALUE         1084\r
 #define _APS_NEXT_SYMED_VALUE           101\r
 #endif\r
 #endif\r
index 5c89d44..e34bc78 100644 (file)
@@ -3,11 +3,11 @@
 #include "resource.h"\r
 \r
 #define IMAGEWIDTH 16\r
-#define IMAGEHEIGHT 17\r
+#define IMAGEHEIGHT 16\r
 #define BUTTONWIDTH 0\r
 #define BUTTONHEIGHT 0\r
 \r
-TBBUTTON tbButtons[] = // Array defining the toolbar buttons\r
+static const TBBUTTON tbButtons[] = // Array defining the toolbar buttons\r
 {\r
        {  0, IDM_NEW,                   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },\r
        {  1, IDM_OPEN,                  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },\r
@@ -31,18 +31,18 @@ TBBUTTON tbButtons[] = // Array defining the toolbar buttons
 HWND CreateTBar(HWND hWnd, HINSTANCE hInst)\r
 {\r
        HWND hwndToolBar = CreateToolbarEx(hWnd,\r
-               WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | TBSTYLE_WRAPABLE,\r
+               WS_CHILD | WS_VISIBLE | CCS_NORESIZE |\r
+               TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | TBSTYLE_WRAPABLE,\r
                0,\r
-               sizeof(tbButtons)/sizeof(TBBUTTON),\r
+               RTL_NUMBER_OF(tbButtons) - 4,\r
                hInst,\r
                IDB_TOOLBAR,\r
                tbButtons,\r
-               sizeof(tbButtons)/sizeof(TBBUTTON),\r
+               RTL_NUMBER_OF(tbButtons),\r
                BUTTONWIDTH,\r
                BUTTONHEIGHT,\r
                IMAGEWIDTH,\r
                IMAGEHEIGHT,\r
                sizeof(TBBUTTON));\r
-\r
        return hwndToolBar;\r
 }\r
index 10e35cd..cdf44a4 100644 (file)
@@ -1,3 +1,4 @@
 #define FRHED_MAJOR_VERSION 1\r
 #define FRHED_MINOR_VERSION 2\r
 #define FRHED_SUB_RELEASE_NO 1\r
+#define FRHED_BUILD_NO 1\r
index 7487748..5ad4b74 100644 (file)
@@ -6,10 +6,11 @@
 \r
 #define CURRENT_VERSION SHARPEN(A,FRHED_MAJOR_VERSION) "." SHARPEN(A,FRHED_MINOR_VERSION)\r
 #define SUB_RELEASE_NO SHARPEN(A,FRHED_SUB_RELEASE_NO)\r
+#define BUILD_NO SHARPEN(A,FRHED_BUILD_NO)\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
- FILEVERSION FRHED_MAJOR_VERSION,FRHED_MINOR_VERSION,FRHED_SUB_RELEASE_NO,0\r
- PRODUCTVERSION FRHED_MAJOR_VERSION,FRHED_MINOR_VERSION,FRHED_SUB_RELEASE_NO,0\r
+ FILEVERSION FRHED_MAJOR_VERSION,FRHED_MINOR_VERSION,FRHED_SUB_RELEASE_NO,FRHED_BUILD_NO\r
+ PRODUCTVERSION FRHED_MAJOR_VERSION,FRHED_MINOR_VERSION,FRHED_SUB_RELEASE_NO,FRHED_BUILD_NO\r
  FILEFLAGSMASK 0x3fL\r
 #ifdef _DEBUG\r
  FILEFLAGS 0x21L\r
@@ -26,15 +27,15 @@ BEGIN
         BEGIN\r
             VALUE "Comments", "Homepage: http://www.kibria.de, http://zip.to/pabs3\0"\r
             VALUE "CompanyName", "(c) Raihan Kibria 2000\0"\r
-            VALUE "FileDescription", "frhed - free hex editor " CURRENT_VERSION "." SUB_RELEASE_NO\r
-            VALUE "FileVersion", CURRENT_VERSION "." SUB_RELEASE_NO\r
+            VALUE "FileDescription", "frhed - free hex editor " CURRENT_VERSION "." SUB_RELEASE_NO "." BUILD_NO\r
+            VALUE "FileVersion", CURRENT_VERSION "." SUB_RELEASE_NO "." BUILD_NO\r
             VALUE "InternalName", "frhed\0"\r
             VALUE "LegalCopyright", "GNU General Public License v2.0\0"\r
             VALUE "LegalTrademarks", "\0"\r
             VALUE "OriginalFilename", "frhed.exe\0"\r
             VALUE "PrivateBuild", "\0"\r
             VALUE "ProductName", "frhed\0"\r
-            VALUE "ProductVersion", CURRENT_VERSION "." SUB_RELEASE_NO\r
+            VALUE "ProductVersion", CURRENT_VERSION "." SUB_RELEASE_NO "." BUILD_NO\r
             VALUE "SpecialBuild", "\0"\r
         END\r
     END\r