From 1a92fc283187829e26d62a8b6f0f8dd258a1a7c8 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Wed, 28 Jul 2010 19:13:24 +0000 Subject: [PATCH] Bug 5531: [PATCH] regedit: cut, copy, paste, etc. on hexedit by Katayama Hirofumi svn path=/trunk/; revision=48334 --- reactos/base/applications/regedit/childwnd.c | 2 +- reactos/base/applications/regedit/hexedit.c | 283 ++++++++++++++++-- .../base/applications/regedit/lang/bg-BG.rc | 9 + .../base/applications/regedit/lang/cs-CZ.rc | 9 + .../base/applications/regedit/lang/de-DE.rc | 9 + .../base/applications/regedit/lang/el-GR.rc | 9 + .../base/applications/regedit/lang/en-US.rc | 9 + .../base/applications/regedit/lang/es-ES.rc | 9 + .../base/applications/regedit/lang/fr-FR.rc | 9 + .../base/applications/regedit/lang/hu-HU.rc | 9 + .../base/applications/regedit/lang/id-ID.rc | 9 + .../base/applications/regedit/lang/it-IT.rc | 9 + .../base/applications/regedit/lang/ja-JP.rc | 9 + .../base/applications/regedit/lang/ko-KR.rc | 9 + .../base/applications/regedit/lang/nl-NL.rc | 9 + .../base/applications/regedit/lang/no-NO.rc | 9 + .../base/applications/regedit/lang/pl-PL.rc | 9 + .../base/applications/regedit/lang/pt-BR.rc | 9 + .../base/applications/regedit/lang/pt-PT.rc | 9 + .../base/applications/regedit/lang/ru-RU.rc | 9 + .../base/applications/regedit/lang/sk-SK.rc | 9 + .../base/applications/regedit/lang/sl-SI.rc | 9 + .../base/applications/regedit/lang/sv-SE.rc | 9 + .../base/applications/regedit/lang/th-TH.rc | 9 + .../base/applications/regedit/lang/uk-UA.rc | 9 + .../base/applications/regedit/lang/zh-CN.rc | 9 + reactos/base/applications/regedit/main.h | 1 + reactos/base/applications/regedit/resource.h | 7 + reactos/base/applications/regedit/treeview.c | 26 +- 29 files changed, 508 insertions(+), 27 deletions(-) diff --git a/reactos/base/applications/regedit/childwnd.c b/reactos/base/applications/regedit/childwnd.c index 0d76562ae39..6f3de0b4910 100644 --- a/reactos/base/applications/regedit/childwnd.c +++ b/reactos/base/applications/regedit/childwnd.c @@ -587,8 +587,8 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa } else pt.x = pt.y = 0; + ClientToScreen(pChildWnd->hListWnd, &pt); } - ClientToScreen(pChildWnd->hListWnd, &pt); if(i == -1) { TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL); diff --git a/reactos/base/applications/regedit/hexedit.c b/reactos/base/applications/regedit/hexedit.c index b84f431d04e..8a7438be84e 100644 --- a/reactos/base/applications/regedit/hexedit.c +++ b/reactos/base/applications/regedit/hexedit.c @@ -47,9 +47,11 @@ typedef struct INT SelStart; INT SelEnd; - BOOL SelOnField; } HEXEDIT_DATA, *PHEXEDIT_DATA; +static const TCHAR ClipboardFormatName[] = TEXT("RegEdit_HexData"); +static UINT ClipboardFormatID = 0; + /* hit test codes */ #define HEHT_LEFTMARGIN (0x1) #define HEHT_ADDRESS (0x2) @@ -67,6 +69,8 @@ RegisterHexEditorClass(HINSTANCE hInstance) { WNDCLASSEX WndClass; + ClipboardFormatID = RegisterClipboardFormat(ClipboardFormatName); + ZeroMemory(&WndClass, sizeof(WNDCLASSEX)); WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.style = CS_DBLCLKS; @@ -218,7 +222,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO if(ScrollPos + First == 0) { /* draw address */ - _stprintf(addr, _T("%04X"), 0); + wsprintf(addr, TEXT("%04X"), 0); TextOut(hDC, hed->LeftMargin, First * hed->LineHeight, addr, 4); } } @@ -240,7 +244,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO dx = hed->LeftMargin; /* draw address */ - _stprintf(addr, _T("%04lX"), linestart); + wsprintf(addr, TEXT("%04lX"), linestart); TextOut(hDC, dx, dy, addr, 4); dx += ((4 + hed->AddressSpacing) * hed->CharWidth); @@ -260,7 +264,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO rct.left += dh; rct.right += dh; - _stprintf(hex, _T("%02X"), *(current++)); + wsprintf(hex, TEXT("%02X"), *(current++)); if (i0 <= i && i < i1) { rct2.left = dx; @@ -275,7 +279,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO } else ExtTextOut(hDC, dx, dy, ETO_OPAQUE, &rct, hex, 2, NULL); - dx += dh; + dx += dh; i++; } @@ -285,8 +289,8 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO i = isave; for(x = 0; x < hed->ColumnsPerLine && current < end; x++) { - _stprintf(hex, _T("%C"), *(current++)); - hex[0] = ((hex[0] & _T('\x007f')) >= _T(' ') ? hex[0] : _T('.')); + wsprintf(hex, _T("%C"), *(current++)); + hex[0] = ((hex[0] & _T('\x007f')) >= _T(' ') ? hex[0] : _T('.')); if (i0 <= i && i < i1) { rct2.left = dx; @@ -300,7 +304,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO } else TextOut(hDC, dx, dy, hex, 1); - dx += hed->CharWidth; + dx += hed->CharWidth; i++; } @@ -415,6 +419,149 @@ HEXEDIT_IndexFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPos, return Index; } +static VOID +HEXEDIT_Copy(PHEXEDIT_DATA hed) +{ + PBYTE pb, buf; + UINT cb; + INT i0, i1; + HGLOBAL hGlobal; + + if (hed->SelStart < hed->SelEnd) + { + i0 = hed->SelStart; + i1 = hed->SelEnd; + } + else + { + i0 = hed->SelEnd; + i1 = hed->SelStart; + } + + cb = i1 - i0; + if (cb == 0) + return; + + hGlobal = GlobalAlloc(GHND | GMEM_SHARE, cb + sizeof(DWORD)); + if (hGlobal == NULL) + return; + + pb = GlobalLock(hGlobal); + if (pb) + { + *(PDWORD)pb = cb; + pb += sizeof(DWORD); + buf = (PBYTE) LocalLock(hed->hBuffer); + if (buf) + { + CopyMemory(pb, buf + i0, cb); + LocalUnlock(hed->hBuffer); + } + GlobalUnlock(hGlobal); + + if (OpenClipboard(hed->hWndSelf)) + { + EmptyClipboard(); + SetClipboardData(ClipboardFormatID, hGlobal); + CloseClipboard(); + } + } + else + GlobalFree(hGlobal); +} + +static VOID +HEXEDIT_Delete(PHEXEDIT_DATA hed) +{ + PBYTE buf; + INT i0, i1; + UINT bufsize; + + if (hed->SelStart < hed->SelEnd) + { + i0 = hed->SelStart; + i1 = hed->SelEnd; + } + else + { + i0 = hed->SelEnd; + i1 = hed->SelStart; + } + + if (i0 != i1) + { + bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0); + buf = (PBYTE) LocalLock(hed->hBuffer); + if (buf) + { + MoveMemory(buf + i0, buf + i1, bufsize - i1); + LocalUnlock(hed->hBuffer); + } + HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - (i1 - i0)); + hed->InMid = FALSE; + hed->Index = hed->SelStart = hed->SelEnd = i0; + hed->CaretCol = hed->Index % hed->ColumnsPerLine; + hed->CaretLine = hed->Index / hed->ColumnsPerLine; + InvalidateRect(hed->hWndSelf, NULL, TRUE); + HEXEDIT_MoveCaret(hed, TRUE); + } +} + +static VOID +HEXEDIT_Paste(PHEXEDIT_DATA hed) +{ + HGLOBAL hGlobal; + UINT bufsize; + PBYTE pb, buf; + DWORD cb; + + HEXEDIT_Delete(hed); + bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0); + + if (OpenClipboard(hed->hWndSelf)) + { + hGlobal = GetClipboardData(ClipboardFormatID); + if (hGlobal != NULL) + { + pb = (PBYTE) GlobalLock(hGlobal); + cb = *(PDWORD) pb; + pb += sizeof(DWORD); + HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize + cb); + buf = (PBYTE) LocalLock(hed->hBuffer); + if (buf) + { + MoveMemory(buf + hed->Index + cb, buf + hed->Index, + bufsize - hed->Index); + CopyMemory(buf + hed->Index, pb, cb); + LocalUnlock(hed->hBuffer); + } + GlobalUnlock(hGlobal); + } + CloseClipboard(); + } + InvalidateRect(hed->hWndSelf, NULL, TRUE); + HEXEDIT_MoveCaret(hed, TRUE); +} + +static VOID +HEXEDIT_Cut(PHEXEDIT_DATA hed) +{ + HEXEDIT_Copy(hed); + HEXEDIT_Delete(hed); +} + +static VOID +HEXEDIT_SelectAll(PHEXEDIT_DATA hed) +{ + INT bufsize; + + bufsize = (hed->hBuffer ? (INT) LocalSize(hed->hBuffer) : 0); + hed->Index = hed->SelStart = 0; + hed->SelEnd = bufsize; + InvalidateRect(hed->hWndSelf, NULL, TRUE); + HEXEDIT_MoveCaret(hed, TRUE); +} + /*** Control specific messages ************************************************/ static LRESULT @@ -808,19 +955,18 @@ HEXEDIT_WM_LBUTTONDOWN(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt) if (GetAsyncKeyState(VK_SHIFT) < 0) { - if (hed->SelOnField) + if (hed->EditingField) hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField); else hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField); hed->SelEnd = hed->Index; - hed->EditingField = hed->SelOnField; } else { Hit = HEXEDIT_HitRegionTest(hed, Pt); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, Hit, &EditPos, &NewField); hed->SelStart = hed->SelEnd = hed->Index; - hed->SelOnField = hed->EditingField = NewField; + hed->EditingField = NewField; SetCapture(hed->hWndSelf); } hed->CaretCol = EditPos.x; @@ -839,7 +985,7 @@ HEXEDIT_WM_LBUTTONUP(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt) POINT EditPos; if (GetCapture() == hed->hWndSelf) { - if (hed->SelOnField) + if (hed->EditingField) hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField); else hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField); @@ -860,7 +1006,7 @@ HEXEDIT_WM_MOUSEMOVE(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt) POINT EditPos; if (GetCapture() == hed->hWndSelf) { - if (hed->SelOnField) + if (hed->EditingField) hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField); else hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField); @@ -900,8 +1046,51 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) switch(VkCode) { - case VK_DELETE: + case 'X': + if (GetAsyncKeyState(VK_SHIFT) >= 0 && + GetAsyncKeyState(VK_CONTROL) < 0 && hed->SelStart != hed->SelEnd) + HEXEDIT_Cut(hed); + else + return TRUE; + break; + + case 'C': + if (GetAsyncKeyState(VK_SHIFT) >= 0 && + GetAsyncKeyState(VK_CONTROL) < 0 && hed->SelStart != hed->SelEnd) + HEXEDIT_Copy(hed); + else + return TRUE; + break; + + case 'V': + if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0) + HEXEDIT_Paste(hed); + else + return TRUE; + break; + + case 'A': + if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0) + HEXEDIT_SelectAll(hed); + else + return TRUE; + break; + + case VK_INSERT: if (hed->SelStart != hed->SelEnd) + { + if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0) + HEXEDIT_Copy(hed); + } + if (GetAsyncKeyState(VK_SHIFT) < 0 && GetAsyncKeyState(VK_CONTROL) >= 0) + HEXEDIT_Paste(hed); + break; + + case VK_DELETE: + if (GetAsyncKeyState(VK_SHIFT) < 0 && GetAsyncKeyState(VK_CONTROL) >= 0 && + hed->SelStart != hed->SelEnd) + HEXEDIT_Copy(hed); + if (i0 != i1) { buf = (PBYTE) LocalLock(hed->hBuffer); if (buf) @@ -946,7 +1135,7 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) break; case VK_BACK: - if (hed->SelStart != hed->SelEnd) + if (i0 != i1) { buf = (PBYTE) LocalLock(hed->hBuffer); if (buf) @@ -986,6 +1175,8 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) hed->CaretCol = hed->Index % hed->ColumnsPerLine; hed->CaretLine = hed->Index / hed->ColumnsPerLine; } + else + return TRUE; HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1); hed->InMid = FALSE; } @@ -1056,6 +1247,9 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) InvalidateRect(hed->hWndSelf, NULL, TRUE); HEXEDIT_MoveCaret(hed, TRUE); break; + + default: + return TRUE; } return FALSE; @@ -1185,6 +1379,40 @@ HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed, DWORD sType, WORD NewWidth, WORD NewHeight) return 0; } +static VOID +HEXEDIT_WM_CONTEXTMENU(PHEXEDIT_DATA hed, INT x, INT y) +{ + HMENU hMenu; + RECT rc; + + if (x == -1 && y == -1) + { + GetWindowRect(hed->hWndSelf, &rc); + x = rc.left; + y = rc.top; + } + + hMenu = GetSubMenu(hPopupMenus, PM_HEXEDIT); + if (hed->SelStart == hed->SelEnd) + { + EnableMenuItem(hMenu, ID_HEXEDIT_CUT, MF_GRAYED); + EnableMenuItem(hMenu, ID_HEXEDIT_COPY, MF_GRAYED); + EnableMenuItem(hMenu, ID_HEXEDIT_PASTE, MF_GRAYED); + EnableMenuItem(hMenu, ID_HEXEDIT_DELETE, MF_GRAYED); + } + else + { + EnableMenuItem(hMenu, ID_HEXEDIT_CUT, MF_ENABLED); + EnableMenuItem(hMenu, ID_HEXEDIT_COPY, MF_ENABLED); + EnableMenuItem(hMenu, ID_HEXEDIT_PASTE, MF_ENABLED); + EnableMenuItem(hMenu, ID_HEXEDIT_DELETE, MF_ENABLED); + } + + SetForegroundWindow(hed->hWndSelf); + TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, x, y, 0, hed->hWndSelf, NULL); + PostMessage(hed->hWndSelf, WM_NULL, 0, 0); +} + INT_PTR CALLBACK HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -1291,11 +1519,32 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_CONTEXTMENU: - /* FIXME: Implement Cut, Copy, Paste, Delete and Select All */ + HEXEDIT_WM_CONTEXTMENU(hed, (short)LOWORD(lParam), (short)HIWORD(lParam)); break; case WM_COMMAND: - /* FIXME: Implement Cut, Copy, Paste, Delete and Select All */ + switch(LOWORD(wParam)) + { + case ID_HEXEDIT_CUT: + HEXEDIT_Cut(hed); + break; + + case ID_HEXEDIT_COPY: + HEXEDIT_Copy(hed); + break; + + case ID_HEXEDIT_PASTE: + HEXEDIT_Paste(hed); + break; + + case ID_HEXEDIT_DELETE: + HEXEDIT_Delete(hed); + break; + + case ID_HEXEDIT_SELECT_ALL: + HEXEDIT_SelectAll(hed); + break; + } break; } diff --git a/reactos/base/applications/regedit/lang/bg-BG.rc b/reactos/base/applications/regedit/lang/bg-BG.rc index c7bd4215245..7ecabedf807 100644 --- a/reactos/base/applications/regedit/lang/bg-BG.rc +++ b/reactos/base/applications/regedit/lang/bg-BG.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Çàïîìíÿíå ñòîéíîñòòà íà êëþ÷à", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/cs-CZ.rc b/reactos/base/applications/regedit/lang/cs-CZ.rc index b412af4c186..c1d12dbfa95 100644 --- a/reactos/base/applications/regedit/lang/cs-CZ.rc +++ b/reactos/base/applications/regedit/lang/cs-CZ.rc @@ -160,6 +160,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Z&kopírovat název klíèe", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/de-DE.rc b/reactos/base/applications/regedit/lang/de-DE.rc index 3b2b646f738..4cf8657a80f 100644 --- a/reactos/base/applications/regedit/lang/de-DE.rc +++ b/reactos/base/applications/regedit/lang/de-DE.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "S&chlüsselnamen kopieren", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "&Ausschneiden", ID_HEXEDIT_CUT + MENUITEM "&Kopieren", ID_HEXEDIT_COPY + MENUITEM "&Einfügen", ID_HEXEDIT_PASTE + MENUITEM "&Löschen", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "A&lles auswählen", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/el-GR.rc b/reactos/base/applications/regedit/lang/el-GR.rc index 34e4202d15d..281ed2d299e 100644 --- a/reactos/base/applications/regedit/lang/el-GR.rc +++ b/reactos/base/applications/regedit/lang/el-GR.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&ÁíôéãñáöÞ Ïíüìáôïò Êëåéäéïý", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/en-US.rc b/reactos/base/applications/regedit/lang/en-US.rc index b7e948f8a9a..e5a94cba8e7 100644 --- a/reactos/base/applications/regedit/lang/en-US.rc +++ b/reactos/base/applications/regedit/lang/en-US.rc @@ -160,6 +160,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/es-ES.rc b/reactos/base/applications/regedit/lang/es-ES.rc index b7e703048da..b128846bca1 100644 --- a/reactos/base/applications/regedit/lang/es-ES.rc +++ b/reactos/base/applications/regedit/lang/es-ES.rc @@ -165,6 +165,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copiar nombre de clave", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/fr-FR.rc b/reactos/base/applications/regedit/lang/fr-FR.rc index ed997425aff..c5042da4c9a 100644 --- a/reactos/base/applications/regedit/lang/fr-FR.rc +++ b/reactos/base/applications/regedit/lang/fr-FR.rc @@ -165,6 +165,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copier le nom de la clé", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/hu-HU.rc b/reactos/base/applications/regedit/lang/hu-HU.rc index 3c7277b79ab..42faef3a4ea 100644 --- a/reactos/base/applications/regedit/lang/hu-HU.rc +++ b/reactos/base/applications/regedit/lang/hu-HU.rc @@ -163,6 +163,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/id-ID.rc b/reactos/base/applications/regedit/lang/id-ID.rc index c6b9bb1cb49..059abec9576 100644 --- a/reactos/base/applications/regedit/lang/id-ID.rc +++ b/reactos/base/applications/regedit/lang/id-ID.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Nama Kunci", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/it-IT.rc b/reactos/base/applications/regedit/lang/it-IT.rc index f5a2fc96540..a86981a0865 100644 --- a/reactos/base/applications/regedit/lang/it-IT.rc +++ b/reactos/base/applications/regedit/lang/it-IT.rc @@ -165,6 +165,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copia il nome della chiave", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/ja-JP.rc b/reactos/base/applications/regedit/lang/ja-JP.rc index 3108fb8aa34..8b1816bf03f 100644 --- a/reactos/base/applications/regedit/lang/ja-JP.rc +++ b/reactos/base/applications/regedit/lang/ja-JP.rc @@ -160,6 +160,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "ƒL[–¼‚̃Rƒs[(&C)", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "Ø‚èŽæ‚è(&C)", ID_HEXEDIT_CUT + MENUITEM "ƒRƒs[(&C)", ID_HEXEDIT_COPY + MENUITEM "“\\‚è•t‚¯(&P)", ID_HEXEDIT_PASTE + MENUITEM "íœ(&D)", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "‚·‚ׂđI‘ð(&A)", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/ko-KR.rc b/reactos/base/applications/regedit/lang/ko-KR.rc index 5aef6a1b358..01777d0344b 100644 --- a/reactos/base/applications/regedit/lang/ko-KR.rc +++ b/reactos/base/applications/regedit/lang/ko-KR.rc @@ -147,6 +147,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Å° À̸§ º¹»ç(&C)", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/nl-NL.rc b/reactos/base/applications/regedit/lang/nl-NL.rc index 158a4ec4d24..be86610e59c 100644 --- a/reactos/base/applications/regedit/lang/nl-NL.rc +++ b/reactos/base/applications/regedit/lang/nl-NL.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/no-NO.rc b/reactos/base/applications/regedit/lang/no-NO.rc index ac3e7faa330..b052432f8ec 100644 --- a/reactos/base/applications/regedit/lang/no-NO.rc +++ b/reactos/base/applications/regedit/lang/no-NO.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Kopier nøkkelnavn", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/pl-PL.rc b/reactos/base/applications/regedit/lang/pl-PL.rc index ebf6da04151..198125c772c 100644 --- a/reactos/base/applications/regedit/lang/pl-PL.rc +++ b/reactos/base/applications/regedit/lang/pl-PL.rc @@ -167,6 +167,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Kopiuj nazwê klucza", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/pt-BR.rc b/reactos/base/applications/regedit/lang/pt-BR.rc index 9c1f7245ec4..4cd21990e30 100644 --- a/reactos/base/applications/regedit/lang/pt-BR.rc +++ b/reactos/base/applications/regedit/lang/pt-BR.rc @@ -163,6 +163,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copiar nome da chave", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/pt-PT.rc b/reactos/base/applications/regedit/lang/pt-PT.rc index 081ba3b0800..15fee2f3166 100644 --- a/reactos/base/applications/regedit/lang/pt-PT.rc +++ b/reactos/base/applications/regedit/lang/pt-PT.rc @@ -163,6 +163,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/ru-RU.rc b/reactos/base/applications/regedit/lang/ru-RU.rc index 3d38ed24f01..62892800f15 100644 --- a/reactos/base/applications/regedit/lang/ru-RU.rc +++ b/reactos/base/applications/regedit/lang/ru-RU.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Êîïèðîâàòü èìÿ êëþ÷à", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/sk-SK.rc b/reactos/base/applications/regedit/lang/sk-SK.rc index 1ef4df97081..d8d558852b3 100644 --- a/reactos/base/applications/regedit/lang/sk-SK.rc +++ b/reactos/base/applications/regedit/lang/sk-SK.rc @@ -147,6 +147,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/sl-SI.rc b/reactos/base/applications/regedit/lang/sl-SI.rc index 5c529ffe6fb..d5c5804c881 100644 --- a/reactos/base/applications/regedit/lang/sl-SI.rc +++ b/reactos/base/applications/regedit/lang/sl-SI.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/sv-SE.rc b/reactos/base/applications/regedit/lang/sv-SE.rc index efce60a4190..ee1515dd08b 100644 --- a/reactos/base/applications/regedit/lang/sv-SE.rc +++ b/reactos/base/applications/regedit/lang/sv-SE.rc @@ -160,6 +160,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Kopiera nyckelnamn", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/th-TH.rc b/reactos/base/applications/regedit/lang/th-TH.rc index d69da60f90e..c7bb7fde7d9 100644 --- a/reactos/base/applications/regedit/lang/th-TH.rc +++ b/reactos/base/applications/regedit/lang/th-TH.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/uk-UA.rc b/reactos/base/applications/regedit/lang/uk-UA.rc index 6638339705a..5fd1fa5ec45 100644 --- a/reactos/base/applications/regedit/lang/uk-UA.rc +++ b/reactos/base/applications/regedit/lang/uk-UA.rc @@ -163,6 +163,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Êîï³þâàòè ³ì'ÿ ðîçä³ëó", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/lang/zh-CN.rc b/reactos/base/applications/regedit/lang/zh-CN.rc index 87a1e6fd5e4..0d20667cdd3 100644 --- a/reactos/base/applications/regedit/lang/zh-CN.rc +++ b/reactos/base/applications/regedit/lang/zh-CN.rc @@ -162,6 +162,15 @@ BEGIN MENUITEM SEPARATOR MENUITEM "¸´ÖÆÏîÃû³Æ(&C)", ID_EDIT_COPYKEYNAME END + POPUP "" + BEGIN + MENUITEM "C&ut", ID_HEXEDIT_CUT + MENUITEM "&Copy", ID_HEXEDIT_COPY + MENUITEM "&Paste", ID_HEXEDIT_PASTE + MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + END END diff --git a/reactos/base/applications/regedit/main.h b/reactos/base/applications/regedit/main.h index ea16ceec7cb..eee317e67ae 100644 --- a/reactos/base/applications/regedit/main.h +++ b/reactos/base/applications/regedit/main.h @@ -35,6 +35,7 @@ #define PM_MODIFYVALUE 0 #define PM_NEW 1 #define PM_TREECONTEXT 2 +#define PM_HEXEDIT 3 #define MAX_NEW_KEY_LEN 128 diff --git a/reactos/base/applications/regedit/resource.h b/reactos/base/applications/regedit/resource.h index 6da08790a28..2190e0e3ed6 100644 --- a/reactos/base/applications/regedit/resource.h +++ b/reactos/base/applications/regedit/resource.h @@ -108,6 +108,11 @@ #define ID_REGISTRY_PRINTSUBTREE 32832 #define ID_REGISTRY_PRINTERSETUP 32833 #define ID_REGISTRY_SAVESUBTREEAS 32834 +#define ID_HEXEDIT_CUT 32835 +#define ID_HEXEDIT_COPY 32836 +#define ID_HEXEDIT_PASTE 32837 +#define ID_HEXEDIT_DELETE 32838 +#define ID_HEXEDIT_SELECT_ALL 32839 #define IDS_LICENSE 32835 #define IDS_ERROR 32836 #define IDS_BAD_VALUE 32837 @@ -203,6 +208,7 @@ #define IDC_LOOKAT_DATA 2016 #define IDC_MATCHSTRING 2017 #define IDC_MATCHCASE 2018 + #define IDS_FINISHEDFIND 2019 #define ID_FAVORITES_MIN 2100 @@ -210,4 +216,5 @@ #define ID_ACCEL 3000 + #define IDC_STATIC -1 diff --git a/reactos/base/applications/regedit/treeview.c b/reactos/base/applications/regedit/treeview.c index cfbd401d009..cd592036907 100644 --- a/reactos/base/applications/regedit/treeview.c +++ b/reactos/base/applications/regedit/treeview.c @@ -540,15 +540,16 @@ BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem) TCHAR szNewKey[128]; LPCTSTR pszKeyPath; int iIndex = 1; - HKEY hRootKey; - HKEY hKey = NULL; - HKEY hNewKey = NULL; + LONG nResult; + HKEY hRootKey = NULL, hKey = NULL, hNewKey = NULL; BOOL bSuccess = FALSE; DWORD dwDisposition; HTREEITEM hNewItem; - pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, hItem, &hRootKey); - if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS) + pszKeyPath = GetItemPath(hwndTV, hItem, &hRootKey); + if (pszKeyPath[0] == TEXT('\0')) + hKey = hRootKey; + else if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS) goto done; if (LoadString(hInst, IDS_NEW_KEY, szNewKeyFormat, sizeof(szNewKeyFormat) / sizeof(szNewKeyFormat[0])) <= 0) @@ -557,13 +558,20 @@ BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem) /* Need to create a new key with a unique name */ do { - _sntprintf(szNewKey, sizeof(szNewKey) / sizeof(szNewKey[0]), szNewKeyFormat, iIndex++); - RegCreateKeyEx(hKey, szNewKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hNewKey, &dwDisposition); - if (hNewKey && (dwDisposition == REG_OPENED_EXISTING_KEY)) + wsprintf(szNewKey, szNewKeyFormat, iIndex++); + nResult = RegCreateKeyEx(hKey, szNewKey, 0, NULL, 0, KEY_WRITE, NULL, &hNewKey, &dwDisposition); + if (hNewKey && dwDisposition == REG_OPENED_EXISTING_KEY) { RegCloseKey(hNewKey); hNewKey = NULL; } + else if (!hNewKey) + { + TCHAR sz[256]; + wsprintf(sz, TEXT("Cannot create new key!\n\nError Code: %d"), nResult); + MessageBox(hFrameWnd, sz, NULL, MB_ICONERROR); + goto done; + } } while(!hNewKey); @@ -578,7 +586,7 @@ BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem) bSuccess = TRUE; done: - if (hKey) + if (hKey != hRootKey && hKey) RegCloseKey(hKey); if (hNewKey) RegCloseKey(hNewKey); -- 2.17.1