|
|
|
@ -610,7 +610,7 @@ std::pair<intptr_t, intptr_t> Finder::gotoFoundLine(size_t nOccurrence)
|
|
|
|
|
{ |
|
|
|
|
index = nOccurrence - 1; |
|
|
|
|
} |
|
|
|
|
else // nOccurrence not used: use current line relative pos to check if it's inside of a marked occurrence
|
|
|
|
|
else // nOccurrence == 0 -> not used: use current line relative pos to check if it's inside of a marked occurrence
|
|
|
|
|
{ |
|
|
|
|
intptr_t currentPosInLine = currentPos - start; |
|
|
|
|
|
|
|
|
@ -718,18 +718,18 @@ bool Finder::canFind(const TCHAR *fileName, size_t lineNumber, size_t* indexToSt
|
|
|
|
|
// X : current sel
|
|
|
|
|
// XXXXY : current sel + current pos
|
|
|
|
|
//
|
|
|
|
|
// 1 2 3 4 Status auxiliaryInfo
|
|
|
|
|
// =======================================================================================
|
|
|
|
|
// Y [ ] [ ] [ ] [ ] : pos_infront -1
|
|
|
|
|
// [ ] [ ] [ ] [ Y ] : pos_inside 4
|
|
|
|
|
// [ ] XXY ] [ ] [ ] : pos_inside 2
|
|
|
|
|
// [ ] [ ] [ ] [ XXXY : pos_inside 4
|
|
|
|
|
// [ ] [ ] [XXXXXY [ ] : pos_inside 3
|
|
|
|
|
// [ Y [ ] [ ] [ ] : pos_between 1
|
|
|
|
|
// [ ] [ ] [ ] Y ] : pos_between 3
|
|
|
|
|
// [ ] [ ] [ Y [ ] : pos_between 3
|
|
|
|
|
// [ ] [ ] Y [ ] [ ] : pos_between 2
|
|
|
|
|
// [ ] [ ] [ ] [ ] Y : pos_behind 4
|
|
|
|
|
// occurrence 1 occur. 2 occur. 3 occur. 4 Status auxiliaryInfo
|
|
|
|
|
// =========================================================================================================
|
|
|
|
|
// situation 1: Y [ ] [ ] [ ] [ ] : pos_infront -1
|
|
|
|
|
// situation 2: [ ] [ ] [ ] [ Y ] : pos_inside 4
|
|
|
|
|
// situation 3: [ ] XXY ] [ ] [ ] : pos_inside 2
|
|
|
|
|
// situation 4: [ ] [ ] [ ] [ XXXY : pos_inside 4
|
|
|
|
|
// situation 5: [ ] [ ] [XXXXXY [ ] : pos_inside 3
|
|
|
|
|
// situation 6: [ Y [ ] [ ] [ ] : pos_between 1
|
|
|
|
|
// situation 7: [ ] [ ] [ ] Y ] : pos_between 3
|
|
|
|
|
// situation 8: [ ] [ ] [ Y [ ] : pos_between 3
|
|
|
|
|
// situation 9: [ ] [ ] Y [ ] [ ] : pos_between 2
|
|
|
|
|
// situation 10: [ ] [ ] [ ] [ ] Y : pos_behind 4
|
|
|
|
|
|
|
|
|
|
Finder::CurrentPosInLineInfo Finder::getCurrentPosInLineInfo(intptr_t currentPosInLine, const SearchResultMarkingLine& markingLine) const |
|
|
|
|
{ |
|
|
|
@ -846,12 +846,15 @@ void Finder::gotoNextFoundResult(int direction)
|
|
|
|
|
assert(min_lno >= 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (min_lno < 0) min_lno = lno; // when lno is a search header line
|
|
|
|
|
if (min_lno < 0) |
|
|
|
|
min_lno = lno; // when lno is a search header line
|
|
|
|
|
|
|
|
|
|
assert(min_lno <= max_lno); |
|
|
|
|
|
|
|
|
|
if (lno > max_lno && direction == 0) lno = min_lno; |
|
|
|
|
else if (lno < min_lno) lno = max_lno; |
|
|
|
|
if (lno > max_lno && direction == 0) |
|
|
|
|
lno = min_lno; |
|
|
|
|
else if (lno < min_lno) |
|
|
|
|
lno = max_lno; |
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Set anchor and make sure that achor is not on the last (empty) line or head lines
|
|
|
|
@ -879,7 +882,7 @@ void Finder::gotoNextFoundResult(int direction)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t n = 0; |
|
|
|
|
size_t occurrenceNumberInLine_base1 = 0; |
|
|
|
|
const SearchResultMarkingLine& markingLine = *(_pMainMarkings->begin() + lno); |
|
|
|
|
|
|
|
|
|
//
|
|
|
|
@ -894,21 +897,30 @@ void Finder::gotoNextFoundResult(int direction)
|
|
|
|
|
{ |
|
|
|
|
switch (cpili._status) |
|
|
|
|
{ |
|
|
|
|
case pos_infront: |
|
|
|
|
case pos_infront: // 2 situation:
|
|
|
|
|
{ |
|
|
|
|
if (markingLine._segmentPostions[0].second < SC_SEARCHRESULT_LINEBUFFERMAXLENGTH) // 1. The occurrence is displayed in the line
|
|
|
|
|
{ |
|
|
|
|
occurrenceNumberInLine_base1 = 1; |
|
|
|
|
} |
|
|
|
|
else // 2. The occurrence is NOT displayed in the line
|
|
|
|
|
{ |
|
|
|
|
n = 1; |
|
|
|
|
lno++; |
|
|
|
|
anchorWithNoHeaderLines(lno, init_lno, min_lno, max_lno, direction); |
|
|
|
|
occurrenceNumberInLine_base1 = 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case pos_between: |
|
|
|
|
case pos_inside: |
|
|
|
|
{ |
|
|
|
|
n = cpili.auxiliaryInfo + 1; |
|
|
|
|
if (n > markingLine._segmentPostions.size()) |
|
|
|
|
occurrenceNumberInLine_base1 = cpili.auxiliaryInfo + 1; |
|
|
|
|
if (occurrenceNumberInLine_base1 > markingLine._segmentPostions.size()) |
|
|
|
|
{ |
|
|
|
|
lno++; |
|
|
|
|
anchorWithNoHeaderLines(lno, init_lno, min_lno, max_lno, direction); |
|
|
|
|
n = 1; |
|
|
|
|
occurrenceNumberInLine_base1 = 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
@ -917,7 +929,7 @@ void Finder::gotoNextFoundResult(int direction)
|
|
|
|
|
{ |
|
|
|
|
lno++; |
|
|
|
|
anchorWithNoHeaderLines(lno, init_lno, min_lno, max_lno, direction); |
|
|
|
|
n = 1; |
|
|
|
|
occurrenceNumberInLine_base1 = 1; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -931,33 +943,33 @@ void Finder::gotoNextFoundResult(int direction)
|
|
|
|
|
lno--; |
|
|
|
|
anchorWithNoHeaderLines(lno, init_lno, min_lno, max_lno, direction); |
|
|
|
|
const SearchResultMarkingLine& newMarkingLine = *(_pMainMarkings->begin() + lno); |
|
|
|
|
n = newMarkingLine._segmentPostions.size(); |
|
|
|
|
occurrenceNumberInLine_base1 = newMarkingLine._segmentPostions.size(); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case pos_between: |
|
|
|
|
{ |
|
|
|
|
n = cpili.auxiliaryInfo; |
|
|
|
|
occurrenceNumberInLine_base1 = cpili.auxiliaryInfo; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case pos_inside: |
|
|
|
|
{ |
|
|
|
|
if (cpili.auxiliaryInfo > 1) |
|
|
|
|
n = cpili.auxiliaryInfo - 1; |
|
|
|
|
occurrenceNumberInLine_base1 = cpili.auxiliaryInfo - 1; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
lno--; |
|
|
|
|
anchorWithNoHeaderLines(lno, init_lno, min_lno, max_lno, direction); |
|
|
|
|
const SearchResultMarkingLine& newMarkingLine = *(_pMainMarkings->begin() + lno); |
|
|
|
|
n = newMarkingLine._segmentPostions.size(); |
|
|
|
|
occurrenceNumberInLine_base1 = newMarkingLine._segmentPostions.size(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case pos_behind: |
|
|
|
|
{ |
|
|
|
|
n = cpili.auxiliaryInfo; |
|
|
|
|
occurrenceNumberInLine_base1 = cpili.auxiliaryInfo; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -968,7 +980,7 @@ void Finder::gotoNextFoundResult(int direction)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_scintView.execute(SCI_ENSUREVISIBLE, lno); |
|
|
|
|
std::pair<intptr_t, intptr_t> newPos = gotoFoundLine(n); |
|
|
|
|
std::pair<intptr_t, intptr_t> newPos = gotoFoundLine(occurrenceNumberInLine_base1); |
|
|
|
|
|
|
|
|
|
lineStartAbsPos = _scintView.execute(SCI_POSITIONFROMLINE, lno); |
|
|
|
|
intptr_t lineEndAbsPos = _scintView.execute(SCI_GETLINEENDPOSITION, lno); |
|
|
|
@ -979,9 +991,11 @@ void Finder::gotoNextFoundResult(int direction)
|
|
|
|
|
if (end > lineEndAbsPos) |
|
|
|
|
end = lineEndAbsPos; |
|
|
|
|
|
|
|
|
|
if (begin < end) |
|
|
|
|
{ |
|
|
|
|
_scintView.execute(SCI_SETSEL, begin, end); |
|
|
|
|
_scintView.execute(SCI_SCROLLRANGE, begin, end); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FindInFinderDlg::initFromOptions() |
|
|
|
|