blob: 655c49cc1c40636d59c6a4fe41577682e423be4d [file] [log] [blame]
// Copyright (c) 2006-2008 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 CHROME_VIEWS_NATIVE_BUTTON_H__
#define CHROME_VIEWS_NATIVE_BUTTON_H__
#include <string>
#include "base/gfx/size.h"
#include "chrome/common/gfx/chrome_font.h"
#include "chrome/views/native_control.h"
namespace views {
class HWNDView;
////////////////////////////////////////////////////////////////////////////////
//
// NativeButton is a wrapper for a windows native button
// TODO(beng): (Cleanup) this should derive also from some button-like base to
// get all the listenery-stuff for free and to work with
// AddManagedButton.
//
////////////////////////////////////////////////////////////////////////////////
class NativeButton : public NativeControl {
public:
explicit NativeButton(const std::wstring& label);
NativeButton(const std::wstring& label, bool is_default);
virtual ~NativeButton();
virtual gfx::Size GetPreferredSize();
void SetLabel(const std::wstring& l);
const std::wstring GetLabel() const;
std::string GetClassName() const;
class Listener {
public:
//
// This is invoked once the button is released.
virtual void ButtonPressed(NativeButton* sender) = 0;
};
//
// The the listener, the object that receives a notification when this
// button is pressed.
void SetListener(Listener* listener);
// Set the font used by this button.
void SetFont(const ChromeFont& font) { font_ = font; }
// Adds some internal padding to the button. The |size| specified is applied
// on both sides of the button for each directions
void SetPadding(CSize size);
// Sets/unsets this button as the default button. The default button is the
// one triggered when enter is pressed. It is displayed with a blue border.
void SetDefaultButton(bool is_default_button);
bool IsDefaultButton() const { return is_default_; }
virtual LRESULT OnNotify(int w_param, LPNMHDR l_param);
virtual LRESULT OnCommand(UINT code, int id, HWND source);
// Invoked when the accelerator associated with the button is pressed.
virtual bool AcceleratorPressed(const Accelerator& accelerator);
// Sets the minimum size of the button from the specified size (in dialog
// units). If the width/height is non-zero, the preferred size of the button
// is max(preferred size of the content + padding, dlus converted to pixels).
//
// The default is 50, 14.
void SetMinSizeFromDLUs(const gfx::Size& dlu_size) {
min_dlu_size_ = dlu_size;
}
// Returns the MSAA role of the current view. The role is what assistive
// technologies (ATs) use to determine what behavior to expect from a given
// control.
bool GetAccessibleRole(VARIANT* role);
// Returns a brief, identifying string, containing a unique, readable name.
bool GetAccessibleName(std::wstring* name);
// Assigns an accessible string name.
void SetAccessibleName(const std::wstring& name);
// Sets whether the min size of this button should follow the Windows
// guidelines. Default is true. Set this to false if you want slim buttons.
void set_enforce_dlu_min_size(bool value) { enforce_dlu_min_size_ = value; }
// The view class name.
static const char kViewClassName[];
protected:
virtual HWND CreateNativeControl(HWND parent_container);
// Sub-classes can call this method to cause the native button to reflect
// the current state
virtual void UpdateNativeButton();
// Sub-classes must override this method to properly configure the native
// button given the current state
virtual void ConfigureNativeButton(HWND hwnd);
// Overridden from NativeControl so we can activate the button when Enter is
// pressed.
virtual bool NotifyOnKeyDown() const;
virtual bool OnKeyDown(int virtual_key_code);
private:
NativeButton() {}
// Initializes the button. If |is_default| is true, this appears like the
// "default" button, and will register Enter as its keyboard accelerator.
void Init(const std::wstring& label, bool is_default);
void Clicked();
// Whether the button preferred size should follow the Microsoft layout
// guidelines. Default is true.
bool enforce_dlu_min_size_;
std::wstring label_;
ChromeFont font_;
Listener* listener_;
CSize padding_;
// True if the button should be rendered to appear like the "default" button
// in the containing dialog box. Default buttons register Enter as their
// accelerator.
bool is_default_;
// Minimum size, in dlus (see SetMinSizeFromDLUs).
gfx::Size min_dlu_size_;
// Storage of strings needed for accessibility.
std::wstring accessible_name_;
DISALLOW_EVIL_CONSTRUCTORS(NativeButton);
};
} // namespace views
#endif // CHROME_VIEWS_NATIVE_BUTTON_H__