From: Julian Smart Date: Fri, 30 Dec 2011 17:12:37 +0000 (+0000) Subject: Split up the context menu functionality to make it easier to customise. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/9b794421aef8db5c257c7f9c9ab1a467526bf7ab Split up the context menu functionality to make it easier to customise. Tweaked style combobox popup border. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70202 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/richtext/richtextctrl.h b/include/wx/richtext/richtextctrl.h index 3ca480b1a7..89ef2a71a3 100644 --- a/include/wx/richtext/richtextctrl.h +++ b/include/wx/richtext/richtextctrl.h @@ -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 /** diff --git a/interface/wx/richtext/richtextctrl.h b/interface/wx/richtext/richtextctrl.h index 3ad293d42a..7188dbfda3 100644 --- a/interface/wx/richtext/richtextctrl.h +++ b/interface/wx/richtext/richtextctrl.h @@ -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 /** diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index d20413be70..63cc1a2887 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -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(); diff --git a/src/richtext/richtextstyles.cpp b/src/richtext/richtextstyles.cpp index ef62442eaf..8484ce683b 100644 --- a/src/richtext/richtextstyles.cpp +++ b/src/richtext/richtextstyles.cpp @@ -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,