void OnNew( wxCommandEvent &event );
     void OnChoiceFilter( wxCommandEvent &event );
     void OnTextEnter( wxCommandEvent &event );
+    void OnTextChange( wxCommandEvent &event );
     void OnCheck( wxCommandEvent &event );
 
     void HandleAction( const wxString &fn );
 
         EVT_LIST_ITEM_ACTIVATED(ID_LIST_CTRL, wxFileDialog::OnActivated)
         EVT_CHOICE(ID_CHOICE,wxFileDialog::OnChoiceFilter)
         EVT_TEXT_ENTER(ID_TEXT,wxFileDialog::OnTextEnter)
+        EVT_TEXT(ID_TEXT,wxFileDialog::OnTextChange)
         EVT_CHECKBOX(ID_CHECK,wxFileDialog::OnCheck)
 END_EVENT_TABLE()
 
     GetEventHandler()->ProcessEvent( cevent );
 }
 
+static bool ignoreChanges = FALSE;
+
+void wxFileDialog::OnTextChange( wxCommandEvent &WXUNUSED(event) )
+{
+    if (!ignoreChanges)
+    {
+        // Clear selections.  Otherwise when the user types in a value they may
+        // not get the file whose name they typed.
+        if (m_list->GetSelectedItemCount() > 0)
+        {
+           long item = m_list->GetNextItem(-1, wxLIST_NEXT_ALL,
+                wxLIST_STATE_SELECTED);
+            while ( item != -1 )
+           {
+                m_list->SetItemState(item,0, wxLIST_STATE_SELECTED);
+                item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
+           }
+        }
+    }
+}
+
 void wxFileDialog::OnSelected( wxListEvent &event )
 {
     wxString filename( event.m_item.m_text );
     dir += filename;
     if (wxDirExists(dir)) return;
 
+    ignoreChanges = TRUE;
     m_text->SetValue( filename );
+    ignoreChanges = FALSE;
 }
 
 void wxFileDialog::HandleAction( const wxString &fn )