wxWidgets/include/wx/simplebook.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

260 lines
7.1 KiB
C
Raw Normal View History

///////////////////////////////////////////////////////////////////////////////
// Name: wx/simplebook.h
// Purpose: wxBookCtrlBase-derived class without any controller.
// Author: Vadim Zeitlin
// Created: 2012-08-21
// Copyright: (c) 2012 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_SIMPLEBOOK_H_
#define _WX_SIMPLEBOOK_H_
#include "wx/bookctrl.h"
#if wxUSE_BOOKCTRL
#include "wx/containr.h"
#include "wx/vector.h"
// Hack to work around problems with wxNavigationEnabled<wxBookCtrlBase> when
// using wx as DLL: we want the compiler to see that it's already available in
// the DLL by including some other DLL exported class using it as the base in
// order to prevent it from generating a non-DLL-exported instantiation which
// will conflict with the one in the DLL at the link-time.
//
// Find the first available class using wxNavigationEnabled<wxBookCtrlBase> as
// base, any will do (except for wxAUI one, as this would create a dependency
// on the AUI library that we can't have here).
#if wxUSE_CHOICEBOOK
#include "wx/choicebk.h"
#elif wxUSE_LISTBOOK
#include "wx/listbook.h"
#elif wxUSE_TOOLBOOK
#include "wx/toolbook.h"
#elif wxUSE_TREEBOOK
#include "wx/treebook.h"
#endif
// ----------------------------------------------------------------------------
// wxSimplebook: a book control without any user-actionable controller.
// ----------------------------------------------------------------------------
// NB: This class doesn't use DLL export declaration as it's fully inline.
class wxSimplebook : public wxNavigationEnabled<wxBookCtrlBase>
{
public:
wxSimplebook()
{
Init();
}
wxSimplebook(wxWindow *parent,
wxWindowID winid = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxEmptyString)
{
wxBookCtrlBase::Create(parent, winid, pos, size, style | wxBK_TOP, name);
Init();
}
bool Create(wxWindow *parent,
wxWindowID winid = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxEmptyString)
{
return wxBookCtrlBase::Create(parent, winid, pos, size, style | wxBK_TOP, name);
}
// Methods specific to this class.
// A method allowing to add a new page without any label (which is unused
// by this control) and show it immediately.
bool ShowNewPage(wxWindow* page)
{
return AddPage(page, wxString(), true /* select it */);
}
// Set effect to use for showing/hiding pages.
void SetEffects(wxShowEffect showEffect, wxShowEffect hideEffect)
{
m_showEffect = showEffect;
m_hideEffect = hideEffect;
}
// Or the same effect for both of them.
void SetEffect(wxShowEffect effect)
{
SetEffects(effect, effect);
}
// And the same for time outs.
void SetEffectsTimeouts(unsigned showTimeout, unsigned hideTimeout)
{
m_showTimeout = showTimeout;
m_hideTimeout = hideTimeout;
}
void SetEffectTimeout(unsigned timeout)
{
SetEffectsTimeouts(timeout, timeout);
}
// Implement base class pure virtual methods.
// Page management
virtual bool InsertPage(size_t n,
wxWindow *page,
const wxString& text,
bool bSelect = false,
int imageId = NO_IMAGE) wxOVERRIDE
{
if ( !wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId) )
return false;
m_pageTexts.insert(m_pageTexts.begin() + n, text);
if ( !DoSetSelectionAfterInsertion(n, bSelect) )
page->Hide();
return true;
}
virtual int SetSelection(size_t n) wxOVERRIDE
{
return DoSetSelection(n, SetSelection_SendEvent);
}
virtual int ChangeSelection(size_t n) wxOVERRIDE
{
return DoSetSelection(n);
}
// Neither labels nor images are supported but we still store the labels
// just in case the user code attaches some importance to them.
virtual bool SetPageText(size_t n, const wxString& strText) wxOVERRIDE
{
wxCHECK_MSG( n < GetPageCount(), false, wxS("Invalid page") );
m_pageTexts[n] = strText;
return true;
}
virtual wxString GetPageText(size_t n) const wxOVERRIDE
{
wxCHECK_MSG( n < GetPageCount(), wxString(), wxS("Invalid page") );
return m_pageTexts[n];
}
virtual bool SetPageImage(size_t WXUNUSED(n), int WXUNUSED(imageId)) wxOVERRIDE
{
return false;
}
virtual int GetPageImage(size_t WXUNUSED(n)) const wxOVERRIDE
{
return NO_IMAGE;
}
// Override some wxWindow methods too.
virtual void SetFocus() wxOVERRIDE
{
wxWindow* const page = GetCurrentPage();
if ( page )
page->SetFocus();
}
protected:
virtual void UpdateSelectedPage(size_t WXUNUSED(newsel)) wxOVERRIDE
{
// Nothing to do here, but must be overridden to avoid the assert in
// the base class version.
}
virtual wxBookCtrlEvent* CreatePageChangingEvent() const wxOVERRIDE
{
return new wxBookCtrlEvent(wxEVT_BOOKCTRL_PAGE_CHANGING,
GetId());
}
virtual void MakeChangedEvent(wxBookCtrlEvent& event) wxOVERRIDE
{
event.SetEventType(wxEVT_BOOKCTRL_PAGE_CHANGED);
}
virtual wxWindow *DoRemovePage(size_t page) wxOVERRIDE
{
wxWindow* const win = wxBookCtrlBase::DoRemovePage(page);
if ( win )
{
m_pageTexts.erase(m_pageTexts.begin() + page);
DoSetSelectionAfterRemoval(page);
}
return win;
}
virtual void DoSize() wxOVERRIDE
{
wxWindow* const page = GetCurrentPage();
if ( page )
page->SetSize(GetPageRect());
}
virtual void DoShowPage(wxWindow* page, bool show) wxOVERRIDE
{
if ( show )
{
page->ShowWithEffect(m_showEffect, m_showTimeout);
// Unlike simple Show(), ShowWithEffect() doesn't necessarily give
// focus to the window, but we do expect the new page to have focus.
page->SetFocus();
}
else
{
page->HideWithEffect(m_hideEffect, m_hideTimeout);
}
}
private:
void Init()
{
// We don't need any border as we don't have anything to separate the
// page contents from.
SetInternalBorder(0);
// No effects by default.
m_showEffect =
m_hideEffect = wxSHOW_EFFECT_NONE;
m_showTimeout =
m_hideTimeout = 0;
}
wxVector<wxString> m_pageTexts;
wxShowEffect m_showEffect,
m_hideEffect;
unsigned m_showTimeout,
m_hideTimeout;
wxDECLARE_NO_COPY_CLASS(wxSimplebook);
};
#endif // wxUSE_BOOKCTRL
#endif // _WX_SIMPLEBOOK_H_