// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_POPUP_MESSAGE_H_
#define ASH_POPUP_MESSAGE_H_

#include "ash/ash_export.h"
#include "base/basictypes.h"
#include "base/gtest_prod_util.h"
#include "base/strings/string16.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/bubble/bubble_border.h"

namespace views {
class BubbleDelegateView;
class Widget;
}

namespace ash {

// PopupMessage shows a message to the user. Since the user is not able to
// dismiss it, the calling code needs to explictly close and destroy it.
class ASH_EXPORT PopupMessage {
 public:
  enum IconType {
    ICON_WARNING,
    ICON_NONE
  };

  // Creates a message pointing towards |anchor| with the requested
  // |arrow_orientation|. The message contains an optional |caption| which is
  // drawn in bold and an optional |message| together with an optional icon of
  // shape |message_type|. If a component in |size_override| is not 0 the value
  // is the used as output size. If |arrow_offset| is not 0, the number is the
  // arrow offset in pixels from the border.
  //
  // Here is the layout (arrow given as TOP_LEFT):
  //                    |--------|
  //                    | Anchor |
  //                    |--------|
  //       |-arrow_offset---^
  //       +-------------------------------------------------+
  //      -|                                                 |-
  //  icon |  [!]  Caption in bold which can be multi line   | caption_label
  //      -|                                                 |-
  //       |       Message text which can be multi line      | message_label
  //       |       as well.                                  |
  //       |                                                 |-
  //       +-------------------------------------------------+
  PopupMessage(const base::string16& caption,
               const base::string16& message,
               IconType message_type,
               views::View* anchor,
               views::BubbleBorder::Arrow arrow,
               const gfx::Size& size_override,
               int arrow_offset);
  // If the message was not explicitly closed before, it closes the message
  // without animation.
  virtual ~PopupMessage();

  // Closes the message with a fade out animation.
  void Close();

 private:
  FRIEND_TEST_ALL_PREFIXES(PopupMessageTest, Layout);

  class MessageBubble;

  static const int kCaptionLabelID;
  static const int kMessageLabelID;

  void CancelHidingAnimation();

  MessageBubble* view_;
  views::Widget* widget_;

  base::string16 caption_;
  base::string16 message_;

  DISALLOW_COPY_AND_ASSIGN(PopupMessage);
};

}  // namespace ash

#endif  // ASH_POPUP_MESSAGE_H_
