diff options
-rw-r--r-- | chrome/browser/gtk/back_forward_menu_model_gtk.cc | 10 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_menu_controller_gtk.cc | 11 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_utils_gtk.cc | 33 | ||||
-rw-r--r-- | chrome/browser/gtk/go_button_gtk.cc | 7 | ||||
-rw-r--r-- | chrome/browser/gtk/menu_gtk.cc | 6 |
5 files changed, 58 insertions, 9 deletions
diff --git a/chrome/browser/gtk/back_forward_menu_model_gtk.cc b/chrome/browser/gtk/back_forward_menu_model_gtk.cc index 6747b98..ff31cf4 100644 --- a/chrome/browser/gtk/back_forward_menu_model_gtk.cc +++ b/chrome/browser/gtk/back_forward_menu_model_gtk.cc @@ -4,9 +4,13 @@ #include "chrome/browser/gtk/back_forward_menu_model_gtk.h" +#include "app/l10n_util.h" #include "base/string_util.h" #include "chrome/browser/gtk/back_forward_button_gtk.h" +// Might want to vary this by locale. +static const size_t kMaxChars = 50; + BackForwardMenuModelGtk::BackForwardMenuModelGtk(Browser* browser, ModelType model_type, BackForwardButtonGtk* button) @@ -23,7 +27,11 @@ bool BackForwardMenuModelGtk::IsItemSeparator(int command_id) const { } std::string BackForwardMenuModelGtk::GetLabel(int command_id) const { - return UTF16ToUTF8(GetItemLabel(command_id)); + std::wstring item_label_wstr = UTF16ToWideHack(GetItemLabel(command_id)); + // This breaks on word boundaries. Ideally we would break on character + // boundaries. + item_label_wstr = l10n_util::TruncateString(item_label_wstr, kMaxChars); + return WideToUTF8(item_label_wstr); } bool BackForwardMenuModelGtk::HasIcon(int command_id) const { diff --git a/chrome/browser/gtk/bookmark_menu_controller_gtk.cc b/chrome/browser/gtk/bookmark_menu_controller_gtk.cc index b059fc8..de4b885 100644 --- a/chrome/browser/gtk/bookmark_menu_controller_gtk.cc +++ b/chrome/browser/gtk/bookmark_menu_controller_gtk.cc @@ -27,6 +27,9 @@ namespace { +// TODO(estade): It might be a good idea to vary this by locale. +const int kMaxChars = 50; + void SetImageMenuItem(GtkWidget* menu_item, const SkBitmap& bitmap) { GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&bitmap); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), @@ -150,8 +153,12 @@ void BookmarkMenuController::BuildMenu(const BookmarkNode* parent, for (int i = start_child_index; i < parent->GetChildCount(); ++i) { const BookmarkNode* node = parent->GetChild(i); - GtkWidget* menu_item = gtk_image_menu_item_new_with_label( - WideToUTF8(node->GetTitle()).c_str()); + // This breaks on word boundaries. Ideally we would break on character + // boundaries. + std::wstring elided_name = + l10n_util::TruncateString(node->GetTitle(), kMaxChars); + GtkWidget* menu_item = + gtk_image_menu_item_new_with_label(WideToUTF8(elided_name).c_str()); g_object_set_data(G_OBJECT(menu_item), "bookmark-node", AsVoid(node)); if (node->is_url()) { diff --git a/chrome/browser/gtk/bookmark_utils_gtk.cc b/chrome/browser/gtk/bookmark_utils_gtk.cc index aec8fa6..12f27eb 100644 --- a/chrome/browser/gtk/bookmark_utils_gtk.cc +++ b/chrome/browser/gtk/bookmark_utils_gtk.cc @@ -5,6 +5,7 @@ #include "chrome/browser/gtk/bookmark_utils_gtk.h" #include "app/gtk_dnd_util.h" +#include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/gfx/gtk_util.h" #include "base/pickle.h" @@ -29,6 +30,10 @@ const int kBitsInAByte = 8; // Maximum number of characters on a bookmark button. const size_t kMaxCharsOnAButton = 15; +// Max size of each component of the button tooltips. +const size_t kMaxTooltipTitleLength = 100; +const size_t kMaxTooltipURLLength = 400; + // Only used for the background of the drag widget. const GdkColor kBackgroundColor = GDK_COLOR_RGB(0xe6, 0xed, 0xf4); @@ -147,7 +152,7 @@ void ConfigureButtonForNode(const BookmarkNode* node, BookmarkModel* model, std::string tooltip = BuildTooltipFor(node); if (!tooltip.empty()) - gtk_widget_set_tooltip_text(button, tooltip.c_str()); + gtk_widget_set_tooltip_markup(button, tooltip.c_str()); // We pack the button manually (rather than using gtk_button_set_*) so that // we can have finer control over its label. @@ -186,9 +191,29 @@ void ConfigureButtonForNode(const BookmarkNode* node, BookmarkModel* model, } std::string BuildTooltipFor(const BookmarkNode* node) { - // TODO(erg): Actually build the tooltip. For now, we punt and just return - // the URL. - return node->GetURL().possibly_invalid_spec(); + const std::string& url = node->GetURL().possibly_invalid_spec(); + const std::string& title = WideToUTF8(node->GetTitle()); + + std::string truncated_url = WideToUTF8(l10n_util::TruncateString( + UTF8ToWide(url), kMaxTooltipURLLength)); + gchar* escaped_url_cstr = g_markup_escape_text(truncated_url.c_str(), + truncated_url.size()); + std::string escaped_url(escaped_url_cstr); + g_free(escaped_url_cstr); + + std::string tooltip; + if (url == title) { + return escaped_url; + } else { + std::string truncated_title = WideToUTF8(l10n_util::TruncateString( + node->GetTitle(), kMaxTooltipTitleLength)); + gchar* escaped_title_cstr = g_markup_escape_text(truncated_title.c_str(), + truncated_title.size()); + std::string escaped_title(escaped_title_cstr); + g_free(escaped_title_cstr); + + return std::string("<b>") + escaped_title + "</b>\n" + escaped_url; + } } const BookmarkNode* BookmarkNodeForWidget(GtkWidget* widget) { diff --git a/chrome/browser/gtk/go_button_gtk.cc b/chrome/browser/gtk/go_button_gtk.cc index 81b8e52..e4606bb 100644 --- a/chrome/browser/gtk/go_button_gtk.cc +++ b/chrome/browser/gtk/go_button_gtk.cc @@ -19,6 +19,10 @@ #include "grit/generated_resources.h" #include "grit/theme_resources.h" +// Limit the length of the tooltip text. This applies only to the text in the +// omnibox (e.g. X in "Go to X"); +const size_t kMaxTooltipTextLength = 400; + GoButtonGtk::GoButtonGtk(LocationBarViewGtk* location_bar, Browser* browser) : location_bar_(location_bar), browser_(browser), @@ -193,7 +197,8 @@ gboolean GoButtonGtk::OnQueryTooltip(GtkTooltip* tooltip) { std::wstring current_text_wstr(location_bar_->location_entry()->GetText()); if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) l10n_util::WrapStringWithLTRFormatting(¤t_text_wstr); - string16 current_text = WideToUTF16Hack(current_text_wstr); + string16 current_text = WideToUTF16Hack( + l10n_util::TruncateString(current_text_wstr, kMaxTooltipTextLength)); AutocompleteEditModel* edit_model = location_bar_->location_entry()->model(); diff --git a/chrome/browser/gtk/menu_gtk.cc b/chrome/browser/gtk/menu_gtk.cc index 73a3296..8cfe7f8 100644 --- a/chrome/browser/gtk/menu_gtk.cc +++ b/chrome/browser/gtk/menu_gtk.cc @@ -292,8 +292,12 @@ void MenuGtk::MenuPositionFunc(GtkMenu* menu, if (!start_align) *x += widget->allocation.width - menu_req.width; - if (*y + menu_req.height >= screen_rect.height) + // If the menu would run off the bottom of the screen, and there is more + // screen space up than down, then pop upwards. + if (*y + menu_req.height >= screen_rect.height && + *y > screen_rect.height / 2) { *y -= menu_req.height; + } *push_in = FALSE; } |