]> git.saurik.com Git - wxWidgets.git/blobdiff - src/richtext/richtextctrl.cpp
Add demonstration of a few more wxRenderer methods.
[wxWidgets.git] / src / richtext / richtextctrl.cpp
index f3b1d697f33f2be7262d90d714641b38da91697a..9c55ab02fbe022d08ccadf35834c1b7fd903b793 100644 (file)
@@ -26,6 +26,7 @@
     #include "wx/settings.h"
 #endif
 
+#include "wx/timer.h"
 #include "wx/textfile.h"
 #include "wx/ffile.h"
 #include "wx/filename.h"
@@ -67,18 +68,30 @@ wxDEFINE_EVENT( wxEVT_COMMAND_RICHTEXT_BUFFER_RESET, wxRichTextEvent );
  * wxRICHTEXT_USE_OWN_CARET is set in richtextbuffer.h.
  */
 
+class wxRichTextCaret;
+class wxRichTextCaretTimer: public wxTimer
+{
+  public:
+    wxRichTextCaretTimer(wxRichTextCaret* caret)
+    {
+        m_caret = caret;
+    }
+    virtual void Notify();
+    wxRichTextCaret* m_caret;
+};
+
 class wxRichTextCaret: public wxCaret
 {
 public:
     // ctors
     // -----
         // default - use Create()
-    wxRichTextCaret() { Init(); }
+    wxRichTextCaret(): m_timer(this)  { Init(); }
         // creates a block caret associated with the given window
     wxRichTextCaret(wxRichTextCtrl *window, int width, int height)
-        : wxCaret(window, width, height) { Init(); m_richTextCtrl = window; }
+        : wxCaret(window, width, height), m_timer(this) { Init(); m_richTextCtrl = window; }
     wxRichTextCaret(wxRichTextCtrl *window, const wxSize& size)
-        : wxCaret(window, size) { Init(); m_richTextCtrl = window; }
+        : wxCaret(window, size), m_timer(this) { Init(); m_richTextCtrl = window; }
 
     virtual ~wxRichTextCaret();
 
@@ -99,6 +112,8 @@ public:
     bool GetNeedsUpdate() const { return m_needsUpdate; }
     void SetNeedsUpdate(bool needsUpdate = true ) { m_needsUpdate = needsUpdate; }
 
+    void Notify();
+
 protected:
     virtual void DoShow();
     virtual void DoHide();
@@ -115,7 +130,8 @@ private:
                   m_yOld;
     bool          m_hasFocus;       // true => our window has focus
     bool          m_needsUpdate;    // must be repositioned
-
+    bool          m_flashOn;
+    wxRichTextCaretTimer m_timer;
     wxRichTextCtrl* m_richTextCtrl;
 };
 #endif
@@ -273,6 +289,17 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va
     wxAcceleratorTable accel(6, entries);
     SetAcceleratorTable(accel);
 
+    m_contextMenu = new wxMenu;
+    m_contextMenu->Append(wxID_UNDO, _("&Undo"));
+    m_contextMenu->Append(wxID_REDO, _("&Redo"));
+    m_contextMenu->AppendSeparator();
+    m_contextMenu->Append(wxID_CUT, _("Cu&t"));
+    m_contextMenu->Append(wxID_COPY, _("&Copy"));
+    m_contextMenu->Append(wxID_PASTE, _("&Paste"));
+    m_contextMenu->Append(wxID_CLEAR, _("&Delete"));
+    m_contextMenu->AppendSeparator();
+    m_contextMenu->Append(wxID_SELECTALL, _("Select &All"));
+
     return true;
 }
 
