[ENHANCEMENT] (Author: Mike Cowperthwaite) Enhance Incremental search. (part 2/2)

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@1335 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
Don Ho 2015-02-06 03:46:15 +00:00
parent b7edd3c8e2
commit 3d2f570aba
6 changed files with 109 additions and 88 deletions

View File

@ -2572,6 +2572,12 @@ void Notepad_plus::specialCmd(int id)
}
}
BOOL Notepad_plus::processIncrFindAccel(MSG *msg) const
{
if (!::IsChild(_incrementFindDlg.getHSelf(), ::GetFocus()))
return FALSE;
return ::TranslateAccelerator(_incrementFindDlg.getHSelf(), _accelerator.getIncrFindAccTable(), msg);
}
void Notepad_plus::setLanguage(LangType langType) {
//Add logic to prevent changing a language when a document is shared between two views

View File

@ -519,6 +519,8 @@ private:
void setLanguage(LangType langType);
enum LangType menuID2LangType(int cmdID);
BOOL processIncrFindAccel(MSG *msg) const;
void checkMenuItem(int itemID, bool willBeChecked) const {
::CheckMenuItem(_mainMenuHandle, itemID, MF_BYCOMMAND | (willBeChecked?MF_CHECKED:MF_UNCHECKED));
};

View File

@ -269,6 +269,9 @@ bool Notepad_plus_Window::isDlgsMsg(MSG *msg) const
{
for (size_t i = 0, len = _notepad_plus_plus_core._hModelessDlgs.size(); i < len; ++i)
{
if (_notepad_plus_plus_core.processIncrFindAccel(msg))
return true;
if (::IsDialogMessageW(_notepad_plus_plus_core._hModelessDlgs[i], msg))
return true;
}

View File

@ -2698,7 +2698,7 @@ void FindIncrementDlg::display(bool toShow) const
_pRebar->setIDVisible(_rbBand.wID, toShow);
}
BOOL CALLBACK FindIncrementDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
BOOL CALLBACK FindIncrementDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
@ -2718,8 +2718,12 @@ BOOL CALLBACK FindIncrementDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
case WM_COMMAND :
{
bool isUnicode = (*(_pFRDlg->_ppEditView))->getCurrentBuffer()->getUnicodeMode() != uni8Bit;
FindStatus findStatus = FSFound;
bool updateSearch = false;
bool forward = true;
bool advance = false;
bool updateHiLight = false;
bool updateCase = false;
switch (LOWORD(wParam))
{
case IDCANCEL :
@ -2730,85 +2734,77 @@ BOOL CALLBACK FindIncrementDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
display(false);
return TRUE;
case IDC_INCFINDPREVOK :
case IDC_INCFINDNXTOK :
case IDOK :
case IDM_SEARCH_FINDINCREMENT: // Accel table: Start incremental search
// if focus is on a some other control, return it to the edit field
if (::GetFocus() != ::GetDlgItem(_hSelf, IDC_INCFINDTEXT))
{
::PostMessage(_hSelf, WM_NEXTDLGCTL, (WPARAM)::GetDlgItem(_hSelf, IDC_INCFINDTEXT), TRUE);
return TRUE;
}
// otherwise, repeat the search
case IDM_SEARCH_FINDPREV: // Accel table: find prev
case IDM_SEARCH_FINDNEXT: // Accel table: find next
case IDC_INCFINDPREVOK:
case IDC_INCFINDNXTOK:
case IDOK:
updateSearch = true;
advance = true;
forward = (LOWORD(wParam) == IDC_INCFINDNXTOK) ||
(LOWORD(wParam) == IDM_SEARCH_FINDNEXT) ||
(LOWORD(wParam) == IDM_SEARCH_FINDINCREMENT) ||
((LOWORD(wParam) == IDOK) && !(GetKeyState(VK_SHIFT) & SHIFTED));
break;
case IDC_INCFINDMATCHCASE:
updateSearch = true;
updateCase = true;
updateHiLight = true;
break;
case IDC_INCFINDHILITEALL:
updateHiLight = true;
break;
case IDC_INCFINDTEXT:
if (HIWORD(wParam) == EN_CHANGE)
{
updateSearch = true;
break;
}
// treat other edit notifications as unhandled
default:
return DefWindowProc(getHSelf(), message, wParam, lParam);
}
FindOption fo;
fo._isWholeWord = false;
fo._incrementalType = advance ? NextIncremental : FirstIncremental;
fo._whichDirection = forward ? DIR_DOWN : DIR_UP;
fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0));
bool isUnicode = (*(_pFRDlg->_ppEditView))->getCurrentBuffer()->getUnicodeMode() != uni8Bit;
generic_string str2Search = _pFRDlg->getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode);
if (updateSearch)
{
FindStatus findStatus = FSFound;
bool isFound = _pFRDlg->processFindNext(str2Search.c_str(), &fo, &findStatus);
setFindStatus(findStatus);
// If case-sensitivity changed (to Match=yes), there may have been a matched selection that
// now does not match; so if Not Found, clear selection and put caret at beginning of what was
// selected (no change, if there was no selection)
if (updateCase && !isFound)
{
FindOption fo;
fo._isWholeWord = false;
fo._incrementalType = NextIncremental;
fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0));
if (LOWORD(wParam) == IDC_INCFINDPREVOK)
fo._whichDirection = DIR_UP;
else if (LOWORD(wParam) == IDOK)
{
SHORT nVirtKey = GetKeyState(VK_SHIFT);
if (nVirtKey & SHIFTED)
fo._whichDirection = DIR_UP;
}
generic_string str2Search = _pFRDlg->getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode);
_pFRDlg->processFindNext(str2Search.c_str(), &fo, &findStatus);
setFindStatus(findStatus);
CharacterRange range = (*(_pFRDlg->_ppEditView))->getSelection();
(*(_pFRDlg->_ppEditView))->execute(SCI_SETSEL, (WPARAM)-1, range.cpMin);
}
return TRUE;
case IDC_INCFINDTEXT :
{
switch(HIWORD(wParam))
{
case EN_CHANGE :
{
FindOption fo;
fo._isWholeWord = false;
fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0));
fo._incrementalType = FirstIncremental;
generic_string str2Search = _pFRDlg->getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode);
_pFRDlg->processFindNext(str2Search.c_str(), &fo, &findStatus);
setFindStatus(findStatus);
}
return TRUE;
case EN_KILLFOCUS :
case EN_SETFOCUS :
break;
}
}
return TRUE;
case IDC_INCFINDMATCHCASE:
{
FindOption fo;
fo._isWholeWord = false;
fo._incrementalType = FirstIncremental;
fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0));
generic_string str2Search = _pFRDlg->getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode);
bool isFound = _pFRDlg->processFindNext(str2Search.c_str(), &fo, &findStatus);
setFindStatus(findStatus);
if (!isFound)
{
CharacterRange range = (*(_pFRDlg->_ppEditView))->getSelection();
(*(_pFRDlg->_ppEditView))->execute(SCI_SETSEL, (WPARAM)-1, range.cpMin);
}
}
case IDC_INCFINDHILITEALL :
{
FindOption fo;
fo._isWholeWord = false;
fo._incrementalType = FirstIncremental;
fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0));
generic_string str2Search = _pFRDlg->getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode);
bool isHiLieAll = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDHILITEALL, BM_GETCHECK, 0, 0));
if (str2Search == TEXT(""))
isHiLieAll = false;
markSelectedTextInc(isHiLieAll, &fo);
}
return TRUE;
}
if (updateHiLight)
{
bool highlight = !str2Search.empty() &&
(BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDHILITEALL, BM_GETCHECK, 0, 0));
markSelectedTextInc(highlight, &fo);
}
return TRUE;
}
case WM_ERASEBKGND:
@ -2825,7 +2821,7 @@ BOOL CALLBACK FindIncrementDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
break;
}
}
return FALSE;
return DefWindowProc(getHSelf(), message, wParam, lParam);
}
void FindIncrementDlg::markSelectedTextInc(bool enable, FindOption *opt)

