#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
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
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
#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
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
// (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
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
class LangArray : public SimpleArray<char *>\r
{\r
public:\r
+ static const LANGID DefLangId;\r
struct StringData\r
{\r
int refcount;\r
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
// 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
--- /dev/null
+#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
--- /dev/null
+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
--- /dev/null
+#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
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
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
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
# 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
# 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
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
#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
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
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
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
LEFTMARGIN, 7\r
RIGHTMARGIN, 205\r
TOPMARGIN, 7\r
- BOTTOMMARGIN, 192\r
END\r
\r
IDD_HEXDUMPDIALOG, DIALOG\r
IDD_VIEWSETTINGSDIALOG, DIALOG\r
BEGIN\r
LEFTMARGIN, 7\r
- RIGHTMARGIN, 221\r
+ RIGHTMARGIN, 241\r
TOPMARGIN, 7\r
BOTTOMMARGIN, 160\r
END\r
END\r
#endif // APSTUDIO_INVOKED\r
\r
+\r
/////////////////////////////////////////////////////////////////////////////\r
//\r
// Bitmap\r
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
</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
#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
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
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
+void GetWindowText(HWND, SimpleString &);\r
+void GetDlgItemText(HWND, int, SimpleString &);\r
+\r
class DragDropOptionsDlg : public HexEditorWindow\r
{\r
public:\r
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
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
// 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
//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
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
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
// 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
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
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
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
\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
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
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
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
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
\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
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
\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
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
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
friend CEnumFORMATETC;\r
private:\r
ULONG m_cRefCount;\r
- bool deleteself;\r
- CDataObject** pthis;\r
\r
bool allowSetData; //Allow the IDataObject::SetData call\r
- DataSpecifier* data; //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
\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
#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
{\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
#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
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
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
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
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
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
}\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
#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
#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
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
#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
\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
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