]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/control.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/control.cpp 
   3 // Purpose:     wxControl class 
   4 // Author:      David Webster 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  15 #include "wx/control.h" 
  20     #include "wx/dcclient.h" 
  21     #include "wx/scrolwin.h" 
  25 #include "wx/os2/private.h" 
  27 IMPLEMENT_ABSTRACT_CLASS(wxControl
, wxWindow
) 
  29 BEGIN_EVENT_TABLE(wxControl
, wxWindow
) 
  30     EVT_ERASE_BACKGROUND(wxControl::OnEraseBackground
) 
  34 wxControl::wxControl() 
  36 } // end of wxControl::wxControl 
  38 bool wxControl::Create( wxWindow
*           pParent
, 
  43                         const wxValidator
&  rValidator
, 
  44                         const wxString
&     rsName 
) 
  46     bool                            bRval 
= wxWindow::Create( pParent
 
  56         SetValidator(rValidator
); 
  60 } // end of wxControl::Create 
  62 wxControl::~wxControl() 
  64     m_isBeingDeleted 
= true; 
  67 bool wxControl::OS2CreateControl( const wxChar
* zClassname
, 
  68                                   const wxString
& rsLabel
, 
  74     WXDWORD dwStyle 
= OS2GetStyle( lStyle
, &dwExstyle 
); 
  76     return OS2CreateControl( zClassname
 
  83 } // end of wxControl::OS2CreateControl 
  85 bool wxControl::OS2CreateControl( const wxChar
*   zClassname
, 
  89                                   const wxString
& rsLabel
, 
  93     // Doesn't do anything at all under OS/2 
  95     if (dwExstyle 
== (WXDWORD
)-1) 
  98         (void) OS2GetStyle(GetWindowStyle(), &dwExstyle
); 
 101     // All controls should have these styles (wxWidgets creates all controls 
 102     // visible by default) 
 105         dwStyle 
|= WS_VISIBLE
; 
 107     wxWindow
* pParent 
= GetParent(); 
 113     if ((wxStrcmp(zClassname
, _T("COMBOBOX"))) == 0) 
 114         zClass 
= WC_COMBOBOX
; 
 115     else if ((wxStrcmp(zClassname
, _T("STATIC"))) == 0) 
 117     else if ((wxStrcmp(zClassname
, _T("BUTTON"))) == 0) 
 119     else if ((wxStrcmp(zClassname
, _T("NOTEBOOK"))) == 0) 
 120         zClass 
= WC_NOTEBOOK
; 
 121     else if ((wxStrcmp(zClassname
, _T("CONTAINER"))) == 0) 
 122         zClass 
= WC_CONTAINER
; 
 123     if ((zClass 
== WC_STATIC
) || (zClass 
== WC_BUTTON
)) 
 124         dwStyle 
|= DT_MNEMONIC
; 
 129     if (dwStyle 
& DT_MNEMONIC
) 
 130         label 
= ::wxPMTextToLabel(m_label
); 
 134     // clipping siblings does not yet work 
 135     dwStyle 
&= ~WS_CLIPSIBLINGS
; 
 137     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)GetHwndOf(pParent
) // Parent window handle 
 138                                        ,zClass              
// Window class 
 139                                        ,label
.c_str()       // Initial Text 
 140                                        ,(ULONG
)dwStyle           
// Style flags 
 141                                        ,(LONG
)0                  // X pos of origin 
 142                                        ,(LONG
)0                  // Y pos of origin 
 143                                        ,(LONG
)0                  // control width 
 144                                        ,(LONG
)0                  // control height 
 145                                        ,(HWND
)GetHwndOf(pParent
) // owner window handle (same as parent 
 146                                        ,HWND_TOP                 
// initial z position 
 147                                        ,(ULONG
)GetId()           // Window identifier 
 148                                        ,NULL                     
// no control data 
 149                                        ,NULL                     
// no Presentation parameters 
 155         wxLogError(wxT("Failed to create a control of class '%s'"), zClassname
); 
 161     // Subclass again for purposes of dialog editing mode 
 166     // Controls use the same colours as their parent dialog by default 
 170     // All OS/2 ctrls use the small font 
 172     SetFont(*wxSMALL_FONT
); 
 176     SetSize( rPos
.x
, rPos
.y
, rSize
.x
, rSize
.y 
); 
 178 } // end of wxControl::OS2CreateControl 
 180 wxSize 
