Skip to content

Commit

Permalink
[New] Wildcard Search ability.
Browse files Browse the repository at this point in the history
[Fixes] wstr2num/str2num std::make_signed type trait before underflow checking.
Added forgotten m_pDlgGoTo->DestroyWindow() to CHexCtrl::OnDestroy.
Numpad numeric keys wrongly interpreted in Hex area (wrong legacy behavior)(#26).
[Changes] Latest IListEx.
  • Loading branch information
jovibor committed Nov 2, 2020
1 parent 511fa72 commit 38d0223
Show file tree
Hide file tree
Showing 9 changed files with 202 additions and 145 deletions.
29 changes: 15 additions & 14 deletions HexCtrl/res/HexCtrl.rc
Original file line number Diff line number Diff line change
Expand Up @@ -51,30 +51,31 @@ END
// Dialog
//

IDD_HEXCTRL_SEARCH DIALOGEX 0, 0, 351, 188
IDD_HEXCTRL_SEARCH DIALOGEX 0, 0, 357, 187
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE | WS_EX_LAYERED
CAPTION "Search and Replace..."
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
COMBOBOX IDC_HEXCTRL_SEARCH_COMBO_SEARCH,71,16,170,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_HEXCTRL_SEARCH_COMBO_REPLACE,71,32,170,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "<< Search",IDC_HEXCTRL_SEARCH_BTN_SEARCH_B,248,16,41,14
DEFPUSHBUTTON "Search >>",IDC_HEXCTRL_SEARCH_BTN_SEARCH_F,291,16,41,14
PUSHBUTTON "Replace",IDC_HEXCTRL_SEARCH_BTN_REPLACE,248,46,41,14
PUSHBUTTON "Replace All",IDC_HEXCTRL_SEARCH_BTN_REPLACE_ALL,291,47,41,14
COMBOBOX IDC_HEXCTRL_SEARCH_COMBO_SEARCH,71,16,179,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_HEXCTRL_SEARCH_COMBO_REPLACE,71,32,179,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "<< Search",IDC_HEXCTRL_SEARCH_BTN_SEARCH_B,258,16,41,14
DEFPUSHBUTTON "Search >>",IDC_HEXCTRL_SEARCH_BTN_SEARCH_F,301,16,41,14
PUSHBUTTON "Replace",IDC_HEXCTRL_SEARCH_BTN_REPLACE,258,46,41,14
PUSHBUTTON "Replace All",IDC_HEXCTRL_SEARCH_BTN_REPLACE_ALL,301,47,41,14
LTEXT "",IDC_HEXCTRL_SEARCH_STATIC_TEXTBOTTOM,10,176,280,8
LTEXT "Find:",IDC_STATIC,51,19,17,8
LTEXT "Replace with:",IDC_STATIC,24,35,44,8
CONTROL "Selection",IDC_HEXCTRL_SEARCH_CHECK_SELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,201,48,43,10
CONTROL "In selection",IDC_HEXCTRL_SEARCH_CHECK_SELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,203,48,47,8
COMBOBOX IDC_HEXCTRL_SEARCH_COMBO_MODE,71,48,82,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Search mode:",IDC_STATIC,23,51,44,8
CONTROL "",IDC_HEXCTRL_SEARCH_LIST_MAIN,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,7,81,337,93
PUSHBUTTON "Find All",IDC_HEXCTRL_SEARCH_BTN_FINDALL,248,31,84,14
LTEXT "Search mode:",IDC_STATIC,23,50,44,8
CONTROL "",IDC_HEXCTRL_SEARCH_LIST_MAIN,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,7,81,343,93
PUSHBUTTON "Find All",IDC_HEXCTRL_SEARCH_BTN_FINDALL,258,31,84,14
EDITTEXT IDC_HEXCTRL_SEARCH_EDIT_START,71,64,82,12,ES_AUTOHSCROLL
LTEXT "Start search at:",IDC_STATIC,17,66,52,8
EDITTEXT IDC_HEXCTRL_SEARCH_EDIT_STEP,182,64,59,12,ES_AUTOHSCROLL
EDITTEXT IDC_HEXCTRL_SEARCH_EDIT_STEP,182,64,68,12,ES_AUTOHSCROLL,WS_EX_RIGHT
LTEXT "Step:",IDC_STATIC,160,66,18,8
CONTROL "Wildcard",IDC_HEXCTRL_SEARCH_CHECK_WILDCARD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,48,38,8
END

IDD_HEXCTRL_ABOUT DIALOGEX 0, 0, 187, 65
Expand Down Expand Up @@ -257,9 +258,9 @@ BEGIN
IDD_HEXCTRL_SEARCH, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 344
RIGHTMARGIN, 350
TOPMARGIN, 7
BOTTOMMARGIN, 187
BOTTOMMARGIN, 186
END

IDD_HEXCTRL_ABOUT, DIALOG
Expand Down
4 changes: 3 additions & 1 deletion HexCtrl/res/HexCtrlRes.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@
#define IDC_HEXCTRL_GOTO_STATIC_OFFRANGE 9268
#define IDC_HEXCTRL_GOTO_STATIC_PAGETOTAL 9269
#define IDC_HEXCTRL_GOTO_STATIC_PAGERANGE 9270
#define IDC_CHECK1 9271
#define IDC_HEXCTRL_SEARCH_CHECK_WILDCARD 9271
#define IDM_HEXCTRL_DLG_SEARCH 32769
#define IDM_HEXCTRL_MODIFY_UNDO 32770
#define IDM_HEXCTRL_MODIFY_REDO 32771
Expand Down Expand Up @@ -143,7 +145,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 9271
#define _APS_NEXT_COMMAND_VALUE 32815
#define _APS_NEXT_CONTROL_VALUE 9271
#define _APS_NEXT_CONTROL_VALUE 9272
#define _APS_NEXT_SYMED_VALUE 9333
#endif
#endif
54 changes: 26 additions & 28 deletions HexCtrl/src/CHexCtrl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4203,10 +4203,6 @@ void CHexCtrl::OnChar(UINT nChar, UINT /*nRepCnt*/, UINT /*nFlags*/)
if (!m_fMutable || !IsCurTextArea() || (GetKeyState(VK_CONTROL) < 0))
return;

SMODIFY hms;
hms.vecSpan.emplace_back(HEXSPANSTRUCT { m_ullCaretPos, 1 });
hms.ullDataSize = 1;

BYTE chByte = nChar & 0xFF;
WCHAR warrCurrLocaleID[KL_NAMELENGTH];
GetKeyboardLayoutNameW(warrCurrLocaleID); //Current langID as wstring.
Expand All @@ -4225,6 +4221,9 @@ void CHexCtrl::OnChar(UINT nChar, UINT /*nRepCnt*/, UINT /*nFlags*/)
}
}

