- add sources.
[platform/framework/web/crosswalk.git] / src / ui / views / examples / text_example.cc
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/text_example.h"
6
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"
17
18 namespace views {
19 namespace examples {
20
21 namespace {
22
23 // Number of columns in the view layout.
24 const int kNumColumns = 10;
25
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.";
40
41 const char* kTextExamples[] = {
42     "Short",
43     "Medium",
44     "Long",
45     "Ampersands",
46     "Newlines",
47 };
48
49 const char* kElidingBehaviors[] = {
50     "Ellipsis",
51     "None",
52     "Fade Tail",
53     "Fade Head",
54 };
55
56 const char* kPrefixOptions[] = {
57     "Default",
58     "Show",
59     "Hide",
60 };
61
62 const char* kHorizontalAligments[] = {
63     "Default",
64     "Left",
65     "Center",
66     "Right",
67 };
68
69 // Toggles bit |flag| on |flags| based on state of |checkbox|.
70 void SetFlagFromCheckbox(Checkbox* checkbox, int* flags, int flag) {
71   if (checkbox->checked())
72     *flags |= flag;
73   else
74     *flags &= ~flag;
75 }
76
77 }  // namespace
78
79 // TextExample's content view, which is responsible for drawing a string with
80 // the specified style.
81 class TextExample::TextExampleView : public View {
82  public:
83   TextExampleView()
84     : text_(ASCIIToUTF16(kShortText)),
85       text_flags_(0),
86       halo_(false),
87       fade_(false),
88       fade_mode_(gfx::Canvas::TruncateFadeTail) {
89   }
90
91   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
92     View::OnPaint(canvas);
93     const gfx::Rect bounds = GetContentsBounds();
94
95     if (fade_) {
96       canvas->DrawFadeTruncatingStringRect(text_, fade_mode_, font_list_,
97                                            SK_ColorDKGRAY, bounds);
98     } else if (halo_) {
99       canvas->DrawStringRectWithHalo(text_, font_list_, SK_ColorDKGRAY,
100                                      SK_ColorWHITE, bounds, text_flags_);
101     } else {
102       canvas->DrawStringRectWithFlags(text_, font_list_, SK_ColorDKGRAY, bounds,
103                                       text_flags_);
104     }
105   }
106
107   int text_flags() const { return text_flags_; }
108   void set_text_flags(int text_flags) { text_flags_ = text_flags; }
109
110   const string16& text() const { return text_; }
111   void set_text(const string16& text) { text_ = text; }
112
113   bool halo() const { return halo_; }
114   void set_halo(bool halo) { halo_ = halo; }
115
116   bool fade() const { return fade_; }
117   void set_fade(bool fade) { fade_ = fade; }
118
119   gfx::Canvas::TruncateFadeMode fade_mode() const { return fade_mode_; }
120   void set_fade_mode(gfx::Canvas::TruncateFadeMode mode) { fade_mode_ = mode; }
121
122   int GetFontStyle() const {
123     return font_list_.GetFontStyle();
124   }
125   void SetFontStyle(int style) {
126     font_list_ = font_list_.DeriveFontList(style);
127   }
128
129  private:
130   // The font used for drawing the text.
131   gfx::FontList font_list_;
132
133   // The text to draw.
134   string16 text_;
135
136   // Text flags for passing to |DrawStringInt()|.
137   int text_flags_;
138
139   // If |true|, specifies to call |DrawStringWithHalo()| instead of
140   // |DrawStringInt()|.
141   bool halo_;
142
143   // If |true|, specifies to call |DrawFadeTruncatingString()| instead of
144   // |DrawStringInt()|.
145   bool fade_;
146
147   // If |fade_| is |true|, fade mode parameter to |DrawFadeTruncatingString()|.
148   gfx::Canvas::TruncateFadeMode fade_mode_;
149
150   DISALLOW_COPY_AND_ASSIGN(TextExampleView);
151 };
152
153 TextExample::TextExample() : ExampleBase("Text Styles") {
154 }
155
156 TextExample::~TextExample() {
157   // Remove all the views first as some reference models in
158   // |example_combobox_model_|.
159   container()->RemoveAllChildViews(true);
160 }
161
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);
166   return checkbox;
167 }
168
169 Combobox* TextExample::AddCombobox(GridLayout* layout,
170                                    const char* name,
171                                    const char** strings,
172                                    int count) {
173   layout->StartRow(0, 0);
174   layout->AddView(new Label(ASCIIToUTF16(name)));
175   ExampleComboboxModel* combobox_model = new ExampleComboboxModel(strings,
176                                                                   count);
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);
182   return combobox;
183 }
184
185 void TextExample::CreateExampleView(View* container) {
186   text_view_ = new TextExampleView;
187   text_view_->set_border(Border::CreateSolidBorder(1, SK_ColorGRAY));
188
189   GridLayout* layout = new GridLayout(container);
190   container->SetLayoutManager(layout);
191
192   layout->AddPaddingRow(0, 8);
193
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);
202
203   h_align_cb_ = AddCombobox(layout,
204                             "H-Align",
205                             kHorizontalAligments,
206                             arraysize(kHorizontalAligments));
207   eliding_cb_ = AddCombobox(layout,
208                             "Eliding",
209                             kElidingBehaviors,
210                             arraysize(kElidingBehaviors));
211   prefix_cb_ = AddCombobox(layout,
212                            "Prefix",
213                            kPrefixOptions,
214                            arraysize(kPrefixOptions));
215   text_cb_ = AddCombobox(layout,
216                          "Example Text",
217                          kTextExamples,
218                          arraysize(kTextExamples));
219
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");
227
228   layout->AddPaddingRow(0, 32);
229
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_);
237
238   layout->AddPaddingRow(0, 8);
239 }
240
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();
253 }
254
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()) {
262       case 0:
263         break;
264       case 1:
265         text_flags |= gfx::Canvas::TEXT_ALIGN_LEFT;
266         break;
267       case 2:
268         text_flags |= gfx::Canvas::TEXT_ALIGN_CENTER;
269         break;
270       case 3:
271         text_flags |= gfx::Canvas::TEXT_ALIGN_RIGHT;
272         break;
273     }
274   } else if (combobox == text_cb_) {
275     switch (combobox->selected_index()) {
276       case 0:
277         text_view_->set_text(ASCIIToUTF16(kShortText));
278         break;
279       case 1:
280         text_view_->set_text(ASCIIToUTF16(kMediumText));
281         break;
282       case 2:
283         text_view_->set_text(ASCIIToUTF16(kLongText));
284         break;
285       case 3:
286         text_view_->set_text(ASCIIToUTF16(kAmpersandText));
287         break;
288       case 4:
289         text_view_->set_text(ASCIIToUTF16(kNewlineText));
290         break;
291     }
292   } else if (combobox == eliding_cb_) {
293     switch (combobox->selected_index()) {
294       case 0:
295         text_flags &= ~gfx::Canvas::NO_ELLIPSIS;
296         text_view_->set_fade(false);
297         break;
298       case 1:
299         text_flags |= gfx::Canvas::NO_ELLIPSIS;
300         text_view_->set_fade(false);
301         break;
302       case 2:
303         text_view_->set_fade_mode(gfx::Canvas::TruncateFadeTail);
304         text_view_->set_fade(true);
305         break;
306       case 3:
307         text_view_->set_fade_mode(gfx::Canvas::TruncateFadeHead);
308         text_view_->set_fade(true);
309         break;
310     }
311   } else if (combobox == prefix_cb_) {
312     text_flags &= ~(gfx::Canvas::SHOW_PREFIX | gfx::Canvas::HIDE_PREFIX);
313     switch (combobox->selected_index()) {
314       case 0:
315         break;
316       case 1:
317         text_flags |= gfx::Canvas::SHOW_PREFIX;
318         break;
319       case 2:
320         text_flags |= gfx::Canvas::HIDE_PREFIX;
321         break;
322     }
323   }
324   text_view_->set_text_flags(text_flags);
325   text_view_->SchedulePaint();
326 }
327
328 }  // namespace examples
329 }  // namespace views