You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
6.8 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: wxMenuButton
// Purpose: A button with a dropdown wxMenu
// Author: John Labenski
// Modified by:
// Created: 11/05/2002
// Copyright: (c) John Labenski
// Licence: wxWidgets licence
/////////////////////////////////////////////////////////////////////////////
/*
wxMenuButton is a button that drops down an assigned wxMenu
Create the button with either a text or bitmap label.
Create a new wxMenu and call AssignMenu and thats it. When you press the
dropdown button the menu appears. When you press the label button the next
wxITEM_RADIO (ie wxMenuItem::GetKind) in the menu is selected round robin.
If there are no radio items then it really just acts like a menubar, though
this is probably not too useful. The events sent in this case are EVT_MENUs
either generated by the menu when you click on it or created when you click
on the label to select the next radio item.
*/
#ifndef _WX_MENUBTN_H_
#define _WX_MENUBTN_H_
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "menubtn.h"
#endif
#include "wx/things/thingdef.h"
#include "wx/things/toggle.h"
class WXDLLEXPORT wxMenu;
class WXDLLEXPORT wxBitmap;
class WXDLLIMPEXP_THINGS wxCustomButton;
//-----------------------------------------------------------------------------
// wxMenuButton styles
//-----------------------------------------------------------------------------
#define wxMENUBUTTON_DROP_WIDTH 10
#define wxMENUBUTTON_DROP_HEIGHT 22
enum wxMenuButton_Styles
{
wxMENUBUT_FLAT = wxCUSTBUT_FLAT
};
//-----------------------------------------------------------------------------
// wxMenuButton
//-----------------------------------------------------------------------------
class WXDLLIMPEXP_THINGS wxMenuButton : public wxControl
{
public:
wxMenuButton() : wxControl() { Init(); }
// Use this constructor if you need one compatible with a wxButton
// setup the button later with AssignMenu
wxMenuButton( wxWindow* parent,
wxWindowID id,
const wxString &label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxT("wxMenuButton"))
: wxControl()
{
Init();
Create(parent,id,label,wxNullBitmap,pos,size,style,val,name);
}
// Use this constructor if you need one compatible with a wxBitmapButton
// setup the button later with AssignMenu
wxMenuButton( wxWindow* parent, wxWindowID id,
const wxBitmap &bitmap,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxT("wxMenuButton"))
: wxControl()
{
Init();
Create(parent,id,wxEmptyString,bitmap,pos,size,style,val,name);
}
// wxComboBox constructor, completely setup later
wxMenuButton( wxWindow *parent, wxWindowID id,
const wxString& value = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = (const wxString *) NULL,
long style = 0,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxT("wxMenuButton"))
: wxControl()
{
n = n; choices = choices; // get rid of unused warning
Init();
Create(parent, id, value, wxNullBitmap, pos, size, style, val, name);
}
// Native constructor
wxMenuButton( wxWindow* parent, wxWindowID id,
const wxString &label, const wxBitmap &bitmap,
wxMenu *menu, bool static_menu = false,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxT("wxMenuButton"))
: wxControl()
{
Init();
AssignMenu(menu, static_menu);
Create(parent,id,label,bitmap,pos,size,style,val,name);
}
virtual ~wxMenuButton();
bool Create( wxWindow* parent,
wxWindowID id,
const wxString &label,
const wxBitmap &bitmap,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxNO_BORDER,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxT("wxMenuButton"));
// Gets the id of the first selected radio item or wxNOT_FOUND (-1) if none
int GetSelection() const;
// This menu will be displayed when the dropdown button is pressed.
// if static_menu is false it will be deleted when the buttton is destroyed.
void AssignMenu(wxMenu *menu, bool static_menu = false);
wxMenu *GetMenu() const { return m_menu; }
// get a pointer to the label button, for turning it into a toggle perhaps
wxCustomButton *GetLabelButton() const { return m_labelButton; }
wxCustomButton *GetDropDownButton() const { return m_dropdownButton; }
void SetToolTip(const wxString &tip);
void SetToolTip(wxToolTip *tip);
protected:
void OnButton(wxCommandEvent &event);
virtual void DoSetSize(int x, int y, int width, int height,
int sizeFlags = wxSIZE_AUTO);
virtual wxSize DoGetBestSize();
// FIXME! - in MSW the radio items don't check themselves
#ifdef __WXMSW__
void OnMenu( wxCommandEvent &event );
#endif
wxCustomButton *m_labelButton;
wxCustomButton *m_dropdownButton;
wxMenu *m_menu;
bool m_menu_static;
long m_style;
private:
void Init();
DECLARE_DYNAMIC_CLASS(wxMenuButton)
DECLARE_EVENT_TABLE()
};
//-----------------------------------------------------------------------------
// wxMenuButtonEvents
//
// EVT_MENUBUTTON_OPEN(id, fn) - menu is about to be opened, (dis)(en)able items
// or call Veto() to stop menu from popping up
// this is a wxNotifyEvent
//-----------------------------------------------------------------------------
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_THINGS, wxEVT_MENUBUTTON_OPEN, 0)
END_DECLARE_EVENT_TYPES()
#define EVT_MENUBUTTON_OPEN(id, fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_MENUBUTTON_OPEN, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) & fn, (wxObject *) NULL ),
#endif // _WX_MENUBTN_H_