X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca8b28f2efff34b9939035a7aeb1de1e3ac98a0c..48da7d0ba891d2e6d2f326a5122b92bae2fdf1fc:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index d08a18f028..7388f2817e 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -68,13 +68,26 @@ #endif #if !USE_SHARED_LIBRARY + IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_CHAR(wxTextCtrl::OnChar) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) - EVT_ERASE_BACKGROUND(wxTextCtrl::OnEraseBackground) + + EVT_MENU(wxID_CUT, wxTextCtrl::OnCut) + EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy) + EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste) + EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo) + EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo) + + EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut) + EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy) + EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste) + EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo) + EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) END_EVENT_TABLE() + #endif // USE_SHARED_LIBRARY // Text item @@ -363,20 +376,29 @@ void wxTextCtrl::DoSetSize(int x, int y, int width, int height, int sizeFlags) // Clipboard operations void wxTextCtrl::Copy() { - HWND hWnd = (HWND) GetHWND(); - SendMessage(hWnd, WM_COPY, 0, 0L); + if (CanCopy()) + { + HWND hWnd = (HWND) GetHWND(); + SendMessage(hWnd, WM_COPY, 0, 0L); + } } void wxTextCtrl::Cut() { - HWND hWnd = (HWND) GetHWND(); - SendMessage(hWnd, WM_CUT, 0, 0L); + if (CanCut()) + { + HWND hWnd = (HWND) GetHWND(); + SendMessage(hWnd, WM_CUT, 0, 0L); + } } void wxTextCtrl::Paste() { - HWND hWnd = (HWND) GetHWND(); - SendMessage(hWnd, WM_PASTE, 0, 0L); + if (CanPaste()) + { + HWND hWnd = (HWND) GetHWND(); + SendMessage(hWnd, WM_PASTE, 0, 0L); + } } void wxTextCtrl::SetEditable(bool editable) @@ -747,8 +769,24 @@ bool wxTextCtrl::CanCut() const bool wxTextCtrl::CanPaste() const { - int dataFormat = 0; // 0 == any format - return (::SendMessage( (HWND) GetHWND(), EM_CANPASTE, (WPARAM) (UINT) dataFormat, 0) != 0); +#if wxUSE_RICHEDIT + if (m_isRich) + { + int dataFormat = 0; // 0 == any format + return (::SendMessage( (HWND) GetHWND(), EM_CANPASTE, (WPARAM) (UINT) dataFormat, 0) != 0); + } +#endif + if (!IsEditable()) + return FALSE; + + // Standard edit control: check for straight text on clipboard + bool isTextAvailable = FALSE; + if (::OpenClipboard((HWND) wxTheApp->GetTopWindow()->GetHWND())) + { + isTextAvailable = (::IsClipboardFormatAvailable(CF_TEXT) != 0); + ::CloseClipboard(); + } + return isTextAvailable; } // Undo/redo @@ -796,8 +834,8 @@ void wxTextCtrl::GetSelection(long* from, long* to) const } #endif DWORD dwStart, dwEnd; - WPARAM wParam = (WPARAM) (DWORD*) dwStart; // receives starting position - LPARAM lParam = (LPARAM) (DWORD*) dwEnd; // receives ending position + WPARAM wParam = (WPARAM) (DWORD*) & dwStart; // receives starting position + LPARAM lParam = (LPARAM) (DWORD*) & dwEnd; // receives ending position ::SendMessage((HWND) GetHWND(), EM_GETSEL, wParam, lParam); @@ -1031,7 +1069,7 @@ WXHBRUSH wxTextCtrl::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, void wxTextCtrl::OnChar(wxKeyEvent& event) { - switch( event.KeyCode() ) + switch ( event.KeyCode() ) { case WXK_RETURN: if ( !(m_windowStyle & wxTE_MULTILINE) ) @@ -1072,8 +1110,9 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) // don't just call event.Skip() because this will cause TABs and ENTERs // be passed upwards and we don't always want this - instead process it // right here - Default(); -// event.Skip(); + + // FIXME + event.Skip(); } long wxTextCtrl::MSWGetDlgCode() @@ -1096,27 +1135,6 @@ long wxTextCtrl::MSWGetDlgCode() return lRc; } -void wxTextCtrl::OnEraseBackground(wxEraseEvent& event) -{ - if ( m_windowStyle & wxTE_MULTILINE ) - { - // No flicker - only problem is we probably can't change the background - Default(); -/* - RECT rect; - ::GetClientRect((HWND) GetHWND(), &rect); - - HBRUSH hBrush = ::CreateSolidBrush(PALETTERGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue())); - int mode = ::SetMapMode((HDC) event.GetDC()->GetHDC(), MM_TEXT); - - ::FillRect ((HDC) event.GetDC()->GetHDC(), &rect, hBrush); - ::DeleteObject(hBrush); - ::SetMapMode((HDC) event.GetDC()->GetHDC(), mode); -*/ - } -// wxWindow::OnEraseBackground(event); -} - bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { /* @@ -1195,7 +1213,7 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) // For Rich Edit controls. Do we need it? #if 0 #if wxUSE_RICHEDIT -bool wxTextCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) +bool wxTextCtrl::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam) { wxCommandEvent event(0, m_windowId); int eventType = 0; @@ -1204,7 +1222,7 @@ bool wxTextCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) { // Insert case code here default : - return wxControl::MSWNotify(wParam, lParam); + return wxControl::MSWOnNotify(wParam, lParam); break; } @@ -1219,3 +1237,53 @@ bool wxTextCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) #endif #endif +void wxTextCtrl::OnCut(wxCommandEvent& event) +{ + Cut(); +} + +void wxTextCtrl::OnCopy(wxCommandEvent& event) +{ + Copy(); +} + +void wxTextCtrl::OnPaste(wxCommandEvent& event) +{ + Paste(); +} + +void wxTextCtrl::OnUndo(wxCommandEvent& event) +{ + Undo(); +} + +void wxTextCtrl::OnRedo(wxCommandEvent& event) +{ + Redo(); +} + +void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event) +{ + event.Enable( CanCut() ); +} + +void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event) +{ + event.Enable( CanCopy() ); +} + +void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event) +{ + event.Enable( CanPaste() ); +} + +void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event) +{ + event.Enable( CanUndo() ); +} + +void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) +{ + event.Enable( CanRedo() ); +} +