X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/716ed2259a90954581baea38e4de16c772d6b27e..7f42e09be2bfa39edae40932796c746a8d67338f:/src/os2/textctrl.cpp diff --git a/src/os2/textctrl.cpp b/src/os2/textctrl.cpp index 1895e9657b..88178bf957 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,16 +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 @@ -43,7 +45,7 @@ # include #endif -#if defined(__EMX__) && !defined(MLE_INDEX) +#if !defined(MLE_INDEX) #define MLE_INDEX 0 #define MLE_RGB 1 #endif @@ -53,9 +55,9 @@ // event tables and other macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase) -BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) +BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_CHAR(wxTextCtrl::OnChar) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) @@ -85,6 +87,10 @@ wxTextCtrl::wxTextCtrl() { } +wxTextCtrl::~wxTextCtrl() +{ +} + bool wxTextCtrl::Create( wxWindow* pParent , wxWindowID vId @@ -92,9 +98,7 @@ bool wxTextCtrl::Create( , const wxPoint& rPos , const wxSize& rSize , long lStyle -#if wxUSE_VALIDATORS , const wxValidator& rValidator -#endif , const wxString& rsName ) { @@ -106,32 +110,22 @@ 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; 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; + m_bIsMLE = false; + m_bSkipUpdate = false; long lSstyle = WS_VISIBLE | WS_TABSTOP; @@ -140,8 +134,8 @@ bool wxTextCtrl::Create( // if ( m_windowStyle & wxTE_MULTILINE ) { - m_bIsMLE = TRUE; - m_windowStyle |= wxTE_PROCESS_ENTER; + lSstyle |= MLS_BORDER | MLS_WORDWRAP; + m_bIsMLE = true; if ((m_windowStyle & wxTE_NO_VSCROLL) == 0) lSstyle |= MLS_VSCROLL; @@ -152,7 +146,7 @@ bool wxTextCtrl::Create( } else { - lSstyle |= ES_LEFT; + lSstyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN; if (m_windowStyle & wxHSCROLL) lSstyle |= ES_AUTOSCROLL; @@ -161,11 +155,12 @@ 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 ,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 @@ -182,7 +177,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 @@ -198,7 +193,7 @@ bool wxTextCtrl::Create( if (m_hWnd == 0) { - return FALSE; + return false; } SubclassWin(GetHWND()); @@ -206,27 +201,31 @@ 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); } 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 - GetXComp() + ,vPos.y - GetYComp() ,rSize.x ,rSize.y ); - return TRUE; + delete pTextFont; + return true; } // end of wxTextCtrl::Create // @@ -254,13 +253,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 // ---------------------------------------------------------------------------- @@ -270,7 +329,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++ ) { @@ -282,12 +342,12 @@ wxString wxTextCtrl::GetValue() const if (*zStr == '\r') *zStr = '\n'; } - sStr = zStr; - return sStr; + return zStr; } // end of wxTextCtrl::GetValue -void wxTextCtrl::SetValue( - const wxString& rsValue +void wxTextCtrl::DoSetValue( + const wxString& rsValue, + int flags ) { // @@ -298,6 +358,9 @@ void wxTextCtrl::SetValue( // if ((rsValue.length() > 0x400) || (rsValue != GetValue())) { + if ( flags & SetValue_SendEvent ) + m_bSkipUpdate = true; + ::WinSetWindowText(GetHwnd(), rsValue.c_str()); AdjustSpaceLimit(); } @@ -307,7 +370,10 @@ void wxTextCtrl::WriteText( const wxString& rsValue ) { - ::WinSetWindowText(GetHwnd(), rsValue.c_str()); + if (m_bIsMLE) + ::WinSendMsg(GetHwnd(), MLM_INSERT, MPARAM(rsValue.wx_str()), MPARAM(0)); + else + ::WinSetWindowText(GetHwnd(), rsValue.c_str()); AdjustSpaceLimit(); } // end of wxTextCtrl::WriteText @@ -324,6 +390,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 // ---------------------------------------------------------------------------- @@ -389,10 +463,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 @@ -435,8 +509,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 @@ -454,7 +537,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; @@ -520,16 +603,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(); - long lFromChar = lFrom; - long lToChar = lTo; + HWND hWnd = GetHwnd(); // // Set selection and remove it @@ -556,6 +635,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 @@ -566,8 +648,6 @@ void wxTextCtrl::Remove( ) { HWND hWnd = GetHwnd(); - long lFromChar = lFrom; - long lToChar = lTo; if (m_bIsMLE) { @@ -591,7 +671,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)) @@ -605,20 +685,21 @@ 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 // AdjustSpaceLimit(); - return TRUE; + return true; } - return FALSE; -} // end of wxTextCtrl::LoadFile + return false; +} // end of wxTextCtrl::DoLoadFile bool wxTextCtrl::IsModified() const { @@ -631,6 +712,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' // @@ -661,7 +751,6 @@ long wxTextCtrl::XYToPosition( , long lY ) const { - HWND hWnd = GetHwnd(); long lCharIndex = 0L; long lLen; @@ -693,7 +782,7 @@ bool wxTextCtrl::PositionToXY( if (nLineNo == -1) { // no such line - return FALSE; + return false; } // @@ -725,7 +814,7 @@ bool wxTextCtrl::PositionToXY( if (lCharIndex == -1) { - return FALSE; + return false; } // @@ -736,15 +825,13 @@ bool wxTextCtrl::PositionToXY( if (plY) *plY = nLineNo; - return TRUE; + 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: @@ -771,17 +858,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() @@ -804,14 +891,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; @@ -822,7 +909,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'; @@ -837,7 +924,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; @@ -876,7 +963,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 @@ -887,7 +974,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 @@ -914,22 +1001,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; - wxBrush* pBrush = NULL; - 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) { @@ -942,17 +1024,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) ) @@ -960,7 +1049,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 @@ -979,10 +1068,10 @@ void wxTextCtrl::OnChar( wxNavigationKeyEvent vEventNav; vEventNav.SetDirection(!rEvent.ShiftDown()); - vEventNav.SetWindowChange(FALSE); + vEventNav.SetWindowChange(false); vEventNav.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(vEventNav) ) + if ( HandleWindowEvent(vEventNav) ) return; } break; @@ -1006,18 +1095,23 @@ 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 ); InitCommandEvent(vEvent); - vEvent.SetString((char*)GetValue().c_str()); ProcessCommand(vEvent); } break; @@ -1032,15 +1126,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() @@ -1059,10 +1153,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() @@ -1070,48 +1165,54 @@ 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 } 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 - ::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); + 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); @@ -1121,91 +1222,136 @@ 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::OnUpdateCut( - wxUpdateUIEvent& rEvent -) +void wxTextCtrl::OnDelete( wxCommandEvent& WXUNUSED(rEvent) ) +{ + long lFrom, lTo; + + GetSelection( &lFrom, &lTo ); + + if (lFrom != -1 && lTo != -1) + Remove( lFrom, lTo ); +} // end of wxTextCtrl::OnDelete + +void wxTextCtrl::OnSelectAll( wxCommandEvent& WXUNUSED(rEvent) ) +{ + SetSelection(-1, -1); +} // end of wxTextCtrl::OnSelectAll + +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 -bool wxTextCtrl::SetBackgroundColour( - const wxColour& rColour -) +void wxTextCtrl::OnUpdateDelete( wxUpdateUIEvent& rEvent ) +{ + long lFrom, 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( - const wxColour& rColour -) +bool wxTextCtrl::SetForegroundColour( const wxColour& rColour ) { if (m_bIsMLE) ::WinSendMsg(GetHwnd(), MLM_SETTEXTCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX); - return TRUE; + return true; } // end of wxTextCtrl::SetForegroundColour +bool wxTextCtrl::SetStyle( long lStart, + long lEnd, + const wxTextAttr& WXUNUSED(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, 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