]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/combobox.cpp
Update wxWebFileHandler to handle paths with fragments correctly, some backends pass...
[wxWidgets.git] / src / univ / combobox.cpp
index 8647a82611455383deeb4e03b30ac034924e0ab1..0cfcbcdd71bdd17a00901c79f254633e1b55c239 100644 (file)
 #include "wx/univ/inphand.h"
 #include "wx/univ/theme.h"
 
 #include "wx/univ/inphand.h"
 #include "wx/univ/theme.h"
 
+// ----------------------------------------------------------------------------
+// wxStdComboBoxInputHandler: allows the user to open/close the combo from kbd
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStdComboBoxInputHandler : public wxStdInputHandler
+{
+public:
+    wxStdComboBoxInputHandler(wxInputHandler *inphand);
+
+    virtual bool HandleKey(wxInputConsumer *consumer,
+                           const wxKeyEvent& event,
+                           bool pressed);
+};
 
 // ----------------------------------------------------------------------------
 // wxComboListBox is a listbox modified to be used as a popup window in a
 
 // ----------------------------------------------------------------------------
 // wxComboListBox is a listbox modified to be used as a popup window in a
@@ -79,6 +92,8 @@ protected:
     void OnLeftUp(wxMouseEvent& event);
 
 private:
     void OnLeftUp(wxMouseEvent& event);
 
 private:
+    friend class wxComboBox; // it accesses our DoGetItemClientData()
+
     DECLARE_EVENT_TABLE()
 };
 
     DECLARE_EVENT_TABLE()
 };
 
@@ -90,8 +105,6 @@ BEGIN_EVENT_TABLE(wxComboListBox, wxListBox)
     EVT_LEFT_UP(wxComboListBox::OnLeftUp)
 END_EVENT_TABLE()
 
     EVT_LEFT_UP(wxComboListBox::OnLeftUp)
 END_EVENT_TABLE()
 
-IMPLEMENT_DYNAMIC_CLASS2(wxComboBox, wxControl, wxComboCtrl)
-
 // ============================================================================
 // implementation
 // ============================================================================
 // ============================================================================
 // implementation
 // ============================================================================
@@ -109,8 +122,8 @@ bool wxComboListBox::Create(wxWindow* parent)
     if ( !wxListBox::Create(parent, wxID_ANY,
                             wxDefaultPosition, wxDefaultSize,
                             0, NULL,
     if ( !wxListBox::Create(parent, wxID_ANY,
                             wxDefaultPosition, wxDefaultSize,
                             0, NULL,
-                            wxBORDER_SIMPLE | wxLB_INT_HEIGHT |
-                            m_combo->GetWindowStyle() & wxCB_SORT ? wxLB_SORT : 0) )
+                            wxBORDER_SIMPLE |
+                            ( m_combo->GetWindowStyle() & wxCB_SORT ? wxLB_SORT : 0 ) ) )
         return false;
 
     // we don't react to the mouse events outside the window at all
         return false;
 
     // we don't react to the mouse events outside the window at all
@@ -130,8 +143,11 @@ wxString wxComboListBox::GetStringValue() const
 
 void wxComboListBox::SetStringValue(const wxString& value)
 {
 
 void wxComboListBox::SetStringValue(const wxString& value)
 {
-    if ( !value.empty() && (FindString(value) != wxNOT_FOUND) )
-        wxListBox::SetStringSelection(value);
+    if ( !value.empty() )
+    {
+        if (FindString(value) != wxNOT_FOUND)
+            wxListBox::SetStringSelection(value);
+    }
     else
         wxListBox::SetSelection(-1);
 }
     else
         wxListBox::SetSelection(-1);
 }
@@ -167,7 +183,7 @@ void wxComboListBox::OnLeftUp(wxMouseEvent& event)
     wxCommandEvent evt(wxEVT_COMMAND_COMBOBOX_SELECTED,m_combo->GetId());
     evt.SetInt(wxListBox::GetSelection());
     evt.SetEventObject(m_combo);
     wxCommandEvent evt(wxEVT_COMMAND_COMBOBOX_SELECTED,m_combo->GetId());
     evt.SetInt(wxListBox::GetSelection());
     evt.SetEventObject(m_combo);
-    m_combo->ProcessEvent(evt);
+    m_combo->ProcessWindowEvent(evt);
 
     event.Skip();
 }
 
     event.Skip();
 }
