X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a756f210019dd5b51331b7181c816d3882146a30..9f7948af90ec2e3b907944e7d979f0863910c5c8:/src/os2/textctrl.cpp diff --git a/src/os2/textctrl.cpp b/src/os2/textctrl.cpp index 69f0914f4b..0f801323ef 100644 --- a/src/os2/textctrl.cpp +++ b/src/os2/textctrl.cpp @@ -86,6 +86,10 @@ wxTextCtrl::wxTextCtrl() { } +wxTextCtrl::~wxTextCtrl() +{ +} + bool wxTextCtrl::Create( wxWindow* pParent , wxWindowID vId @@ -93,14 +97,13 @@ bool wxTextCtrl::Create( , const wxPoint& rPos , const wxSize& rSize , long lStyle -#if wxUSE_VALIDATORS , const wxValidator& rValidator -#endif , const wxString& rsName ) { HWND hParent; int nTempy; + // // Base initialization // @@ -109,9 +112,7 @@ bool wxTextCtrl::Create( ,rPos ,rSize ,lStyle -#if wxUSE_VALIDATORS ,rValidator -#endif ,rsName )) return FALSE; @@ -125,6 +126,7 @@ bool wxTextCtrl::Create( } m_windowStyle = lStyle; + m_bIsMLE = FALSE; long lSstyle = WS_VISIBLE | WS_TABSTOP; @@ -154,14 +156,6 @@ bool wxTextCtrl::Create( if (m_windowStyle & wxTE_PASSWORD) // hidden input lSstyle |= ES_UNREADABLE; } - // - // If the parent is a scrolled window the controls must - // have this style or they will overlap the scrollbars - // - if (pParent) - if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) || - pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow))) - lSstyle |= WS_CLIPSIBLINGS; if (m_bIsMLE) { @@ -208,16 +202,12 @@ bool wxTextCtrl::Create( // // Set font, position, size and initial value // - wxFont& vFontParent = pParent->GetFont(); - - if (vFontParent.Ok()) - { - SetFont(vFontParent); - } - else - { - SetFont(wxSystemSettings::GetFont(wxSYS_SYSTEM_FONT)); - } + wxFont* pTextFont = new wxFont( 8 + ,wxMODERN + ,wxNORMAL + ,wxNORMAL + ); + SetFont(*pTextFont); if (!rsValue.IsEmpty()) { SetValue(rsValue); @@ -230,11 +220,12 @@ bool wxTextCtrl::Create( ::WinQueryWindowPos(m_hWnd, &vSwp); SetXComp(vSwp.x); SetYComp(vSwp.y); - SetSize( vPos.x - ,vPos.y + SetSize( vPos.x - GetXComp() + ,vPos.y - GetYComp() ,rSize.x ,rSize.y ); + delete pTextFont; return TRUE; } // end of wxTextCtrl::Create @@ -263,6 +254,58 @@ 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; @@ -299,7 +342,6 @@ wxString wxTextCtrl::GetValue() const if (*zStr == '\r') *zStr = '\n'; } - sStr = zStr; return sStr; } // end of wxTextCtrl::GetValue @@ -324,7 +366,10 @@ void wxTextCtrl::WriteText( const wxString& rsValue ) { - ::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 @@ -341,6 +386,14 @@ void wxTextCtrl::Clear() ::WinSetWindowText(GetHwnd(), ""); } // end of wxTextCtrl::Clear +bool wxTextCtrl::EmulateKeyPress( + const wxKeyEvent& rEvent +) +{ + SetFocus(); + return(wxTextCtrlBase::EmulateKeyPress(rEvent)); +} // end of wxTextCtrl::EmulateKeyPress + // ---------------------------------------------------------------------------- // Clipboard operations // ---------------------------------------------------------------------------- @@ -454,6 +507,15 @@ void wxTextCtrl::SetInsertionPointEnd() { long lPos = GetLastPosition(); + // + // We must not do anything if the caret is already there because calling + // SetInsertionPoint() thaws the controls if Freeze() had been called even + // if it doesn't actually move the caret anywhere and so the simple fact of + // doing it results in horrible flicker when appending big amounts of text + // to the control in a few chunks (see DoAddText() test in the text sample) + // + if (GetInsertionPoint() == GetLastPosition()) + return; SetInsertionPoint(lPos); } // end of wxTextCtrl::SetInsertionPointEnd @@ -648,6 +710,15 @@ bool wxTextCtrl::IsModified() const return bRc; } // end of wxTextCtrl::IsModified +void wxTextCtrl::MarkDirty() +{ + if (m_bIsMLE) + ::WinSendMsg(GetHwnd(), MLM_SETCHANGED, MPFROMLONG(TRUE), 0); + else + // EM controls do not have a SETCHANGED, what can we do?? + wxFAIL_MSG( _T("not implemented") ); +} + // // Makes 'unmodified' // @@ -965,6 +1036,13 @@ WXHBRUSH wxTextCtrl::OnCtlColor( 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 ) @@ -1076,10 +1154,11 @@ void wxTextCtrl::AdjustSpaceLimit() } else { - ENTRYFDATA* pEfd; + ENTRYFDATA Efd; WNDPARAMS vParams; vParams.fsStatus = WPM_CBCTLDATA; + vParams.pCtlData = &Efd; vParams.cbCtlData = sizeof(ENTRYFDATA); if (::WinSendMsg( GetHwnd() @@ -1087,10 +1166,7 @@ void wxTextCtrl::AdjustSpaceLimit() ,&vParams ,0 )) - { - pEfd = (ENTRYFDATA*)vParams.pCtlData; - uLimit = (unsigned int)pEfd->cchEditLimit; - } + uLimit = (unsigned int)Efd.cchEditLimit; else uLimit = 32; //PM's default } @@ -1104,16 +1180,18 @@ void wxTextCtrl::AdjustSpaceLimit() if (m_bIsMLE) ::WinSendMsg(GetHwnd(), MLM_SETTEXTLIMIT, MPFROMLONG(uLimit), 0); else - ::WinSendMsg(GetHwnd(), EM_SETTEXTLIMIT, MPFROMLONG(uLimit), 0); + ::WinSendMsg(GetHwnd(), EM_SETTEXTLIMIT, MPFROMSHORT(uLimit), 0); } } // end of wxTextCtrl::AdjustSpaceLimit bool wxTextCtrl::AcceptsFocus() const { // - // We don't want focus if we can't be edited + // We don't want focus if we can't be edited unless we're a multiline + // control because then it might be still nice to get focus from keyboard + // to be able to scroll it without mouse // - return IsEditable() && wxControl::AcceptsFocus(); + return (IsEditable() || IsMultiLine()) && wxControl::AcceptsFocus(); } // end of wxTextCtrl::Command wxSize wxTextCtrl::DoGetBestSize() const @@ -1128,7 +1206,7 @@ wxSize wxTextCtrl::DoGetBestSize() const 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); @@ -1173,6 +1251,29 @@ void wxTextCtrl::OnRedo( Redo(); } // end of wxTextCtrl::OnRedo +void wxTextCtrl::OnDelete( + wxCommandEvent& rEvent +) +{ + long lFrom; + long lTo; + + GetSelection( &lFrom + ,&lTo + ); + if (lFrom != -1 && lTo != -1) + Remove( lFrom + ,lTo + ); +} // end of wxTextCtrl::OnDelete + +void wxTextCtrl::OnSelectAll( + wxCommandEvent& rEvent +) +{ + SetSelection(-1, -1); +} // end of wxTextCtrl::OnSelectAll + void wxTextCtrl::OnUpdateCut( wxUpdateUIEvent& rEvent ) @@ -1208,6 +1309,26 @@ void wxTextCtrl::OnUpdateRedo( rEvent.Enable(CanRedo()); } // end of wxTextCtrl::OnUpdateRedo +void wxTextCtrl::OnUpdateDelete( + wxUpdateUIEvent& rEvent +) +{ + long lFrom; + long lTo; + + GetSelection( &lFrom + ,&lTo + ); + rEvent.Enable( lFrom != -1L && lTo != -1L && lFrom != lTo && IsEditable()) ; +} // end of wxTextCtrl::OnUpdateDelete + +void wxTextCtrl::OnUpdateSelectAll( + wxUpdateUIEvent& rEvent +) +{ + rEvent.Enable(GetLastPosition() > 0); +} // end of wxTextCtrl::OnUpdateSelectAll + bool wxTextCtrl::SetBackgroundColour( const wxColour& rColour )