void SetId( wxWindowID winid ) { m_windowId = winid; }
wxWindowID GetId() const { return m_windowId; }
- // returns true if this id value belong to the range reserved for the
- // auto-generated (by NewControlId()) ids (they're always negative)
- static bool IsAutoGeneratedId(wxWindowID id);
-
// generate a unique id (or count of them consecutively), returns a
- // valid id in IsAutoGeneratedId() range or wxID_NONE if failed
- static wxWindowID NewControlId(int count = 1);
+ // valid id in the auto-id range or wxID_NONE if failed. If using
+ // autoid management, it will mark the id as reserved until it is
+ // used (by assigning it to a wxWindowIDRef) or unreserved.
+ static wxWindowID NewControlId(int count = 1)
+ {
+ return wxIdManager::ReserveId(count);
+ }
- // mark an id previously returned by NewControlId() as being unused any
- // more so that it can be reused again for another control later
- static void ReleaseControlId(wxWindowID id);
+ // If an ID generated from NewControlId is not assigned to a wxWindowIDRef,
+ // it must be unreserved
+ static void UnreserveControlId(wxWindowID id, int count = 1)
+ {
+ wxIdManager::UnreserveId(id, count);
+ }
// moving/resizing
return wxRect(GetClientAreaOrigin(), GetClientSize());
}
+ // client<->window size conversion
+ virtual wxSize ClientToWindowSize(const wxSize& size) const;
+ virtual wxSize WindowToClientSize(const wxSize& size) const;
+
// get the size best suited for the window (in fact, minimal
// acceptable size using which it will still look "nice" in
// most situations)
virtual void SetMinSize(const wxSize& minSize) { m_minWidth = minSize.x; m_minHeight = minSize.y; }
virtual void SetMaxSize(const wxSize& maxSize) { m_maxWidth = maxSize.x; m_maxHeight = maxSize.y; }
+ // Like Set*Size, but for client, not window, size
+ virtual void SetMinClientSize(const wxSize& size)
+ { SetMinSize(ClientToWindowSize(size)); }
+ virtual void SetMaxClientSize(const wxSize& size)
+ { SetMaxSize(ClientToWindowSize(size)); }
+
// Override these methods to impose restrictions on min/max size.
// The easier way is to call SetMinSize() and SetMaxSize() which
// will have the same effect. Doing both is non-sense.
virtual wxSize GetMinSize() const { return wxSize(m_minWidth, m_minHeight); }
virtual wxSize GetMaxSize() const { return wxSize(m_maxWidth, m_maxHeight); }
+ // Like Get*Size, but for client, not window, size
+ virtual wxSize GetMinClientSize() const
+ { return WindowToClientSize(GetMinSize()); }
+ virtual wxSize GetMaxClientSize() const
+ { return WindowToClientSize(GetMaxSize()); }
+
// Get the min and max values one by one
int GetMinWidth() const { return GetMinSize().x; }
int GetMinHeight() const { return GetMinSize().y; }
static wxWindow *DoFindFocus() /* = 0: implement in derived classes */;
+ // return true if the window has focus (handles composite windows
+ // correctly - returns true if GetMainWindowOfCompositeControl()
+ // has focus)
+ virtual bool HasFocus() const;
+
// can this window have focus in principle?
//
// the difference between AcceptsFocus[FromKeyboard]() and CanAcceptFocus
bool Navigate(int flags = wxNavigationKeyEvent::IsForward)
{ return m_parent && ((wxWindowBase *)m_parent)->DoNavigateIn(flags); }
+ // this function will generate the appropriate call to Navigate() if the
+ // key event is one normally used for keyboard navigation and return true
+ // in this case
+ bool HandleAsNavigationKey(const wxKeyEvent& event);
+
// move this window just before/after the specified one in tab order
// (the other window must be our sibling!)
void MoveBeforeInTabOrder(wxWindow *win)
virtual void ClearBackground();
// freeze the window: don't redraw it until it is thawed
- virtual void Freeze() { }
+ void Freeze() { if ( !m_freezeCount++ ) DoFreeze(); }
// thaw the window: redraw it after it had been frozen
- virtual void Thaw() { }
+ void Thaw()
+ {
+ wxASSERT_MSG( m_freezeCount, "Thaw() without matching Freeze()" );
+
+ if ( !--m_freezeCount )
+ DoThaw();
+ }
// return true if window had been frozen and not unthawed yet
- virtual bool IsFrozen() const { return false; }
+ bool IsFrozen() const { return m_freezeCount != 0; }
// adjust DC for drawing on this window
virtual void PrepareDC( wxDC & WXUNUSED(dc) ) { }
// the window id - a number which uniquely identifies a window among
// its siblings unless it is wxID_ANY
- wxWindowID m_windowId;
+ wxWindowIDRef m_windowId;
// the parent window of this window (or NULL) and the list of the children
// of this window
// Layout() window automatically when its size changes?
bool m_autoLayout:1;
- // true if we had automatically allocated the id value for this window
- // (i.e. wxID_ANY had been passed to the ctor)
- bool m_freeId:1;
-
// window state
bool m_isShown:1;
bool m_isEnabled:1;
// implements the window variants
virtual void DoSetWindowVariant( wxWindowVariant variant ) ;
+
+ // really freeze/thaw the window (should have port-specific implementation)
+ virtual void DoFreeze() { }
+ virtual void DoThaw() { }
+
+
// Must be called when mouse capture is lost to send
// wxMouseCaptureLostEvent to windows on capture stack.
static void NotifyCaptureLost();
// the stack of windows which have captured the mouse
static struct WXDLLIMPEXP_FWD_CORE wxWindowNext *ms_winCaptureNext;
+
// the window that currently has mouse capture
static wxWindow *ms_winCaptureCurrent;
+
// indicates if execution is inside CaptureMouse/ReleaseMouse
static bool ms_winCaptureChanging;
+
+ // number of Freeze() calls minus the number of Thaw() calls: we're frozen
+ // (i.e. not being updated) if it is positive
+ unsigned int m_freezeCount;
+
+
DECLARE_ABSTRACT_CLASS(wxWindowBase)
DECLARE_NO_COPY_CLASS(wxWindowBase)
DECLARE_EVENT_TABLE()
#if WXWIN_COMPATIBILITY_2_6
// deprecated (doesn't start with 'wx' prefix), use wxWindow::NewControlId()
- wxDEPRECATED( int NewControlId() );
- inline int NewControlId() { return wxWindowBase::NewControlId(); }
+ wxDEPRECATED( wxWindowID NewControlId() );
+ inline wxWindowID NewControlId() { return wxWindowBase::NewControlId(); }
#endif // WXWIN_COMPATIBILITY_2_6
#if wxUSE_ACCESSIBILITY