Skip to content

Commit

Permalink
Fix macro playing back crash issue
Browse files Browse the repository at this point in the history
Fix crash issue while playing back macro if "find previous" and/or "find next"
button actions are/is recorded.

Also prevent from future crash if new commands in Find dialog are forgotten to be
treated.
  • Loading branch information
donho committed Mar 4, 2018
1 parent 789cf38 commit 9b56531
Showing 1 changed file with 167 additions and 139 deletions.
306 changes: 167 additions & 139 deletions PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp
Expand Up @@ -2530,186 +2530,214 @@ void FindReplaceDlg::setStatusbarMessage(const generic_string & msg, FindStatus

void FindReplaceDlg::execSavedCommand(int cmd, uptr_t intValue, generic_string stringValue)
{
switch(cmd)
try
{
case IDC_FRCOMMAND_INIT:
_env = new FindOption;
break;
case IDFINDWHAT:
_env->_str2Search = stringValue;
break;
case IDC_FRCOMMAND_BOOLEANS:
_env->_isWholeWord = ((intValue & IDF_WHOLEWORD)> 0);
_env->_isMatchCase = ((intValue & IDF_MATCHCASE)> 0);
_env->_isRecursive = ((intValue & IDF_FINDINFILES_RECURSIVE_CHECK)> 0);
_env->_isInHiddenDir = ((intValue & IDF_FINDINFILES_INHIDDENDIR_CHECK)> 0);
_env->_doPurge = ((intValue & IDF_PURGE_CHECK)> 0);
_env->_doMarkLine = ((intValue & IDF_MARKLINE_CHECK)> 0);
_env->_isInSelection = ((intValue & IDF_IN_SELECTION_CHECK)> 0);
_env->_isWrapAround = ((intValue & IDF_WRAP)> 0);
_env->_whichDirection = ((intValue & IDF_WHICH_DIRECTION)> 0);
_env->_dotMatchesNewline = ((intValue & IDF_REDOTMATCHNL)> 0);
break;
case IDNORMAL:
_env->_searchType = static_cast<SearchType>(intValue);
break;
case IDREPLACEWITH:
_env->_str4Replace = stringValue;
break;
case IDD_FINDINFILES_DIR_COMBO:
_env->_directory = stringValue;
break;
case IDD_FINDINFILES_FILTERS_COMBO:
_env->_filters = stringValue;
break;
case IDC_FRCOMMAND_EXEC:
switch (cmd)
{
NppParameters *nppParamInst = NppParameters::getInstance();
switch(intValue)
case IDC_FRCOMMAND_INIT:
_env = new FindOption;
break;
case IDFINDWHAT:
_env->_str2Search = stringValue;
break;
case IDC_FRCOMMAND_BOOLEANS:
_env->_isWholeWord = ((intValue & IDF_WHOLEWORD) > 0);
_env->_isMatchCase = ((intValue & IDF_MATCHCASE) > 0);
_env->_isRecursive = ((intValue & IDF_FINDINFILES_RECURSIVE_CHECK) > 0);
_env->_isInHiddenDir = ((intValue & IDF_FINDINFILES_INHIDDENDIR_CHECK) > 0);
_env->_doPurge = ((intValue & IDF_PURGE_CHECK) > 0);
_env->_doMarkLine = ((intValue & IDF_MARKLINE_CHECK) > 0);
_env->_isInSelection = ((intValue & IDF_IN_SELECTION_CHECK) > 0);
_env->_isWrapAround = ((intValue & IDF_WRAP) > 0);
_env->_whichDirection = ((intValue & IDF_WHICH_DIRECTION) > 0);
_env->_dotMatchesNewline = ((intValue & IDF_REDOTMATCHNL) > 0);
break;
case IDNORMAL:
_env->_searchType = static_cast<SearchType>(intValue);
break;
case IDREPLACEWITH:
_env->_str4Replace = stringValue;
break;
case IDD_FINDINFILES_DIR_COMBO:
_env->_directory = stringValue;
break;
case IDD_FINDINFILES_FILTERS_COMBO:
_env->_filters = stringValue;
break;
case IDC_FRCOMMAND_EXEC:
{
case IDOK:
nppParamInst->_isFindReplacing = true;
processFindNext(_env->_str2Search.c_str());
nppParamInst->_isFindReplacing = false;
break;
case IDREPLACE:
nppParamInst->_isFindReplacing = true;
processReplace(_env->_str2Search.c_str(), _env->_str4Replace.c_str(), _env);
nppParamInst->_isFindReplacing = false;
break;
case IDC_FINDALL_OPENEDFILES:
nppParamInst->_isFindReplacing = true;
findAllIn(ALL_OPEN_DOCS);
nppParamInst->_isFindReplacing = false;
break;
case IDC_FINDALL_CURRENTFILE:
nppParamInst->_isFindReplacing = true;
findAllIn(FILES_IN_DIR);
nppParamInst->_isFindReplacing = false;
break;
case IDC_REPLACE_OPENEDFILES :
nppParamInst->_isFindReplacing = true;
replaceAllInOpenedDocs();
nppParamInst->_isFindReplacing = false;
break;
case IDD_FINDINFILES_FIND_BUTTON :
nppParamInst->_isFindReplacing = true;
findAllIn(FILES_IN_DIR);
nppParamInst->_isFindReplacing = false;
break;

case IDD_FINDINFILES_REPLACEINFILES :
NppParameters *nppParamInst = NppParameters::getInstance();
switch (intValue)
{
generic_string msg = TEXT("Are you sure you want to replace all occurrences in :\r");
msg += _env->_directory;
msg += TEXT("\rfor file type : ");
msg += (_env->_filters[0])?_env->_filters:TEXT("*.*");
case IDOK:
nppParamInst->_isFindReplacing = true;
processFindNext(_env->_str2Search.c_str());
nppParamInst->_isFindReplacing = false;
break;

case IDC_FINDNEXT:
{
nppParamInst->_isFindReplacing = true;
_options._whichDirection = DIR_DOWN;
processFindNext(_env->_str2Search.c_str());
nppParamInst->_isFindReplacing = false;
}
break;

if (::MessageBox(_hParent, msg.c_str(), TEXT("Are you sure?"), MB_OKCANCEL|MB_DEFBUTTON2) == IDOK)
case IDC_FINDPREV:
{
nppParamInst->_isFindReplacing = true;
::SendMessage(_hParent, WM_REPLACEINFILES, 0, 0);
_env->_whichDirection = DIR_UP;
processFindNext(_env->_str2Search.c_str());
nppParamInst->_isFindReplacing = false;
}
break;
}
case IDREPLACEALL :
{
nppParamInst->_isFindReplacing = true;
(*_ppEditView)->execute(SCI_BEGINUNDOACTION);
int nbReplaced = processAll(ProcessReplaceAll, _env);
(*_ppEditView)->execute(SCI_ENDUNDOACTION);
nppParamInst->_isFindReplacing = false;

generic_string result;
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
if (nbReplaced < 0)
case IDREPLACE:
nppParamInst->_isFindReplacing = true;
processReplace(_env->_str2Search.c_str(), _env->_str4Replace.c_str(), _env);
nppParamInst->_isFindReplacing = false;
break;
case IDC_FINDALL_OPENEDFILES:
nppParamInst->_isFindReplacing = true;
findAllIn(ALL_OPEN_DOCS);
nppParamInst->_isFindReplacing = false;
break;
case IDC_FINDALL_CURRENTFILE:
nppParamInst->_isFindReplacing = true;
findAllIn(FILES_IN_DIR);
nppParamInst->_isFindReplacing = false;
break;
case IDC_REPLACE_OPENEDFILES:
nppParamInst->_isFindReplacing = true;
replaceAllInOpenedDocs();
nppParamInst->_isFindReplacing = false;
break;
case IDD_FINDINFILES_FIND_BUTTON:
nppParamInst->_isFindReplacing = true;
findAllIn(FILES_IN_DIR);
nppParamInst->_isFindReplacing = false;
break;

case IDD_FINDINFILES_REPLACEINFILES:
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-replaceall-re-malformed", TEXT("Replace All: The regular expression is malformed."));
generic_string msg = TEXT("Are you sure you want to replace all occurrences in :\r");
msg += _env->_directory;
msg += TEXT("\rfor file type : ");
msg += (_env->_filters[0]) ? _env->_filters : TEXT("*.*");

if (::MessageBox(_hParent, msg.c_str(), TEXT("Are you sure?"), MB_OKCANCEL | MB_DEFBUTTON2) == IDOK)
{
nppParamInst->_isFindReplacing = true;
::SendMessage(_hParent, WM_REPLACEINFILES, 0, 0);
nppParamInst->_isFindReplacing = false;
}
break;
}
else
case IDREPLACEALL:
{
if (nbReplaced == 1)
nppParamInst->_isFindReplacing = true;
(*_ppEditView)->execute(SCI_BEGINUNDOACTION);
int nbReplaced = processAll(ProcessReplaceAll, _env);
(*_ppEditView)->execute(SCI_ENDUNDOACTION);
nppParamInst->_isFindReplacing = false;

generic_string result;
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
if (nbReplaced < 0)
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-replaceall-1-replaced", TEXT("Replace All: 1 occurrence was replaced."));
result = pNativeSpeaker->getLocalizedStrFromID("find-status-replaceall-re-malformed", TEXT("Replace All: The regular expression is malformed."));
}
else
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-replaceall-nb-replaced", TEXT("Replace All: $INT_REPLACE$ occurrences were replaced."));
result = stringReplace(result, TEXT("$INT_REPLACE$"), std::to_wstring(nbReplaced));
if (nbReplaced == 1)
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-replaceall-1-replaced", TEXT("Replace All: 1 occurrence was replaced."));
}
else
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-replaceall-nb-replaced", TEXT("Replace All: $INT_REPLACE$ occurrences were replaced."));
result = stringReplace(result, TEXT("$INT_REPLACE$"), std::to_wstring(nbReplaced));
}
}
}

setStatusbarMessage(result, FSMessage);
break;
}

