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