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.

168 lines
5.7 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: DropDownBase
// Purpose: base class for a control like a combobox
// Author: John Labenski
// Modified by:
// Created: 11/05/2002
// Copyright: (c) John Labenski
// Licence: wxWidgets licence
/////////////////////////////////////////////////////////////////////////////
/*
YOU MUST USE A wxWIDGETS RELEASE NEWER THAN 1/29/05 - AFTER POPUPWINDOW FIX
DropDownBase is a class that has a DropDownPopup as a child. It works like a
wxComboBox in that there is a button to the right that you use to drop down
a window. You can put whatever you want in the DropDownPopup by calling
GetPopupWindow()->SetChild(win) in your DoShowPopup function.
Additionally, you'll want to put a window to the left of the dropdown button.
You need to subclass this to make a new control.
You need to override these function in DropDownBase
DoGetBestSize() let wxWidgets know how big this control wants to be
DoGetBestDropHeight(max) - max is the # pixels to bottom of screen, you probably want
it smaller so return that height, return -1 if you don't want the popup shown.
DoShowPopup() - this is called from ShowPopup after creating the m_popupWin.
Create your child window with the popup as the parent and call
GetPopupWindow()->SetChild(win). Make sure you call
DropDownBase::DoShowPopup() to have the popup window shown.
*/
#ifndef _WX_DROPDOWNBASE_H_
#define _WX_DROPDOWNBASE_H_
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "dropdown.h"
#endif
#include "wx/popupwin.h"
#include "wx/things/thingdef.h"
class WXDLLEXPORT wxTimer;
class WXDLLEXPORT wxTimerEvent;
class WXDLLEXPORT wxCustomButton;
class WXDLLIMPEXP_THINGS DropDownPopup;
#define DROPDOWN_DROP_WIDTH 14 // these are the default sizes
#define DROPDOWN_DROP_HEIGHT 22
//-----------------------------------------------------------------------------
// DropDownBase generic combobox type widget that drops down a DropDownPopup
//-----------------------------------------------------------------------------
class WXDLLIMPEXP_THINGS DropDownBase : public wxControl
{
public:
DropDownBase() : wxControl() { Init(); }
DropDownBase( wxWindow *parent, wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxT("DropDownBase"))
: wxControl()
{
Init();
Create(parent, id, pos, size, style, val, name);
}
virtual ~DropDownBase();
bool Create(wxWindow* parent,
wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxT("DropDownBase"));
virtual bool ShowPopup();
virtual void HidePopup();
bool IsPopupShown();
// implementation
void OnDropButton( wxCommandEvent &event );
wxCustomButton* GetDropDownButton() { return m_dropdownButton; }
// Get the popup window, NULL when not shown
DropDownPopup* GetPopupWindow() { return m_popupWin; }
protected:
virtual void DoSetSize(int x, int y, int width, int height,
int sizeFlags = wxSIZE_AUTO);
void OnSize( wxSizeEvent& event );
virtual wxSize DoGetBestSize() const;
virtual bool DoShowPopup();
// override to set the height of the dropdown box
// input max_height is height from bottom of ctrl to bottom of screen
// return < 1 to not have the popup displayed
virtual int DoGetBestDropHeight(int max_height) { return max_height; }
wxCustomButton *m_dropdownButton;
DropDownPopup *m_popupWin;
private:
void Init();
DECLARE_DYNAMIC_CLASS(DropDownBase)
DECLARE_EVENT_TABLE()
};
//-----------------------------------------------------------------------------
// DropDownPopup generic popup window, call SetChild
//-----------------------------------------------------------------------------
class WXDLLIMPEXP_THINGS DropDownPopup : public wxPopupTransientWindow
{
public:
DropDownPopup() : wxPopupTransientWindow() { Init(); }
DropDownPopup(DropDownBase *parent, int style = wxBORDER_NONE) : wxPopupTransientWindow()
{
Init();
Create(parent, style);
}
virtual ~DropDownPopup();
bool Create(DropDownBase *parent, int style = wxBORDER_NONE);
virtual void Popup(wxWindow *focus = NULL);
virtual void Dismiss();
virtual bool ProcessLeftDown(wxMouseEvent& event);
virtual void SetChild(wxWindow *child);
virtual wxWindow *GetChild() const { return m_childWin; }
bool m_ignore_popup;
protected:
// start/stop timer shat pushes and pops handler when the mouse goes over
// the scrollbars (if any) of the child window
void StartTimer();
void StopTimer();
void PushPopupHandler(wxWindow* child);
void PopPopupHandler(wxWindow* child);
void OnMouse( wxMouseEvent& event );
void OnKeyDown( wxKeyEvent &event );
void OnTimer( wxTimerEvent& event );
void OnIdle( wxIdleEvent& event );
wxPoint m_mouse; // last/current mouse position
wxWindow *m_childWin; // store our own child pointer
DropDownBase *m_owner;
wxTimer *m_timer; // timer for tracking mouse position
bool m_popped_handler; // state of the event handler
private:
void Init();
DECLARE_DYNAMIC_CLASS(DropDownPopup)
DECLARE_EVENT_TABLE()
};
#endif // _WX_DROPDOWNBASE_H_