1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/views/examples/label_example.h" 6 7 #include "base/strings/utf_string_conversions.h" 8 #include "ui/views/background.h" 9 #include "ui/views/border.h" 10 #include "ui/views/controls/button/checkbox.h" 11 #include "ui/views/controls/combobox/combobox.h" 12 #include "ui/views/controls/label.h" 13 #include "ui/views/controls/textfield/textfield.h" 14 #include "ui/views/examples/example_combobox_model.h" 15 #include "ui/views/layout/box_layout.h" 16 #include "ui/views/layout/grid_layout.h" 17 #include "ui/views/view.h" 18 19 using base::ASCIIToUTF16; 20 using base::WideToUTF16; 21 22 namespace views { 23 namespace examples { 24 25 namespace { 26 27 const char* kElideBehaviors[] = { "No Elide", "Truncate", "Elide Head", 28 "Elide Middle", "Elide Tail", "Elide Email", "Fade Tail" }; 29 const char* kAlignments[] = { "Left", "Center", "Right", "Head" }; 30 31 // A Label with a clamped preferred width to demonstrate eliding or wrapping. 32 class PreferredSizeLabel : public Label { 33 public: 34 PreferredSizeLabel() : Label() { 35 SetBorder(Border::CreateSolidBorder(1, SK_ColorGRAY)); 36 } 37 virtual ~PreferredSizeLabel() {} 38 39 // Label: 40 virtual gfx::Size GetPreferredSize() const OVERRIDE { 41 return gfx::Size(50, Label::GetPreferredSize().height()); 42 } 43 44 private: 45 DISALLOW_COPY_AND_ASSIGN(PreferredSizeLabel); 46 }; 47 48 } // namespace 49 50 LabelExample::LabelExample() 51 : ExampleBase("Label"), 52 textfield_(NULL), 53 alignment_(NULL), 54 elide_behavior_(NULL), 55 multiline_(NULL), 56 shadows_(NULL), 57 custom_label_(NULL) { 58 } 59 60 LabelExample::~LabelExample() { 61 // Remove the views first as some reference combobox models. 62 container()->RemoveAllChildViews(true); 63 } 64 65 void LabelExample::CreateExampleView(View* container) { 66 // A very simple label example, followed by additional helpful examples. 67 container->SetLayoutManager(new BoxLayout(BoxLayout::kVertical, 0, 0, 10)); 68 Label* label = new Label(ASCIIToUTF16("Hello world!")); 69 container->AddChildView(label); 70 71 const wchar_t hello_world_hebrew[] = 72 L"\x5e9\x5dc\x5d5\x5dd \x5d4\x5e2\x5d5\x5dc\x5dd!"; 73 label = new Label(WideToUTF16(hello_world_hebrew)); 74 label->SetHorizontalAlignment(gfx::ALIGN_RIGHT); 75 container->AddChildView(label); 76 77 label = new Label(WideToUTF16(L"A UTF16 surrogate pair: \x5d0\x5b0")); 78 label->SetHorizontalAlignment(gfx::ALIGN_RIGHT); 79 container->AddChildView(label); 80 81 label = new Label(ASCIIToUTF16("A left-aligned blue label.")); 82 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 83 label->SetEnabledColor(SK_ColorBLUE); 84 container->AddChildView(label); 85 86 label = new Label(WideToUTF16(L"Password!")); 87 label->SetObscured(true); 88 container->AddChildView(label); 89 90 label = new Label(ASCIIToUTF16("A Courier-18 label with shadows.")); 91 label->SetFontList(gfx::FontList("Courier, 18px")); 92 gfx::ShadowValues shadows(1, gfx::ShadowValue(gfx::Point(), 1, SK_ColorRED)); 93 gfx::ShadowValue shadow(gfx::Point(2, 2), 0, SK_ColorGRAY); 94 shadows.push_back(shadow); 95 label->SetShadows(shadows); 96 container->AddChildView(label); 97 98 label = new PreferredSizeLabel(); 99 label->SetText(ASCIIToUTF16("A long label will elide toward its logical end " 100 "if the text's width exceeds the label's available width.")); 101 container->AddChildView(label); 102 103 label = new PreferredSizeLabel(); 104 label->SetText(ASCIIToUTF16("A multi-line label will wrap onto subsequent " 105 "lines if the text's width exceeds the label's available width, which is " 106 "helpful for extemely long text used to demonstrate line wrapping.")); 107 label->SetMultiLine(true); 108 container->AddChildView(label); 109 110 AddCustomLabel(container); 111 } 112 113 void LabelExample::ButtonPressed(Button* button, const ui::Event& event) { 114 if (button == multiline_) { 115 custom_label_->SetMultiLine(multiline_->checked()); 116 } else if (button == shadows_) { 117 gfx::ShadowValues shadows; 118 if (shadows_->checked()) { 119 shadows.push_back(gfx::ShadowValue(gfx::Point(), 1, SK_ColorRED)); 120 shadows.push_back(gfx::ShadowValue(gfx::Point(2, 2), 0, SK_ColorGRAY)); 121 } 122 custom_label_->SetShadows(shadows); 123 } 124 custom_label_->parent()->parent()->Layout(); 125 custom_label_->SchedulePaint(); 126 } 127 128 void LabelExample::OnPerformAction(Combobox* combobox) { 129 if (combobox == alignment_) { 130 custom_label_->SetHorizontalAlignment( 131 static_cast<gfx::HorizontalAlignment>(combobox->selected_index())); 132 } else if (combobox == elide_behavior_) { 133 custom_label_->SetElideBehavior( 134 static_cast<gfx::ElideBehavior>(combobox->selected_index())); 135 } 136 } 137 138 void LabelExample::ContentsChanged(Textfield* sender, 139 const base::string16& new_contents) { 140 custom_label_->SetText(new_contents); 141 custom_label_->parent()->parent()->Layout(); 142 } 143 144 void LabelExample::AddCustomLabel(View* container) { 145 View* control_container = new View(); 146 control_container->SetBorder(Border::CreateSolidBorder(2, SK_ColorGRAY)); 147 control_container->set_background( 148 Background::CreateSolidBackground(SK_ColorLTGRAY)); 149 GridLayout* layout = GridLayout::CreatePanel(control_container); 150 control_container->SetLayoutManager(layout); 151 152 ColumnSet* column_set = layout->AddColumnSet(0); 153 column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 154 0.0f, GridLayout::USE_PREF, 0, 0); 155 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 156 1.0f, GridLayout::USE_PREF, 0, 0); 157 158 layout->StartRow(0, 0); 159 layout->AddView(new Label(ASCIIToUTF16("Content: "))); 160 textfield_ = new Textfield(); 161 textfield_->SetText(ASCIIToUTF16("Use the provided controls to configure the " 162 "content and presentation of this custom label.")); 163 textfield_->SetSelectionRange(gfx::Range()); 164 textfield_->set_controller(this); 165 layout->AddView(textfield_); 166 167 alignment_ = AddCombobox(layout, "Alignment: ", kAlignments, 168 arraysize(kAlignments)); 169 elide_behavior_ = AddCombobox(layout, "Elide Behavior: ", kElideBehaviors, 170 arraysize(kElideBehaviors)); 171 172 column_set = layout->AddColumnSet(1); 173 column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 174 0, GridLayout::USE_PREF, 0, 0); 175 column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 176 0, GridLayout::USE_PREF, 0, 0); 177 layout->StartRow(0, 1); 178 multiline_ = new Checkbox(base::ASCIIToUTF16("Multiline")); 179 multiline_->set_listener(this); 180 layout->AddView(multiline_); 181 shadows_ = new Checkbox(base::ASCIIToUTF16("Shadows")); 182 shadows_->set_listener(this); 183 layout->AddView(shadows_); 184 layout->AddPaddingRow(0, 8); 185 186 column_set = layout->AddColumnSet(2); 187 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 188 1, GridLayout::USE_PREF, 0, 0); 189 layout->StartRow(0, 2); 190 custom_label_ = new PreferredSizeLabel(); 191 custom_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 192 custom_label_->SetElideBehavior(gfx::NO_ELIDE); 193 custom_label_->SetText(textfield_->text()); 194 layout->AddView(custom_label_); 195 196 container->AddChildView(control_container); 197 } 198 199 Combobox* LabelExample::AddCombobox(GridLayout* layout, 200 const char* name, 201 const char** strings, 202 int count) { 203 layout->StartRow(0, 0); 204 layout->AddView(new Label(base::ASCIIToUTF16(name))); 205 ExampleComboboxModel* model = new ExampleComboboxModel(strings, count); 206 example_combobox_models_.push_back(model); 207 Combobox* combobox = new Combobox(model); 208 combobox->SetSelectedIndex(0); 209 combobox->set_listener(this); 210 layout->AddView(combobox); 211 return combobox; 212 } 213 214 } // namespace examples 215 } // namespace views 216