case IDCCOUNTALL :
{
int nbCounted = processAll(ProcessCountAll, _env);
generic_string result;
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
if (nbCounted < 0)
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-count-re-malformed", TEXT("Count: The regular expression to search is malformed."));
setStatusbarMessage(result, FSMessage);
break;
}
else

case IDCCOUNTALL:
{
if (nbCounted == 1)
int nbCounted = processAll(ProcessCountAll, _env);
generic_string result;
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
if (nbCounted < 0)
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-count-1-match", TEXT("Count: 1 match."));
result = pNativeSpeaker->getLocalizedStrFromID("find-status-count-re-malformed", TEXT("Count: The regular expression to search is malformed."));
}
else
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-count-nb-matches", TEXT("Count: $INT_REPLACE$ matches."));
result = stringReplace(result, TEXT("$INT_REPLACE$"), std::to_wstring(nbCounted));
if (nbCounted == 1)
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-count-1-match", TEXT("Count: 1 match."));
}
else
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-count-nb-matches", TEXT("Count: $INT_REPLACE$ matches."));
result = stringReplace(result, TEXT("$INT_REPLACE$"), std::to_wstring(nbCounted));
}
}
setStatusbarMessage(result, FSMessage);
break;
}
setStatusbarMessage(result, FSMessage);
break;
}

