Index: chrome/browser/autocomplete/autocomplete_popup_view_gtk.cc |
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 0000000000000000000000000000000000000000..8f1b586dd95d3585efbc76d699acee8d853ad9da |
--- /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; |
+} |