]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxComboPopup::FindItem() to help in deciding how SetValue() should change the...
authorJaakko Salli <jaakko.salli@dnainternet.net>
Mon, 20 Dec 2010 13:51:24 +0000 (13:51 +0000)
committerJaakko Salli <jaakko.salli@dnainternet.net>
Mon, 20 Dec 2010 13:51:24 +0000 (13:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66409 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/combo.h
include/wx/odcombo.h
interface/wx/combo.h
src/common/combocmn.cpp
src/generic/odcombo.cpp

index 0a9359ac36c3413a22961323f71397f36fd09e86..9c38cda2110ce1d1c2a144dd8988e25bbe144aa4 100644 (file)
@@ -774,6 +774,13 @@ public:
     // Gets displayed string representation of the value.
     virtual wxString GetStringValue() const = 0;
 
+    // Called to check if the popup - when an item container - actually
+    // has matching item. Case-sensitivity checking etc. is up to the
+    // implementation. If the found item matched the string, but is
+    // different, it should be written back to pItem. Default implementation
+    // always return true and does not alter trueItem.
+    virtual bool FindItem(const wxString& item, wxString* trueItem=NULL);
+
     // This is called to custom paint in the combo control itself (ie. not the popup).
     // Default implementation draws value as string.
     virtual void PaintComboControl( wxDC& dc, const wxRect& rect );
index 706d04e2ba73daa4e7ce48468b4df735b6a3db3e..73a954c250e8ff6fa8c4ef3eb4f2ae6835f31d48 100644 (file)
@@ -93,6 +93,7 @@ public:
     virtual void OnComboCharEvent( wxKeyEvent& event );
     virtual void OnComboDoubleClick();
     virtual bool LazyCreate();
+    virtual bool FindItem(const wxString& item, wxString* trueItem);
 
     // Item management
     void SetSelection( int item );
index 6574deed3400e2ac07cb24cec4b53b4efafa5413..af438253f389decacdac190bcaed321e40ab43f9 100644 (file)
@@ -41,6 +41,25 @@ public:
     */
     void Dismiss();
 
+    /**
+        Implement to customize matching of value string to an item container
+        entry.
+        
+        @param item
+            String entered, usually by user or from SetValue() call.
+            
+        @param trueItem
+            When item matches an entry, but the entry's string representation
+            is not exactly the same (case mismatch, for example), then the
+            true item string should be written back to here, if it is not
+            a NULL pointer.
+
+        @remarks
+            Default implementation always return true and does not alter
+            trueItem.
+    */
+    virtual bool FindItem(const wxString& item, wxString* trueItem=NULL);
+
     /**
         The derived class may implement this to return adjusted size for the
         popup control, according to the variables given.
@@ -86,7 +105,7 @@ public:
         Useful in conjunction with LazyCreate().
     */
     bool IsCreated() const;
-
+    
     /**
         The derived class may implement this to return @true if it wants to
         delay call to Create() until the popup is shown for the first time. It
index 53f8b308491a61415895236c138169a73c038a54..0b3a518a1b22ec7331f01bca321b574773c0c7a0 100644 (file)
@@ -590,6 +590,12 @@ void wxComboPopup::SetStringValue( const wxString& WXUNUSED(value) )
 {
 }
 
+bool wxComboPopup::FindItem(const wxString& WXUNUSED(item),
+                            wxString* WXUNUSED(trueItem))
+{
+    return true;
+}
+
 bool wxComboPopup::LazyCreate()
 {
     return false;
@@ -2575,12 +2581,26 @@ void wxComboCtrlBase::OnSetValue(const wxString& value)
     // to set the string value here (as well as sometimes in ShowPopup).
     if ( m_valueString != value )
     {
-        m_valueString = value;
+        bool found = true;
+        wxString trueValue = value;
+
+        // Conform to wxComboBox behavior: read-only control can only accept
+        // valid list items and empty string
+        if ( m_popupInterface && HasFlag(wxCB_READONLY) && value.length() )
+        {
+            found = m_popupInterface->FindItem(value,
+                                               &trueValue);
+        }
 
-        EnsurePopupControl();
+        if ( found )
+        {
+            m_valueString = trueValue;
 
-        if (m_popupInterface)
-            m_popupInterface->SetStringValue(value);
+            EnsurePopupControl();
+
+            if ( m_popupInterface )
+                m_popupInterface->SetStringValue(trueValue);
+        }
     }
 
     Refresh();
index 7321ec28d8807d4c7401d35c9b338134cccc43f5..da2fa7802765d745e3d751e458fa8d0e673639c7 100644 (file)
@@ -642,6 +642,16 @@ int wxVListBoxComboPopup::FindString(const wxString& s, bool bCase) const
     return m_strings.Index(s, bCase);
 }
 
+bool wxVListBoxComboPopup::FindItem(const wxString& item, wxString* trueItem)
+{
+    int idx = m_strings.Index(item, false);
+    if ( idx == wxNOT_FOUND )
+        return false;
+    if ( trueItem != NULL )
+        *trueItem = m_strings[idx];
+    return true;
+}
+
 unsigned int wxVListBoxComboPopup::GetCount() const
 {
     return m_strings.GetCount();