+fix: virtual space navigation and rectangular selection (minor issues)

(allow "Virtual Space Rectangular Selection" also allows moving Caret into virtual space (beyond line end))
This commit is contained in:
Rainer Kottenhoff 2017-10-05 02:18:51 +02:00
parent 352ba83efa
commit 32ccdc0671
3 changed files with 42 additions and 11 deletions

View File

@ -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);

View File

@ -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*);

View File

@ -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: