Home | History | Annotate | Download | only in examples
      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/views/controls/button/checkbox.h"
     11 #include "ui/views/controls/combobox/combobox.h"
     12 #include "ui/views/controls/label.h"
     13 #include "ui/views/examples/example_combobox_model.h"
     14 #include "ui/views/layout/grid_layout.h"
     15 #include "ui/views/view.h"
     16 
     17 namespace views {
     18 namespace examples {
     19 
     20 namespace {
     21 
     22 // Number of columns in the view layout.
     23 const int kNumColumns = 10;
     24 
     25 const char kShortText[] = "Batman";
     26 const char kMediumText[] = "The quick brown fox jumps over the lazy dog.";
     27 const char kLongText[] =
     28     "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
     29     "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
     30     "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
     31     "commodo consequat. Duis aute irure dolor in reprehenderit in voluptate "
     32     "velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint "
     33     "occaecat cupidatat non proident, sunt in culpa qui officia deserunt "
     34     "mollit anim id est laborum.";
     35 const char kAmpersandText[] =
     36     "The quick && &brown fo&x jumps over the lazy dog.";
     37 const char kNewlineText[] =
     38     "The quick \nbrown fox jumps\n\n over the lazy dog.";
     39 
     40 const char* kTextExamples[] = {
     41     "Short",
     42     "Medium",
     43     "Long",
     44     "Ampersands",
     45     "Newlines",
     46 };
     47 
     48 const char* kElidingBehaviors[] = {
     49     "Ellipsis",
     50     "None",
     51 #if defined(OS_WIN)
     52     "Fade Tail",
     53     "Fade Head",
     54     "Fade Head and Tail",
     55 #endif
     56 };
     57 
     58 const char* kPrefixOptions[] = {
     59     "Default",
     60     "Show",
     61     "Hide",
     62 };
     63 
     64 const char* kHorizontalAligments[] = {
     65     "Default",
     66     "Left",
     67     "Center",
     68     "Right",
     69 };
     70 
     71 // Toggles bit |flag| on |flags| based on state of |checkbox|.
     72 void SetFlagFromCheckbox(Checkbox* checkbox, int* flags, int flag) {
     73   if (checkbox->checked())
     74     *flags |= flag;
     75   else
     76     *flags &= ~flag;
     77 }
     78 
     79 }  // namespace
     80 
     81 // TextExample's content view, which is responsible for drawing a string with
     82 // the specified style.
     83 class TextExample::TextExampleView : public View {
     84  public:
     85   TextExampleView()
     86     : font_(ResourceBundle::GetSharedInstance().GetFont(
     87           ResourceBundle::BaseFont)),
     88       text_(ASCIIToUTF16(kShortText)),
     89       text_flags_(0),
     90       halo_(false),
     91       fade_(false),
     92       fade_mode_(gfx::Canvas::TruncateFadeTail) {
     93   }
     94 
     95   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
     96     View::OnPaint(canvas);
     97 
     98     const gfx::Rect bounds = GetContentsBounds();
     99 
    100 #if defined(OS_WIN)
    101     if (fade_) {
    102       size_t characters_to_truncate_from_head =
    103           gfx::Canvas::TruncateFadeHeadAndTail ? 10 : 0;
    104       canvas->DrawFadeTruncatingString(text_, fade_mode_,
    105           characters_to_truncate_from_head, font_, SK_ColorDKGRAY, bounds);
    106       return;
    107     }
    108 #endif
    109 
    110     if (halo_) {
    111       canvas->DrawStringWithHalo(text_, font_, SK_ColorDKGRAY, SK_ColorWHITE,
    112           bounds.x(), bounds.y(), bounds.width(), bounds.height(), text_flags_);
    113     } else {
    114       canvas->DrawStringInt(text_, font_, SK_ColorDKGRAY, bounds.x(),
    115           bounds.y(), bounds.width(), bounds.height(), text_flags_);
    116     }
    117   }
    118 
    119   int text_flags() const { return text_flags_; }
    120   void set_text_flags(int text_flags) { text_flags_ = text_flags; }
    121 
    122   const string16& text() const { return text_; }
    123   void set_text(const string16& text) { text_ = text; }
    124 
    125   bool halo() const { return halo_; }
    126   void set_halo(bool halo) { halo_ = halo; }
    127 
    128   bool fade() const { return fade_; }
    129   void set_fade(bool fade) { fade_ = fade; }
    130 
    131   gfx::Canvas::TruncateFadeMode fade_mode() const { return fade_mode_; }
    132   void set_fade_mode(gfx::Canvas::TruncateFadeMode fade_mode) {
    133     fade_mode_ = fade_mode;
    134   }
    135 
    136   int GetFontStyle() const {
    137     return font_.GetStyle();
    138   }
    139   void SetFontStyle(int style) {
    140     font_ = font_.DeriveFont(0, style);
    141   }
    142 
    143  private:
    144   // The font used for drawing the text.
    145   gfx::Font font_;
    146 
    147   // The text to draw.
    148   string16 text_;
    149 
    150   // Text flags for passing to |DrawStringInt()|.
    151   int text_flags_;
    152 
    153   // If |true|, specifies to call |DrawStringWithHalo()| instead of
    154   // |DrawStringInt()|.
    155   bool halo_;
    156 
    157   // If |true|, specifies to call |DrawFadeTruncatingString()| instead of
    158   // |DrawStringInt()|.
    159   bool fade_;
    160 
    161   // If |fade_| is |true|, fade mode parameter to |DrawFadeTruncatingString()|.
    162   gfx::Canvas::TruncateFadeMode fade_mode_;
    163 
    164   DISALLOW_COPY_AND_ASSIGN(TextExampleView);
    165 };
    166 
    167 TextExample::TextExample() : ExampleBase("Text Styles") {
    168 }
    169 
    170 TextExample::~TextExample() {
    171 }
    172 
    173 Checkbox* TextExample::AddCheckbox(GridLayout* layout, const char* name) {
    174   Checkbox* checkbox = new Checkbox(ASCIIToUTF16(name));
    175   checkbox->set_listener(this);
    176   layout->AddView(checkbox);
    177   return checkbox;
    178 }
    179 
    180 Combobox* TextExample::AddCombobox(GridLayout* layout,
    181                                    const char* name,
    182                                    const char** strings,
    183                                    int count) {
    184   layout->StartRow(0, 0);
    185   layout->AddView(new Label(ASCIIToUTF16(name)));
    186   ExampleComboboxModel* combobox_model = new ExampleComboboxModel(strings,
    187                                                                   count);
    188   example_combobox_model_.push_back(combobox_model);
    189   Combobox* combobox = new Combobox(combobox_model);
    190   combobox->SetSelectedIndex(0);
    191   combobox->set_listener(this);
    192   layout->AddView(combobox, kNumColumns - 1, 1);
    193   return combobox;
    194 }
    195 
    196 void TextExample::CreateExampleView(View* container) {
    197   text_view_ = new TextExampleView;
    198   text_view_->set_border(Border::CreateSolidBorder(1, SK_ColorGRAY));
    199 
    200   GridLayout* layout = new GridLayout(container);
    201   container->SetLayoutManager(layout);
    202 
    203   layout->AddPaddingRow(0, 8);
    204 
    205   ColumnSet* column_set = layout->AddColumnSet(0);
    206   column_set->AddPaddingColumn(0, 8);
    207   column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL,
    208                         0.1f, GridLayout::USE_PREF, 0, 0);
    209   for (int i = 0; i < kNumColumns - 1; i++)
    210     column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
    211                           0.1f, GridLayout::USE_PREF, 0, 0);
    212   column_set->AddPaddingColumn(0, 8);
    213 
    214   h_align_cb_ = AddCombobox(layout,
    215                             "H-Align",
    216                             kHorizontalAligments,
    217                             arraysize(kHorizontalAligments));
    218   eliding_cb_ = AddCombobox(layout,
    219                             "Eliding",
    220                             kElidingBehaviors,
    221                             arraysize(kElidingBehaviors));
    222   prefix_cb_ = AddCombobox(layout,
    223                            "Prefix",
    224                            kPrefixOptions,
    225                            arraysize(kPrefixOptions));
    226   text_cb_ = AddCombobox(layout,
    227                          "Example Text",
    228                          kTextExamples,
    229                          arraysize(kTextExamples));
    230 
    231   layout->StartRow(0, 0);
    232   multiline_checkbox_ = AddCheckbox(layout, "Multiline");
    233   break_checkbox_ = AddCheckbox(layout, "Character Break");
    234   halo_checkbox_ = AddCheckbox(layout, "Text Halo");
    235   bold_checkbox_ = AddCheckbox(layout, "Bold");
    236   italic_checkbox_ = AddCheckbox(layout, "Italic");
    237   underline_checkbox_ = AddCheckbox(layout, "Underline");
    238 
    239   layout->AddPaddingRow(0, 32);
    240 
    241   column_set = layout->AddColumnSet(1);
    242   column_set->AddPaddingColumn(0, 16);
    243   column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
    244                         1, GridLayout::USE_PREF, 0, 0);
    245   column_set->AddPaddingColumn(0, 16);
    246   layout->StartRow(1, 1);
    247   layout->AddView(text_view_);
    248 
    249   layout->AddPaddingRow(0, 8);
    250 }
    251 
    252 void TextExample::ButtonPressed(Button* button, const ui::Event& event) {
    253   int flags = text_view_->text_flags();
    254   int style = text_view_->GetFontStyle();
    255   SetFlagFromCheckbox(multiline_checkbox_, &flags, gfx::Canvas::MULTI_LINE);
    256   SetFlagFromCheckbox(break_checkbox_, &flags, gfx::Canvas::CHARACTER_BREAK);
    257   SetFlagFromCheckbox(bold_checkbox_, &style, gfx::Font::BOLD);
    258   SetFlagFromCheckbox(italic_checkbox_, &style, gfx::Font::ITALIC);
    259   SetFlagFromCheckbox(underline_checkbox_, &style, gfx::Font::UNDERLINE);
    260   text_view_->set_halo(halo_checkbox_->checked());
    261   text_view_->set_text_flags(flags);
    262   text_view_->SetFontStyle(style);
    263   text_view_->SchedulePaint();
    264 }
    265 
    266 void TextExample::OnSelectedIndexChanged(Combobox* combobox) {
    267   int text_flags = text_view_->text_flags();
    268   if (combobox == h_align_cb_) {
    269     text_flags &= ~(gfx::Canvas::TEXT_ALIGN_LEFT |
    270                     gfx::Canvas::TEXT_ALIGN_CENTER |
    271                     gfx::Canvas::TEXT_ALIGN_RIGHT);
    272     switch (combobox->selected_index()) {
    273       case 0:
    274         break;
    275       case 1:
    276         text_flags |= gfx::Canvas::TEXT_ALIGN_LEFT;
    277         break;
    278       case 2:
    279         text_flags |= gfx::Canvas::TEXT_ALIGN_CENTER;
    280         break;
    281       case 3:
    282         text_flags |= gfx::Canvas::TEXT_ALIGN_RIGHT;
    283         break;
    284     }
    285   } else if (combobox == text_cb_) {
    286     switch (combobox->selected_index()) {
    287       case 0:
    288         text_view_->set_text(ASCIIToUTF16(kShortText));
    289         break;
    290       case 1:
    291         text_view_->set_text(ASCIIToUTF16(kMediumText));
    292         break;
    293       case 2:
    294         text_view_->set_text(ASCIIToUTF16(kLongText));
    295         break;
    296       case 3:
    297         text_view_->set_text(ASCIIToUTF16(kAmpersandText));
    298         break;
    299       case 4:
    300         text_view_->set_text(ASCIIToUTF16(kNewlineText));
    301         break;
    302     }
    303   } else if (combobox == eliding_cb_) {
    304     switch (combobox->selected_index()) {
    305       case 0:
    306         text_flags &= ~gfx::Canvas::NO_ELLIPSIS;
    307         text_view_->set_fade(false);
    308         break;
    309       case 1:
    310         text_flags |= gfx::Canvas::NO_ELLIPSIS;
    311         text_view_->set_fade(false);
    312         break;
    313 #if defined(OS_WIN)
    314       case 2:
    315         text_view_->set_fade_mode(gfx::Canvas::TruncateFadeTail);
    316         text_view_->set_fade(true);
    317         break;
    318       case 3:
    319         text_view_->set_fade_mode(gfx::Canvas::TruncateFadeHead);
    320         text_view_->set_fade(true);
    321         break;
    322       case 4:
    323         text_view_->set_fade_mode(gfx::Canvas::TruncateFadeHeadAndTail);
    324         text_view_->set_fade(true);
    325         break;
    326 #endif
    327     }
    328   } else if (combobox == prefix_cb_) {
    329     text_flags &= ~(gfx::Canvas::SHOW_PREFIX | gfx::Canvas::HIDE_PREFIX);
    330     switch (combobox->selected_index()) {
    331       case 0:
    332         break;
    333       case 1:
    334         text_flags |= gfx::Canvas::SHOW_PREFIX;
    335         break;
    336       case 2:
    337         text_flags |= gfx::Canvas::HIDE_PREFIX;
    338         break;
    339     }
    340   }
    341   text_view_->set_text_flags(text_flags);
    342   text_view_->SchedulePaint();
    343 }
    344 
    345 }  // namespace examples
    346 }  // namespace views
    347