text: /////////////////////////////////////////////////////////////////////////////
  // Name:        src/common/ctrlcmn.cpp
  // Purpose:     wxControl common interface
  // Author:      Vadim Zeitlin
  // Modified by:
  // Created:     26.07.99
  // RCS-ID:      $Id: ctrlcmn.cpp 40329 2006-07-25 18:40:04Z VZ $
  // Copyright:   (c) wxWidgets team
  // Licence:     wxWindows licence
  /////////////////////////////////////////////////////////////////////////////
  
  // ============================================================================
  // declarations
  // ============================================================================
  
  // ----------------------------------------------------------------------------
  // headers
  // ----------------------------------------------------------------------------
  
  // For compilers that support precompilation, includes "wx.h".
  #include "wx/wxprec.h"
  
  #ifdef __BORLANDC__
      #pragma hdrstop
  #endif
  
  #if wxUSE_CONTROLS
  
  #include "wx/control.h"
  
  #ifndef WX_PRECOMP
      #include "wx/log.h"
      #include "wx/radiobut.h"
      #include "wx/statbmp.h"
      #include "wx/bitmap.h"
      #include "wx/utils.h"       // for wxStripMenuCodes()
  #endif
  
  const wxChar wxControlNameStr[] = wxT("control");
  
  // ============================================================================
  // implementation
  // ============================================================================
  
  wxControlBase::~wxControlBase()
  {
      // this destructor is required for Darwin
  }
  
  bool wxControlBase::Create(wxWindow *parent,
                             wxWindowID id,
                             const wxPoint &pos,
                             const wxSize &size,
                             long style,
                             const wxValidator& wxVALIDATOR_PARAM(validator),
                             const wxString &name)
  {
      bool ret = wxWindow::Create(parent, id, pos, size, style, name);
  
  #if wxUSE_VALIDATORS
      if ( ret )
          SetValidator(validator);
  #endif // wxUSE_VALIDATORS
  
      return ret;
  }
  
  bool wxControlBase::CreateControl(wxWindowBase *parent,
                                    wxWindowID id,
                                    const wxPoint& pos,
                                    const wxSize& size,
                                    long style,
                                    const wxValidator& validator,
                                    const wxString& name)
  {
      // even if it's possible to create controls without parents in some port,
      // it should surely be discouraged because it doesn't work at all under
      // Windows
      wxCHECK_MSG( parent, false, wxT("all controls must have parents") );
  
      if ( !CreateBase(parent, id, pos, size, style, validator, name) )
          return false;
  
      parent->AddChild(this);
  
      return true;
  }
  
  /* static */
  wxString wxControlBase::GetLabelText(const wxString& label)
  {
      // we don't want strip the TABs here, just the mnemonics
      return wxStripMenuCodes(label, wxStrip_Mnemonics);
  }
  
  void wxControlBase::Command(wxCommandEvent& event)
  {
      (void)GetEventHandler()->ProcessEvent(event);
  }
  
  void wxControlBase::InitCommandEvent(wxCommandEvent& event) const
  {
      event.SetEventObject((wxControlBase *)this);    // const_cast
  
      // event.SetId(GetId()); -- this is usuall done in the event ctor
  
      switch ( m_clientDataType )
      {
          case wxClientData_Void:
              event.SetClientData(GetClientData());
              break;
  
          case wxClientData_Object:
              event.SetClientObject(GetClientObject());
              break;
  
          case wxClientData_None:
              // nothing to do
              ;
      }
  }
  
  
  void wxControlBase::SetLabel( const wxString &label )
  {
      InvalidateBestSize();
      wxWindow::SetLabel(label);
  }
  
  bool wxControlBase::SetFont(const wxFont& font)
  {
      InvalidateBestSize();
      return wxWindow::SetFont(font);
  }
  
  // wxControl-specific processing after processing the update event
  void wxControlBase::DoUpdateWindowUI(wxUpdateUIEvent& event)
  {
      // call inherited
      wxWindowBase::DoUpdateWindowUI(event);
  
      // update label
      if ( event.GetSetText() )
      {
          if ( event.GetText() != GetLabel() )
              SetLabel(event.GetText());
      }
  
      // Unfortunately we don't yet have common base class for
      // wxRadioButton, so we handle updates of radiobuttons here.
      // TODO: If once wxRadioButtonBase will exist, move this code there.
  #if wxUSE_RADIOBTN
      if ( event.GetSetChecked() )
      {
          wxRadioButton *radiobtn = wxDynamicCastThis(wxRadioButton);
          if ( radiobtn )
              radiobtn->SetValue(event.GetChecked());
      }
  #endif // wxUSE_RADIOBTN
  }
  
  // ----------------------------------------------------------------------------
  // wxStaticBitmap
  // ----------------------------------------------------------------------------
  
  #if wxUSE_STATBMP
  
  wxStaticBitmapBase::~wxStaticBitmapBase()
  {
      // this destructor is required for Darwin
  }
  
  wxSize wxStaticBitmapBase::DoGetBestSize() const
  {
      wxSize best;
      wxBitmap bmp = GetBitmap();
      if ( bmp.Ok() )
          best = wxSize(bmp.GetWidth(), bmp.GetHeight());
      else
          // this is completely arbitrary
          best = wxSize(16, 16);
      CacheBestSize(best);
      return best;
  }
  
  #endif // wxUSE_STATBMP
  
  #endif // wxUSE_CONTROLS
  