diff options
Diffstat (limited to 'chrome/browser/autocomplete/autocomplete_popup_view_gtk.cc')
| -rwxr-xr-x | chrome/browser/autocomplete/autocomplete_popup_view_gtk.cc | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_popup_view_gtk.cc b/chrome/browser/autocomplete/autocomplete_popup_view_gtk.cc new file mode 100755 index 0000000..8f1b586 --- /dev/null +++ b/chrome/browser/autocomplete/autocomplete_popup_view_gtk.cc @@ -0,0 +1,115 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/autocomplete/autocomplete_popup_view_gtk.h" + +#include "base/logging.h" +#include "base/scoped_ptr.h" +#include "base/string_util.h" +#include "chrome/browser/autocomplete/autocomplete.h" +#include "chrome/browser/autocomplete/autocomplete_edit.h" +#include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h" +#include "chrome/browser/autocomplete/autocomplete_popup_model.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/search_engines/template_url.h" +#include "chrome/browser/search_engines/template_url_model.h" +#include "chrome/common/notification_service.h" + +namespace { + +const GdkColor kPopupBorderColor = {0, 51143, 51914, 52942}; // #c7cace +const GdkColor kPopupBackground = {0, 65535, 65535, 65535}; // #ffffff +const GdkColor kHighlightColor = {0, 49601, 51400, 55769}; // #c1c8d9 + +} // namespace + +AutocompletePopupViewGtk::AutocompletePopupViewGtk( + AutocompleteEditViewGtk* edit_view, + AutocompleteEditModel* edit_model, + Profile* profile) + : model_(new AutocompletePopupModel(this, edit_model, profile)), + edit_view_(edit_view), + window_(gtk_window_new(GTK_WINDOW_POPUP)), + vbox_(NULL), + opened_(false) { + GTK_WIDGET_UNSET_FLAGS(window_, GTK_CAN_FOCUS); + // Don't allow the window to be resized. This also forces the window to + // shrink down to the size of its child contents. + gtk_window_set_resizable(GTK_WINDOW(window_), FALSE); + // Set up a 1 pixel border around the popup. + gtk_container_set_border_width(GTK_CONTAINER(window_), 1); + gtk_widget_modify_bg(window_, GTK_STATE_NORMAL, &kPopupBorderColor); + gtk_widget_modify_base(window_, GTK_STATE_NORMAL, &kPopupBorderColor); +} + +AutocompletePopupViewGtk::~AutocompletePopupViewGtk() { + if (vbox_) + gtk_widget_destroy(vbox_); + gtk_widget_destroy(window_); +} + +void AutocompletePopupViewGtk::InvalidateLine(size_t line) { + UpdatePopupAppearance(); +} + +void AutocompletePopupViewGtk::UpdatePopupAppearance() { + const AutocompleteResult& result = model_->result(); + if (result.empty()) { + Hide(); + return; + } + + // TODO(deanm): This could be done better, but the code is temporary + // and will need to be replaced with custom drawing and not widgets. + if (vbox_) + gtk_widget_destroy(vbox_); + + vbox_ = gtk_vbox_new(FALSE, 0); + + for (size_t i = 0; i < result.size(); ++i) { + std::string utf8; + utf8.append(WideToUTF8(result.match_at(i).contents)); + utf8.append(" - "); + utf8.append(WideToUTF8(result.match_at(i).description)); + GtkWidget* label = gtk_label_new(utf8.c_str()); + // We need to put the labels in an event box for background painting. + GtkWidget* ebox = gtk_event_box_new(); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0); + gtk_container_add(GTK_CONTAINER(ebox), label); + gtk_box_pack_start(GTK_BOX(vbox_), ebox, FALSE, FALSE, 0); + gtk_widget_show(label); + gtk_widget_show(ebox); + if (i == model_->selected_line()) { + gtk_widget_modify_bg(ebox, GTK_STATE_NORMAL, &kHighlightColor); + } else { + gtk_widget_modify_bg(ebox, GTK_STATE_NORMAL, &kPopupBackground); + } + } + + gtk_widget_show(vbox_); + gtk_container_add(GTK_CONTAINER(window_), vbox_); + Show(); +} + +void AutocompletePopupViewGtk::OnHoverEnabledOrDisabled(bool disabled) { + NOTIMPLEMENTED(); +} + +void AutocompletePopupViewGtk::PaintUpdatesNow() { + UpdatePopupAppearance(); +} + +void AutocompletePopupViewGtk::Show() { + gint x, y, width; + edit_view_->BottomLeftPosWidth(&x, &y, &width); + gtk_window_move(GTK_WINDOW(window_), x, y); + gtk_widget_set_size_request(window_, width, -1); + gtk_widget_show(window_); + opened_ = true; +} + +void AutocompletePopupViewGtk::Hide() { + gtk_widget_hide(window_); + opened_ = false; +} |
