X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3d62dcb6b571cdcc0748f1f91223713755f54abc..3d9b52a80816bc8f59461657bb6a6f7ea858836c:/src/os2/control.cpp diff --git a/src/os2/control.cpp b/src/os2/control.cpp index ada5a5e055..63650453c8 100644 --- a/src/os2/control.cpp +++ b/src/os2/control.cpp @@ -1,28 +1,28 @@ ///////////////////////////////////////////////////////////////////////////// -// 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/private.h" -#include "wx/control.h" IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow) @@ -33,205 +33,220 @@ END_EVENT_TABLE() // Item members wxControl::wxControl() { - m_backgroundColour = *wxWHITE; - m_foregroundColour = *wxBLACK; - -#if WXWIN_COMPATIBILITY - m_callback = 0; -#endif // WXWIN_COMPATIBILITY -} - -bool wxControl::Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos, - const wxSize& size, long style, -#if wxUSE_VALIDATORS - const wxValidator& validator, -#endif - const wxString& name) +} // end of wxControl::wxControl + +bool wxControl::Create( wxWindow* pParent, + wxWindowID vId, + const wxPoint& rPos, + const wxSize& rSize, + long lStyle, + const wxValidator& rValidator, + const wxString& rsName ) { - bool rval = wxWindow::Create(parent, id, pos, size, style, name); - if (rval) { + bool bRval = wxWindow::Create( pParent + ,vId + ,rPos + ,rSize + ,lStyle + ,rsName + ); + if (bRval) + { #if wxUSE_VALIDATORS - SetValidator(validator); + SetValidator(rValidator); #endif } - return rval; -} + return bRval; +} // end of wxControl::Create wxControl::~wxControl() { - m_isBeingDeleted = TRUE; + m_isBeingDeleted = true; } -bool wxControl::OS2CreateControl(const wxChar *classname, - WXDWORD style, - const wxPoint& pos, - const wxSize& size, - const wxString& label, - WXDWORD exstyle) +bool wxControl::OS2CreateControl( const wxChar* zClassname, + const wxString& rsLabel, + const wxPoint& rPos, + const wxSize& rSize, + long lStyle ) { - // VZ: if someone could put a comment here explaining what exactly this is - // needed for, it would be nice... - bool want3D; - - // if no extended style given, determine it ourselves - if ( exstyle == (WXDWORD)-1 ) + 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 ) +{ + // + // Doesn't do anything at all under OS/2 + // + if (dwExstyle == (WXDWORD)-1) { - exstyle = GetExStyle(style); + dwExstyle = 0; + (void) OS2GetStyle(GetWindowStyle(), &dwExstyle); } - -// TODO: -/* - // all controls have these childs (wxWindows creates all controls visible - // by default) - style |= WS_CHILD | WS_VISIBLE; - - m_hWnd = (WXHWND)::CreateWindowEx - ( - exstyle, // extended style - classname, // the kind of control to create - label, // the window name - style, // the window style - pos.x, pos.y, // the window position - size.x, size.y, // and size - GetHwndOf(GetParent()), // parent - (HMENU)GetId(), // child id - wxGetInstance(), // app instance - NULL // creation parameters - ); + // + // All controls should have these styles (wxWidgets creates all controls + // visible by default) + // + if (m_isShown ) + dwStyle |= WS_VISIBLE; + + wxWindow* pParent = GetParent(); + PSZ zClass = ""; + + if (!pParent) + return false; + + if ((wxStrcmp(zClassname, _T("COMBOBOX"))) == 0) + zClass = WC_COMBOBOX; + else if ((wxStrcmp(zClassname, _T("STATIC"))) == 0) + zClass = WC_STATIC; + else if ((wxStrcmp(zClassname, _T("BUTTON"))) == 0) + zClass = WC_BUTTON; + else if ((wxStrcmp(zClassname, _T("NOTEBOOK"))) == 0) + zClass = WC_NOTEBOOK; + else if ((wxStrcmp(zClassname, _T("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 ) { #ifdef __WXDEBUG__ - wxLogError(wxT("Failed to create a control of class '%s'"), classname); + wxLogError(wxT("Failed to create a control of class '%s'"), zClassname); #endif // DEBUG - return FALSE; - } - -#if wxUSE_CTL3D - if ( want3D ) - { - Ctl3dSubclassCtl(GetHwnd()); - m_useCtl3D = TRUE; + return false; } -#endif // wxUSE_CTL3D - - // 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 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 { return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT); -} +} // end of wxControl::DoGetBestSize 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); } -bool wxControl::OS2OnNotify(int idCtrl, - WXLPARAM lParam, - WXLPARAM* result) +WXHBRUSH wxControl::OnCtlColor(WXHDC hWxDC, + WXHWND WXUNUSED(hWnd), + WXUINT WXUNUSED(uCtlColor), + WXUINT WXUNUSED(uMessage), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam)) { - wxCommandEvent event(wxEVT_NULL, m_windowId); - wxEventType eventType = wxEVT_NULL; -/* TODO: - NMHDR *hdr1 = (NMHDR*) lParam; - switch ( hdr1->code ) - { - case NM_CLICK: - eventType = wxEVT_COMMAND_LEFT_CLICK; - break; + HPS hPS = (HPS)hWxDC; // pass in a PS handle in OS/2 + wxColour vColFore = GetForegroundColour(); + wxColour vColBack = GetBackgroundColour(); - case NM_DBLCLK: - eventType = wxEVT_COMMAND_LEFT_DCLICK; - break; + if (GetParent()->GetTransparentBackground()) + ::GpiSetBackMix(hPS, BM_LEAVEALONE); + else + ::GpiSetBackMix(hPS, BM_OVERPAINT); - case NM_RCLICK: - eventType = wxEVT_COMMAND_RIGHT_CLICK; - break; + ::GpiSetBackColor(hPS, vColBack.GetPixel()); + ::GpiSetColor(hPS, vColFore.GetPixel()); - case NM_RDBLCLK: - eventType = wxEVT_COMMAND_RIGHT_DCLICK; - break; + wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack + ,wxSOLID + ); + return (WXHBRUSH)pBrush->GetResourceHandle(); +} // end of wxControl::OnCtlColor - case NM_SETFOCUS: - eventType = wxEVT_COMMAND_SET_FOCUS; - break; +void wxControl::OnEraseBackground( wxEraseEvent& rEvent ) +{ + RECTL vRect; + HPS hPS = rEvent.GetDC()->GetHPS(); + SIZEL vSize = {0,0}; - case NM_KILLFOCUS: - eventType = wxEVT_COMMAND_KILL_FOCUS; - break; + ::GpiSetPS(hPS, &vSize, PU_PELS | GPIF_DEFAULT); + ::WinQueryWindowRect((HWND)GetHwnd(), &vRect); + ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel()); +} // end of wxControl::OnEraseBackground - case NM_RETURN: - eventType = wxEVT_COMMAND_ENTER; - break; +WXDWORD wxControl::OS2GetStyle( long lStyle, WXDWORD* pdwExstyle ) const +{ + long dwStyle = wxWindow::OS2GetStyle( lStyle, pdwExstyle ); - default: - return wxWindow::OS2OnNotify(idCtrl, lParam, result); + if (AcceptsFocusFromKeyboard()) + { + dwStyle |= WS_TABSTOP; } -*/ - event.SetEventType(eventType); - event.SetEventObject(this); - - return GetEventHandler()->ProcessEvent(event); -} - -void wxControl::OnEraseBackground(wxEraseEvent& event) -{ - // 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); -*/ -} + return dwStyle; +} // end of wxControl::OS2GetStyle -WXDWORD wxControl::GetExStyle(WXDWORD& style) const +void wxControl::SetLabel( const wxString& rsLabel ) { - bool want3D; - WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D) ; - - // Even with extended styles, need to combine with FS_BORDER - // for them to look right. Check it out later, base window style does - // not designate BORDERS. Down in Frame and And controls. - - if ( want3D || wxStyleHasBorder(m_windowStyle) ) - style |= FS_BORDER; - - return exStyle; -} + 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 @@ -242,28 +257,30 @@ 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->xLeft; - int right = rect->xRight; - int top = rect->yTop; - int bottom = rect->yBottom; + int nLeft = pRect->xLeft; + int nRight = pRect->xRight; + int nTop = pRect->yTop; + int nBottom = pRect->yBottom; - ::WinQueryWindowRect((HWND) wnd, rect); + ::WinQueryWindowRect((HWND)hWnd, pRect); - if (left < 0) + if (nLeft < 0) return; - if (left < rect->xLeft) - rect->xLeft = left; - - if (right > rect->xRight) - rect->xRight = right; + if (nLeft < pRect->xLeft) + pRect->xLeft = nLeft; - if (top < rect->yTop) - rect->yTop = top; + if (nRight > pRect->xRight) + pRect->xRight = nRight; - if (bottom > rect->yBottom) - rect->yBottom = bottom; -} + if (nTop > pRect->yTop) + pRect->yTop = nTop; + if (nBottom < pRect->yBottom) + pRect->yBottom = nBottom; +} // end of wxFindMaxSize