File: alternate_nav_infobar_view.cc

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (115 lines) | stat: -rw-r--r-- 4,088 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright (c) 2012 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/ui/views/infobars/alternate_nav_infobar_view.h"

#include "base/logging.h"
#include "chrome/browser/ui/omnibox/alternate_nav_infobar_delegate.h"
#include "ui/base/window_open_disposition.h"
#include "ui/gfx/text_elider.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/link.h"


// AlternateNavInfoBarDelegate -------------------------------------------------

// static
scoped_ptr<infobars::InfoBar> AlternateNavInfoBarDelegate::CreateInfoBar(
    scoped_ptr<AlternateNavInfoBarDelegate> delegate) {
  return make_scoped_ptr(new AlternateNavInfoBarView(delegate.Pass()));
}


// AlternateNavInfoBarView -----------------------------------------------------

AlternateNavInfoBarView::AlternateNavInfoBarView(
    scoped_ptr<AlternateNavInfoBarDelegate> delegate)
    : InfoBarView(delegate.Pass()),
      label_1_(NULL),
      link_(NULL),
      label_2_(NULL) {
}

AlternateNavInfoBarView::~AlternateNavInfoBarView() {
}

// static
void AlternateNavInfoBarView::ElideLabels(Labels* labels, int available_width) {
  views::Label* last_label = labels->back();
  labels->pop_back();
  int used_width = 0;
  for (Labels::iterator i(labels->begin()); i != labels->end(); ++i)
    used_width += (*i)->GetPreferredSize().width();
  int last_label_width = std::min(last_label->GetPreferredSize().width(),
                                  available_width - used_width);
  if (last_label_width < last_label->GetMinimumSize().width()) {
    last_label_width = 0;
    if (!labels->empty())
      labels->back()->SetText(labels->back()->text() + gfx::kEllipsisUTF16);
  }
  last_label->SetSize(gfx::Size(last_label_width, last_label->height()));
  if (!labels->empty())
    ElideLabels(labels, available_width - last_label_width);
}

void AlternateNavInfoBarView::Layout() {
  InfoBarView::Layout();

  label_1_->SetText(label_1_text_);
  link_->SetText(link_text_);
  label_2_->SetText(label_2_text_);
  Labels labels;
  labels.push_back(label_1_);
  labels.push_back(link_);
  labels.push_back(label_2_);
  ElideLabels(&labels, EndX() - StartX());

  label_1_->SetPosition(gfx::Point(StartX(), OffsetY(label_1_)));
  link_->SetPosition(gfx::Point(label_1_->bounds().right(), OffsetY(link_)));
  label_2_->SetPosition(gfx::Point(link_->bounds().right(), OffsetY(label_2_)));
}

void AlternateNavInfoBarView::ViewHierarchyChanged(
    const ViewHierarchyChangedDetails& details) {
  if (details.is_add && (details.child == this) && (label_1_ == NULL)) {
    AlternateNavInfoBarDelegate* delegate = GetDelegate();
    size_t offset;
    base::string16 message_text = delegate->GetMessageTextWithOffset(&offset);
    DCHECK_NE(base::string16::npos, offset);
    label_1_text_ = message_text.substr(0, offset);
    label_1_ = CreateLabel(label_1_text_);
    AddChildView(label_1_);

    link_text_ = delegate->GetLinkText();
    link_ = CreateLink(link_text_, this);
    AddChildView(link_);

    label_2_text_ = message_text.substr(offset);
    label_2_ = CreateLabel(label_2_text_);
    AddChildView(label_2_);
  }

  // This must happen after adding all other children so InfoBarView can ensure
  // the close button is the last child.
  InfoBarView::ViewHierarchyChanged(details);
}

int AlternateNavInfoBarView::ContentMinimumWidth() const {
  int label_1_width = label_1_->GetMinimumSize().width();
  return label_1_width ? label_1_width : link_->GetMinimumSize().width();
}

void AlternateNavInfoBarView::LinkClicked(views::Link* source,
                                          int event_flags) {
  if (!owner())
    return;  // We're closing; don't call anything, it might access the owner.
  DCHECK(link_ != NULL);
  DCHECK_EQ(link_, source);
  if (GetDelegate()->LinkClicked(ui::DispositionFromEventFlags(event_flags)))
    RemoveSelf();
}

AlternateNavInfoBarDelegate* AlternateNavInfoBarView::GetDelegate() {
  return static_cast<AlternateNavInfoBarDelegate*>(delegate());
}