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/bubble_example.h"
      6 
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "ui/views/bubble/bubble_delegate.h"
      9 #include "ui/views/controls/button/label_button.h"
     10 #include "ui/views/controls/label.h"
     11 #include "ui/views/layout/box_layout.h"
     12 #include "ui/views/widget/widget.h"
     13 
     14 namespace views {
     15 namespace examples {
     16 
     17 namespace {
     18 
     19 SkColor colors[] = { SK_ColorWHITE, SK_ColorGRAY, SK_ColorCYAN, 0xFFC1B1E1 };
     20 
     21 BubbleBorder::Arrow arrows[] = {
     22     BubbleBorder::TOP_LEFT, BubbleBorder::TOP_CENTER,
     23     BubbleBorder::TOP_RIGHT, BubbleBorder::RIGHT_TOP,
     24     BubbleBorder::RIGHT_CENTER, BubbleBorder::RIGHT_BOTTOM,
     25     BubbleBorder::BOTTOM_RIGHT, BubbleBorder::BOTTOM_CENTER,
     26     BubbleBorder::BOTTOM_LEFT, BubbleBorder::LEFT_BOTTOM,
     27     BubbleBorder::LEFT_CENTER, BubbleBorder::LEFT_TOP };
     28 
     29 string16 GetArrowName(BubbleBorder::Arrow arrow) {
     30   switch (arrow) {
     31     case BubbleBorder::TOP_LEFT:      return ASCIIToUTF16("TOP_LEFT");
     32     case BubbleBorder::TOP_RIGHT:     return ASCIIToUTF16("TOP_RIGHT");
     33     case BubbleBorder::BOTTOM_LEFT:   return ASCIIToUTF16("BOTTOM_LEFT");
     34     case BubbleBorder::BOTTOM_RIGHT:  return ASCIIToUTF16("BOTTOM_RIGHT");
     35     case BubbleBorder::LEFT_TOP:      return ASCIIToUTF16("LEFT_TOP");
     36     case BubbleBorder::RIGHT_TOP:     return ASCIIToUTF16("RIGHT_TOP");
     37     case BubbleBorder::LEFT_BOTTOM:   return ASCIIToUTF16("LEFT_BOTTOM");
     38     case BubbleBorder::RIGHT_BOTTOM:  return ASCIIToUTF16("RIGHT_BOTTOM");
     39     case BubbleBorder::TOP_CENTER:    return ASCIIToUTF16("TOP_CENTER");
     40     case BubbleBorder::BOTTOM_CENTER: return ASCIIToUTF16("BOTTOM_CENTER");
     41     case BubbleBorder::LEFT_CENTER:   return ASCIIToUTF16("LEFT_CENTER");
     42     case BubbleBorder::RIGHT_CENTER:  return ASCIIToUTF16("RIGHT_CENTER");
     43     case BubbleBorder::NONE:          return ASCIIToUTF16("NONE");
     44     case BubbleBorder::FLOAT:         return ASCIIToUTF16("FLOAT");
     45   }
     46   return ASCIIToUTF16("INVALID");
     47 }
     48 
     49 class ExampleBubble : public BubbleDelegateView {
     50  public:
     51    ExampleBubble(View* anchor, BubbleBorder::Arrow arrow)
     52        : BubbleDelegateView(anchor, arrow) {}
     53 
     54  protected:
     55   virtual void Init() OVERRIDE {
     56     SetLayoutManager(new BoxLayout(BoxLayout::kVertical, 50, 50, 0));
     57     AddChildView(new Label(GetArrowName(arrow())));
     58   }
     59 
     60  private:
     61   DISALLOW_COPY_AND_ASSIGN(ExampleBubble);
     62 };
     63 
     64 }  // namespace
     65 
     66 BubbleExample::BubbleExample() : ExampleBase("Bubble") {}
     67 
     68 BubbleExample::~BubbleExample() {}
     69 
     70 void BubbleExample::CreateExampleView(View* container) {
     71   PrintStatus("Click with optional modifiers: [Ctrl] for set_arrow(NONE), "
     72      "[Alt] for set_arrow(FLOAT), or [Shift] to reverse the arrow iteration.");
     73   container->SetLayoutManager(new BoxLayout(BoxLayout::kHorizontal, 0, 0, 10));
     74   no_shadow_ = new LabelButton(this, ASCIIToUTF16("No Shadow"));
     75   container->AddChildView(no_shadow_);
     76   big_shadow_ = new LabelButton(this, ASCIIToUTF16("Big Shadow"));
     77   container->AddChildView(big_shadow_);
     78   small_shadow_ = new LabelButton(this, ASCIIToUTF16("Small Shadow"));
     79   container->AddChildView(small_shadow_);
     80   align_to_edge_ = new LabelButton(this, ASCIIToUTF16("Align To Edge"));
     81   container->AddChildView(align_to_edge_);
     82   persistent_ = new LabelButton(this, ASCIIToUTF16("Persistent"));
     83   container->AddChildView(persistent_);
     84   fade_in_ = new LabelButton(this, ASCIIToUTF16("Fade In"));
     85   container->AddChildView(fade_in_);
     86 }
     87 
     88 void BubbleExample::ButtonPressed(Button* sender, const ui::Event& event) {
     89   static int arrow_index = 0, color_index = 0;
     90   static const int count = arraysize(arrows);
     91   arrow_index = (arrow_index + count + (event.IsShiftDown() ? -1 : 1)) % count;
     92   BubbleBorder::Arrow arrow = arrows[arrow_index];
     93   if (event.IsControlDown())
     94     arrow = BubbleBorder::NONE;
     95   else if (event.IsAltDown())
     96     arrow = BubbleBorder::FLOAT;
     97 
     98   ExampleBubble* bubble = new ExampleBubble(sender, arrow);
     99   bubble->set_color(colors[(color_index++) % arraysize(colors)]);
    100 
    101   if (sender == no_shadow_)
    102     bubble->set_shadow(BubbleBorder::NO_SHADOW);
    103   else if (sender == big_shadow_)
    104     bubble->set_shadow(BubbleBorder::BIG_SHADOW);
    105   else if (sender == small_shadow_)
    106     bubble->set_shadow(BubbleBorder::SMALL_SHADOW);
    107 
    108   if (sender == persistent_) {
    109     bubble->set_close_on_deactivate(false);
    110     bubble->set_move_with_anchor(true);
    111   }
    112 
    113   BubbleDelegateView::CreateBubble(bubble);
    114   if (sender == align_to_edge_)
    115     bubble->SetAlignment(BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
    116 
    117   if (sender == fade_in_)
    118     bubble->StartFade(true);
    119   else
    120     bubble->GetWidget()->Show();
    121 }
    122 
    123 }  // namespace examples
    124 }  // namespace views
    125