@@ -676,23 +703,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
 
     if (event.GetEventType() == wxEVT_KEY_DOWN)
     {
-        if (event.GetKeyCode() == WXK_LEFT ||
-            event.GetKeyCode() == WXK_RIGHT ||
-            event.GetKeyCode() == WXK_UP ||
-            event.GetKeyCode() == WXK_DOWN ||
-            event.GetKeyCode() == WXK_HOME ||
-            event.GetKeyCode() == WXK_PAGEUP ||
-            event.GetKeyCode() == WXK_PAGEDOWN ||
-            event.GetKeyCode() == WXK_END ||
-
-            event.GetKeyCode() == WXK_NUMPAD_LEFT ||
-            event.GetKeyCode() == WXK_NUMPAD_RIGHT ||
-            event.GetKeyCode() == WXK_NUMPAD_UP ||
-            event.GetKeyCode() == WXK_NUMPAD_DOWN ||
-            event.GetKeyCode() == WXK_NUMPAD_HOME ||
-            event.GetKeyCode() == WXK_NUMPAD_PAGEUP ||
-            event.GetKeyCode() == WXK_NUMPAD_PAGEDOWN ||
-            event.GetKeyCode() == WXK_NUMPAD_END)
+        if (event.IsKeyInCategory(WXK_CATEGORY_NAVIGATION))
         {
             KeyboardNavigate(event.GetKeyCode(), flags);
             return;
@@ -768,7 +779,6 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
             case WXK_NUMPAD_END:
             case WXK_NUMPAD_BEGIN:
             case WXK_NUMPAD_INSERT:
-            case WXK_NUMPAD_DELETE:
             case WXK_WINDOWS_LEFT:
             {
                 return;
@@ -994,7 +1004,8 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
 #ifdef __WXMAC__
                 if (event.CmdDown())
 #else
-                if (event.CmdDown() || event.AltDown())
+                // Fixes AltGr+key with European input languages on Windows
+                if ((event.CmdDown() && !event.AltDown()) || (event.AltDown() && !event.CmdDown()))
 #endif
                 {
                     event.Skip();
@@ -2504,6 +2515,13 @@ bool wxRichTextCtrl::CanDeleteSelection() const
 // Accessors
 // ----------------------------------------------------------------------------
 
+void wxRichTextCtrl::SetContextMenu(wxMenu* menu)
+{
+    if (m_contextMenu && m_contextMenu != menu)
+        delete m_contextMenu;
+    m_contextMenu = menu;
+}
+
 void wxRichTextCtrl::SetEditable(bool editable)
 {
     m_editable = editable;
@@ -2516,6 +2534,8 @@ void wxRichTextCtrl::SetInsertionPoint(long pos)
     m_caretPosition = pos - 1;
 
     PositionCaret();
+
+    SetDefaultStyleToCursorStyle();
 }
 
 void wxRichTextCtrl::SetInsertionPointEnd()
@@ -2563,11 +2583,6 @@ void wxRichTextCtrl::SetSelection(long from, long to)
         to = GetLastPosition()+1;
     }
 
-    DoSetSelection(from, to);
-}
-
-void wxRichTextCtrl::DoSetSelection(long from, long to, bool WXUNUSED(scrollCaret))
-{
     if (from == to)
     {
         SelectNone();
@@ -2806,20 +2821,8 @@ void wxRichTextCtrl::OnContextMenu(wxContextMenuEvent& event)
         return;
     }
 
-    if (!m_contextMenu)
-    {
-        m_contextMenu = new wxMenu;
-        m_contextMenu->Append(wxID_UNDO, _("&Undo"));
-        m_contextMenu->Append(wxID_REDO, _("&Redo"));
-        m_contextMenu->AppendSeparator();
-        m_contextMenu->Append(wxID_CUT, _("Cu&t"));
-        m_contextMenu->Append(wxID_COPY, _("&Copy"));
-        m_contextMenu->Append(wxID_PASTE, _("&Paste"));
-        m_contextMenu->Append(wxID_CLEAR, _("&Delete"));
-        m_contextMenu->AppendSeparator();
-        m_contextMenu->Append(wxID_SELECTALL, _("Select &All"));
-    }
-    PopupMenu(m_contextMenu);
+    if (m_contextMenu)
+        PopupMenu(m_contextMenu);
     return;
 }
 
@@ -3484,10 +3487,13 @@ void wxRichTextCaret::Init()
     m_yOld = -1;
     m_richTextCtrl = NULL;
     m_needsUpdate = false;
+    m_flashOn = true;
 }
 
 wxRichTextCaret::~wxRichTextCaret()
 {
+    if (m_timer.IsRunning())
+        m_timer.Stop();
 }
 
 // ----------------------------------------------------------------------------
@@ -3496,11 +3502,19 @@ wxRichTextCaret::~wxRichTextCaret()
 
 void wxRichTextCaret::DoShow()
 {
+    m_flashOn = true;
+
+    if (!m_timer.IsRunning())
+        m_timer.Start(GetBlinkTime());
+
     Refresh();
 }
 
 void wxRichTextCaret::DoHide()
 {
+    if (m_timer.IsRunning())
+        m_timer.Stop();
+
     Refresh();
 }
 
@@ -3577,17 +3591,25 @@ void wxRichTextCaret::DoDraw(wxDC *dc)
     dc->SetBrush(*(m_hasFocus ? wxBLACK_BRUSH : wxTRANSPARENT_BRUSH));
     dc->SetPen(*wxBLACK_PEN);
 
-    // VZ: unfortunately, the rectangle comes out a pixel smaller when this is
-    //     done under wxGTK - no idea why
-    //dc->SetLogicalFunction(wxINVERT);
-
     wxPoint pt(m_x, m_y);
 
     if (m_richTextCtrl)
     {
         pt = m_richTextCtrl->GetLogicalPoint(pt);
     }
-    dc->DrawRectangle(pt.x, pt.y, m_width, m_height);
+    if (IsVisible() && m_flashOn)
+        dc->DrawRectangle(pt.x, pt.y, m_width, m_height);
+}
+
+void wxRichTextCaret::Notify()
+{
+    m_flashOn = !m_flashOn;
+    Refresh();
+}
+
+void wxRichTextCaretTimer::Notify()
+{
+    m_caret->Notify();
 }
 #endif
     // wxRICHTEXT_USE_OWN_CARET