terminal/src/cascadia/TerminalControl/SearchBoxControl.cpp
Kaiyu Wang a322ff06f8
Fix Search non-blocking follow-ups (#4028)
* search box text localization and search parameters refactoring

* format fix

* remvove unecessary spaces

* Tooltips text localization, CR chanegs

* Move ESC handling to SearchBoxControl

* format check

* mark Esc key input as handled in SearchBoxControl
2019-12-20 17:35:31 -08:00

199 lines
6.4 KiB
C++

// Copyright (c) Microsoft Corporation
// Licensed under the MIT license.
#include "pch.h"
#include "SearchBoxControl.h"
#include "SearchBoxControl.g.cpp"
using namespace winrt;
using namespace winrt::Windows::UI::Xaml;
using namespace winrt::Windows::UI::Core;
namespace winrt::Microsoft::Terminal::TerminalControl::implementation
{
// Constructor
SearchBoxControl::SearchBoxControl()
{
InitializeComponent();
this->CharacterReceived({ this, &SearchBoxControl::_CharacterHandler });
this->KeyDown({ this, &SearchBoxControl::_KeyDownHandler });
_focusableElements.insert(TextBox());
_focusableElements.insert(CloseButton());
_focusableElements.insert(CaseSensitivityButton());
_focusableElements.insert(GoForwardButton());
_focusableElements.insert(GoBackwardButton());
}
// Method Description:
// - Check if the current search direction is forward
// Arguments:
// - <none>
// Return Value:
// - bool: the current search direction, determined by the
// states of the two direction buttons
bool SearchBoxControl::_GoForward()
{
return GoForwardButton().IsChecked().GetBoolean();
}
// Method Description:
// - Check if the current search is case sensitive
// Arguments:
// - <none>
// Return Value:
// - bool: whether the current search is case sensitive (case button is checked )
// or not
bool SearchBoxControl::_CaseSensitive()
{
return CaseSensitivityButton().IsChecked().GetBoolean();
}
// Method Description:
// - Handler for pressing Enter on TextBox, trigger
// text search
// Arguments:
// - sender: not used
// - e: event data
// Return Value:
// - <none>
void SearchBoxControl::TextBoxKeyDown(winrt::Windows::Foundation::IInspectable const& /*sender*/, Input::KeyRoutedEventArgs const& e)
{
if (e.OriginalKey() == winrt::Windows::System::VirtualKey::Enter)
{
auto const state = CoreWindow::GetForCurrentThread().GetKeyState(winrt::Windows::System::VirtualKey::Shift);
if (WI_IsFlagSet(state, CoreVirtualKeyStates::Down))
{
_SearchHandlers(TextBox().Text(), !_GoForward(), _CaseSensitive());
}
else
{
_SearchHandlers(TextBox().Text(), _GoForward(), _CaseSensitive());
}
e.Handled(true);
}
}
// Method Description:
// - Handler for pressing "Esc" when focusing
// on the search dialog, this triggers close
// event of the Search dialog
// Arguments:
// - sender: not used
// - e: event data
// Return Value:
// - <none>
void SearchBoxControl::_KeyDownHandler(winrt::Windows::Foundation::IInspectable const& /*sender*/,
Input::KeyRoutedEventArgs const& e)
{
if (e.OriginalKey() == winrt::Windows::System::VirtualKey::Escape)
{
_ClosedHandlers(*this, e);
e.Handled(true);
}
}
// Method Description:
// - Handler for pressing Enter on TextBox, trigger
// text search
// Arguments:
// - <none>
// Return Value:
// - <none>
void SearchBoxControl::SetFocusOnTextbox()
{
if (TextBox())
{
Input::FocusManager::TryFocusAsync(TextBox(), FocusState::Keyboard);
TextBox().SelectAll();
}
}
// Method Description:
// - Check if the current focus is on any element within the
// search box
// Arguments:
// - <none>
// Return Value:
// - bool: whether the current focus is on the search box
bool SearchBoxControl::ContainsFocus()
{
auto focusedElement = Input::FocusManager::GetFocusedElement(this->XamlRoot());
if (_focusableElements.count(focusedElement) > 0)
{
return true;
}
return false;
}
// Method Description:
// - Handler for clicking the GoBackward button. This change the value of _goForward,
// mark GoBackward button as checked and ensure GoForward button
// is not checked
// Arguments:
// - sender: not used
// - e: not used
// Return Value:
// - <none>
void SearchBoxControl::GoBackwardClicked(winrt::Windows::Foundation::IInspectable const& /*sender*/, RoutedEventArgs const& /*e*/)
{
GoBackwardButton().IsChecked(true);
if (GoForwardButton().IsChecked())
{
GoForwardButton().IsChecked(false);
}
// kick off search
_SearchHandlers(TextBox().Text(), _GoForward(), _CaseSensitive());
}
// Method Description:
// - Handler for clicking the GoForward button. This change the value of _goForward,
// mark GoForward button as checked and ensure GoBackward button
// is not checked
// Arguments:
// - sender: not used
// - e: not used
// Return Value:
// - <none>
void SearchBoxControl::GoForwardClicked(winrt::Windows::Foundation::IInspectable const& /*sender*/, RoutedEventArgs const& /*e*/)
{
GoForwardButton().IsChecked(true);
if (GoBackwardButton().IsChecked())
{
GoBackwardButton().IsChecked(false);
}
// kick off search
_SearchHandlers(TextBox().Text(), _GoForward(), _CaseSensitive());
}
// Method Description:
// - Handler for clicking the close button. This destructs the
// search box object in TermControl
// Arguments:
// - sender: not used
// - e: event data
// Return Value:
// - <none>
void SearchBoxControl::CloseClick(winrt::Windows::Foundation::IInspectable const& /*sender*/, RoutedEventArgs const& e)
{
_ClosedHandlers(*this, e);
}
// Method Description:
// - To avoid Characters input bubbling up to terminal, we implement this handler here,
// simply mark the key input as handled
// Arguments:
// - sender: not used
// - e: event data
// Return Value:
// - <none>
void SearchBoxControl::_CharacterHandler(winrt::Windows::Foundation::IInspectable const& /*sender*/, Input::CharacterReceivedRoutedEventArgs const& e)
{
e.Handled(true);
}
}