m_isShown = FALSE;
m_isEnabled = TRUE;
- // no client data
- m_clientObject = (wxClientData *)NULL;
+ // no client data (yet)
m_clientData = NULL;
+ m_clientDataType = ClientData_None;
// the default event handler is just this window
m_eventHandler = this;
const wxPoint& WXUNUSED(pos),
const wxSize& WXUNUSED(size),
long style,
+ const wxValidator& validator,
const wxString& name)
{
// m_isWindow is set to TRUE in wxWindowBase::Init() as well as many other
SetName(name);
SetWindowStyleFlag(style);
SetParent(parent);
+ SetValidator(validator);
return TRUE;
}
wxASSERT_MSG( GetChildren().GetCount() == 0, _T("children not destroyed") );
+ // make sure that there are no dangling pointers left pointing to us
+ wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
+ if ( panel )
+ {
+ if ( panel->GetLastFocus() == this )
+ {
+ panel->SetLastFocus((wxWindow *)NULL);
+ }
+ }
+
#if wxUSE_CARET
if ( m_caret )
delete m_caret;
int widthParent, heightParent;
wxWindow *parent = GetParent();
- if ( parent )
+ if ( !parent )
{
- parent->GetClientSize(&widthParent, &heightParent);
+ // no other choice
+ direction |= wxCENTRE_ON_SCREEN;
}
- else
+
+ if ( direction & wxCENTRE_ON_SCREEN )
{
// centre with respect to the whole screen
wxDisplaySize(&widthParent, &heightParent);
}
+ else
+ {
+ // centre inside the parents rectangle
+ parent->GetClientSize(&widthParent, &heightParent);
+ }
int width, height;
GetSize(&width, &height);
- int new_x = -1,
- new_y = -1;
+ int xNew = -1,
+ yNew = -1;
if ( direction & wxHORIZONTAL )
- new_x = (widthParent - width)/2;
+ xNew = (widthParent - width)/2;
if ( direction & wxVERTICAL )
- new_y = (heightParent - height)/2;
+ yNew = (heightParent - height)/2;
+
+ // controls are always centered on their parent because it doesn't make
+ // sense to centre them on the screen
+ if ( !(direction & wxCENTRE_ON_SCREEN) || wxDynamicCast(this, wxControl) )
+ {
+ // theo nly chance to get this is to have a wxControl without parent
+ wxCHECK_RET( parent, _T("a control must have a parent") );
+
+ // adjust to the parents client area origin
+ wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0));
+
+ xNew += posParent.x;
+ yNew += posParent.y;
+ }
- Move(new_x, new_y);
+ Move(xNew, yNew);
}
// fits the window around the children
int maxX = 0,
maxY = 0;
- wxWindowList::Node *node = GetChildren().GetFirst();
- while ( node )
+ for ( wxWindowList::Node *node = GetChildren().GetFirst();
+ node;
+ node = node->GetNext() )
{
wxWindow *win = node->GetData();
if ( win->IsTopLevel() )
maxX = wx + ww;
if ( wy + wh > maxY )
maxY = wy + wh;
-
- node = node->GetNext();
}
// leave a margin
// don't try to set invalid cursor, always fall back to the default
const wxCursor& cursorOk = cursor.Ok() ? cursor : *wxSTANDARD_CURSOR;
- if ( cursorOk == m_cursor )
+ if ( (wxCursor&)cursorOk == m_cursor )
{
// no change
return FALSE;
// don't try to set invalid font, always fall back to the default
const wxFont& fontOk = font.Ok() ? font : *wxSWISS_FONT;
- if ( fontOk == m_font )
+ if ( (wxFont&)fontOk == m_font )
{
// no change
return FALSE;
if ( m_caret )
{
wxASSERT_MSG( m_caret->GetWindow() == this,
- "caret should be created associated to this window" );
+ _T("caret should be created associated to this window") );
}
}
#endif // wxUSE_CARET
{
int charWidth = GetCharWidth();
int charHeight = GetCharHeight();
- wxPoint pt2;
- pt2.x = (int) ((pt.x * 4) / charWidth) ;
- pt2.y = (int) ((pt.y * 8) / charHeight) ;
+ wxPoint pt2(-1, -1);
+ if (pt.x != -1)
+ pt2.x = (int) ((pt.x * 4) / charWidth) ;
+ if (pt.y != -1)
+ pt2.y = (int) ((pt.y * 8) / charHeight) ;
return pt2;
}
{
int charWidth = GetCharWidth();
int charHeight = GetCharHeight();
- wxPoint pt2;
- pt2.x = (int) ((pt.x * charWidth) / 4) ;
- pt2.y = (int) ((pt.y * charHeight) / 8) ;
+ wxPoint pt2(-1, -1);
+ if (pt.x != -1)
+ pt2.x = (int) ((pt.x * charWidth) / 4) ;
+ if (pt.y != -1)
+ pt2.y = (int) ((pt.y * charHeight) / 8) ;
return pt2;
}
+// ----------------------------------------------------------------------------
+// client data
+// ----------------------------------------------------------------------------
+
+void wxWindowBase::DoSetClientObject( wxClientData *data )
+{
+ wxASSERT_MSG( m_clientDataType != ClientData_Void,
+ _T("can't have both object and void client data") );
+
+ if ( m_clientObject )
+ delete m_clientObject;
+
+ m_clientObject = data;
+ m_clientDataType = ClientData_Object;
+}
+
+wxClientData *wxWindowBase::DoGetClientObject() const
+{
+ wxASSERT_MSG( m_clientDataType == ClientData_Object,
+ _T("this window doesn't have object client data") );
+
+ return m_clientObject;
+}
+
+void wxWindowBase::DoSetClientData( void *data )
+{
+ wxASSERT_MSG( m_clientDataType != ClientData_Object,
+ _T("can't have both object and void client data") );
+
+ m_clientData = data;
+ m_clientDataType = ClientData_Void;
+}
+
+void *wxWindowBase::DoGetClientData() const
+{
+ wxASSERT_MSG( m_clientDataType == ClientData_Void,
+ _T("this window doesn't have void client data") );
+
+ return m_clientData;
+}
+
// ----------------------------------------------------------------------------
// event handlers
// ----------------------------------------------------------------------------