+ // wxSizer and friends use this to give a chance to a component to recalc
+ // its min size once one of the final size components is known. Override
+ // this function when that is useful (such as for wxStaticText which can
+ // stretch over several lines). Parameter availableOtherDir
+ // tells the item how much more space there is available in the opposite
+ // direction (-1 if unknown).
+ virtual bool
+ InformFirstDirection(int direction, int size, int availableOtherDir);
+
+ // sends a size event to the window using its current size -- this has an
+ // effect of refreshing the window layout
+ //
+ // by default the event is sent, i.e. processed immediately, but if flags
+ // value includes wxSEND_EVENT_POST then it's posted, i.e. only schedule
+ // for later processing
+ virtual void SendSizeEvent(int flags = 0);
+
+ // this is a safe wrapper for GetParent()->SendSizeEvent(): it checks that
+ // we have a parent window and it's not in process of being deleted
+ //
+ // this is used by controls such as tool/status bars changes to which must
+ // also result in parent re-layout
+ void SendSizeEventToParent(int flags = 0);
+
+ // this is a more readable synonym for SendSizeEvent(wxSEND_EVENT_POST)
+ void PostSizeEvent() { SendSizeEvent(wxSEND_EVENT_POST); }
+
+ // this is the same as SendSizeEventToParent() but using PostSizeEvent()
+ void PostSizeEventToParent() { SendSizeEventToParent(wxSEND_EVENT_POST); }
+
+ // These functions should be used before repositioning the children of
+ // this window to reduce flicker or, in MSW case, even avoid display
+ // corruption in some situations (so they're more than just optimization).
+ //
+ // EndRepositioningChildren() should be called if and only if
+ // BeginRepositioningChildren() returns true. To ensure that this is always
+ // done automatically, use ChildrenRepositioningGuard class below.
+ virtual bool BeginRepositioningChildren() { return false; }
+ virtual void EndRepositioningChildren() { }
+
+ // A simple helper which ensures that EndRepositioningChildren() is called
+ // from its dtor if and only if calling BeginRepositioningChildren() from
+ // the ctor returned true.
+ class ChildrenRepositioningGuard
+ {
+ public:
+ // Notice that window can be NULL here, for convenience. In this case
+ // this class simply doesn't do anything.
+ wxEXPLICIT ChildrenRepositioningGuard(wxWindowBase* win)
+ : m_win(win),
+ m_callEnd(win && win->BeginRepositioningChildren())
+ {
+ }
+
+ ~ChildrenRepositioningGuard()
+ {
+ if ( m_callEnd )
+ m_win->EndRepositioningChildren();
+ }
+
+ private:
+ wxWindowBase* const m_win;
+ const bool m_callEnd;
+
+ wxDECLARE_NO_COPY_CLASS(ChildrenRepositioningGuard);
+ };
+