15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/infobars/alternate_nav_infobar_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/alternate_nav_infobar_delegate.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/text_elider.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AlternateNavInfoBarDelegate ------------------------------------------------- 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochscoped_ptr<infobars::InfoBar> AlternateNavInfoBarDelegate::CreateInfoBar( 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<AlternateNavInfoBarDelegate> delegate) { 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return scoped_ptr<infobars::InfoBar>( 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new AlternateNavInfoBarView(delegate.Pass())); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AlternateNavInfoBarView ----------------------------------------------------- 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AlternateNavInfoBarView::AlternateNavInfoBarView( 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<AlternateNavInfoBarDelegate> delegate) 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : InfoBarView(delegate.PassAs<infobars::InfoBarDelegate>()), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_1_(NULL), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_(NULL), 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch label_2_(NULL) {} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AlternateNavInfoBarView::~AlternateNavInfoBarView() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AlternateNavInfoBarView::ElideLabels(Labels* labels, int available_width) { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::Label* last_label = labels->back(); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) labels->pop_back(); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int used_width = 0; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (Labels::iterator i(labels->begin()); i != labels->end(); ++i) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) used_width += (*i)->GetPreferredSize().width(); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int last_label_width = std::min(last_label->GetPreferredSize().width(), 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) available_width - used_width); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (last_label_width < last_label->GetMinimumSize().width()) { 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_label_width = 0; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!labels->empty()) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) labels->back()->SetText(labels->back()->text() + gfx::kEllipsisUTF16); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_label->SetSize(gfx::Size(last_label_width, last_label->height())); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!labels->empty()) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ElideLabels(labels, available_width - last_label_width); 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AlternateNavInfoBarView::Layout() { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InfoBarView::Layout(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_1_->SetText(label_1_text_); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) link_->SetText(link_text_); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_2_->SetText(label_2_text_); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Labels labels; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) labels.push_back(label_1_); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) labels.push_back(link_); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) labels.push_back(label_2_); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ElideLabels(&labels, EndX() - StartX()); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_1_->SetPosition(gfx::Point(StartX(), OffsetY(label_1_))); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) link_->SetPosition(gfx::Point(label_1_->bounds().right(), OffsetY(link_))); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_2_->SetPosition(gfx::Point(link_->bounds().right(), OffsetY(label_2_))); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AlternateNavInfoBarView::ViewHierarchyChanged( 74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& details) { 75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (details.is_add && (details.child == this) && (label_1_ == NULL)) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AlternateNavInfoBarDelegate* delegate = GetDelegate(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t offset; 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 message_text = delegate->GetMessageTextWithOffset(&offset); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(base::string16::npos, offset); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_1_text_ = message_text.substr(0, offset); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_1_ = CreateLabel(label_1_text_); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(label_1_); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) link_text_ = delegate->GetLinkText(); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) link_ = CreateLink(link_text_, this); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(link_); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_2_text_ = message_text.substr(offset); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) label_2_ = CreateLabel(label_2_text_); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(label_2_); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must happen after adding all other children so InfoBarView can ensure 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the close button is the last child. 95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) InfoBarView::ViewHierarchyChanged(details); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int AlternateNavInfoBarView::ContentMinimumWidth() const { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int label_1_width = label_1_->GetMinimumSize().width(); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return label_1_width ? label_1_width : link_->GetMinimumSize().width(); 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AlternateNavInfoBarView::LinkClicked(views::Link* source, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int event_flags) { 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!owner()) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // We're closing; don't call anything, it might access the owner. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(link_ != NULL); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(link_, source); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetDelegate()->LinkClicked(ui::DispositionFromEventFlags(event_flags))) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveSelf(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AlternateNavInfoBarDelegate* AlternateNavInfoBarView::GetDelegate() { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<AlternateNavInfoBarDelegate*>(delegate()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 116