]> git.saurik.com Git - wxWidgets.git/commitdiff
Split up the context menu functionality to make it easier to customise.
authorJulian Smart <julian@anthemion.co.uk>
Fri, 30 Dec 2011 17:12:37 +0000 (17:12 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Fri, 30 Dec 2011 17:12:37 +0000 (17:12 +0000)
Tweaked style combobox popup border.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70202 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/richtext/richtextctrl.h
interface/wx/richtext/richtextctrl.h
src/richtext/richtextctrl.cpp
src/richtext/richtextstyles.cpp

index 3ca480b1a7a62b7130e8524c23a05f6395c0faaa..89ef2a71a31362197f707535ecba0a60c4732b87 100644 (file)
@@ -1564,6 +1564,17 @@ public:
     */
     bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL);
 
+    /**
+        Shows the given context menu, optionally adding appropriate property-editing commands for the current position in the object hierarchy.
+    */
+    virtual bool ShowContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands = true);
+
+    /**
+        Prepares the context menu, optionally adding appropriate property-editing commands.
+        Returns the number of property commands added.
+    */
+    virtual int PrepareContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands = true);
+
 // Command handlers
 
     /**
index 3ad293d42afd110b2222700aad81871656d580fa..7188dbfda34ab941325083cef8340bddf1f179ba 100644 (file)
@@ -1537,6 +1537,17 @@ public:
     */
     bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL);
 
+    /**
+        Shows the given context menu, optionally adding appropriate property-editing commands for the current position in the object hierarchy.
+    */
+    virtual bool ShowContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands);
+
+    /**
+        Prepares the context menu, optionally adding appropriate property-editing commands.
+        Returns the number of property commands added.
+    */
+    virtual int PrepareContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands);
+
 // Command handlers
 
     /**
index d20413be707f4db3ada81a574cb18e8c09fce607..63cc1a288756ba4fdeaffc0a39d8d6a1275ddbfb 100644 (file)
@@ -3200,45 +3200,97 @@ void wxRichTextCtrl::OnContextMenu(wxContextMenuEvent& event)
         return;
     }
 
+    ShowContextMenu(m_contextMenu, event.GetPosition());
+}
+
+// Prepares the context menu, adding appropriate property-editing commands.
+// Returns the number of property commands added.
+int wxRichTextCtrl::PrepareContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands)
+{
     wxClientDC dc(this);
     PrepareDC(dc);
     dc.SetFont(GetFont());
 
+    m_contextMenuPropertiesInfo.Clear();
+
     long position = 0;
-    wxPoint pt = event.GetPosition();
-    wxPoint logicalPt = GetLogicalPoint(ScreenToClient(pt));
     wxRichTextObject* hitObj = NULL;
     wxRichTextObject* contextObj = NULL;
-    int hit = GetFocusObject()->HitTest(dc, logicalPt, position, & hitObj, & contextObj);
+    if (pt != wxDefaultPosition)
+    {
+        wxPoint logicalPt = GetLogicalPoint(ScreenToClient(pt));
+        int hit = GetBuffer().HitTest(dc, logicalPt, position, & hitObj, & contextObj);
 
-    m_contextMenuPropertiesInfo.Clear();
+        if (hit == wxRICHTEXT_HITTEST_ON || hit == wxRICHTEXT_HITTEST_BEFORE || hit == wxRICHTEXT_HITTEST_AFTER)
+        {
+            wxRichTextParagraphLayoutBox* actualContainer = wxDynamicCast(contextObj, wxRichTextParagraphLayoutBox);
+            if (hitObj && actualContainer)
+            {
+                if (actualContainer->AcceptsFocus())
+                {
+                    SetFocusObject(actualContainer, false /* don't set caret position yet */);
+                    SetCaretPositionAfterClick(actualContainer, position, hit);
+                }
 
-    if (hit == wxRICHTEXT_HITTEST_ON || hit == wxRICHTEXT_HITTEST_BEFORE || hit == wxRICHTEXT_HITTEST_AFTER)
+                if (addPropertyCommands)
+                    m_contextMenuPropertiesInfo.AddItems(actualContainer, hitObj);
+            }
+            else
+            {
+                if (addPropertyCommands)
+                    m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+            }
+        }
+        else
+        {
+            if (addPropertyCommands)
+                m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+        }
+    }
+    else
     {
+        // Invoked from the keyboard, so don't set the caret position and don't use the event
+        // position
+        hitObj = GetFocusObject()->GetLeafObjectAtPosition(m_caretPosition+1);
+        if (hitObj)
+            contextObj = hitObj->GetParentContainer();
+        else
+            contextObj = GetFocusObject();
+
         wxRichTextParagraphLayoutBox* actualContainer = wxDynamicCast(contextObj, wxRichTextParagraphLayoutBox);
         if (hitObj && actualContainer)
         {
-            if (actualContainer->AcceptsFocus())
-            {
-                SetFocusObject(actualContainer, false /* don't set caret position yet */);
-                SetCaretPositionAfterClick(actualContainer, position, hit);
-            }
-
-            m_contextMenuPropertiesInfo.AddItems(actualContainer, hitObj);
+            if (addPropertyCommands)
+                m_contextMenuPropertiesInfo.AddItems(actualContainer, hitObj);
         }
         else
-            m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+        {
+            if (addPropertyCommands)
+                m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+        }
     }