View File

@ -35,6 +35,8 @@
#include "Notepad_plus_Window.h"
#include "keys.h"
#include <array>
const int KEY_STR_LEN = 16;
struct KeyIDNAME {
@ -452,6 +454,7 @@ BOOL CALLBACK Shortcut::run_dlgProc(UINT Message, WPARAM wParam, LPARAM)
// return true if one of CommandShortcuts is deleted. Otherwise false.
void Accelerator::updateShortcuts()
{
const std::array<int, 3> IFAccIds = { IDM_SEARCH_FINDNEXT, IDM_SEARCH_FINDPREV, IDM_SEARCH_FINDINCREMENT };
NppParameters *pNppParam = NppParameters::getInstance();
vector<CommandShortcut> & shortcuts = pNppParam->getUserShortcuts();
@ -467,6 +470,7 @@ void Accelerator::updateShortcuts()
if (_pAccelArray)
delete [] _pAccelArray;
_pAccelArray = new ACCEL[nbMenu+nbMacro+nbUserCmd+nbPluginCmd];
vector<ACCEL> IFAcc;
int offset = 0;
size_t i = 0;
@ -476,6 +480,9 @@ void Accelerator::updateShortcuts()
_pAccelArray[offset].cmd = (WORD)(shortcuts[i].getID());
_pAccelArray[offset].fVirt = shortcuts[i].getAcceleratorModifiers();
_pAccelArray[offset].key = shortcuts[i].getKeyCombo()._key;
// Special extra handling for shortcuts shared by Incremental Find dialog
if (std::find(IFAccIds.begin(), IFAccIds.end(), shortcuts[i].getID()) != IFAccIds.end())
IFAcc.push_back(_pAccelArray[offset]);
++offset;
}
}
@ -510,7 +517,15 @@ void Accelerator::updateShortcuts()
_nbAccelItems = offset;
updateFullMenu();
reNew(); //update the table
//update the table
if (_hAccTable)
::DestroyAcceleratorTable(_hAccTable);
_hAccTable = ::CreateAcceleratorTable(_pAccelArray, _nbAccelItems);
if (_hIncFindAccTab)
::DestroyAcceleratorTable(_hIncFindAccTab);
_hIncFindAccTab = ::CreateAcceleratorTable(IFAcc.data(), IFAcc.size());
return;
}

