111 lines
3.5 KiB
C
111 lines
3.5 KiB
C
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// Name: wx/compositewin.h
|
||
|
// Purpose: wxCompositeWindow<> declaration
|
||
|
// Author: Vadim Zeitlin
|
||
|
// Created: 2011-01-02
|
||
|
// RCS-ID: $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
|
||
|
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
||
|
// Licence: wxWindows licence
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef _WX_COMPOSITEWIN_H_
|
||
|
#define _WX_COMPOSITEWIN_H_
|
||
|
|
||
|
#include "wx/window.h"
|
||
|
|
||
|
// NB: This is an experimental and, as for now, undocumented class used only by
|
||
|
// wxWidgets itself internally. Don't use it in your code until its API is
|
||
|
// officially stabilized unless you are ready to change it with the next
|
||
|
// wxWidgets release.
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
// wxCompositeWindow is a helper for implementing composite windows: to define
|
||
|
// a class using subwindows, simply inherit from it specialized with the real
|
||
|
// base class name and implement GetCompositeWindowParts() pure virtual method.
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
// The template parameter W must be a wxWindow-derived class.
|
||
|
template <class W>
|
||
|
class wxCompositeWindow : public W
|
||
|
{
|
||
|
public:
|
||
|
typedef W BaseWindowClass;
|
||
|
|
||
|
// Default ctor doesn't do anything.
|
||
|
wxCompositeWindow() { }
|
||
|
|
||
|
// Override all wxWindow methods which must be forwarded to the composite
|
||
|
// window parts.
|
||
|
|
||
|
// Attribute setters group.
|
||
|
//
|
||
|
// NB: Unfortunately we can't factor out the call for the setter itself
|
||
|
// into DoSetForAllParts() because we can't call the function passed to
|
||
|
// it non-virtually and we need to do this to avoid infinite recursion,
|
||
|
// so we work around this by calling the method of this object itself
|
||
|
// manually in each function.
|
||
|
virtual bool SetForegroundColour(const wxColour& colour)
|
||
|
{
|
||
|
if ( !BaseWindowClass::SetForegroundColour(colour) )
|
||
|
return false;
|
||
|
|
||
|
DoSetForAllParts(&wxWindow::SetForegroundColour, colour);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
virtual bool SetBackgroundColour(const wxColour& colour)
|
||
|
{
|
||
|
if ( !BaseWindowClass::SetBackgroundColour(colour) )
|
||
|
return false;
|
||
|
|
||
|
DoSetForAllParts(&wxWindow::SetBackgroundColour, colour);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
virtual bool SetFont(const wxFont& font)
|
||
|
{
|
||
|
if ( !BaseWindowClass::SetFont(font) )
|
||
|
return false;
|
||
|
|
||
|
DoSetForAllParts(&wxWindow::SetFont, font);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
virtual bool SetCursor(const wxCursor& cursor)
|
||
|
{
|
||
|
if ( !BaseWindowClass::SetCursor(cursor) )
|
||
|
return false;
|
||
|
|
||
|
DoSetForAllParts(&wxWindow::SetCursor, cursor);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
// Must be implemented by the derived class to return all children to which
|
||
|
// the public methods we override should forward to.
|
||
|
virtual wxWindowList GetCompositeWindowParts() const = 0;
|
||
|
|
||
|
template <class T>
|
||
|
void DoSetForAllParts(bool (wxWindow::*func)(const T&), const T& arg)
|
||
|
{
|
||
|
// Simply call the setters for all parts of this composite window.
|
||
|
const wxWindowList parts = GetCompositeWindowParts();
|
||
|
for ( wxWindowList::const_iterator i = parts.begin();
|
||
|
i != parts.end();
|
||
|
++i )
|
||
|
{
|
||
|
wxWindow * const child = *i;
|
||
|
|
||
|
(child->*func)(arg);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxCompositeWindow, W);
|
||
|
};
|
||
|
|
||
|
#endif // _WX_COMPOSITEWIN_H_
|