-    else
+
+    if (menu)
     {
-        m_contextMenuPropertiesInfo.AddItems(GetFocusObject(), NULL);
+        if (addPropertyCommands)
+            m_contextMenuPropertiesInfo.AddMenuItems(menu);
+        return m_contextMenuPropertiesInfo.GetCount();
     }
+    else
+        return 0;
+}
 
-    if (m_contextMenu)
+// Shows the context menu, adding appropriate property-editing commands
+bool wxRichTextCtrl::ShowContextMenu(wxMenu* menu, const wxPoint& pt, bool addPropertyCommands)
+{
+    if (menu)
     {
-        m_contextMenuPropertiesInfo.AddMenuItems(m_contextMenu);
-        PopupMenu(m_contextMenu);
+        PrepareContextMenu(menu, pt, addPropertyCommands);
+        PopupMenu(menu);
+        return true;
     }
+    else
+        return false;
 }
 
 bool wxRichTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
@@ -4279,12 +4331,11 @@ bool wxRichTextContextMenuPropertiesInfo::AddItem(const wxString& label, wxRichT
 int wxRichTextContextMenuPropertiesInfo::AddMenuItems(wxMenu* menu, int startCmd) const
 {
     wxMenuItem* item = menu->FindItem(startCmd);
-    // If none of the standard properties identifiers are in the menu, assume it's
-    // a custom menu without properties commands, and don't add them.
-    if (item)
+    // If none of the standard properties identifiers are in the menu, add them if necessary.
+    // If no items to add, just set the text to something generic
+    if (GetCount() == 0)
     {
-        // If no items, to add just set the text to something generic
-        if (GetCount() == 0)
+        if (item)
         {
             menu->SetLabel(startCmd, _("&Properties"));
 
@@ -4298,50 +4349,59 @@ int wxRichTextContextMenuPropertiesInfo::AddMenuItems(wxMenu* menu, int startCmd
                 }
             }
         }
-        else
+    }
+    else
+    {
+        int i;
+        int pos = -1;
+        // Find the position of the first properties item
+        for (i = 0; i < (int) menu->GetMenuItemCount(); i++)
         {
-            int i;
-            int pos = -1;
-            // Find the position of the first properties item
-            for (i = 0; i < (int) menu->GetMenuItemCount(); i++)
+            wxMenuItem* item = menu->FindItemByPosition(i);
+            if (item && item->GetId() == startCmd)
             {
-                wxMenuItem* item = menu->FindItemByPosition(i);
-                if (item && item->GetId() == startCmd)
-                {
-                    pos = i;
-                    break;
-                }
+                pos = i;
+                break;
             }
+        }
 
-            if (pos != -1)
+        if (pos != -1)
+        {
+            int insertBefore = pos+1;
+            for (i = startCmd; i < startCmd+GetCount(); i++)
             {
-                int insertBefore = pos+1;
-                for (i = startCmd; i < startCmd+GetCount(); i++)
+                if (menu->FindItem(i))
                 {
-                    if (menu->FindItem(i))
-                    {
-                        menu->SetLabel(i, m_labels[i - startCmd]);
-                    }
+                    menu->SetLabel(i, m_labels[i - startCmd]);
+                }
+                else
+                {
+                    if (insertBefore >= (int) menu->GetMenuItemCount())
+                        menu->Append(i, m_labels[i - startCmd]);
                     else
-                    {
-                        if (insertBefore >= (int) menu->GetMenuItemCount())
-                            menu->Append(i, m_labels[i - startCmd]);
-                        else
-                            menu->Insert(insertBefore, i, m_labels[i - startCmd]);
-                    }
-                    insertBefore ++;
+                        menu->Insert(insertBefore, i, m_labels[i - startCmd]);
                 }
+                insertBefore ++;
+            }
 
-                // Delete any old items still left on the menu
-                for (i = startCmd + GetCount(); i < startCmd+3; i++)
+            // Delete any old items still left on the menu
+            for (i = startCmd + GetCount(); i < startCmd+3; i++)
+            {
+                if (menu->FindItem(i))
                 {
-                    if (menu->FindItem(i))
-                    {
-                        menu->Delete(i);
-                    }
+                    menu->Delete(i);
                 }
             }
         }
+        else
+        {
+            // No existing property identifiers were found, so append to the end of the menu.
+            menu->AppendSeparator();
+            for (i = startCmd; i < startCmd+GetCount(); i++)
+            {
+                menu->Append(i, m_labels[i - startCmd]);
+            }
+        }
     }
 
     return GetCount();
index ef62442eaf5a6ec6616c6294f9f03e0b02675d48..8484ce683b9107191184ae26b7041d423e139cb8 100644 (file)
@@ -1209,8 +1209,8 @@ END_EVENT_TABLE()
 bool wxRichTextStyleComboPopup::Create( wxWindow* parent )
 {
     int borderStyle = GetDefaultBorder();
-    if (borderStyle == wxBORDER_SUNKEN)
-        borderStyle = wxBORDER_SIMPLE;
+    if (borderStyle == wxBORDER_SUNKEN || borderStyle == wxBORDER_NONE)
+        borderStyle = wxBORDER_THEME;
 
     return wxRichTextStyleListBox::Create(parent, wxID_ANY,
                                   wxPoint(0,0), wxDefaultSize,