diff --git a/src/Edit.c b/src/Edit.c index 8a8f1c8f8..f454170c2 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -3679,7 +3679,7 @@ void EditRemoveDuplicateLines(HWND hwnd, bool bRemoveEmptyLines) if (iSelEnd <= SciCall_PositionFromLine(iEndLine)) { --iEndLine; } } else { - iEndLine = SciCall_GetLineCount() - 1; // last line + iEndLine = Sci_GetLastDocLine(); } if ((iEndLine - iStartLine) <= 1) { return; } @@ -3700,22 +3700,26 @@ void EditRemoveDuplicateLines(HWND hwnd, bool bRemoveEmptyLines) for (DocLn iCurLine = iStartLine; iCurLine < iEndLine; ++iCurLine) { - const DocPos iCurLnLen = SciCall_GetLine(iCurLine, pCurrentLine); + SciCall_GetLine(iCurLine, pCurrentLine); + const DocPos iCurLnLen = Sci_GetNetLineLength(iCurLine); + pCurrentLine[iCurLnLen] = '\0'; + if (bRemoveEmptyLines || (iCurLnLen > iEmptyLnLen)) { - for (DocLn iCompareLine = iCurLine + 1; iCompareLine < iEndLine; ++iCompareLine) + for (DocLn iCompareLine = iCurLine + 1; iCompareLine <= iEndLine; ++iCompareLine) { - const DocPos iCmpLnLen = SciCall_GetLine(iCompareLine, NULL); + const DocPos iCmpLnLen = Sci_GetNetLineLength(iCompareLine); if (bRemoveEmptyLines || (iCmpLnLen > iEmptyLnLen)) { const DocPos iBegCmpLine = SciCall_PositionFromLine(iCompareLine); - const char* pCompareLine = SciCall_GetRangePointer(iBegCmpLine, iCmpLnLen + 2); + const char* pCompareLine = SciCall_GetRangePointer(iBegCmpLine, iCmpLnLen + 1); if (iCurLnLen == iCmpLnLen) { if (StringCchCompareNA(pCurrentLine, iCurLnLen, pCompareLine, iCmpLnLen) == 0) { - SciCall_SetTargetRange(iBegCmpLine, iBegCmpLine + iCmpLnLen); + const DocPos iLenToDel = (iCompareLine != Sci_GetLastDocLine() ? SciCall_GetLine(iCompareLine, NULL) : iCmpLnLen); + SciCall_SetTargetRange(iBegCmpLine, iBegCmpLine + iLenToDel); SciCall_ReplaceTarget(0, ""); --iCompareLine; // proactive preventing progress to avoid comparison line skip --iEndLine; diff --git a/src/SciCall.h b/src/SciCall.h index 259c76d0b..9aebf496b 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -390,6 +390,7 @@ DeclareSciCallR0(IsSelectionRectangle, SELECTIONISRECTANGLE, bool) #define Sci_GetEOLLen() ((SciCall_GetEOLMode() == SC_EOL_CRLF) ? 2 : 1) #define Sci_GetCurrentLine() SciCall_LineFromPosition(SciCall_GetCurrentPos()) +#define Sci_GetLastDocLine() (SciCall_GetLineCount() - 1) // length of line w/o line-end chars (full use SciCall_LineLength() #define Sci_GetNetLineLength(line) (SciCall_GetLineEndPosition(line) - SciCall_PositionFromLine(line)) @@ -397,6 +398,7 @@ DeclareSciCallR0(IsSelectionRectangle, SELECTIONISRECTANGLE, bool) ///~#define Sci_GetDocEndPosition() (SciCall_GetTextLength() - 1) #define Sci_GetDocEndPosition() SciCall_GetTextLength() + //============================================================================= #endif //_NP3_SCICALL_H_ diff --git a/themes/Flat/48/Toolbar.bmp b/themes/Flat/48/Toolbar.bmp new file mode 100644 index 000000000..889fc5117 Binary files /dev/null and b/themes/Flat/48/Toolbar.bmp differ diff --git a/themes/professional/32/Toolbar.bmp b/themes/professional/32/Toolbar.bmp new file mode 100644 index 000000000..82612dede Binary files /dev/null and b/themes/professional/32/Toolbar.bmp differ