SMODIFY hms;
hms.vecSpan.emplace_back(HEXSPANSTRUCT { m_ullCaretPos, 1 });
hms.ullDataSize = 1;
hms.pData = reinterpret_cast<std::byte*>(&chByte);
Modify(hms);
CaretMoveRight();
Expand Down Expand Up @@ -4276,6 +4275,7 @@ void CHexCtrl::OnDestroy()
m_pDlgEncoding->DestroyWindow();
m_pDlgOpers->DestroyWindow();
m_pDlgSearch->DestroyWindow();
m_pDlgGoTo->DestroyWindow();
m_pScrollV->DestroyWindow();
m_pScrollH->DestroyWindow();

Expand Down Expand Up @@ -4374,34 +4374,32 @@ void CHexCtrl::OnKeyDown(UINT nChar, UINT /*nRepCnt*/, UINT nFlags)
if (auto optCmd = GetCommand(static_cast<BYTE>(nChar),
GetAsyncKeyState(VK_CONTROL) < 0, GetAsyncKeyState(VK_SHIFT) < 0, GetAsyncKeyState(VK_MENU) < 0); optCmd)
ExecuteCmd(optCmd.value());
else if (m_fMutable)
else if (IsMutable() && !IsCurTextArea()) //If caret is in Hex area, just one part (High/Low) of byte must be changed.
{
SMODIFY hms;
hms.vecSpan.emplace_back(HEXSPANSTRUCT { m_ullCaretPos, 1 });
hms.ullDataSize = 1;

BYTE chByte = nChar & 0xFF;
if (!IsCurTextArea()) //If cursor is not in Ascii area then just one part (High/Low) of byte must be changed.
{
if (chByte >= 0x30 && chByte <= 0x39) //Digits.
chByte -= 0x30;
else if (chByte >= 0x41 && chByte <= 0x46) //Hex letters uppercase.
chByte -= 0x37;
else if (chByte >= 0x61 && chByte <= 0x66) //Hex letters lowercase.
chByte -= 0x57;
else
return;
//Normalizing all input in Hex area, reducing it to 0-15 (0x0-F) digit range.
//Allowing only [0-9][A-F][NUM0-NUM9].
if (chByte >= 0x30 && chByte <= 0x39) //Digits [0-9].
chByte -= 0x30;
else if (chByte >= 0x41 && chByte <= 0x46) //Hex letters [A-F].
chByte -= 0x37;
else if (chByte >= 0x60 && chByte <= 0x69) //VK_NUMPAD0 - VK_NUMPAD9 [NUM0-NUM9].
chByte -= 0x60;
else
return;

auto chByteCurr = GetData<BYTE>(m_ullCaretPos);
if (m_fCursorHigh)
chByte = (chByte << 4) | (chByteCurr & 0x0F);
else
chByte = (chByte & 0x0F) | (chByteCurr & 0xF0);
auto chByteCurr = GetData<BYTE>(m_ullCaretPos);
if (m_fCursorHigh)
chByte = (chByte << 4) | (chByteCurr & 0x0F);
else
chByte = (chByte & 0x0F) | (chByteCurr & 0xF0);

hms.pData = reinterpret_cast<std::byte*>(&chByte);
Modify(hms);
CaretMoveRight();
}
SMODIFY hms;
hms.vecSpan.emplace_back(HEXSPANSTRUCT { m_ullCaretPos, 1 });
hms.ullDataSize = 1;
hms.pData = reinterpret_cast<std::byte*>(&chByte);
Modify(hms);
CaretMoveRight();
}

m_optRMouseClick.reset(); //Reset right mouse click.
Expand Down
Loading

0 comments on commit 38d0223

Please sign in to comment.