X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0cf6acbf261c5d47f97d280700b1203f3d8d8047..fb8d7eb7a880f1f2e32d8830f9c5e12b2536e05f:/src/os2/control.cpp?ds=sidebyside diff --git a/src/os2/control.cpp b/src/os2/control.cpp index 592ea3f48e..4b4ecbb55c 100644 --- a/src/os2/control.cpp +++ b/src/os2/control.cpp @@ -1,28 +1,29 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: control.cpp +// Name: src/os2/control.cpp // Purpose: wxControl class // Author: David Webster // Modified by: // Created: 09/17/99 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "control.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#include "wx/control.h" + #ifndef WX_PRECOMP -#include "wx/event.h" -#include "wx/app.h" -#include "wx/dcclient.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/dcclient.h" + #include "wx/scrolwin.h" + #include "wx/log.h" #endif + +#include "wx/os2/dc.h" #include "wx/os2/private.h" -#include "wx/control.h" IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow) @@ -33,25 +34,15 @@ END_EVENT_TABLE() // Item members wxControl::wxControl() { - m_backgroundColour = *wxWHITE; - m_foregroundColour = *wxBLACK; - -#if WXWIN_COMPATIBILITY - m_callback = 0; -#endif // WXWIN_COMPATIBILITY } // end of wxControl::wxControl -bool wxControl::Create( - wxWindow* pParent -, wxWindowID vId -, const wxPoint& rPos -, const wxSize& rSize -, long lStyle -#if wxUSE_VALIDATORS -, const wxValidator& rValidator -#endif -, const wxString& rsName -) +bool wxControl::Create( wxWindow* pParent, + wxWindowID vId, + const wxPoint& rPos, + const wxSize& rSize, + long lStyle, + const wxValidator& rValidator, + const wxString& rsName ) { bool bRval = wxWindow::Create( pParent ,vId @@ -69,99 +60,115 @@ bool wxControl::Create( return bRval; } // end of wxControl::Create -wxControl::~wxControl() +bool wxControl::OS2CreateControl( const wxChar* zClassname, + const wxString& rsLabel, + const wxPoint& rPos, + const wxSize& rSize, + long lStyle ) { - m_isBeingDeleted = TRUE; -} - -bool wxControl::OS2CreateControl( - wxWindow* pParent -, wxWindowID vId -, const wxPoint& rPos -, const wxSize& rSize -, long lStyle -#if wxUSE_VALIDATORS -, const wxValidator& rValidator -#endif -, const wxString& rsName -) -{ - // - // 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 - // - if (!CreateBase( pParent - ,vId - ,rPos - ,rSize - ,lStyle -#if wxUSE_VALIDATORS - ,rValidator -#endif - ,rsName - )) - return FALSE; - pParent->AddChild(this); - return TRUE; + WXDWORD dwExstyle; + WXDWORD dwStyle = OS2GetStyle( lStyle, &dwExstyle ); + + return OS2CreateControl( zClassname + ,dwStyle + ,rPos + ,rSize + ,rsLabel + ,dwExstyle + ); } // end of wxControl::OS2CreateControl -bool wxControl::OS2CreateControl( - const wxChar* zClassname -, WXDWORD dwStyle -, const wxPoint& rPos -, const wxSize& rSize -, const wxString& rsLabel -, WXDWORD dwExstyle -) +bool wxControl::OS2CreateControl( const wxChar* zClassname, + WXDWORD dwStyle, + const wxPoint& rPos, + const wxSize& rSize, + const wxString& rsLabel, + WXDWORD dwExstyle ) { // // Doesn't do anything at all under OS/2 // if (dwExstyle == (WXDWORD)-1) { - dwExstyle = GetExStyle(dwStyle); + dwExstyle = 0; + (void) OS2GetStyle(GetWindowStyle(), &dwExstyle); } + // + // All controls should have these styles (wxWidgets creates all controls + // visible by default) + // + if (m_isShown ) + dwStyle |= WS_VISIBLE; - if ( !m_hWnd ) - { -#ifdef __WXDEBUG__ - wxLogError(wxT("Failed to create a control of class '%s'"), zClassname); -#endif // DEBUG - - return FALSE; - } + wxWindow* pParent = GetParent(); + PSZ zClass = ""; - PSZ zClass; + if (!pParent) + return false; - if ((strcmp(zClassname, "COMBOBOX")) == 0) + if ((wxStrcmp(zClassname, wxT("COMBOBOX"))) == 0) zClass = WC_COMBOBOX; - dwStyle |= WS_VISIBLE; - m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(GetParent()) // Parent window handle - ,(PSZ)zClassname // Window class - ,(PSZ)rsLabel.c_str() // Initial Text - ,(ULONG)dwStyle // Style flags - ,(LONG)rPos.x // X pos of origin - ,(LONG)rPos.y // Y pos of origin - ,(LONG)rSize.x // control width - ,(LONG)rSize.y // control height - ,(HWND)GetHwndOf(GetParent()) // owner window handle (same as parent - ,HWND_TOP // initial z position - ,(ULONG)GetId() // Window identifier - ,NULL // no control data - ,NULL // no Presentation parameters + else if ((wxStrcmp(zClassname, wxT("STATIC"))) == 0) + zClass = WC_STATIC; + else if ((wxStrcmp(zClassname, wxT("BUTTON"))) == 0) + zClass = WC_BUTTON; + else if ((wxStrcmp(zClassname, wxT("NOTEBOOK"))) == 0) + zClass = WC_NOTEBOOK; + else if ((wxStrcmp(zClassname, wxT("CONTAINER"))) == 0) + zClass = WC_CONTAINER; + if ((zClass == WC_STATIC) || (zClass == WC_BUTTON)) + dwStyle |= DT_MNEMONIC; + + m_dwStyle = dwStyle; + m_label = rsLabel; + wxString label; + if (dwStyle & DT_MNEMONIC) + label = ::wxPMTextToLabel(m_label); + else + label = m_label; + + // clipping siblings does not yet work + dwStyle &= ~WS_CLIPSIBLINGS; + + m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle + ,zClass // Window class + ,label.c_str() // Initial Text + ,(ULONG)dwStyle // Style flags + ,(LONG)0 // X pos of origin + ,(LONG)0 // Y pos of origin + ,(LONG)0 // control width + ,(LONG)0 // control height + ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent + ,HWND_TOP // initial z position + ,(ULONG)GetId() // Window identifier + ,NULL // no control data + ,NULL // no Presentation parameters ); + if ( !m_hWnd ) + { + wxLogError(wxT("Failed to create a control of class '%s'"), zClassname); + + return false; + } // // Subclass again for purposes of dialog editing mode // SubclassWin(m_hWnd); // - // Controls use the same font and colours as their parent dialog by default + // Controls use the same colours as their parent dialog by default // InheritAttributes(); - return TRUE; + // + // All OS/2 ctrls use the small font + // + SetFont(*wxSMALL_FONT); + + SetXComp(0); + SetYComp(0); + SetSize( rPos.x, rPos.y, rSize.x, rSize.y ); + return true; } // end of wxControl::OS2CreateControl wxSize wxControl::DoGetBestSize() const @@ -171,31 +178,19 @@ wxSize wxControl::DoGetBestSize() const bool wxControl::ProcessCommand(wxCommandEvent& event) { -#if WXWIN_COMPATIBILITY - if ( m_callback ) - { - (void)(*m_callback)(this, event); - - return TRUE; - } - else -#endif // WXWIN_COMPATIBILITY - - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } -WXHBRUSH wxControl::OnCtlColor( - WXHDC hWxDC -, WXHWND hWnd -, WXUINT uCtlColor -, WXUINT uMessage -, WXWPARAM wParam -, WXLPARAM lParam -) +WXHBRUSH wxControl::OnCtlColor(WXHDC hWxDC, + WXHWND WXUNUSED(hWnd), + WXUINT WXUNUSED(uCtlColor), + WXUINT WXUNUSED(uMessage), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam)) { - HPS hPS = (HPS)hWxDC; // pass in a PS handle in OS/2 - wxColour vColFore = GetForegroundColour(); - wxColour vColBack = GetBackgroundColour(); + HPS hPS = (HPS)hWxDC; // pass in a PS handle in OS/2 + wxColour vColFore = GetForegroundColour(); + wxColour vColBack = GetBackgroundColour(); if (GetParent()->GetTransparentBackground()) ::GpiSetBackMix(hPS, BM_LEAVEALONE); @@ -205,18 +200,17 @@ WXHBRUSH wxControl::OnCtlColor( ::GpiSetBackColor(hPS, vColBack.GetPixel()); ::GpiSetColor(hPS, vColFore.GetPixel()); - wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack - ,wxSOLID - ); + wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack + ,wxSOLID + ); return (WXHBRUSH)pBrush->GetResourceHandle(); } // end of wxControl::OnCtlColor -void wxControl::OnEraseBackground( - wxEraseEvent& rEvent -) +void wxControl::OnEraseBackground( wxEraseEvent& rEvent ) { RECTL vRect; - HPS hPS = rEvent.GetDC()->GetHPS(); + wxPMDCImpl *impl = (wxPMDCImpl*) rEvent.GetDC()->GetImpl(); + HPS hPS = impl->GetHPS(); SIZEL vSize = {0,0}; ::GpiSetPS(hPS, &vSize, PU_PELS | GPIF_DEFAULT); @@ -224,17 +218,30 @@ void wxControl::OnEraseBackground( ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel()); } // end of wxControl::OnEraseBackground -WXDWORD wxControl::GetExStyle( - WXDWORD& rStyle -) const +WXDWORD wxControl::OS2GetStyle( long lStyle, WXDWORD* pdwExstyle ) const { - // - // Meaningless under OS/2, just return what was sent - // - WXDWORD exStyle = rStyle; + long dwStyle = wxWindow::OS2GetStyle( lStyle, pdwExstyle ); - return exStyle; -} // end of wxControl::GetExStyle + if (AcceptsFocusFromKeyboard()) + { + dwStyle |= WS_TABSTOP; + } + return dwStyle; +} // end of wxControl::OS2GetStyle + +void wxControl::SetLabel( const wxString& rsLabel ) +{ + if(rsLabel != m_label) + { + m_label = rsLabel; + wxString label; + if (m_dwStyle & DT_MNEMONIC) + label = ::wxPMTextToLabel(m_label); + else + label = m_label; + ::WinSetWindowText(GetHwnd(), label.c_str()); + } +} // end of wxControl::SetLabel // --------------------------------------------------------------------------- // global functions @@ -266,11 +273,9 @@ void wxFindMaxSize( if (nRight > pRect->xRight) pRect->xRight = nRight; - if (nTop < pRect->yTop) + if (nTop > pRect->yTop) pRect->yTop = nTop; - if (nBottom > pRect->yBottom) + if (nBottom < pRect->yBottom) pRect->yBottom = nBottom; } // end of wxFindMaxSize - -