case IDCMARKALL:
{
nppParamInst->_isFindReplacing = true;
int nbMarked = processAll(ProcessMarkAll, _env);
nppParamInst->_isFindReplacing = false;
generic_string result;

NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
if (nbMarked < 0)
case IDCMARKALL:
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-mark-re-malformed", TEXT("Mark: The regular expression to search is malformed."));
}
else
{
TCHAR moreInfo[128];
nppParamInst->_isFindReplacing = true;
int nbMarked = processAll(ProcessMarkAll, _env);
nppParamInst->_isFindReplacing = false;
generic_string result;

NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
generic_string msg = pNativeSpeaker->getLocalizedStrFromID("find-status-invalid-re", TEXT("Find: Invalid regular expression"));
if (nbMarked <= 1)
if (nbMarked < 0)
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-mark-1-match", TEXT("1 match."));
result = pNativeSpeaker->getLocalizedStrFromID("find-status-mark-re-malformed", TEXT("Mark: The regular expression to search is malformed."));
}
else
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-mark-nb-matches", TEXT("$INT_REPLACE$ matches."));
result = stringReplace(result, TEXT("$INT_REPLACE$"), std::to_wstring(nbMarked));
TCHAR moreInfo[128];
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
generic_string msg = pNativeSpeaker->getLocalizedStrFromID("find-status-invalid-re", TEXT("Find: Invalid regular expression"));
if (nbMarked <= 1)
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-mark-1-match", TEXT("1 match."));
}
else
{
result = pNativeSpeaker->getLocalizedStrFromID("find-status-mark-nb-matches", TEXT("$INT_REPLACE$ matches."));
result = stringReplace(result, TEXT("$INT_REPLACE$"), std::to_wstring(nbMarked));
}
result = moreInfo;
}
result = moreInfo;

setStatusbarMessage(result, FSMessage);
break;
}

setStatusbarMessage(result, FSMessage);
break;
default:
throw std::runtime_error("Internal error: unknown saved command!");
}
default:
throw std::runtime_error("Internal error: unknown saved command!");

delete _env;
_env = &_options;
break;
}
delete _env;
_env = &_options;
break;
default:
throw std::runtime_error("Internal error: unknown SnR command!");
}
default:
throw std::runtime_error("Internal error: unknown SnR command!");
}
catch (std::runtime_error err)
{
MessageBoxA(NULL, err.what(), "Play Macro Exception", MB_OK);
}
}

Expand Down

0 comments on commit 9b56531

Please sign in to comment.