View File

@ -342,10 +342,12 @@ private :
class Accelerator { //Handles accelerator keys for Notepad++ menu, including custom commands
friend class ShortcutMapper;
public:
Accelerator():_hAccelMenu(NULL), _hMenuParent(NULL), _hAccTable(NULL), _pAccelArray(NULL), _nbAccelItems(0){};
~Accelerator(){
Accelerator() :_hAccelMenu(NULL), _hMenuParent(NULL), _hAccTable(NULL), _hIncFindAccTab(NULL), _pAccelArray(NULL), _nbAccelItems(0){};
~Accelerator() {
if (_hAccTable)
::DestroyAcceleratorTable(_hAccTable);
if (_hIncFindAccTab)
::DestroyAcceleratorTable(_hIncFindAccTab);
if (_pAccelArray)
delete [] _pAccelArray;
};
@ -355,6 +357,7 @@ public:
updateShortcuts();
};
HACCEL getAccTable() const {return _hAccTable;};
HACCEL getIncrFindAccTable() const { return _hIncFindAccTab; };
void updateShortcuts();
void updateFullMenu();
@ -363,14 +366,10 @@ private:
HMENU _hAccelMenu;
HWND _hMenuParent;
HACCEL _hAccTable;
HACCEL _hIncFindAccTab;
ACCEL *_pAccelArray;
int _nbAccelItems;
void reNew() {
if(_hAccTable)
::DestroyAcceleratorTable(_hAccTable);
_hAccTable = ::CreateAcceleratorTable(_pAccelArray, _nbAccelItems);
};
void updateMenuItemByCommand(CommandShortcut csc);
};