X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5d44b24ee63543390aa28e1eb4ff162da4264838..3bf93e1e9ac6b61e5220967d2ada2d4faec4dd9c:/src/os2/textctrl.cpp diff --git a/src/os2/textctrl.cpp b/src/os2/textctrl.cpp index 32bc0f69d8..f02d4af9db 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,10 @@ 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,12 +109,10 @@ bool wxTextCtrl::Create( ,rPos ,rSize ,lStyle -#if wxUSE_VALIDATORS ,rValidator -#endif ,rsName )) - return FALSE; + return false; wxPoint vPos = rPos; // The OS/2 position SWP vSwp; @@ -125,6 +123,7 @@ bool wxTextCtrl::Create( } m_windowStyle = lStyle; + m_bIsMLE = false; long lSstyle = WS_VISIBLE | WS_TABSTOP; @@ -134,7 +133,7 @@ bool wxTextCtrl::Create( if ( m_windowStyle & wxTE_MULTILINE ) { lSstyle |= MLS_BORDER | MLS_WORDWRAP; - m_bIsMLE = TRUE; + m_bIsMLE = true; if ((m_windowStyle & wxTE_NO_VSCROLL) == 0) lSstyle |= MLS_VSCROLL; @@ -154,14 +153,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) { @@ -200,7 +191,7 @@ bool wxTextCtrl::Create( if (m_hWnd == 0) { - return FALSE; + return false; } SubclassWin(GetHWND()); @@ -208,17 +199,13 @@ 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)); - } - if (!rsValue.IsEmpty()) + wxFont* pTextFont = new wxFont( 8 + ,wxMODERN + ,wxNORMAL + ,wxNORMAL + ); + SetFont(*pTextFont); + if (!rsValue.empty()) { SetValue(rsValue); } @@ -230,12 +217,13 @@ 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 ); - return TRUE; + delete pTextFont; + return true; } // end of wxTextCtrl::Create // @@ -263,11 +251,63 @@ 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) @@ -299,7 +339,6 @@ wxString wxTextCtrl::GetValue() const if (*zStr == '\r') *zStr = '\n'; } - sStr = zStr; return sStr; } // end of wxTextCtrl::GetValue @@ -315,7 +354,7 @@ void wxTextCtrl::SetValue( // if ((rsValue.length() > 0x400) || (rsValue != GetValue())) { - ::WinSetWindowText(GetHwnd(), rsValue.c_str()); + ::WinSetWindowText(GetHwnd(), (PSZ)rsValue.c_str()); AdjustSpaceLimit(); } } // end of wxTextCtrl::SetValue @@ -324,7 +363,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(), (PSZ)rsValue.c_str()); AdjustSpaceLimit(); } // end of wxTextCtrl::WriteText @@ -341,6 +383,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 // ---------------------------------------------------------------------------- @@ -406,10 +456,10 @@ bool wxTextCtrl::CanCut() const bool wxTextCtrl::CanPaste() const { - bool bIsTextAvailable = FALSE; + bool bIsTextAvailable = false; if (!IsEditable()) - return FALSE; + return false; // // Check for straight text on clipboard @@ -452,8 +502,17 @@ void wxTextCtrl::SetInsertionPoint( void wxTextCtrl::SetInsertionPointEnd() { - long lPos = GetLastPosition(); + wxTextPos 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 @@ -471,7 +530,7 @@ long wxTextCtrl::GetInsertionPoint() const return (dwPos & 0xFFFF); } // end of wxTextCtrl::GetInsertionPoint -long wxTextCtrl::GetLastPosition() const +wxTextPos wxTextCtrl::GetLastPosition() const { HWND hWnd = GetHwnd(); long lCharIndex; @@ -545,8 +604,6 @@ void wxTextCtrl::Replace( { #if wxUSE_CLIPBOARD HWND hWnd = GetHwnd(); - long lFromChar = lFrom; - long lToChar = lTo; // // Set selection and remove it @@ -583,8 +640,6 @@ void wxTextCtrl::Remove( ) { HWND hWnd = GetHwnd(); - long lFromChar = lFrom; - long lToChar = lTo; if (m_bIsMLE) { @@ -608,7 +663,7 @@ void wxTextCtrl::SetSelection( long lToChar = lTo; // - // If from and to are both -1, it means (in wxWindows) that all text should + // If from and to are both -1, it means (in wxWidgets) that all text should // be selected. Translate into Windows convention // if ((lFrom == -1L) && (lTo == -1L)) @@ -632,9 +687,9 @@ bool wxTextCtrl::LoadFile( // Update the size limit if needed // AdjustSpaceLimit(); - return TRUE; + return true; } - return FALSE; + return false; } // end of wxTextCtrl::LoadFile bool wxTextCtrl::IsModified() const @@ -648,6 +703,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' // @@ -678,7 +742,6 @@ long wxTextCtrl::XYToPosition( , long lY ) const { - HWND hWnd = GetHwnd(); long lCharIndex = 0L; long lLen; @@ -710,7 +773,7 @@ bool wxTextCtrl::PositionToXY( if (nLineNo == -1) { // no such line - return FALSE; + return false; } // @@ -742,7 +805,7 @@ bool wxTextCtrl::PositionToXY( if (lCharIndex == -1) { - return FALSE; + return false; } // @@ -753,7 +816,7 @@ bool wxTextCtrl::PositionToXY( if (plY) *plY = nLineNo; - return TRUE; + return true; } // end of wxTextCtrl::PositionToXY void wxTextCtrl::ShowPosition( @@ -821,14 +884,14 @@ wxString wxTextCtrl::GetLineText( { long lLen = (long)GetLineLength((long)lLineNo) + 1; wxString sStr; - char* zBuf; + wxChar* zBuf; // // There must be at least enough place for the length WORD in the // buffer // lLen += sizeof(WORD); - zBuf = new char[lLen]; + zBuf = new wxChar[lLen]; if (m_bIsMLE) { long lIndex; @@ -839,7 +902,7 @@ wxString wxTextCtrl::GetLineText( lIndex = lLen * lLineNo; ::WinSendMsg(GetHwnd(), MLM_SETSEL, (MPARAM)lIndex, (MPARAM)lIndex); - ::WinSendMsg(GetHwnd(), MLM_SETIMPORTEXPORT, MPFROMP(zBuf), MPFROMSHORT((USHORT)sizeof(zBuf))); + ::WinSendMsg(GetHwnd(), MLM_SETIMPORTEXPORT, MPFROMP(zBuf), MPFROMSHORT((USHORT)WXSIZEOF(zBuf))); lBuflen = (long)::WinSendMsg(GetHwnd(), MLM_QUERYFORMATTEXTLENGTH, MPFROMLONG(lIndex), MPFROMLONG(-1)); lCopied = (long)::WinSendMsg(GetHwnd(), MLM_EXPORT, MPFROMP(&lIndex), MPFROMP(&lBuflen)); zBuf[lCopied] = '\0'; @@ -854,7 +917,7 @@ wxString wxTextCtrl::GetLineText( ,&vParams ,0 )) - memcpy(zBuf, vParams.pszText, vParams.cchText); + memcpy((char*)zBuf, vParams.pszText, vParams.cchText); zBuf[vParams.cchText] = '\0'; } sStr = zBuf; @@ -893,7 +956,7 @@ bool wxTextCtrl::CanUndo() const if (m_bIsMLE) bOk = (::WinSendMsg(GetHwnd(), MLM_QUERYUNDO, 0, 0) != 0); else - bOk = FALSE; // can't undo regular edit fields in PM + bOk = false; // can't undo regular edit fields in PM return bOk; } // end of wxTextCtrl::CanUndo @@ -904,7 +967,7 @@ bool wxTextCtrl::CanRedo() const if (m_bIsMLE) bOk = (::WinSendMsg(GetHwnd(), MLM_QUERYUNDO, 0, 0) != 0); else - bOk = FALSE; // can't undo regular edit fields in PM + bOk = false; // can't undo regular edit fields in PM return bOk; } // end of wxTextCtrl::CanRedo @@ -941,7 +1004,6 @@ WXHBRUSH wxTextCtrl::OnCtlColor( ) { HPS hPS = (HPS)hWxDC; - wxBrush* pBrush = NULL; wxColour vColBack = GetBackgroundColour(); wxColour vColFore = GetForegroundColour(); wxBrush* pBackgroundBrush = wxTheBrushList->FindOrCreateBrush( GetBackgroundColour() @@ -959,17 +1021,24 @@ 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 ) { - switch (rEvent.KeyCode()) + switch (rEvent.GetKeyCode()) { case WXK_RETURN: if ( !(m_windowStyle & wxTE_MULTILINE) ) @@ -996,7 +1065,7 @@ void wxTextCtrl::OnChar( wxNavigationKeyEvent vEventNav; vEventNav.SetDirection(!rEvent.ShiftDown()); - vEventNav.SetWindowChange(FALSE); + vEventNav.SetWindowChange(false); vEventNav.SetEventObject(this); if ( GetEventHandler()->ProcessEvent(vEventNav) ) @@ -1034,7 +1103,6 @@ bool wxTextCtrl::OS2Command( ); InitCommandEvent(vEvent); - vEvent.SetString((char*)GetValue().c_str()); ProcessCommand(vEvent); } break; @@ -1049,15 +1117,15 @@ bool wxTextCtrl::OS2Command( case EN_SCROLL: case EN_INSERTMODETOGGLE: case EN_MEMERROR: - return FALSE; + return false; default: - return FALSE; + return false; } // // Processed // - return TRUE; + return true; } // end of wxTextCtrl::OS2Command void wxTextCtrl::AdjustSpaceLimit() @@ -1076,10 +1144,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 +1156,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,31 +1170,34 @@ 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 { int nCx; int nCy; + wxFont vFont = (wxFont)GetFont(); - wxGetCharSize(GetHWND(), &nCx, &nCy, (wxFont*)&GetFont()); + wxGetCharSize(GetHWND(), &nCx, &nCy, &vFont); int wText = DEFAULT_ITEM_WIDTH; - int hText = (EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * .8); + int hText = (int)(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); @@ -1173,6 +1242,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,13 +1300,33 @@ 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 ) { if (m_bIsMLE) ::WinSendMsg(GetHwnd(), MLM_SETBACKCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX); - return TRUE; + return true; } // end of wxTextCtrl::SetBackgroundColour bool wxTextCtrl::SetForegroundColour( @@ -1223,7 +1335,7 @@ bool wxTextCtrl::SetForegroundColour( { if (m_bIsMLE) ::WinSendMsg(GetHwnd(), MLM_SETTEXTCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX); - return TRUE; + return true; } // end of wxTextCtrl::SetForegroundColour bool wxTextCtrl::SetStyle( @@ -1270,6 +1382,6 @@ bool wxTextCtrl::SetStyle( // // TODO:: finish this part // - return TRUE; + return true; } // end of wxTextCtrl::SetStyle