X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1ec46a5b35233f3c69c5b73e4b0b36f44c650633..bbee1b4abc13379569607df8f6985ec68dc12231:/src/os2/textctrl.cpp diff --git a/src/os2/textctrl.cpp b/src/os2/textctrl.cpp index f80abd0f4c..c663907618 100644 --- a/src/os2/textctrl.cpp +++ b/src/os2/textctrl.cpp @@ -18,6 +18,7 @@ #ifndef WX_PRECOMP #include "wx/textctrl.h" + #include "wx/scrolwin.h" #include "wx/settings.h" #include "wx/brush.h" #include "wx/utils.h" @@ -43,7 +44,7 @@ # include #endif -#if defined(__EMX__) && !defined(MLE_INDEX) +#if !defined(MLE_INDEX) #define MLE_INDEX 0 #define MLE_RGB 1 #endif @@ -98,6 +99,8 @@ bool wxTextCtrl::Create( , const wxString& rsName ) { + HWND hParent; + int nTempy; // // Base initialization // @@ -114,21 +117,11 @@ bool wxTextCtrl::Create( return FALSE; wxPoint vPos = rPos; // The OS/2 position + SWP vSwp; if (pParent ) { pParent->AddChild(this); - // - // OS2 uses normal coordinates, no bassackwards Windows ones - // -// vPos.y = pParent->GetSize().y - (vPos.y + rSize.y); - } - else - { - RECTL vRect; - - ::WinQueryWindowRect(HWND_DESKTOP, &vRect); -// vPos.y = vRect.yTop - (vPos.y + rSize.y); } m_windowStyle = lStyle; @@ -140,8 +133,8 @@ bool wxTextCtrl::Create( // if ( m_windowStyle & wxTE_MULTILINE ) { + lSstyle |= MLS_BORDER | MLS_WORDWRAP; m_bIsMLE = TRUE; - m_windowStyle |= wxTE_PROCESS_ENTER; if ((m_windowStyle & wxTE_NO_VSCROLL) == 0) lSstyle |= MLS_VSCROLL; @@ -152,7 +145,7 @@ bool wxTextCtrl::Create( } else { - lSstyle |= ES_LEFT; + lSstyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN; if (m_windowStyle & wxHSCROLL) lSstyle |= ES_AUTOSCROLL; @@ -161,6 +154,7 @@ bool wxTextCtrl::Create( if (m_windowStyle & wxTE_PASSWORD) // hidden input lSstyle |= ES_UNREADABLE; } + if (m_bIsMLE) { m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle @@ -206,26 +200,30 @@ bool wxTextCtrl::Create( // // Set font, position, size and initial value // - wxFont& vFontParent = pParent->GetFont(); - - if (vFontParent.Ok()) - { - SetFont(vFontParent); - } - else - { - SetFont(wxSystemSettings::GetSystemFont(wxSYS_SYSTEM_FONT)); - } + wxFont* pTextFont = new wxFont( 10 + ,wxMODERN + ,wxNORMAL + ,wxNORMAL + ); + SetFont(*pTextFont); if (!rsValue.IsEmpty()) { SetValue(rsValue); } SetupColours(); - SetSize( rPos.x - ,rPos.y + // + // If X and/or Y are not zero the difference is the compensation value + // for margins for OS/2 controls. + // + ::WinQueryWindowPos(m_hWnd, &vSwp); + SetXComp(vSwp.x); + SetYComp(vSwp.y); + SetSize( vPos.x + ,vPos.y ,rSize.x ,rSize.y ); + delete pTextFont; return TRUE; } // end of wxTextCtrl::Create @@ -254,13 +252,73 @@ void wxTextCtrl::AdoptAttributesFromHWND() } } // end of wxTextCtrl::AdoptAttributesFromHWND +WXDWORD wxTextCtrl::OS2GetStyle( + long lStyle +, WXDWORD* pdwExstyle +) const +{ + // + // Default border for the text controls is the sunken one + // + if ((lStyle & wxBORDER_MASK) == wxBORDER_DEFAULT ) + { + lStyle |= wxBORDER_SUNKEN; + } + + long dwStyle = wxControl::OS2GetStyle( lStyle + ,pdwExstyle + ); + + dwStyle = WS_VISIBLE | WS_TABSTOP; + + // + // Single and multiline edit fields are two different controls in PM + // + if ( m_windowStyle & wxTE_MULTILINE ) + { + dwStyle |= MLS_BORDER | MLS_WORDWRAP; + if ((m_windowStyle & wxTE_NO_VSCROLL) == 0) + dwStyle |= MLS_VSCROLL; + if (m_windowStyle & wxHSCROLL) + dwStyle |= MLS_HSCROLL; + if (m_windowStyle & wxTE_READONLY) + dwStyle |= MLS_READONLY; + } + else + { + dwStyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN; + if (m_windowStyle & wxHSCROLL) + dwStyle |= ES_AUTOSCROLL; + if (m_windowStyle & wxTE_READONLY) + dwStyle |= ES_READONLY; + if (m_windowStyle & wxTE_PASSWORD) // hidden input + dwStyle |= ES_UNREADABLE; + } + return dwStyle; +} // end of wxTextCtrl::OS2GetStyle + +void wxTextCtrl::SetWindowStyleFlag( + long lStyle +) +{ + wxControl::SetWindowStyleFlag(lStyle); +} // end of wxTextCtrl::SetWindowStyleFlag + void wxTextCtrl::SetupColours() { wxColour vBkgndColour; - vBkgndColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW); + vBkgndColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); SetBackgroundColour(vBkgndColour); SetForegroundColour(GetParent()->GetForegroundColour()); + if (m_bIsMLE) + { + ::WinSendMsg( GetHwnd() + ,MLM_SETTEXTCOLOR + ,(MPARAM)GetParent()->GetForegroundColour().GetPixel() + ,(MPARAM)MLE_RGB + ); + } } // end of wxTextCtrl::SetupColours // ---------------------------------------------------------------------------- @@ -307,20 +365,10 @@ void wxTextCtrl::WriteText( const wxString& rsValue ) { - if (m_defaultStyle.HasFont() || m_defaultStyle.HasTextColour()) - { - long lStart; - long lEnd; - - GetSelection( &lStart - ,&lEnd - ); - SetStyle( lStart - ,lEnd - ,m_defaultStyle - ); - } - ::WinSetWindowText(GetHwnd(), rsValue.c_str()); + if (m_bIsMLE) + ::WinSendMsg(GetHwnd(), MLM_INSERT, MPARAM((PCHAR)rsValue.c_str()), MPARAM(0)); + else + ::WinSetWindowText(GetHwnd(), rsValue.c_str()); AdjustSpaceLimit(); } // end of wxTextCtrl::WriteText @@ -618,52 +666,6 @@ void wxTextCtrl::SetSelection( ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lFromChar, (USHORT)lToChar), (MPARAM)0); } // end of wxTextCtrl::SetSelection -bool wxTextCtrl::SetStyle( - long lStart -, long lEnd -, const wxTextAttr& rStyle -) -{ - HWND hWnd = GetHwnd(); - // - // Order the range if needed - // - if (lStart > lEnd) - { - long lTmp = lStart; - - lStart = lEnd; - lEnd = lTmp; - } - - // - // We can only change the format of the selection, so select the range we - // want and restore the old selection later - long lStartOld; - long lEndOld; - - GetSelection( &lStartOld - ,&lEndOld - ); - - // - // But do we really have to change the selection? - // - bool bChangeSel = lStart != lStartOld || lEnd != lEndOld; - - if (bChangeSel) - { - if (m_bIsMLE) - ::WinSendMsg(hWnd, MLM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0); - else - ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0); - } - // - // TODO:: finish this by setting fonts and colors - // - return TRUE; -} // end of wxTextCtrl::SetStyle - bool wxTextCtrl::LoadFile( const wxString& rsFile ) @@ -1001,12 +1003,19 @@ WXHBRUSH wxTextCtrl::OnCtlColor( else ::GpiSetBackMix(hPS, BM_OVERPAINT); if (!IsEnabled() && (GetWindowStyle() & wxTE_MULTILINE) == 0) - vColBack = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + vColBack = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); ::GpiSetBackColor(hPS, vColBack.GetPixel()); ::GpiSetColor(hPS, vColFore.GetPixel()); return (WXHBRUSH)pBackgroundBrush->GetResourceHandle(); } // end of wxTextCtrl::OnCtlColor +bool wxTextCtrl::OS2ShouldPreProcessMessage( + WXMSG* pMsg +) +{ + return wxControl::OS2ShouldPreProcessMessage(pMsg); +} // end of wxTextCtrl::OS2ShouldPreProcessMessage + void wxTextCtrl::OnChar( wxKeyEvent& rEvent ) @@ -1166,11 +1175,11 @@ wxSize wxTextCtrl::DoGetBestSize() const wxGetCharSize(GetHWND(), &nCx, &nCy, (wxFont*)&GetFont()); int wText = DEFAULT_ITEM_WIDTH; - int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy); + int hText = (EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * .8); if (m_windowStyle & wxTE_MULTILINE) { - hText *= wxMin(GetNumberOfLines(), 5); + hText *= wxMax(GetNumberOfLines(), 5); } //else: for single line control everything is ok return wxSize(wText, hText); @@ -1268,3 +1277,50 @@ bool wxTextCtrl::SetForegroundColour( return TRUE; } // end of wxTextCtrl::SetForegroundColour +bool wxTextCtrl::SetStyle( + long lStart +, long lEnd +, const wxTextAttr& rStyle +) +{ + HWND hWnd = GetHwnd(); + + if (lStart > lEnd) + { + long lTmp = lStart; + + lStart = lEnd; + lEnd = lTmp; + } + + // + // We can only change the format of the selection, so select the range we + // want and restore the old selection later + // + long lStartOld; + long lEndOld; + + GetSelection( &lStartOld + ,&lEndOld + ); + + // + // But do we really have to change the selection? + // + bool bChangeSel = lStart != lStartOld || + lEnd != lEndOld; + + if (bChangeSel) + { + if (m_bIsMLE) + ::WinSendMsg(hWnd, MLM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0); + else + ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0); + } + + // + // TODO:: finish this part + // + return TRUE; +} // end of wxTextCtrl::SetStyle +