wxControl::DoGetBestSize() const 
 182     return wxSize(DEFAULT_ITEM_WIDTH
, DEFAULT_ITEM_HEIGHT
); 
 183 } // end of wxControl::DoGetBestSize 
 185 bool wxControl::ProcessCommand(wxCommandEvent
& event
) 
 187     return GetEventHandler()->ProcessEvent(event
); 
 190 WXHBRUSH 
wxControl::OnCtlColor(WXHDC    hWxDC
, 
 191                                WXHWND   
WXUNUSED(hWnd
), 
 192                                WXUINT   
WXUNUSED(uCtlColor
), 
 193                                WXUINT   
WXUNUSED(uMessage
), 
 194                                WXWPARAM 
WXUNUSED(wParam
), 
 195                                WXLPARAM 
WXUNUSED(lParam
)) 
 197     HPS      hPS 
= (HPS
)hWxDC
; // pass in a PS handle in OS/2 
 198     wxColour vColFore 
= GetForegroundColour(); 
 199     wxColour vColBack 
= GetBackgroundColour(); 
 201     if (GetParent()->GetTransparentBackground()) 
 202         ::GpiSetBackMix(hPS
, BM_LEAVEALONE
); 
 204         ::GpiSetBackMix(hPS
, BM_OVERPAINT
); 
 206     ::GpiSetBackColor(hPS
, vColBack
.GetPixel()); 
 207     ::GpiSetColor(hPS
, vColFore
.GetPixel()); 
 209     wxBrush
* pBrush 
= wxTheBrushList
->FindOrCreateBrush( vColBack
 
 212     return (WXHBRUSH
)pBrush
->GetResourceHandle(); 
 213 } // end of wxControl::OnCtlColor 
 215 void wxControl::OnEraseBackground( wxEraseEvent
& rEvent 
) 
 218     HPS                             hPS 
= rEvent
.GetDC()->GetHPS(); 
 221     ::GpiSetPS(hPS
, &vSize
, PU_PELS 
| GPIF_DEFAULT
); 
 222     ::WinQueryWindowRect((HWND
)GetHwnd(), &vRect
); 
 223     ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel()); 
 224 } // end of wxControl::OnEraseBackground 
 226 WXDWORD 
wxControl::OS2GetStyle( long lStyle
, WXDWORD
* pdwExstyle 
) const 
 228     long dwStyle 
= wxWindow::OS2GetStyle( lStyle
, pdwExstyle 
); 
 230     if (AcceptsFocusFromKeyboard()) 
 232         dwStyle 
|= WS_TABSTOP
; 
 235 } // end of wxControl::OS2GetStyle 
 237 void wxControl::SetLabel( const wxString
& rsLabel 
) 
 239     if(rsLabel 
!= m_label
) 
 243         if (m_dwStyle 
& DT_MNEMONIC
) 
 244             label 
= ::wxPMTextToLabel(m_label
); 
 247         ::WinSetWindowText(GetHwnd(), label
.c_str()); 
 249 } // end of wxControl::SetLabel 
 251 // --------------------------------------------------------------------------- 
 253 // --------------------------------------------------------------------------- 
 255 // Call this repeatedly for several wnds to find the overall size 
 257 // Call it initially with -1 for all values in rect. 
 258 // Keep calling for other widgets, and rect will be modified 
 259 // to calculate largest bounding rectangle. 
 265     int                             nLeft 
= pRect
->xLeft
; 
 266     int                             nRight 
= pRect
->xRight
; 
 267     int                             nTop 
= pRect
->yTop
; 
 268     int                             nBottom 
= pRect
->yBottom
; 
 270     ::WinQueryWindowRect((HWND
)hWnd
, pRect
); 
 275     if (nLeft 
< pRect
->xLeft
) 
 276         pRect
->xLeft 
= nLeft
; 
 278     if (nRight 
> pRect
->xRight
) 
 279         pRect
->xRight 
= nRight
; 
 281     if (nTop 
> pRect
->yTop
) 
 284     if (nBottom 
< pRect
->yBottom
) 
 285         pRect
->yBottom 
= nBottom
; 
 286 } // end of wxFindMaxSize