X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d598bae33dff0e48eebd569aa3d75e95e8d6947..04fa04d8067d235ab45b5bc05b65f0679634b541:/src/os2/textctrl.cpp diff --git a/src/os2/textctrl.cpp b/src/os2/textctrl.cpp index d315a58b5c..3be381a95f 100644 --- a/src/os2/textctrl.cpp +++ b/src/os2/textctrl.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: textctrl.cpp +// Name: src/os2/textctrl.cpp // Purpose: wxTextCtrl // Author: David Webster // Modified by: @@ -16,17 +16,18 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#include "wx/textctrl.h" + #ifndef WX_PRECOMP - #include "wx/textctrl.h" #include "wx/scrolwin.h" #include "wx/settings.h" #include "wx/brush.h" #include "wx/utils.h" #include "wx/log.h" + #include "wx/app.h" #endif #if wxUSE_CLIPBOARD - #include "wx/app.h" #include "wx/clipbrd.h" #endif @@ -54,9 +55,7 @@ // event tables and other macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) - -BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) +BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_CHAR(wxTextCtrl::OnChar) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) @@ -124,6 +123,7 @@ bool wxTextCtrl::Create( m_windowStyle = lStyle; m_bIsMLE = false; + m_bSkipUpdate = false; long lSstyle = WS_VISIBLE | WS_TABSTOP; @@ -158,7 +158,7 @@ bool wxTextCtrl::Create( { m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_MLE // Window class - ,(PSZ)rsValue.c_str() // Initial Text + ,rsValue.c_str() // Initial Text ,(ULONG)lSstyle // Style flags ,(LONG)0 // X pos of origin ,(LONG)0 // Y pos of origin @@ -175,7 +175,7 @@ bool wxTextCtrl::Create( { m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_ENTRYFIELD // Window class - ,(PSZ)rsValue.c_str() // Initial Text + ,rsValue.c_str() // Initial Text ,(ULONG)lSstyle // Style flags ,(LONG)0 // X pos of origin ,(LONG)0 // Y pos of origin @@ -327,7 +327,8 @@ void wxTextCtrl::SetupColours() wxString wxTextCtrl::GetValue() const { wxString sStr = wxGetWindowText(GetHWND()); - char* zStr = (char*)sStr.c_str(); + wxCharBuffer buf(sStr.char_str()); + char* zStr = buf.data(); for ( ; *zStr; zStr++ ) { @@ -339,11 +340,12 @@ wxString wxTextCtrl::GetValue() const if (*zStr == '\r') *zStr = '\n'; } - return sStr; + return zStr; } // end of wxTextCtrl::GetValue -void wxTextCtrl::SetValue( - const wxString& rsValue +void wxTextCtrl::DoSetValue( + const wxString& rsValue, + int flags ) { // @@ -354,6 +356,9 @@ void wxTextCtrl::SetValue( // if ((rsValue.length() > 0x400) || (rsValue != GetValue())) { + if ( flags & SetValue_SendEvent ) + m_bSkipUpdate = true; + ::WinSetWindowText(GetHwnd(), rsValue.c_str()); AdjustSpaceLimit(); } @@ -364,7 +369,7 @@ void wxTextCtrl::WriteText( ) { if (m_bIsMLE) - ::WinSendMsg(GetHwnd(), MLM_INSERT, MPARAM((PCHAR)rsValue.c_str()), MPARAM(0)); + ::WinSendMsg(GetHwnd(), MLM_INSERT, MPARAM(rsValue.wx_str()), MPARAM(0)); else ::WinSetWindowText(GetHwnd(), rsValue.c_str()); AdjustSpaceLimit(); @@ -596,14 +601,12 @@ bool wxTextCtrl::IsEditable() const // Editing // ---------------------------------------------------------------------------- -void wxTextCtrl::Replace( - long lFrom -, long lTo -, const wxString& rsValue -) +void wxTextCtrl::Replace( long lFrom, + long lTo, + const wxString& rsValue ) { #if wxUSE_CLIPBOARD - HWND hWnd = GetHwnd(); + HWND hWnd = GetHwnd(); // // Set selection and remove it @@ -630,6 +633,9 @@ void wxTextCtrl::Replace( else ::WinSendMsg(hWnd, EM_PASTE, (MPARAM)0, (MPARAM)0); #else + wxUnusedVar(lFrom); + wxUnusedVar(lTo); + wxUnusedVar(rsValue); wxFAIL_MSG("wxTextCtrl::Replace not implemented if wxUSE_CLIPBOARD is 0."); #endif } // end of wxTextCtrl::Replace @@ -677,11 +683,12 @@ void wxTextCtrl::SetSelection( ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lFromChar, (USHORT)lToChar), (MPARAM)0); } // end of wxTextCtrl::SetSelection -bool wxTextCtrl::LoadFile( - const wxString& rsFile +bool wxTextCtrl::DoLoadFile( + const wxString& rsFile, + int fileType ) { - if ( wxTextCtrlBase::LoadFile(rsFile) ) + if ( wxTextCtrlBase::DoLoadFile(rsFile, fileType) ) { // // Update the size limit if needed @@ -690,7 +697,7 @@ bool wxTextCtrl::LoadFile( return true; } return false; -} // end of wxTextCtrl::LoadFile +} // end of wxTextCtrl::DoLoadFile bool wxTextCtrl::IsModified() const { @@ -709,7 +716,7 @@ void wxTextCtrl::MarkDirty() ::WinSendMsg(GetHwnd(), MLM_SETCHANGED, MPFROMLONG(TRUE), 0); else // EM controls do not have a SETCHANGED, what can we do?? - wxFAIL_MSG( _T("not implemented") ); + wxFAIL_MSG( wxT("not implemented") ); } // @@ -819,12 +826,10 @@ bool wxTextCtrl::PositionToXY( return true; } // end of wxTextCtrl::PositionToXY -void wxTextCtrl::ShowPosition( - long lPos -) +void wxTextCtrl::ShowPosition( long WXUNUSED(lPos) ) { - HWND hWnd = GetHwnd(); - long lCurrentLineLineNo = 0L; + HWND hWnd = GetHwnd(); + long lCurrentLineLineNo = 0L; // To scroll to a position, we pass the number of lines and characters // to scroll *by*. This means that we need to: @@ -851,17 +856,17 @@ void wxTextCtrl::ShowPosition( } } // end of wxTextCtrl::ShowPosition -int wxTextCtrl::GetLineLength( - long lLineNo -) const +int wxTextCtrl::GetLineLength( long WXUNUSED(lLineNo) ) const { - long lLen = 0L; + long lLen = 0L; if (m_bIsMLE) + { lLen = (long)::WinSendMsg(GetHwnd(), MLM_QUERYLINELENGTH, 0, 0); + } else { - WNDPARAMS vParams; + WNDPARAMS vParams; vParams.fsStatus = WPM_CCHTEXT; if (::WinSendMsg( GetHwnd() @@ -884,14 +889,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; @@ -902,7 +907,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'; @@ -917,7 +922,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; @@ -994,21 +999,17 @@ void wxTextCtrl::OnDropFiles( } } // end of wxTextCtrl::OnDropFiles -WXHBRUSH wxTextCtrl::OnCtlColor( - WXHDC hWxDC -, WXHWND hWnd -, WXUINT uCtlColor -, WXUINT uMessage -, WXWPARAM wParam -, WXLPARAM lParam -) +WXHBRUSH wxTextCtrl::OnCtlColor( WXHDC hWxDC, + WXHWND WXUNUSED(hWnd), + WXUINT WXUNUSED(uCtlColor), + WXUINT WXUNUSED(uMessage), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam) ) { - HPS hPS = (HPS)hWxDC; - wxColour vColBack = GetBackgroundColour(); - wxColour vColFore = GetForegroundColour(); - wxBrush* pBackgroundBrush = wxTheBrushList->FindOrCreateBrush( GetBackgroundColour() - ,wxSOLID - ); + HPS hPS = (HPS)hWxDC; + wxColour vColBack = GetBackgroundColour(); + wxColour vColFore = GetForegroundColour(); + wxBrush* pBackgroundBrush = wxTheBrushList->FindOrCreateBrush( vColBack, wxSOLID ); if (m_bUseCtl3D) { @@ -1046,7 +1047,7 @@ void wxTextCtrl::OnChar( wxCommandEvent vEvent(wxEVT_COMMAND_TEXT_ENTER, m_windowId); vEvent.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(vEvent)) + if ( HandleWindowEvent(vEvent)) return; } //else: multiline controls need Enter for themselves @@ -1068,7 +1069,7 @@ void wxTextCtrl::OnChar( vEventNav.SetWindowChange(false); vEventNav.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(vEventNav) ) + if ( HandleWindowEvent(vEventNav) ) return; } break; @@ -1092,12 +1093,18 @@ bool wxTextCtrl::OS2Command( ); vEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(vEvent); + HandleWindowEvent(vEvent); } break; case EN_CHANGE: { + if (m_bSkipUpdate) + { + m_bSkipUpdate = false; + break; + } + wxCommandEvent vEvent( wxEVT_COMMAND_TEXT_UPDATED ,m_windowId ); @@ -1162,11 +1169,17 @@ void wxTextCtrl::AdjustSpaceLimit() } if (uLen >= uLimit) { - uLimit = uLen + 0x8000; // 32Kb - if (uLimit > 0xffff) + if (m_bIsMLE) { - uLimit = 0L; + uLimit = uLen + 0x8000; // 32Kb + if (uLimit > 0xffff) + { + uLimit = 0L; + } } + else + uLimit = 0x7fff; + if (m_bIsMLE) ::WinSendMsg(GetHwnd(), MLM_SETTEXTLIMIT, MPFROMLONG(uLimit), 0); else @@ -1207,148 +1220,107 @@ wxSize wxTextCtrl::DoGetBestSize() const // standard handlers for standard edit menu events // ---------------------------------------------------------------------------- -void wxTextCtrl::OnCut( - wxCommandEvent& rEvent -) +void wxTextCtrl::OnCut( wxCommandEvent& WXUNUSED(rEvent) ) { Cut(); } // end of wxTextCtrl::OnCut -void wxTextCtrl::OnCopy( - wxCommandEvent& rEvent -) +void wxTextCtrl::OnCopy( wxCommandEvent& WXUNUSED(rEvent) ) { Copy(); } // end of wxTextCtrl::OnCopy -void wxTextCtrl::OnPaste( - wxCommandEvent& rEvent -) +void wxTextCtrl::OnPaste( wxCommandEvent& WXUNUSED(rEvent) ) { Paste(); } // end of wxTextCtrl::OnPaste -void wxTextCtrl::OnUndo( - wxCommandEvent& rEvent -) +void wxTextCtrl::OnUndo( wxCommandEvent& WXUNUSED(rEvent) ) { Undo(); } // end of wxTextCtrl::OnUndo -void wxTextCtrl::OnRedo( - wxCommandEvent& rEvent -) +void wxTextCtrl::OnRedo( wxCommandEvent& WXUNUSED(rEvent) ) { Redo(); } // end of wxTextCtrl::OnRedo -void wxTextCtrl::OnDelete( - wxCommandEvent& rEvent -) +void wxTextCtrl::OnDelete( wxCommandEvent& WXUNUSED(rEvent) ) { - long lFrom; - long lTo; + long lFrom, lTo; + + GetSelection( &lFrom, &lTo ); - GetSelection( &lFrom - ,&lTo - ); if (lFrom != -1 && lTo != -1) - Remove( lFrom - ,lTo - ); + Remove( lFrom, lTo ); } // end of wxTextCtrl::OnDelete -void wxTextCtrl::OnSelectAll( - wxCommandEvent& rEvent -) +void wxTextCtrl::OnSelectAll( wxCommandEvent& WXUNUSED(rEvent) ) { SetSelection(-1, -1); } // end of wxTextCtrl::OnSelectAll -void wxTextCtrl::OnUpdateCut( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnUpdateCut( wxUpdateUIEvent& rEvent ) { rEvent.Enable(CanCut()); } // end of wxTextCtrl::OnUpdateCut -void wxTextCtrl::OnUpdateCopy( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnUpdateCopy( wxUpdateUIEvent& rEvent ) { rEvent.Enable(CanCopy()); } // end of wxTextCtrl::OnUpdateCopy -void wxTextCtrl::OnUpdatePaste( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnUpdatePaste( wxUpdateUIEvent& rEvent ) { rEvent.Enable(CanPaste()); } // end of wxTextCtrl::OnUpdatePaste -void wxTextCtrl::OnUpdateUndo( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnUpdateUndo( wxUpdateUIEvent& rEvent ) { rEvent.Enable(CanUndo()); } // end of wxTextCtrl::OnUpdateUndo -void wxTextCtrl::OnUpdateRedo( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnUpdateRedo( wxUpdateUIEvent& rEvent ) { rEvent.Enable(CanRedo()); } // end of wxTextCtrl::OnUpdateRedo -void wxTextCtrl::OnUpdateDelete( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnUpdateDelete( wxUpdateUIEvent& rEvent ) { - long lFrom; - long lTo; + long lFrom, lTo; - GetSelection( &lFrom - ,&lTo - ); + GetSelection( &lFrom, &lTo ); rEvent.Enable( lFrom != -1L && lTo != -1L && lFrom != lTo && IsEditable()) ; } // end of wxTextCtrl::OnUpdateDelete -void wxTextCtrl::OnUpdateSelectAll( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnUpdateSelectAll( wxUpdateUIEvent& rEvent ) { rEvent.Enable(GetLastPosition() > 0); } // end of wxTextCtrl::OnUpdateSelectAll -bool wxTextCtrl::SetBackgroundColour( - const wxColour& rColour -) +bool wxTextCtrl::SetBackgroundColour( const wxColour& rColour ) { if (m_bIsMLE) ::WinSendMsg(GetHwnd(), MLM_SETBACKCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX); return true; } // end of wxTextCtrl::SetBackgroundColour -bool wxTextCtrl::SetForegroundColour( - const wxColour& rColour -) +bool wxTextCtrl::SetForegroundColour( const wxColour& rColour ) { if (m_bIsMLE) ::WinSendMsg(GetHwnd(), MLM_SETTEXTCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX); return true; } // end of wxTextCtrl::SetForegroundColour -bool wxTextCtrl::SetStyle( - long lStart -, long lEnd -, const wxTextAttr& rStyle -) +bool wxTextCtrl::SetStyle( long lStart, + long lEnd, + const wxTextAttr& WXUNUSED(rStyle) ) { - HWND hWnd = GetHwnd(); + HWND hWnd = GetHwnd(); if (lStart > lEnd) { - long lTmp = lStart; + long lTmp = lStart; lStart = lEnd; lEnd = lTmp; @@ -1358,18 +1330,15 @@ bool wxTextCtrl::SetStyle( // 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; + long lStartOld, lEndOld; - GetSelection( &lStartOld - ,&lEndOld - ); + GetSelection( &lStartOld, &lEndOld ); // // But do we really have to change the selection? // - bool bChangeSel = lStart != lStartOld || - lEnd != lEndOld; + bool bChangeSel = lStart != lStartOld || + lEnd != lEndOld; if (bChangeSel) { @@ -1384,4 +1353,3 @@ bool wxTextCtrl::SetStyle( // return true; } // end of wxTextCtrl::SetStyle -