]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/radiocmn.cpp
[ 1522987 ] wxComboCtrl crashes if TAB is pressed while popup is open
[wxWidgets.git] / src / common / radiocmn.cpp
index bf88463af51503724a1c74a39171515ec8eb4706..d31889c4b304b764044e52c8eb192f8abad1be05 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "radioboxbase.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #include "wx/radiobox.h"
 #endif //WX_PRECOMP
 
+#if wxUSE_TOOLTIPS
+    #include "wx/tooltip.h"
+#endif // wxUSE_TOOLTIPS
+
+#if wxUSE_HELP
+    #include "wx/cshelp.h"
+#endif
+
 // ============================================================================
 // implementation
 // ============================================================================
 
+void wxRadioBoxBase::SetMajorDim(unsigned int majorDim, long style)
+{
+    wxCHECK_RET( majorDim != 0, _T("major radiobox dimension can't be 0") );
+
+    m_majorDim = majorDim;
+
+    int minorDim = (GetCount() + m_majorDim - 1) / m_majorDim;
+
+    if ( style & wxRA_SPECIFY_COLS )
+    {
+        m_numCols = majorDim;
+        m_numRows = minorDim;
+    }
+    else // wxRA_SPECIFY_ROWS
+    {
+        m_numCols = minorDim;
+        m_numRows = majorDim;
+    }
+}
+
 int wxRadioBoxBase::GetNextItem(int item, wxDirection dir, long style) const
 {
     int count = GetCount(),
@@ -134,38 +158,137 @@ int wxRadioBoxBase::GetNextItem(int item, wxDirection dir, long style) const
     return item;
 }
 
-#if WXWIN_COMPATIBILITY_2_4
+#if wxUSE_TOOLTIPS
 
-// these functions are deprecated and don't do anything
-int wxRadioBoxBase::GetNumberOfRowsOrCols() const
+void wxRadioBoxBase::SetItemToolTip(unsigned int item, const wxString& text)
 {
-    return 1;
+    wxASSERT_MSG( item < GetCount(), _T("Invalid item index") );
+
+    // extend the array to have entries for all our items on first use
+    if ( !m_itemsTooltips )
+    {
+        m_itemsTooltips = new wxToolTipArray;
+        m_itemsTooltips->resize(GetCount());
+    }
+
+    wxToolTip *tooltip = (*m_itemsTooltips)[item];
+
+    bool changed = true;
+    if ( text.empty() )
+    {
+        if ( tooltip )
+        {
+            // delete the tooltip
+            delete tooltip;
+            tooltip = NULL;
+        }
+        else // nothing to do
+        {
+            changed = false;
+        }
+    }
+    else // non empty tooltip text
+    {
+        if ( tooltip )
+        {
+            // just change the existing tooltip text, don't change the tooltip
+            tooltip->SetTip(text);
+            changed = false;
+        }
+        else // no tooltip yet
+        {
+            // create the new one
+            tooltip = new wxToolTip(text);
+        }
+    }
+
+    if ( changed )
+    {
+        (*m_itemsTooltips)[item] = tooltip;
+        DoSetItemToolTip(item, tooltip);
+    }
 }
 
-void wxRadioBoxBase::SetNumberOfRowsOrCols(int WXUNUSED(n))
+void
+wxRadioBoxBase::DoSetItemToolTip(unsigned int WXUNUSED(item),
+                                 wxToolTip * WXUNUSED(tooltip))
 {
+    // per-item tooltips not implemented by default
 }
 
-#endif // WXWIN_COMPATIBILITY_2_4
+#endif // wxUSE_TOOLTIPS
+
+wxRadioBoxBase::~wxRadioBoxBase()
+{
+#if wxUSE_TOOLTIPS
+    if ( m_itemsTooltips )
+    {
+        const size_t n = m_itemsTooltips->size();
+        for ( size_t i = 0; i < n; i++ )
+            delete (*m_itemsTooltips)[i];
 
-#if WXWIN_COMPATIBILITY_2_2
+        delete m_itemsTooltips;
+    }
+#endif // wxUSE_TOOLTIPS
+}
 
-int wxRadioBoxBase::Number() const
+#if wxUSE_HELP
+
+// set helptext for a particular item
+void wxRadioBoxBase::SetItemHelpText(unsigned int n, const wxString& helpText)
 {
-    return GetCount();
+    wxCHECK_RET( n < GetCount(), _T("Invalid item index") );
+
+    if ( m_itemsHelpTexts.empty() )
+    {
+        // once-only initialization of the array: reserve space for all items
+        m_itemsHelpTexts.Add(wxEmptyString, GetCount());
+    }
+
+    m_itemsHelpTexts[n] = helpText;
 }
 
-wxString wxRadioBoxBase::GetLabel(int n) const
+// retrieve helptext for a particular item
+wxString wxRadioBoxBase::GetItemHelpText( unsigned int n ) const
 {
-    return GetString(n);
+    wxCHECK_MSG( n < GetCount(), wxEmptyString, _T("Invalid item index") );
+
+    return m_itemsHelpTexts.empty() ? wxString() : m_itemsHelpTexts[n];
 }
 
-void wxRadioBoxBase::SetLabel(int n, const wxString& label)
+// return help text for the item for which wxEVT_HELP was generated.
+wxString wxRadioBoxBase::DoGetHelpTextAtPoint(const wxWindow *derived,
+                                              const wxPoint& pt,
+                                              wxHelpEvent::Origin origin) const
 {
-    SetString(n, label);
+    const int item = origin == wxHelpEvent::Origin_HelpButton
+                        ? GetItemFromPoint(pt)
+                        : GetSelection();
+
+    if ( item != wxNOT_FOUND )
+    {
+        wxString text = GetItemHelpText(wx_static_cast(unsigned int, item));
+        if( !text.empty() )
+            return text;
+    }
+
+    return derived->wxWindowBase::GetHelpTextAtPoint(pt, origin);
 }
 
-#endif // WXWIN_COMPATIBILITY_2_2
+#endif // wxUSE_HELP
 
-#endif // wxUSE_RADIOBOX
+#if WXWIN_COMPATIBILITY_2_4
+
+// these functions are deprecated and don't do anything
+int wxRadioBoxBase::GetNumberOfRowsOrCols() const
+{
+    return 1;
+}
 
+void wxRadioBoxBase::SetNumberOfRowsOrCols(int WXUNUSED(n))
+{
+}
+
+#endif // WXWIN_COMPATIBILITY_2_4
+
+#endif // wxUSE_RADIOBOX