Fix uncomment in block for line comment bug

Fixed block uncomment in undoStreamComment func, new argument.
tryBlockComment is to avoid loop call.
Fixed typo in doStreamComment func.

Fixes #1200, fixes #1714, fixes #2125, fixes #2854, closes #2875
This commit is contained in:
redmanmale 2017-02-06 22:58:37 +03:00 committed by Don Ho
parent 3dfe526019
commit 73ee4426e4
5 changed files with 38 additions and 38 deletions

View File

@ -640,7 +640,7 @@ generic_string BuildMenuFileName(int filenameLen, unsigned int pos, const generi
if (filenameLen > 0)
{
std::vector<TCHAR> vt(filenameLen + 1);
//--FLS: W removed from PathCompactPathExW due to compiler errors for ANSI version.
// W removed from PathCompactPathExW due to compiler errors for ANSI version.
PathCompactPathEx(&vt[0], filename.c_str(), filenameLen + 1, 0);
strTemp.append(convertFileName(vt.begin(), vt.begin() + lstrlen(&vt[0])));
}

View File

@ -3886,7 +3886,7 @@ static generic_string extractSymbol(TCHAR firstChar, TCHAR secondChar, const TCH
bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
{
Buffer * buf = _pEditView->getCurrentBuffer();
//--FLS: Avoid side-effects (e.g. cursor moves number of comment-characters) when file is read-only.
// Avoid side-effects (e.g. cursor moves number of comment-characters) when file is read-only.
if (buf->isReadOnly())
return false;
@ -3916,7 +3916,7 @@ bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
symbol = extractSymbol('0', '0', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
commentLineSymbol = symbol.c_str();
//--FLS: BlockToStreamComment: Needed to decide, if stream-comment can be called below!
// BlockToStreamComment: Needed to decide, if stream-comment can be called below!
symbolStart = extractSymbol('0', '3', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
commentStart = symbolStart.c_str();
symbolEnd = extractSymbol('0', '4', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
@ -3925,14 +3925,14 @@ bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
else
{
commentLineSymbol = buf->getCommentLineSymbol();
//--FLS: BlockToStreamComment: Needed to decide, if stream-comment can be called below!
// BlockToStreamComment: Needed to decide, if stream-comment can be called below!
commentStart = buf->getCommentStart();
commentEnd = buf->getCommentEnd();
}
if ((!commentLineSymbol) || (!commentLineSymbol[0]) || (commentLineSymbol == NULL))
{
//--FLS: BlockToStreamComment: If there is no block-comment symbol, try the stream comment:
// BlockToStreamComment: If there is no block-comment symbol, try the stream comment:
if (!(!commentStart || !commentStart[0] || commentStart == NULL || !commentEnd || !commentEnd[0] || commentEnd == NULL))
{
if (currCommentMode == cm_comment)
@ -3946,7 +3946,7 @@ bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
//"undoStreamComment()" can be more flexible than "isSingleLineAdvancedMode = true",
//since it can uncomment more embedded levels at once and the commentEnd symbol can be located everywhere.
//But, depending on the selection start/end position, the first/last selected line may not be uncommented properly!
return undoStreamComment();
return undoStreamComment(false);
//isSingleLineAdvancedMode = true;
}
else if (currCommentMode == cm_toggle)
@ -4005,7 +4005,7 @@ bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
// "caret return" is part of the last selected line
if ((lines > 0) && (selectionEnd == static_cast<size_t>(_pEditView->execute(SCI_POSITIONFROMLINE, selEndLine))))
selEndLine--;
//--FLS: count lines which were un-commented to decide if undoStreamComment() shall be called.
// count lines which were un-commented to decide if undoStreamComment() shall be called.
int nUncomments = 0;
//Some Lexers need line-comments at the beginning of a line.
const bool avoidIndent = (buf->getLangType() == L_FORTRAN_77 || buf->getLangType() == L_BAANC);
@ -4027,8 +4027,6 @@ bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
if (avoidIndent)
lineIndent = lineStart;
//size_t linebufferSize = lineEnd - lineIndent + 2;
// Replace hard coded 2 (commentLineSymbol + aSpace) to comment_length.
size_t linebufferSize = lineEnd - lineIndent + comment_length;
TCHAR* linebuf = new TCHAR[linebufferSize];
@ -4041,13 +4039,10 @@ bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
{
if (not isSingleLineAdvancedMode)
{
//--FLS: In order to do get case insensitive comparison use strnicmp() instead case-sensitive comparison.
// In order to do get case insensitive comparison use strnicmp() instead case-sensitive comparison.
// Case insensitive comparison is needed e.g. for "REM" and "rem" in Batchfiles.
//if (linebufStr.substr(0, comment_length - 1) == comment.substr(0, comment_length - 1))
//if (generic_strnicmp(linebufStr.c_str(), comment.c_str(), comment_length - 1) == 0)
if (generic_strnicmp(linebufStr.c_str(), comment.c_str(), !(buf->getLangType() == L_BAANC) ? comment_length - 1 : comment_length) == 0)
{
//size_t len = linebufStr[comment_length - 1] == aSpace[0] ? comment_length : comment_length - 1;
size_t len = linebufStr[comment_length - 1] == aSpace[0] ? comment_length : !(buf->getLangType() == L_BAANC) ? comment_length - 1 : comment_length;
_pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + len);
@ -4186,9 +4181,9 @@ bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
}
_pEditView->execute(SCI_ENDUNDOACTION);
//--FLS: undoStreamComment: If there were no block-comments to un-comment try uncommenting of stream-comment.
// undoStreamComment: If there were no block-comments to un-comment try uncommenting of stream-comment.
if ((currCommentMode == cm_uncomment) && (nUncomments == 0)) {
return undoStreamComment();
return undoStreamComment(false);
}
return true;
}
@ -4201,12 +4196,12 @@ bool Notepad_plus::doStreamComment()
generic_string symbolStart;
generic_string symbolEnd;
//--FLS: BlockToStreamComment:
const TCHAR *commentLineSybol;
// BlockToStreamComment:
const TCHAR *commentLineSymbol;
generic_string symbol;
Buffer * buf = _pEditView->getCurrentBuffer();
//--FLS: Avoid side-effects (e.g. cursor moves number of comment-characters) when file is read-only.
// Avoid side-effects (e.g. cursor moves number of comment-characters) when file is read-only.
if (buf->isReadOnly())
return false;
@ -4217,9 +4212,9 @@ bool Notepad_plus::doStreamComment()
if (!userLangContainer)
return false;
//--FLS: BlockToStreamComment: Next two lines needed to decide, if block-comment can be called below!
// BlockToStreamComment: Next two lines needed to decide, if block-comment can be called below!
symbol = extractSymbol('0', '0', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
commentLineSybol = symbol.c_str();
commentLineSymbol = symbol.c_str();
symbolStart = extractSymbol('0', '3', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
commentStart = symbolStart.c_str();
@ -4228,19 +4223,15 @@ bool Notepad_plus::doStreamComment()
}
else
{
//--FLS: BlockToStreamComment: Next line needed to decide, if block-comment can be called below!
commentLineSybol = buf->getCommentLineSymbol();
// BlockToStreamComment: Next line needed to decide, if block-comment can be called below!
commentLineSymbol = buf->getCommentLineSymbol();
commentStart = buf->getCommentStart();
commentEnd = buf->getCommentEnd();
}
// if ((!commentStart) || (!commentStart[0]))
// return false;
// if ((!commentEnd) || (!commentEnd[0]))
// return false;
//--FLS: BlockToStreamComment: If there is no stream-comment symbol, try the block comment:
// BlockToStreamComment: If there is no stream-comment symbol, try the block comment:
if ((!commentStart) || (!commentStart[0]) || (commentStart == NULL) || (!commentEnd) || (!commentEnd[0]) || (commentEnd == NULL)) {
if (!(!commentLineSybol || !commentLineSybol[0] || commentLineSybol == NULL))
if (!(!commentLineSymbol || !commentLineSymbol[0] || commentLineSymbol == NULL))
return doBlockComment(cm_comment);
else
return false;
@ -6528,13 +6519,16 @@ DWORD WINAPI Notepad_plus::backupDocument(void * /*param*/)
#pragma warning( disable : 4127 )
//-- undoStreamComment: New function to undo stream comment around or within selection end-points.
bool Notepad_plus::undoStreamComment()
bool Notepad_plus::undoStreamComment(bool tryBlockComment)
{
const TCHAR *commentStart;
const TCHAR *commentEnd;
const TCHAR *commentLineSymbol;
generic_string symbolStart;
generic_string symbolEnd;
generic_string symbol;
const int charbufLen = 10;
TCHAR charbuf[charbufLen];
@ -6550,6 +6544,8 @@ bool Notepad_plus::undoStreamComment()
if (!userLangContainer)
return false;
symbol = extractSymbol('0', '0', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
commentLineSymbol = symbol.c_str();
symbolStart = extractSymbol('0', '3', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
commentStart = symbolStart.c_str();
symbolEnd = extractSymbol('0', '4', userLangContainer->_keywordLists[SCE_USER_KWLIST_COMMENTS]);
@ -6557,14 +6553,19 @@ bool Notepad_plus::undoStreamComment()
}
else
{
commentLineSymbol = buf->getCommentLineSymbol();
commentStart = buf->getCommentStart();
commentEnd = buf->getCommentEnd();
}
if ((!commentStart) || (!commentStart[0]))
return false;
if ((!commentEnd) || (!commentEnd[0]))
// BlockToStreamComment: If there is no stream-comment symbol and we came not from doBlockComment, try the block comment:
if ((!commentStart) || (!commentStart[0]) || (commentStart == NULL) || (!commentEnd) || (!commentEnd[0]) || (commentEnd == NULL)) {
if (!(!commentLineSymbol || !commentLineSymbol[0] || commentLineSymbol == NULL) && tryBlockComment)
return doBlockComment(cm_uncomment);
else
return false;
}
generic_string start_comment(commentStart);
generic_string end_comment(commentEnd);

View File

@ -199,8 +199,7 @@ public:
bool doBlockComment(comment_mode currCommentMode);
bool doStreamComment();
//--FLS: undoStreamComment: New function unDoStreamComment()
bool undoStreamComment();
bool undoStreamComment(bool tryBlockComment = true);
bool addCurrentMacro();
void macroPlayback(Macro);

View File

@ -1765,7 +1765,7 @@ void Notepad_plus::command(int id)
case IDM_VIEW_WRAP:
{
bool isWraped = !_pEditView->isWrap();
//--FLS: ViewMoveAtWrappingDisableFix: Disable wrapping messes up visible lines. Therefore save view position before in IDM_VIEW_WRAP and restore after SCN_PAINTED, as Scintilla-Doc. says
// ViewMoveAtWrappingDisableFix: Disable wrapping messes up visible lines. Therefore save view position before in IDM_VIEW_WRAP and restore after SCN_PAINTED, as Scintilla-Doc. says
if (!isWraped)
{
_mainEditView.saveCurrentPos();

View File

@ -1678,8 +1678,8 @@ void ScintillaEditView::activateBuffer(BufferID buffer)
void ScintillaEditView::getCurrentFoldStates(std::vector<size_t> & lineStateVector)
{
//-- FLS: xCodeOptimization1304: For active document get folding state from Scintilla.
//-- The code using SCI_CONTRACTEDFOLDNEXT is usually 10%-50% faster than checking each line of the document!!
// xCodeOptimization1304: For active document get folding state from Scintilla.
// The code using SCI_CONTRACTEDFOLDNEXT is usually 10%-50% faster than checking each line of the document!!
size_t contractedFoldHeaderLine = 0;
do {