@@ -187,7 +203,7 @@ wxSize wxComboListBox::GetAdjustedSize(int minWidth,
 
 void wxComboBox::Init()
 {
 
 void wxComboBox::Init()
 {
-    m_lbox = (wxListBox *)NULL;
+    m_lbox = NULL;
 }
 
 wxComboBox::wxComboBox(wxWindow *parent,
 }
 
 wxComboBox::wxComboBox(wxWindow *parent,
@@ -255,14 +271,20 @@ wxComboBox::~wxComboBox()
 // wxComboBox methods forwarded to wxTextCtrl
 // ----------------------------------------------------------------------------
 
 // wxComboBox methods forwarded to wxTextCtrl
 // ----------------------------------------------------------------------------
 
-wxString wxComboBox::GetValue() const
+wxString wxComboBox::DoGetValue() const
 {
 {
-    return wxComboCtrl::GetValue();
+    return GetTextCtrl() ? GetTextCtrl()->GetValue() : wxString();
 }
 
 void wxComboBox::SetValue(const wxString& value)
 {
 }
 
 void wxComboBox::SetValue(const wxString& value)
 {
-    wxComboCtrl::SetValue(value);
+    if ( GetTextCtrl() )
+        GetTextCtrl()->SetValue(value);
+}
+
+void wxComboBox::WriteText(const wxString& value)
+{
+    if ( GetTextCtrl() ) GetTextCtrl()->WriteText(value);
 }
 
 void wxComboBox::Copy()
 }
 
 void wxComboBox::Copy()
@@ -319,6 +341,11 @@ void wxComboBox::SetSelection(long from, long to)
     if ( GetTextCtrl() ) GetTextCtrl()->SetSelection(from, to);
 }
 
     if ( GetTextCtrl() ) GetTextCtrl()->SetSelection(from, to);
 }
 
+void wxComboBox::GetSelection(long *from, long *to) const
+{
+    if ( GetTextCtrl() ) GetTextCtrl()->GetSelection(from, to);
+}
+
 void wxComboBox::SetEditable(bool editable)
 {
     if ( GetTextCtrl() ) GetTextCtrl()->SetEditable(editable);
 void wxComboBox::SetEditable(bool editable)
 {
     if ( GetTextCtrl() ) GetTextCtrl()->SetEditable(editable);
@@ -328,15 +355,15 @@ void wxComboBox::SetEditable(bool editable)
 // wxComboBox methods forwarded to wxListBox
 // ----------------------------------------------------------------------------
 
 // wxComboBox methods forwarded to wxListBox
 // ----------------------------------------------------------------------------
 
-void wxComboBox::Clear()
+void wxComboBox::DoClear()
 {
     GetLBox()->Clear();
     if ( GetTextCtrl() ) GetTextCtrl()->SetValue(wxEmptyString);
 }
 
 {
     GetLBox()->Clear();
     if ( GetTextCtrl() ) GetTextCtrl()->SetValue(wxEmptyString);
 }
 
-void wxComboBox::Delete(unsigned int n)
+void wxComboBox::DoDeleteOneItem(unsigned int n)
 {
 {
-    wxCHECK_RET( IsValid(n), _T("invalid index in wxComboBox::Delete") );
+    wxCHECK_RET( IsValid(n), wxT("invalid index in wxComboBox::Delete") );
 
     if (GetSelection() == (int)n)
         if ( GetTextCtrl() ) GetTextCtrl()->SetValue(wxEmptyString);
 
     if (GetSelection() == (int)n)
         if ( GetTextCtrl() ) GetTextCtrl()->SetValue(wxEmptyString);
@@ -351,14 +378,14 @@ unsigned int wxComboBox::GetCount() const
 
 wxString wxComboBox::GetString(unsigned int n) const
 {
 
 wxString wxComboBox::GetString(unsigned int n) const
 {
-    wxCHECK_MSG( IsValid(n), wxEmptyString, _T("invalid index in wxComboBox::GetString") );
+    wxCHECK_MSG( IsValid(n), wxEmptyString, wxT("invalid index in wxComboBox::GetString") );
 
     return GetLBox()->GetString(n);
 }
 
 void wxComboBox::SetString(unsigned int n, const wxString& s)
 {
 
     return GetLBox()->GetString(n);
 }
 
 void wxComboBox::SetString(unsigned int n, const wxString& s)
 {
-    wxCHECK_RET( IsValid(n), _T("invalid index in wxComboBox::SetString") );
+    wxCHECK_RET( IsValid(n), wxT("invalid index in wxComboBox::SetString") );
 
     GetLBox()->SetString(n, s);
 }
 
     GetLBox()->SetString(n, s);
 }
@@ -370,15 +397,20 @@ int wxComboBox::FindString(const wxString& s, bool bCase) const
 
 void wxComboBox::SetSelection(int n)
 {
 
 void wxComboBox::SetSelection(int n)
 {
-    wxCHECK_RET( IsValid(n), _T("invalid index in wxComboBox::Select") );
+    wxCHECK_RET( (n == wxNOT_FOUND || IsValid(n)), wxT("invalid index in wxComboBox::Select") );
 
     GetLBox()->SetSelection(n);
 
     GetLBox()->SetSelection(n);
-    if ( GetTextCtrl() ) GetTextCtrl()->SetValue(GetLBox()->GetString(n));
+
+    wxString str;
+    if ( n != wxNOT_FOUND )
+        str = GetLBox()->GetString(n);
+
+    SetText(str);
 }
 
 int wxComboBox::GetSelection() const
 {
 }
 
 int wxComboBox::GetSelection() const
 {
-#if 1 // FIXME:: What is the correct behavior?
+#if 1 // FIXME:: What is the correct behaviour?
     // if the current value isn't one of the listbox strings, return -1
     return GetLBox()->GetSelection();
 #else
     // if the current value isn't one of the listbox strings, return -1
     return GetLBox()->GetSelection();
 #else
@@ -389,41 +421,36 @@ int wxComboBox::GetSelection() const
 #endif
 }
 
 #endif
 }
 
-int wxComboBox::DoAppend(const wxString& item)
+wxString wxComboBox::GetStringSelection() const
 {
 {
-    return GetLBox()->Append(item);
+    return GetLBox()->GetStringSelection();
 }
 
 }
 
-int wxComboBox::DoInsert(const wxString& item, unsigned int pos)
+wxClientDataType wxComboBox::GetClientDataType() const
 {
 {
-    wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
-    wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index"));
-
-    if (pos == GetCount())
-        return DoAppend(item);
-
-    GetLBox()->Insert(item, pos);
-    return pos;
+    return GetLBox()->GetClientDataType();
 }
 
 }
 
-void wxComboBox::DoSetItemClientData(unsigned int n, void* clientData)
+void wxComboBox::SetClientDataType(wxClientDataType clientDataItemsType)
 {
 {
-    GetLBox()->SetClientData(n, clientData);
+    GetLBox()->SetClientDataType(clientDataItemsType);
 }
 
 }
 
-void *wxComboBox::DoGetItemClientData(unsigned int n) const
+int wxComboBox::DoInsertItems(const wxArrayStringsAdapter & items,
+                              unsigned int pos,
+                              void **clientData, wxClientDataType type)
 {
 {
-    return GetLBox()->GetClientData(n);
+    return GetLBox()->DoInsertItems(items, pos, clientData, type);
 }
 
 }
 
-void wxComboBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData)
+void wxComboBox::DoSetItemClientData(unsigned int n, void* clientData)
 {
 {
-    GetLBox()->SetClientObject(n, clientData);
+    GetLBox()->DoSetItemClientData(n, clientData);
 }
 
 }
 
-wxClientData* wxComboBox::DoGetItemClientObject(unsigned int n) const
+void *wxComboBox::DoGetItemClientData(unsigned int n) const
 {
 {
-    return GetLBox()->GetClientObject(n);
+    return GetLBox()->DoGetItemClientData(n);
 }
 
 bool wxComboBox::IsEditable() const
 }
 
 bool wxComboBox::IsEditable() const
@@ -527,5 +554,12 @@ bool wxStdComboBoxInputHandler::HandleKey(wxInputConsumer *consumer,
     return wxStdInputHandler::HandleKey(consumer, event, pressed);
 }
 
     return wxStdInputHandler::HandleKey(consumer, event, pressed);
 }
 
+/* static */
+wxInputHandler *wxComboBox::GetStdInputHandler(wxInputHandler *handlerDef)
+{
+    static wxStdComboBoxInputHandler s_handler(handlerDef);
+
+    return &s_handler;
+}
 
 #endif // wxUSE_COMBOBOX
 
 #endif // wxUSE_COMBOBOX