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.
5 #include "ui/views/examples/text_example.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "ui/base/resource/resource_bundle.h"
9 #include "ui/gfx/canvas.h"
10 #include "ui/gfx/font_list.h"
11 #include "ui/views/controls/button/checkbox.h"
12 #include "ui/views/controls/combobox/combobox.h"
13 #include "ui/views/controls/label.h"
14 #include "ui/views/examples/example_combobox_model.h"
15 #include "ui/views/layout/grid_layout.h"
16 #include "ui/views/view.h"
23 // Number of columns in the view layout.
24 const int kNumColumns = 10;
26 const char kShortText[] = "Batman";
27 const char kMediumText[] = "The quick brown fox jumps over the lazy dog.";
28 const char kLongText[] =
29 "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
30 "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
31 "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
32 "commodo consequat. Duis aute irure dolor in reprehenderit in voluptate "
33 "velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint "
34 "occaecat cupidatat non proident, sunt in culpa qui officia deserunt "
35 "mollit anim id est laborum.";
36 const char kAmpersandText[] =
37 "The quick && &brown fo&x jumps over the lazy dog.";
38 const char kNewlineText[] =
39 "The quick \nbrown fox jumps\n\n over the lazy dog.";
41 const char* kTextExamples[] = {
49 const char* kElidingBehaviors[] = {
56 const char* kPrefixOptions[] = {
62 const char* kHorizontalAligments[] = {
69 // Toggles bit |flag| on |flags| based on state of |checkbox|.
70 void SetFlagFromCheckbox(Checkbox* checkbox, int* flags, int flag) {
71 if (checkbox->checked())
79 // TextExample's content view, which is responsible for drawing a string with
80 // the specified style.
81 class TextExample::TextExampleView : public View {
84 : text_(ASCIIToUTF16(kShortText)),
88 fade_mode_(gfx::Canvas::TruncateFadeTail) {
91 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
92 View::OnPaint(canvas);
93 const gfx::Rect bounds = GetContentsBounds();
96 canvas->DrawFadeTruncatingStringRect(text_, fade_mode_, font_list_,
97 SK_ColorDKGRAY, bounds);
99 canvas->DrawStringRectWithHalo(text_, font_list_, SK_ColorDKGRAY,
100 SK_ColorWHITE, bounds, text_flags_);
102 canvas->DrawStringRectWithFlags(text_, font_list_, SK_ColorDKGRAY, bounds,
107 int text_flags() const { return text_flags_; }
108 void set_text_flags(int text_flags) { text_flags_ = text_flags; }
110 const string16& text() const { return text_; }
111 void set_text(const string16& text) { text_ = text; }
113 bool halo() const { return halo_; }
114 void set_halo(bool halo) { halo_ = halo; }
116 bool fade() const { return fade_; }
117 void set_fade(bool fade) { fade_ = fade; }
119 gfx::Canvas::TruncateFadeMode fade_mode() const { return fade_mode_; }
120 void set_fade_mode(gfx::Canvas::TruncateFadeMode mode) { fade_mode_ = mode; }
122 int GetFontStyle() const {
123 return font_list_.GetFontStyle();
125 void SetFontStyle(int style) {
126 font_list_ = font_list_.DeriveFontList(style);
130 // The font used for drawing the text.
131 gfx::FontList font_list_;
136 // Text flags for passing to |DrawStringInt()|.
139 // If |true|, specifies to call |DrawStringWithHalo()| instead of
140 // |DrawStringInt()|.
143 // If |true|, specifies to call |DrawFadeTruncatingString()| instead of
144 // |DrawStringInt()|.
147 // If |fade_| is |true|, fade mode parameter to |DrawFadeTruncatingString()|.
148 gfx::Canvas::TruncateFadeMode fade_mode_;
150 DISALLOW_COPY_AND_ASSIGN(TextExampleView);
153 TextExample::TextExample() : ExampleBase("Text Styles") {
156 TextExample::~TextExample() {
157 // Remove all the views first as some reference models in
158 // |example_combobox_model_|.
159 container()->RemoveAllChildViews(true);
162 Checkbox* TextExample::AddCheckbox(GridLayout* layout, const char* name) {
163 Checkbox* checkbox = new Checkbox(ASCIIToUTF16(name));
164 checkbox->set_listener(this);
165 layout->AddView(checkbox);
169 Combobox* TextExample::AddCombobox(GridLayout* layout,
171 const char** strings,
173 layout->StartRow(0, 0);
174 layout->AddView(new Label(ASCIIToUTF16(name)));
175 ExampleComboboxModel* combobox_model = new ExampleComboboxModel(strings,
177 example_combobox_model_.push_back(combobox_model);
178 Combobox* combobox = new Combobox(combobox_model);
179 combobox->SetSelectedIndex(0);
180 combobox->set_listener(this);
181 layout->AddView(combobox, kNumColumns - 1, 1);
185 void TextExample::CreateExampleView(View* container) {
186 text_view_ = new TextExampleView;
187 text_view_->set_border(Border::CreateSolidBorder(1, SK_ColorGRAY));
189 GridLayout* layout = new GridLayout(container);
190 container->SetLayoutManager(layout);
192 layout->AddPaddingRow(0, 8);
194 ColumnSet* column_set = layout->AddColumnSet(0);
195 column_set->AddPaddingColumn(0, 8);
196 column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL,
197 0.1f, GridLayout::USE_PREF, 0, 0);
198 for (int i = 0; i < kNumColumns - 1; i++)
199 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
200 0.1f, GridLayout::USE_PREF, 0, 0);
201 column_set->AddPaddingColumn(0, 8);
203 h_align_cb_ = AddCombobox(layout,
205 kHorizontalAligments,
206 arraysize(kHorizontalAligments));
207 eliding_cb_ = AddCombobox(layout,
210 arraysize(kElidingBehaviors));
211 prefix_cb_ = AddCombobox(layout,
214 arraysize(kPrefixOptions));
215 text_cb_ = AddCombobox(layout,
218 arraysize(kTextExamples));
220 layout->StartRow(0, 0);
221 multiline_checkbox_ = AddCheckbox(layout, "Multiline");
222 break_checkbox_ = AddCheckbox(layout, "Character Break");
223 halo_checkbox_ = AddCheckbox(layout, "Text Halo");
224 bold_checkbox_ = AddCheckbox(layout, "Bold");
225 italic_checkbox_ = AddCheckbox(layout, "Italic");
226 underline_checkbox_ = AddCheckbox(layout, "Underline");
228 layout->AddPaddingRow(0, 32);
230 column_set = layout->AddColumnSet(1);
231 column_set->AddPaddingColumn(0, 16);
232 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
233 1, GridLayout::USE_PREF, 0, 0);
234 column_set->AddPaddingColumn(0, 16);
235 layout->StartRow(1, 1);
236 layout->AddView(text_view_);
238 layout->AddPaddingRow(0, 8);
241 void TextExample::ButtonPressed(Button* button, const ui::Event& event) {
242 int flags = text_view_->text_flags();
243 int style = text_view_->GetFontStyle();
244 SetFlagFromCheckbox(multiline_checkbox_, &flags, gfx::Canvas::MULTI_LINE);
245 SetFlagFromCheckbox(break_checkbox_, &flags, gfx::Canvas::CHARACTER_BREAK);
246 SetFlagFromCheckbox(bold_checkbox_, &style, gfx::Font::BOLD);
247 SetFlagFromCheckbox(italic_checkbox_, &style, gfx::Font::ITALIC);
248 SetFlagFromCheckbox(underline_checkbox_, &style, gfx::Font::UNDERLINE);
249 text_view_->set_halo(halo_checkbox_->checked());
250 text_view_->set_text_flags(flags);
251 text_view_->SetFontStyle(style);
252 text_view_->SchedulePaint();
255 void TextExample::OnSelectedIndexChanged(Combobox* combobox) {
256 int text_flags = text_view_->text_flags();
257 if (combobox == h_align_cb_) {
258 text_flags &= ~(gfx::Canvas::TEXT_ALIGN_LEFT |
259 gfx::Canvas::TEXT_ALIGN_CENTER |
260 gfx::Canvas::TEXT_ALIGN_RIGHT);
261 switch (combobox->selected_index()) {
265 text_flags |= gfx::Canvas::TEXT_ALIGN_LEFT;
268 text_flags |= gfx::Canvas::TEXT_ALIGN_CENTER;
271 text_flags |= gfx::Canvas::TEXT_ALIGN_RIGHT;
274 } else if (combobox == text_cb_) {
275 switch (combobox->selected_index()) {
277 text_view_->set_text(ASCIIToUTF16(kShortText));
280 text_view_->set_text(ASCIIToUTF16(kMediumText));
283 text_view_->set_text(ASCIIToUTF16(kLongText));
286 text_view_->set_text(ASCIIToUTF16(kAmpersandText));
289 text_view_->set_text(ASCIIToUTF16(kNewlineText));
292 } else if (combobox == eliding_cb_) {
293 switch (combobox->selected_index()) {
295 text_flags &= ~gfx::Canvas::NO_ELLIPSIS;
296 text_view_->set_fade(false);
299 text_flags |= gfx::Canvas::NO_ELLIPSIS;
300 text_view_->set_fade(false);
303 text_view_->set_fade_mode(gfx::Canvas::TruncateFadeTail);
304 text_view_->set_fade(true);
307 text_view_->set_fade_mode(gfx::Canvas::TruncateFadeHead);
308 text_view_->set_fade(true);
311 } else if (combobox == prefix_cb_) {
312 text_flags &= ~(gfx::Canvas::SHOW_PREFIX | gfx::Canvas::HIDE_PREFIX);
313 switch (combobox->selected_index()) {
317 text_flags |= gfx::Canvas::SHOW_PREFIX;
320 text_flags |= gfx::Canvas::HIDE_PREFIX;
324 text_view_->set_text_flags(text_flags);
325 text_view_->SchedulePaint();
328 } // namespace examples