Index: mash/quick_launch/quick_launch_application.cc |
diff --git a/mash/quick_launch/quick_launch_application.cc b/mash/quick_launch/quick_launch_application.cc |
index b46873785438a21454a5f0e552a0d61ed3b65d70..1fa54e2e5297ccd4df1ca9b1b35cbb4c1870d4e5 100644 |
--- a/mash/quick_launch/quick_launch_application.cc |
+++ b/mash/quick_launch/quick_launch_application.cc |
@@ -6,6 +6,7 @@ |
#include "base/macros.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/strings/string16.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "mojo/public/c/system/main.h" |
@@ -31,11 +32,15 @@ namespace quick_launch { |
class QuickLaunchUI : public views::WidgetDelegateView, |
public views::TextfieldController { |
public: |
- QuickLaunchUI(mojo::Connector* connector) |
- : connector_(connector), prompt_(new views::Textfield) { |
+ QuickLaunchUI(mojo::Connector* connector, catalog::mojom::CatalogPtr catalog) |
+ : connector_(connector), |
+ prompt_(new views::Textfield), |
+ catalog_(std::move(catalog)) { |
set_background(views::Background::CreateStandardPanelBackground()); |
prompt_->set_controller(this); |
AddChildView(prompt_); |
+ |
+ UpdateEntries(); |
} |
~QuickLaunchUI() override {} |
@@ -62,13 +67,45 @@ class QuickLaunchUI : public views::WidgetDelegateView, |
// Overridden from views::TextFieldController: |
bool HandleKeyEvent(views::Textfield* sender, |
const ui::KeyEvent& key_event) override { |
- if (key_event.key_code() == ui::VKEY_RETURN) { |
- std::string url = Canonicalize(prompt_->text()); |
- connections_.push_back(connector_->Connect(url)); |
- prompt_->SetText(base::string16()); |
+ suggestion_rejected_ = false; |
+ switch (key_event.key_code()) { |
+ case ui::VKEY_RETURN: { |
+ std::string url = Canonicalize(prompt_->text()); |
+ connections_.push_back(connector_->Connect(url)); |
+ prompt_->SetText(base::string16()); |
+ UpdateEntries(); |
+ } break; |
+ case ui::VKEY_BACK: |
+ case ui::VKEY_DELETE: |
+ // The user didn't like our suggestion, don't make another until they |
+ // type another character. |
+ suggestion_rejected_ = true; |
+ break; |
+ default: |
+ break; |
} |
return false; |
} |
+ void ContentsChanged(views::Textfield* sender, |
+ const base::string16& new_contents) override { |
+ // Don't keep making a suggestion if the user didn't like what we offered. |
+ if (suggestion_rejected_) |
+ return; |
+ |
+ // TODO(beng): it'd be nice if we persisted some history/scoring here. |
+ for (const auto& name : app_names_) { |
+ if (base::StartsWith(name, new_contents, |
+ base::CompareCase::INSENSITIVE_ASCII)) { |
+ base::string16 suffix = name; |
+ base::ReplaceSubstringsAfterOffset(&suffix, 0, new_contents, |
+ base::string16()); |
+ gfx::Range range(new_contents.size(), name.size()); |
+ prompt_->SetText(name); |
+ prompt_->SelectRange(range); |
+ break; |
+ } |
+ } |
+ } |
std::string Canonicalize(const base::string16& input) const { |
base::string16 working; |
@@ -79,9 +116,24 @@ class QuickLaunchUI : public views::WidgetDelegateView, |
return base::UTF16ToUTF8(working); |
} |
+ void UpdateEntries() { |
+ catalog_->GetEntries(nullptr, |
+ base::Bind(&QuickLaunchUI::OnGotCatalogEntries, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnGotCatalogEntries( |
+ mojo::Map<mojo::String, catalog::mojom::CatalogEntryPtr> entries) { |
+ for (const auto& entry : entries) |
+ app_names_.insert(base::UTF8ToUTF16(entry.first.get())); |
+ } |
+ |
mojo::Connector* connector_; |
views::Textfield* prompt_; |
std::vector<scoped_ptr<mojo::Connection>> connections_; |
+ catalog::mojom::CatalogPtr catalog_; |
+ std::set<base::string16> app_names_; |
+ bool suggestion_rejected_ = false; |
DISALLOW_COPY_AND_ASSIGN(QuickLaunchUI); |
}; |
@@ -97,14 +149,14 @@ void QuickLaunchApplication::Initialize(mojo::Connector* connector, |
aura_init_.reset(new views::AuraInit(connector, "views_mus_resources.pak")); |
views::WindowManagerConnection::Create(connector); |
+ catalog::mojom::CatalogPtr catalog; |
+ connector->ConnectToInterface("mojo:catalog", &catalog); |
+ |
views::Widget* window = views::Widget::CreateWindowWithContextAndBounds( |
- new QuickLaunchUI(connector), nullptr, gfx::Rect(10, 640, 0, 0)); |
+ new QuickLaunchUI(connector, std::move(catalog)), nullptr, |
+ gfx::Rect(10, 640, 0, 0)); |
window->Show(); |
} |
-bool QuickLaunchApplication::AcceptConnection(mojo::Connection* connection) { |
- return true; |
-} |
- |
} // namespace quick_launch |
} // namespace mash |