diff --git a/src/Edit.c b/src/Edit.c index baf617299..92223a4ed 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -286,18 +286,22 @@ HWND EditCreate(HWND hwndParent) Encoding_SciSetCodePage(hwnd,iDefaultEncoding); SendMessage(hwnd,SCI_SETEOLMODE,SC_EOL_CRLF,0); - SendMessage(hwnd,SCI_SETPASTECONVERTENDINGS,1,0); + SendMessage(hwnd,SCI_SETPASTECONVERTENDINGS,TRUE,0); SendMessage(hwnd,SCI_SETMODEVENTMASK,/*SC_MODEVENTMASKALL*/SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT|SC_MOD_CONTAINER,0); SendMessage(hwnd,SCI_USEPOPUP,FALSE,0); SendMessage(hwnd,SCI_SETSCROLLWIDTH, DEFAULT_SCROLL_WIDTH,0); SendMessage(hwnd,SCI_SETSCROLLWIDTHTRACKING,TRUE,0); SendMessage(hwnd,SCI_SETENDATLASTLINE,TRUE,0); - SendMessage(hwnd,SCI_SETCARETSTICKY,FALSE,0); + SendMessage(hwnd,SCI_SETCARETLINEVISIBLEALWAYS,TRUE,0); + SendMessage(hwnd,SCI_SETCARETSTICKY,SC_CARETSTICKY_OFF,0); + //SendMessage(hwnd,SCI_SETCARETSTICKY,SC_CARETSTICKY_WHITESPACE,0); SendMessage(hwnd,SCI_SETXCARETPOLICY,CARET_SLOP|CARET_EVEN,50); SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_EVEN,0); + SendMessage(hwnd,SCI_SETMOUSESELECTIONRECTANGULARSWITCH,TRUE,0); SendMessage(hwnd,SCI_SETMULTIPLESELECTION,FALSE,0); SendMessage(hwnd,SCI_SETADDITIONALSELECTIONTYPING,FALSE,0); - SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS,(bVirtualSpaceInRectSelection ? SCVS_RECTANGULARSELECTION : SCVS_NONE),0); + SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS, + (bVirtualSpaceInRectSelection ? (SCVS_RECTANGULARSELECTION | SCVS_USERACCESSIBLE | SCVS_NOWRAPLINESTART) : SCVS_NONE),0); SendMessage(hwnd,SCI_SETADDITIONALCARETSBLINK,FALSE,0); SendMessage(hwnd,SCI_SETADDITIONALCARETSVISIBLE,FALSE,0); SendMessage(hwnd,SCI_SETMOUSEWHEELCAPTURES,FALSE,0); @@ -600,7 +604,7 @@ BOOL EditIsRecodingNeeded(WCHAR* pszText, int cchLen) // -char* EditGetClipboardText(HWND hwnd,BOOL bCheckEncoding) { +char* EditGetClipboardText(HWND hwnd,BOOL bCheckEncoding,int* pLineCount) { HANDLE hmem; WCHAR *pwch; char *pmch; @@ -648,6 +652,7 @@ char* EditGetClipboardText(HWND hwnd,BOOL bCheckEncoding) { else return (pmch); + int lineCount = 0; if ((BOOL)SendMessage(hwnd,SCI_GETPASTECONVERTENDINGS,0,0)) { ptmp = LocalAlloc(LPTR,mlen * 2 + 2); if (ptmp) { @@ -671,6 +676,7 @@ char* EditGetClipboardText(HWND hwnd,BOOL bCheckEncoding) { s++; } s++; + ++lineCount; } else { *d++ = *s++; @@ -685,10 +691,27 @@ char* EditGetClipboardText(HWND hwnd,BOOL bCheckEncoding) { LocalFree(ptmp); } } + else { + // count lines only + char *s = pmch; + for (int i = 0; (i <= mlen) && (*s != '\0'); i++) { + if (*s == '\n' || *s == '\r') { + if ((*s == '\r') && (i + 1 < mlen) && (*(s + 1) == '\n')) { + i++; + s++; + } + s++; + ++lineCount; + } + } + } GlobalUnlock(hmem); CloseClipboard(); + if (pLineCount) + *pLineCount = lineCount; + return (pmch); } @@ -5178,7 +5201,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA // if first time you bring up find/replace dialog, copy content from clipboard to find box if (bFirstTime) { - char* pClip = EditGetClipboardText(hwnd,FALSE); + char* pClip = EditGetClipboardText(hwnd,FALSE,NULL); if (pClip) { int len = lstrlenA(pClip); if (len > 0 && len < FNDRPL_BUFFER) { @@ -5838,7 +5861,7 @@ BOOL EditReplace(HWND hwnd,LPCEDITFINDREPLACE lpefr) if (StringCchCompareNA(lpefr->szReplace,FNDRPL_BUFFER,"^c",-1) == 0) { iReplaceMsg = SCI_REPLACETARGET; - pszReplace2 = EditGetClipboardText(hwnd,TRUE); + pszReplace2 = EditGetClipboardText(hwnd,TRUE,NULL); } else { //lstrcpyA(szReplace2,lpefr->szReplace); @@ -6199,7 +6222,7 @@ BOOL EditReplaceAll(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo) if (StringCchCompareNA(lpefr->szReplace,FNDRPL_BUFFER,"^c",-1) == 0) { iReplaceMsg = SCI_REPLACETARGET; - pszReplace2 = EditGetClipboardText(hwnd,TRUE); + pszReplace2 = EditGetClipboardText(hwnd,TRUE,NULL); } else { //lstrcpyA(szReplace2,lpefr->szReplace); @@ -6328,7 +6351,7 @@ BOOL EditReplaceAllInSelection(HWND hwnd,LPCEDITFINDREPLACE lpefr,BOOL bShowInfo if (StringCchCompareNA(lpefr->szReplace,FNDRPL_BUFFER,"^c",-1) == 0) { iReplaceMsg = SCI_REPLACETARGET; - pszReplace2 = EditGetClipboardText(hwnd,TRUE); + pszReplace2 = EditGetClipboardText(hwnd,TRUE,NULL); } else { //lstrcpyA(szReplace2,lpefr->szReplace); diff --git a/src/Edit.h b/src/Edit.h index d439037b7..73678c745 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -50,7 +50,7 @@ void EditSetNewText(HWND,char*,DWORD); BOOL EditConvertText(HWND,int,int,BOOL); BOOL EditSetNewEncoding(HWND,int,int,BOOL,BOOL); BOOL EditIsRecodingNeeded(WCHAR*,int); -char* EditGetClipboardText(HWND,BOOL); +char* EditGetClipboardText(HWND,BOOL,int*); BOOL EditCopyAppend(HWND); int EditDetectEOLMode(HWND,char*,DWORD); BOOL EditLoadFile(HWND,LPCWSTR,BOOL,int*,int*,BOOL*,BOOL*); diff --git a/src/Notepad3.c b/src/Notepad3.c index 01f08d985..a1cd2776c 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -3081,7 +3081,8 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) bSwapClipBoard = TRUE; case IDM_EDIT_PASTE: { - char *pClip = EditGetClipboardText(hwndEdit,!bSkipUnicodeDetection); + int lineCount = 0; + char *pClip = EditGetClipboardText(hwndEdit,!bSkipUnicodeDetection,&lineCount); if (!pClip) break; // recoding canceled @@ -3089,9 +3090,16 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) if (SendMessage(hwndEdit,SCI_GETSELECTIONEMPTY,0,0)) { + int iCurPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0); + int iCurLine = (int)SendMessage(hwndEdit,SCI_LINEFROMPOSITION,(WPARAM)iCurPos,0); + int iCurColumn = (int)SendMessage(hwndEdit,SCI_GETCOLUMN,(WPARAM)iCurPos,0); + SendMessage(hwndEdit, SCI_PASTE, 0, 0); if (bSwapClipBoard) SendMessage(hwndEdit, SCI_COPYTEXT, 0, (LPARAM)NULL); + + EditJumpTo(hwndEdit, iCurLine + lineCount + 1, iCurColumn + 1); + } else { @@ -4284,7 +4292,7 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) bVirtualSpaceInRectSelection = (bVirtualSpaceInRectSelection) ? FALSE : TRUE; // toggle //SendMessage(hwndEdit,SCI_CLEARSELECTIONS,0,0); SendMessage(hwndEdit,SCI_SETVIRTUALSPACEOPTIONS, - (bVirtualSpaceInRectSelection ? SCVS_RECTANGULARSELECTION : SCVS_NONE),0); + (bVirtualSpaceInRectSelection ? (SCVS_RECTANGULARSELECTION | SCVS_USERACCESSIBLE | SCVS_NOWRAPLINESTART) : SCVS_NONE),0); break; case IDM_VIEW_MARKOCCURRENCES_OFF: