X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/45fcbf3b7a7c9cfd96e67278e4eaa12e8e015651..cc164686f3dc689732395f11210c5bb9a76b6ff2:/src/os2/control.cpp diff --git a/src/os2/control.cpp b/src/os2/control.cpp index 9d80a1c83b..a7d56cb07d 100644 --- a/src/os2/control.cpp +++ b/src/os2/control.cpp @@ -20,71 +20,165 @@ #include "wx/event.h" #include "wx/app.h" #include "wx/dcclient.h" +#include "wx/scrolwin.h" #endif - +#include "wx/os2/private.h" #include "wx/control.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow) BEGIN_EVENT_TABLE(wxControl, wxWindow) EVT_ERASE_BACKGROUND(wxControl::OnEraseBackground) END_EVENT_TABLE() -#endif // 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 bRval = wxWindow::Create( pParent + ,vId + ,rPos + ,rSize + ,lStyle + ,rsName + ); + if (bRval) + { +#if wxUSE_VALIDATORS + SetValidator(rValidator); +#endif + } + return bRval; +} // end of wxControl::Create wxControl::~wxControl() { m_isBeingDeleted = TRUE; } -bool wxControl::OS2CreateControl(const wxChar *classname, WXDWORD style) +bool wxControl::OS2CreateControl( + const wxChar* zClassname +, const wxString& rsLabel +, const wxPoint& rPos +, const wxSize& rSize +, long lStyle +) { - m_hWnd = (WXHWND)::CreateWindowEx - ( - GetExStyle(style), // extended style - classname, // the kind of control to create - NULL, // the window name - style, // the window style - 0, 0, 0, 0, // the window position and size - GetHwndOf(GetParent()), // parent - (HMENU)GetId(), // child id - wxGetInstance(), // app instance - NULL // creation parameters - ); + 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 bWant3D = FALSE; + int nX = rPos.x == -1 ? 0 : rPos.x; + int nY = rPos.y == -1 ? 0 : rPos.y; + int nW = rSize.x == -1 ? 0 : rSize.x; + int nH = rSize.y == -1 ? 0 : rSize.y; + // + // Doesn't do anything at all under OS/2 + // + if (dwExstyle == (WXDWORD)-1) + { + dwExstyle = Determine3DEffects(WS_EX_CLIENTEDGE, &bWant3D); + } + // + // All controls should have these styles (wxWindows creates all controls + // visible by default) + // + dwStyle |= WS_VISIBLE; + + wxWindow* pParent = GetParent(); + PSZ zClass; + + if (!pParent) + return FALSE; + + if ((strcmp(zClassname, "COMBOBOX")) == 0) + zClass = WC_COMBOBOX; + else if ((strcmp(zClassname, "STATIC")) == 0) + zClass = WC_STATIC; + else if ((strcmp(zClassname, "BUTTON")) == 0) + zClass = WC_BUTTON; + dwStyle |= WS_VISIBLE; + + m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle + ,(PSZ)zClass // Window class + ,(PSZ)rsLabel.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 ) { #ifdef __WXDEBUG__ - wxLogError(_T("Failed to create a control of class '%s'"), classname); + wxLogError(wxT("Failed to create a control of class '%s'"), zClassname); #endif // DEBUG return FALSE; } - - // subclass again for purposes of dialog editing mode + // + // 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 font and colours as their parent dialog by default + // InheritAttributes(); - + SetXComp(0); + SetYComp(0); + if (nW == 0 || nH == 0) + SetBestSize(rSize); return TRUE; -} +} // end of wxControl::OS2CreateControl -wxSize wxControl::DoGetBestSize() +wxSize wxControl::DoGetBestSize() const { return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT); -} +} // end of wxControl::DoGetBestSize bool wxControl::ProcessCommand(wxCommandEvent& event) { @@ -101,89 +195,61 @@ bool wxControl::ProcessCommand(wxCommandEvent& event) return GetEventHandler()->ProcessEvent(event); } -bool wxControl::OS2OnNotify(int idCtrl, - WXLPARAM lParam, - WXLPARAM* result) +WXHBRUSH wxControl::OnCtlColor( + WXHDC hWxDC +, WXHWND hWnd +, WXUINT uCtlColor +, WXUINT uMessage +, WXWPARAM wParam +, WXLPARAM lParam +) { - wxCommandEvent event(wxEVT_NULL, m_windowId); - wxEventType eventType = wxEVT_NULL; - NMHDR *hdr1 = (NMHDR*) lParam; - switch ( hdr1->code ) - { - case NM_CLICK: - eventType = wxEVT_COMMAND_LEFT_CLICK; - break; - - case NM_DBLCLK: - eventType = wxEVT_COMMAND_LEFT_DCLICK; - break; - - case NM_RCLICK: - eventType = wxEVT_COMMAND_RIGHT_CLICK; - break; - - case NM_RDBLCLK: - eventType = wxEVT_COMMAND_RIGHT_DCLICK; - break; - - case NM_SETFOCUS: - eventType = wxEVT_COMMAND_SET_FOCUS; - break; + HPS hPS = (HPS)hWxDC; // pass in a PS handle in OS/2 + wxColour vColFore = GetForegroundColour(); + wxColour vColBack = GetBackgroundColour(); - case NM_KILLFOCUS: - eventType = wxEVT_COMMAND_KILL_FOCUS; - break; - - case NM_RETURN: - eventType = wxEVT_COMMAND_ENTER; - break; + if (GetParent()->GetTransparentBackground()) + ::GpiSetBackMix(hPS, BM_LEAVEALONE); + else + ::GpiSetBackMix(hPS, BM_OVERPAINT); - default: - return wxWindow::OS2OnNotify(idCtrl, lParam, result); - } + ::GpiSetBackColor(hPS, vColBack.GetPixel()); + ::GpiSetColor(hPS, vColFore.GetPixel()); - event.SetEventType(eventType); - event.SetEventObject(this); + wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack + ,wxSOLID + ); + return (WXHBRUSH)pBrush->GetResourceHandle(); +} // end of wxControl::OnCtlColor - return GetEventHandler()->ProcessEvent(event); -} - -void wxControl::OnEraseBackground(wxEraseEvent& event) +void wxControl::OnEraseBackground( + wxEraseEvent& rEvent +) { - // In general, you don't want to erase the background of a control, - // or you'll get a flicker. - // TODO: move this 'null' function into each control that - // might flicker. - - RECT rect; -/* -* below is msw code. -* TODO: convert to PM Code -* ::GetClientRect((HWND) GetHWND(), &rect); -* -* HBRUSH hBrush = ::CreateSolidBrush(PALETTERGB(GetBackgroundColour().Red(), -* GetBackgroundColour().Green(), -* GetBackgroundColour().Blue())); -* int mode = ::SetMapMode((HDC) event.GetDC()->GetHDC(), MM_TEXT); -* -* ::FillRect ((HDC) event.GetDC()->GetHDC(), &rect, hBrush); -* ::DeleteObject(hBrush); -* ::SetMapMode((HDC) event.GetDC()->GetHDC(), mode); -*/ -} - -WXDWORD wxControl::GetExStyle(WXDWORD& style) const + RECTL vRect; + HPS hPS = rEvent.GetDC()->GetHPS(); + SIZEL vSize = {0,0}; + + ::GpiSetPS(hPS, &vSize, PU_PELS | GPIF_DEFAULT); + ::WinQueryWindowRect((HWND)GetHwnd(), &vRect); + ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel()); +} // end of wxControl::OnEraseBackground + +WXDWORD wxControl::OS2GetStyle( + long lStyle +, WXDWORD* pdwExstyle +) const { - bool want3D; - WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D) ; + long dwStyle = wxWindow::OS2GetStyle( lStyle + ,pdwExstyle + ); - // Even with extended styles, need to combine with WS_BORDER - // for them to look right. - if ( want3D || wxStyleHasBorder(m_windowStyle) ) - style |= WS_BORDER; - - return exStyle; -} + if (AcceptsFocus()) + { + dwStyle |= WS_TABSTOP; + } + return dwStyle; +} // end of wxControl::OS2GetStyle // --------------------------------------------------------------------------- // global functions @@ -194,28 +260,32 @@ WXDWORD wxControl::GetExStyle(WXDWORD& style) const // Call it initially with -1 for all values in rect. // Keep calling for other widgets, and rect will be modified // to calculate largest bounding rectangle. -void wxFindMaxSize(WXHWND wnd, RECT *rect) +void wxFindMaxSize( + WXHWND hWnd +, RECT* pRect +) { - int left = rect->left; - int right = rect->right; - int top = rect->top; - int bottom = rect->bottom; + int nLeft = pRect->xLeft; + int nRight = pRect->xRight; + int nTop = pRect->yTop; + int nBottom = pRect->yBottom; - GetWindowRect((HWND) wnd, rect); + ::WinQueryWindowRect((HWND)hWnd, pRect); - if (left < 0) + if (nLeft < 0) return; - if (left < rect->left) - rect->left = left; + if (nLeft < pRect->xLeft) + pRect->xLeft = nLeft; - if (right > rect->right) - rect->right = right; + if (nRight > pRect->xRight) + pRect->xRight = nRight; - if (top < rect->top) - rect->top = top; + if (nTop < pRect->yTop) + pRect->yTop = nTop; + + if (nBottom > pRect->yBottom) + pRect->yBottom = nBottom; +} // end of wxFindMaxSize - if (bottom > rect->bottom) - rect->bottom = bottom; -}