1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_VIEWS_CONTROLS_PREFIX_SELECTOR_H_
#define UI_VIEWS_CONTROLS_PREFIX_SELECTOR_H_
#include <stddef.h>
#include <stdint.h>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/views/views_export.h"
namespace base {
class TickClock;
}
namespace views {
class PrefixDelegate;
class View;
// PrefixSelector is used to change the selection in a view as the user
// types characters.
class VIEWS_EXPORT PrefixSelector : public ui::TextInputClient {
public:
PrefixSelector(PrefixDelegate* delegate, View* host_view);
PrefixSelector(const PrefixSelector&) = delete;
PrefixSelector& operator=(const PrefixSelector&) = delete;
~PrefixSelector() override;
// Invoked from the view when it loses focus.
void OnViewBlur();
// Returns whether a key typed now would continue the existing search or start
// a new search.
bool ShouldContinueSelection() const;
// ui::TextInputClient:
base::WeakPtr<ui::TextInputClient> AsWeakPtr() override;
void SetCompositionText(const ui::CompositionText& composition) override;
size_t ConfirmCompositionText(bool keep_selection) override;
void ClearCompositionText() override;
void InsertText(const std::u16string& text,
InsertTextCursorBehavior cursor_behavior) override;
void InsertChar(const ui::KeyEvent& event) override;
ui::TextInputType GetTextInputType() const override;
ui::TextInputMode GetTextInputMode() const override;
base::i18n::TextDirection GetTextDirection() const override;
int GetTextInputFlags() const override;
bool CanComposeInline() const override;
gfx::Rect GetCaretBounds() const override;
gfx::Rect GetSelectionBoundingBox() const override;
#if BUILDFLAG(IS_WIN)
std::optional<gfx::Rect> GetProximateCharacterBounds(
const gfx::Range& range) const override;
std::optional<size_t> GetProximateCharacterIndexFromPoint(
const gfx::Point& screen_point_in_dips,
ui::IndexFromPointFlags flags) const override;
#endif // BUILDFLAG(IS_WIN)
bool GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const override;
bool HasCompositionText() const override;
FocusReason GetFocusReason() const override;
bool GetTextRange(gfx::Range* range) const override;
bool GetCompositionTextRange(gfx::Range* range) const override;
bool GetEditableSelectionRange(gfx::Range* range) const override;
bool SetEditableSelectionRange(const gfx::Range& range) override;
#if BUILDFLAG(IS_MAC)
bool DeleteRange(const gfx::Range& range) override;
#endif
bool GetTextFromRange(const gfx::Range& range,
std::u16string* text) const override;
void OnInputMethodChanged() override;
bool ChangeTextDirectionAndLayoutAlignment(
base::i18n::TextDirection direction) override;
void ExtendSelectionAndDelete(size_t before, size_t after) override;
void EnsureCaretNotInRect(const gfx::Rect& rect) override;
bool IsTextEditCommandEnabled(ui::TextEditCommand command) const override;
void SetTextEditCommandForNextKeyEvent(ui::TextEditCommand command) override;
ukm::SourceId GetClientSourceForMetrics() const override;
bool ShouldDoLearning() override;
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
bool SetCompositionFromExistingText(
const gfx::Range& range,
const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) override;
#endif
#if BUILDFLAG(IS_CHROMEOS)
gfx::Range GetAutocorrectRange() const override;
gfx::Rect GetAutocorrectCharacterBounds() const override;
bool SetAutocorrectRange(const gfx::Range& range) override;
#endif
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
void GetActiveTextInputControlLayoutBounds(
std::optional<gfx::Rect>* control_bounds,
std::optional<gfx::Rect>* selection_bounds) override;
#endif
#if BUILDFLAG(IS_WIN)
void SetActiveCompositionForAccessibility(
const gfx::Range& range,
const std::u16string& active_composition_text,
bool is_composition_committed) override;
#endif
void set_tick_clock_for_testing(const base::TickClock* clock) {
tick_clock_ = clock;
}
private:
// Invoked when text is typed. Tries to change the selection appropriately.
void OnTextInput(const std::u16string& text);
// Returns true if the text of the node at |row| starts with |lower_text|.
bool TextAtRowMatchesText(size_t row, const std::u16string& lower_text);
// Clears |current_text_| and resets |time_of_last_key_|.
void ClearText();
raw_ptr<PrefixDelegate> prefix_delegate_;
raw_ptr<View> host_view_;
// Time OnTextInput() was last invoked.
base::TimeTicks time_of_last_key_;
std::u16string current_text_;
// TickClock used for getting the time of the current keystroke, used for
// continuing or restarting selections.
raw_ptr<const base::TickClock> tick_clock_;
base::WeakPtrFactory<PrefixSelector> weak_ptr_factory_{this};
};
} // namespace views
#endif // UI_VIEWS_CONTROLS_PREFIX_SELECTOR_H_
|