diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 5aa58e6f..7ddf1912 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -2973,8 +2973,20 @@ void Notepad_plus::command(int id) } break; - case IDM_EDIT_DELETEMARKEDLINES : - markedLinesOperation(0); + case IDM_SEARCH_CUTMARKEDLINES : + cutMarkedLines(); + break; + + case IDM_SEARCH_COPYMARKEDLINES : + copyMarkedLines(); + break; + + case IDM_SEARCH_PASTEMARKEDLINES : + pasteToMarkedLines(); + break; + + case IDM_SEARCH_DELETEMARKEDLINES : + deleteMarkedLines(); break; case IDM_VIEW_FULLSCREENTOGGLE : @@ -3239,7 +3251,7 @@ void Notepad_plus::command(int id) if (startLine == 0) startLine = 1; - if (endLine == _pEditView->getNbLine()) + if (endLine == _pEditView->lastZeroBasedLineNumber()) endLine -= 1; _pEditView->execute(SCI_HIDELINES, startLine, endLine); _pEditView->execute(SCI_MARKERADD, startLine-1, MARK_HIDELINESBEGIN); @@ -3480,7 +3492,6 @@ void Notepad_plus::command(int id) ::CloseClipboard(); //Do not free anything, EmptyClipboard does that - //::GlobalFree(allocClipboardData); _pEditView->execute(SCI_EMPTYUNDOBUFFER); } break; @@ -4375,7 +4386,7 @@ void Notepad_plus::reloadOnSwitchBack() const NppGUI & nppGUI = pNppParam->getNppGUI(); if (nppGUI._fileAutoDetection == cdAutoUpdateGo2end || nppGUI._fileAutoDetection == cdGo2end) { - int line = _pEditView->getNbLine(); + int line = _pEditView->lastZeroBasedLineNumber(); _pEditView->gotoLine(line); } @@ -4403,9 +4414,6 @@ void Notepad_plus::hideCurrentView() ::SendMessage(_hSelf, WM_SIZE, 0, 0); switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); - - //setTitleWith(_pEditView->getCurrentTitle()); - _mainWindowStatus &= ~TWO_VIEWS_MASK; } @@ -4462,10 +4470,6 @@ bool Notepad_plus::fileClose() PathRemoveFileSpec(fullPath); setWorkingDir(fullPath); - //updateStatusBar(); - //dynamicCheckMenuAndTB(); - //setLangStatus(_pEditView->getCurrentDocType()); - //checkDocState(); _linkTriggered = true; ::SendMessage(_hSelf, NPPM_INTERNAL_DOCSWITCHIN, 0, 0); diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index 0ad6ed23..c30770a5 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -536,27 +536,108 @@ private: _pEditView->execute(SCI_MARKERDELETEALL, MARK_BOOKMARK); }; - void markedLinesOperation(int whichOp) { - int nbLine = _pEditView->getNbLine(); - for (int i = 0 ; i < nbLine ; i++) + void copyMarkedLines() { + int lastLine = _pEditView->lastZeroBasedLineNumber(); + string globalStr = ""; + for (int i = lastLine ; i >= 0 ; i--) { if (bookmarkPresent(i)) - lineOperation(i, whichOp); + { + string currentStr = getMarkedLine(i) + globalStr; + globalStr = currentStr; + } } + str2Cliboard(globalStr.c_str()); }; - void lineOperation(int ln, int op) { + void cutMarkedLines() { + int lastLine = _pEditView->lastZeroBasedLineNumber(); + string globalStr = ""; + + _pEditView->execute(SCI_BEGINUNDOACTION); + for (int i = lastLine ; i >= 0 ; i--) + { + if (bookmarkPresent(i)) + { + string currentStr = getMarkedLine(i) + globalStr; + globalStr = currentStr; + + deleteMarkedline(i); + } + } + _pEditView->execute(SCI_ENDUNDOACTION); + str2Cliboard(globalStr.c_str()); + }; + + void deleteMarkedLines() { + int lastLine = _pEditView->lastZeroBasedLineNumber(); + + _pEditView->execute(SCI_BEGINUNDOACTION); + for (int i = lastLine ; i >= 0 ; i--) + { + if (bookmarkPresent(i)) + deleteMarkedline(i); + } + _pEditView->execute(SCI_ENDUNDOACTION); + }; + + void pasteToMarkedLines() { + int lastLine = _pEditView->lastZeroBasedLineNumber(); + + ::OpenClipboard(_hSelf); + HANDLE clipboardData = ::GetClipboardData(CF_TEXT); + int len = ::GlobalSize(clipboardData); + LPVOID clipboardDataPtr = ::GlobalLock(clipboardData); + + string clipboardStr = (const char *)clipboardDataPtr; + + ::GlobalUnlock(clipboardData); + ::CloseClipboard(); + + _pEditView->execute(SCI_BEGINUNDOACTION); + for (int i = lastLine ; i >= 0 ; i--) + { + if (bookmarkPresent(i)) + { + replaceMarkedline(i, clipboardStr.c_str()); + } + } + _pEditView->execute(SCI_ENDUNDOACTION); + }; + + void deleteMarkedline(int ln) { + int lineLen = _pEditView->execute(SCI_LINELENGTH, ln); + int lineBegin = _pEditView->execute(SCI_POSITIONFROMLINE, ln); + + bookmarkDelete(ln); + _pEditView->execute(SCI_SETTARGETSTART, lineBegin); + _pEditView->execute(SCI_SETTARGETEND, lineBegin + lineLen); + char emptyString[2] = ""; + _pEditView->execute(SCI_REPLACETARGET, strlen(emptyString), (LPARAM)emptyString); + }; + + void replaceMarkedline(int ln, const char *str) { + + int lineBegin = _pEditView->execute(SCI_POSITIONFROMLINE, ln); + int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION, ln); + + _pEditView->execute(SCI_SETTARGETSTART, lineBegin); + _pEditView->execute(SCI_SETTARGETEND, lineEnd); + + _pEditView->execute(SCI_REPLACETARGET, strlen(str), (LPARAM)str); + }; + + string getMarkedLine(int ln) { int lineLen = _pEditView->execute(SCI_LINELENGTH, ln); int lineBegin = _pEditView->execute(SCI_POSITIONFROMLINE, ln); - bookmarkDelete(ln); + char * buf = new char[lineLen+1]; + _pEditView->getText(buf, lineBegin, lineBegin + lineLen); + string line = buf; + delete [] buf; - _pEditView->execute(SCI_SETTARGETSTART, lineBegin); - _pEditView->execute(SCI_SETTARGETEND, lineBegin + lineLen); - - char emptyString[2] = ""; - _pEditView->execute(SCI_REPLACETARGET, strlen(emptyString), (LPARAM)emptyString); + return line; }; int hideLinesMarkPresent(int lineno) const { @@ -597,7 +678,7 @@ private: } else if (hideLinesMark == MARK_HIDELINESBEGIN) { - long nbLine = _pEditView->getNbLine(); + long nbLine = _pEditView->lastZeroBasedLineNumber(); start = lineno; int i = lineno + 1; for ( ; i < nbLine ; i++) diff --git a/PowerEditor/src/Notepad_plus.rc b/PowerEditor/src/Notepad_plus.rc index 4fba64ac..30aa4315 100644 --- a/PowerEditor/src/Notepad_plus.rc +++ b/PowerEditor/src/Notepad_plus.rc @@ -304,11 +304,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Set Read Only", IDM_EDIT_SETREADONLY MENUITEM "Clear Read Only Flag", IDM_EDIT_CLEARREADONLY - MENUITEM SEPARATOR - MENUITEM "Cut marked lines", IDM_EDIT_CUTMARKEDLINES - MENUITEM "Copy marked lines", IDM_EDIT_COPYMARKEDLINES - MENUITEM "Paste to (Replace) marked lines", IDM_EDIT_PASTEMARKEDLINES - MENUITEM "Delete marked lines", IDM_EDIT_DELETEMARKEDLINES + //MENUITEM SEPARATOR END POPUP "&Search" @@ -331,6 +327,10 @@ BEGIN MENUITEM "Next Bookmark", IDM_SEARCH_NEXT_BOOKMARK MENUITEM "Previous Bookmark", IDM_SEARCH_PREV_BOOKMARK MENUITEM "Clear all Bookmarks", IDM_SEARCH_CLEAR_BOOKMARKS + MENUITEM "Cut bookmarked lines", IDM_SEARCH_CUTMARKEDLINES + MENUITEM "Copy bookmarked lines", IDM_SEARCH_COPYMARKEDLINES + MENUITEM "Paste to (Replace) bookmarked lines", IDM_SEARCH_PASTEMARKEDLINES + MENUITEM "Delete bookmarked lines", IDM_SEARCH_DELETEMARKEDLINES END POPUP "&View" diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h index b86393c9..6df7d8e3 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h @@ -427,7 +427,7 @@ public: return long(execute(SCI_LINEFROMPOSITION, execute(SCI_GETCURRENTPOS))); }; - long getNbLine() const { + long lastZeroBasedLineNumber() const { int endPos = execute(SCI_GETLENGTH); return execute(SCI_LINEFROMPOSITION, endPos); }; diff --git a/PowerEditor/src/menuCmdID.h b/PowerEditor/src/menuCmdID.h index 2c4c4e9e..cb0f2ab2 100644 --- a/PowerEditor/src/menuCmdID.h +++ b/PowerEditor/src/menuCmdID.h @@ -76,11 +76,6 @@ #define IDM_EDIT_COLUMNMODE (IDM_EDIT+34) #define IDM_EDIT_BLOCK_COMMENT_SET (IDM_EDIT+35) #define IDM_EDIT_BLOCK_UNCOMMENT (IDM_EDIT+36) - - #define IDM_EDIT_CUTMARKEDLINES (IDM_EDIT+42) - #define IDM_EDIT_COPYMARKEDLINES (IDM_EDIT+43) - #define IDM_EDIT_PASTEMARKEDLINES (IDM_EDIT+44) - #define IDM_EDIT_DELETEMARKEDLINES (IDM_EDIT+45) #define IDM_EDIT_AUTOCOMPLETE (50000+0) #define IDM_EDIT_AUTOCOMPLETE_CURRENTFILE (50000+1) @@ -108,8 +103,12 @@ #define IDM_SEARCH_VOLATILE_FINDPREV (IDM_SEARCH + 15) #define IDM_SEARCH_MARKALL (IDM_SEARCH + 16) #define IDM_SEARCH_UNMARKALL (IDM_SEARCH + 17) - -#define IDM_VIEW (IDM + 4000) + #define IDM_SEARCH_CUTMARKEDLINES (IDM_SEARCH + 18) + #define IDM_SEARCH_COPYMARKEDLINES (IDM_SEARCH + 19) + #define IDM_SEARCH_PASTEMARKEDLINES (IDM_SEARCH + 20) + #define IDM_SEARCH_DELETEMARKEDLINES (IDM_SEARCH + 21) + +#define IDM_VIEW (IDM + 4000) #define IDM_VIEW_TOOLBAR_HIDE (IDM_VIEW + 1) #define IDM_VIEW_TOOLBAR_REDUCE (IDM_VIEW + 2) #define IDM_VIEW_TOOLBAR_ENLARGE (IDM_VIEW + 3)