X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0b289133089a070e3538214cfd73209b65b8ff5c..refs/heads/master:/src/richtext/richtextctrl.cpp diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index ce93c740a3..f639779d11 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2005-09-30 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -49,26 +48,26 @@ #include "wx/app.h" WX_CHECK_BUILD_OPTIONS("wxRichTextCtrl") -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_RETURN, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_CHARACTER, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_DELETE, wxRichTextEvent ); - -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, wxRichTextEvent ); - -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_PROPERTIES_CHANGED, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_BUFFER_RESET, wxRichTextEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_FOCUS_OBJECT_CHANGED, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_LEFT_CLICK, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_MIDDLE_CLICK, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_RIGHT_CLICK, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_LEFT_DCLICK, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_RETURN, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_CHARACTER, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_DELETE, wxRichTextEvent ); + +wxDEFINE_EVENT( wxEVT_RICHTEXT_STYLESHEET_REPLACING, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_STYLESHEET_REPLACED, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_STYLESHEET_CHANGING, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_STYLESHEET_CHANGED, wxRichTextEvent ); + +wxDEFINE_EVENT( wxEVT_RICHTEXT_CONTENT_INSERTED, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_CONTENT_DELETED, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_STYLE_CHANGED, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_PROPERTIES_CHANGED, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_SELECTION_CHANGED, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_BUFFER_RESET, wxRichTextEvent ); +wxDEFINE_EVENT( wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED, wxRichTextEvent ); #if wxRICHTEXT_USE_OWN_CARET @@ -149,6 +148,8 @@ private: wxRichTextCaretTimer m_timer; wxRichTextCtrl* m_richTextCtrl; bool m_refreshEnabled; + wxPen m_caretPen; + wxBrush m_caretBrush; }; #endif @@ -239,6 +240,11 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va const wxValidator& validator, const wxString& name) { style |= wxVSCROLL; + + // If read-only, the programmer probably wants to retain dialog keyboard navigation. + // If you don't, then pass wxWANTS_CHARS explicitly. + if ((style & wxTE_READONLY) == 0) + style |= wxWANTS_CHARS; if (!wxControl::Create(parent, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE, @@ -691,7 +697,7 @@ void wxRichTextCtrl::OnLeftUp(wxMouseEvent& event) if ((hit != wxRICHTEXT_HITTEST_NONE) && !(hit & wxRICHTEXT_HITTEST_OUTSIDE)) { wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, + wxEVT_RICHTEXT_LEFT_CLICK, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetPosition(position); @@ -990,7 +996,7 @@ void wxRichTextCtrl::OnRightClick(wxMouseEvent& event) } wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, + wxEVT_RICHTEXT_RIGHT_CLICK, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetPosition(position); @@ -1005,7 +1011,7 @@ void wxRichTextCtrl::OnRightClick(wxMouseEvent& event) void wxRichTextCtrl::OnLeftDClick(wxMouseEvent& WXUNUSED(event)) { wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, + wxEVT_RICHTEXT_LEFT_DCLICK, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetPosition(m_caretPosition+1); @@ -1021,7 +1027,7 @@ void wxRichTextCtrl::OnLeftDClick(wxMouseEvent& WXUNUSED(event)) void wxRichTextCtrl::OnMiddleClick(wxMouseEvent& event) { wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, + wxEVT_RICHTEXT_MIDDLE_CLICK, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetPosition(m_caretPosition+1); @@ -1197,7 +1203,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) ScrollIntoView(m_caretPosition, WXK_RIGHT); wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_RETURN, + wxEVT_RICHTEXT_RETURN, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetFlags(flags); @@ -1207,7 +1213,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) if (!GetEventHandler()->ProcessEvent(cmdEvent)) { // Generate conventional event - wxCommandEvent textEvent(wxEVT_COMMAND_TEXT_ENTER, GetId()); + wxCommandEvent textEvent(wxEVT_TEXT_ENTER, GetId()); InitCommandEvent(textEvent); GetEventHandler()->ProcessEvent(textEvent); @@ -1277,10 +1283,10 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) ScrollIntoView(m_caretPosition, WXK_LEFT); - // Always send this event; wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED will be sent only if there is an actual deletion. + // Always send this event; wxEVT_RICHTEXT_CONTENT_DELETED will be sent only if there is an actual deletion. { wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_DELETE, + wxEVT_RICHTEXT_DELETE, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetFlags(flags); @@ -1316,7 +1322,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) } wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_CHARACTER, + wxEVT_RICHTEXT_CHARACTER, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetFlags(flags); @@ -1501,10 +1507,10 @@ bool wxRichTextCtrl::ProcessBackKey(wxKeyEvent& event, int flags) ScrollIntoView(m_caretPosition, WXK_LEFT); - // Always send this event; wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED will be sent only if there is an actual deletion. + // Always send this event; wxEVT_RICHTEXT_CONTENT_DELETED will be sent only if there is an actual deletion. { wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_DELETE, + wxEVT_RICHTEXT_DELETE, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetFlags(flags); @@ -2663,7 +2669,7 @@ bool wxRichTextCtrl::RecreateBuffer(const wxSize& size) // ---------------------------------------------------------------------------- // file IO functions // ---------------------------------------------------------------------------- - +#if wxUSE_FFILE && wxUSE_STREAMS bool wxRichTextCtrl::DoLoadFile(const wxString& filename, int fileType) { SetFocusObject(& GetBuffer(), true); @@ -2705,6 +2711,7 @@ bool wxRichTextCtrl::DoSaveFile(const wxString& filename, int fileType) return false; } +#endif // wxUSE_FFILE && wxUSE_STREAMS // ---------------------------------------------------------------------------- // wxRichTextCtrl specific functionality @@ -3007,6 +3014,12 @@ wxRichTextBox* wxRichTextCtrl::WriteTextBox(const wxRichTextAttr& textAttr) textBox->AddParagraph(wxEmptyString); textBox->SetParent(NULL); + // If the box has an invalid foreground colour, its text will mimic any upstream value (see #15224) + if (!textBox->GetAttributes().GetTextColour().IsOk()) + { + textBox->GetAttributes().SetTextColour(GetBasicStyle().GetTextColour()); + } + // The object returned is the one actually inserted into the buffer, // while the original one is deleted. wxRichTextObject* obj = GetFocusObject()->InsertObjectWithUndo(& GetBuffer(), m_caretPosition+1, textBox, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE); @@ -3032,17 +3045,25 @@ wxRichTextTable* wxRichTextCtrl::WriteTable(int rows, int cols, const wxRichText wxRichTextTable* table = new wxRichTextTable; table->SetAttributes(tableAttr); table->SetParent(& GetBuffer()); // set parent temporarily for AddParagraph to use correct style + table->SetBasicStyle(GetBasicStyle()); table->CreateTable(rows, cols); table->SetParent(NULL); + // If cells have an invalid foreground colour, their text will mimic any upstream value (see #15224) + wxRichTextAttr attr = cellAttr; + if (!attr.GetTextColour().IsOk()) + { + attr.SetTextColour(GetBasicStyle().GetTextColour()); + } + int i, j; for (j = 0; j < rows; j++) { for (i = 0; i < cols; i++) { - table->GetCell(j, i)->GetAttributes() = cellAttr; + table->GetCell(j, i)->GetAttributes() = attr; } } @@ -4554,7 +4575,7 @@ bool wxRichTextCtrl::SetFocusObject(wxRichTextParagraphLayoutBox* obj, bool setC SetDefaultStyleToCursorStyle(); wxRichTextEvent cmdEvent( - wxEVT_COMMAND_RICHTEXT_FOCUS_OBJECT_CHANGED, + wxEVT_RICHTEXT_FOCUS_OBJECT_CHANGED, GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetPosition(m_caretPosition+1); @@ -4777,7 +4798,7 @@ void wxRichTextCaret::DoShow() { m_flashOn = true; - if (!m_timer.IsRunning()) + if (!m_timer.IsRunning() && GetBlinkTime() > 0) m_timer.Start(GetBlinkTime()); Refresh(); @@ -4861,10 +4882,15 @@ void wxRichTextCaret::Refresh() void wxRichTextCaret::DoDraw(wxDC *dc) { - dc->SetPen( *wxBLACK_PEN ); - - dc->SetBrush(*(m_hasFocus ? wxBLACK_BRUSH : wxTRANSPARENT_BRUSH)); - dc->SetPen(*wxBLACK_PEN); + wxBrush brush(m_caretBrush); + wxPen pen(m_caretPen); + if (m_richTextCtrl && m_richTextCtrl->GetBasicStyle().HasTextColour()) + { + brush = wxBrush(m_richTextCtrl->GetBasicStyle().GetTextColour()); + pen = wxPen(m_richTextCtrl->GetBasicStyle().GetTextColour()); + } + dc->SetBrush((m_hasFocus ? brush : *wxTRANSPARENT_BRUSH)); + dc->SetPen(pen); wxPoint pt(m_x, m_y); @@ -4878,6 +4904,15 @@ void wxRichTextCaret::DoDraw(wxDC *dc) void wxRichTextCaret::Notify() { +#ifdef __WXMAC__ + // Workaround for lack of kill focus event in wxOSX + if (m_richTextCtrl && !m_richTextCtrl->HasFocus()) + { + Hide(); + return; + } +#endif + m_flashOn = !m_flashOn; Refresh(); }