]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/listbox.cpp
wxButtons no longer leave junk on dialogs when moved.
[wxWidgets.git] / src / mac / listbox.cpp
index a5ef8163b078a08b3b70e132c91c205cba82401d..557d05f213a40aeff08bf5d6d8f4dba045777fc9 100644 (file)
@@ -26,7 +26,8 @@
   IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
 
 BEGIN_EVENT_TABLE(wxListBox, wxControl)
-    EVT_SIZE( wxListBox::OnSize ) 
+       EVT_SIZE( wxListBox::OnSize ) 
+       EVT_CHAR( wxListBox::OnChar )
 END_EVENT_TABLE()
 #endif
 
@@ -64,7 +65,6 @@ static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect
                                      Cell cell, short dataOffset, short dataLength,
                                      ListHandle listHandle )
 {
-    FontInfo fontInfo;
     GrafPtr savePort;
     GrafPtr grafPtr;
     RgnHandle savedClipRegion;
@@ -195,7 +195,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
 #else
 
     long    result ;
-
+    wxStAppResource resload ;
     m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false ,
                   kwxMacListWithVerticalScrollbar , 0 , 0, 
                   kControlListBoxProc , (long) this ) ;
@@ -320,7 +320,7 @@ void wxListBox::Delete(int N)
         delete GetClientObject(N);
     }
 #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
-    m_stringArray.Remove( N ) ;
+    m_stringArray.RemoveAt( N ) ;
     m_dataArray.RemoveAt( N ) ;
     m_noItems --;
     
@@ -428,6 +428,7 @@ int wxListBox::FindString(const wxString& st) const
         }
         if ( s.Left(1) == "*" && s.Length() > 1 )
         {
+            s = st ;
             s.MakeLower() ;
             for ( int i = 0 ; i < m_noItems ; ++i )
             {
@@ -681,10 +682,10 @@ void wxListBox::MacSetSelection( int n , bool select )
     Cell cell = { 0 , 0 } ;
     if ( ! (m_windowStyle & wxLB_MULTIPLE) )
     {
-    if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )
-    {
-        LSetSelect( false , cell , (ListHandle)m_macList ) ;
-    }
+        if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )
+        {
+            LSetSelect( false , cell , (ListHandle)m_macList ) ;
+        }
     }
     
     cell.v = n ;
@@ -832,5 +833,60 @@ void wxListBox::MacDoDoubleClick()
 {
     wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
     event.SetEventObject( this );
-    GetEventHandler()->ProcessEvent(event) ; 
+       GetEventHandler()->ProcessEvent(event) ; 
 }
+
+static long sLastTypeIn = 0 ;
+
+void wxListBox::OnChar(wxKeyEvent& event)
+{
+       EventRecord *ev = (EventRecord*) (wxTheApp->MacGetCurrentEvent() ) ;
+       short keycode ;
+       short keychar ;
+       keychar = short(ev->message & charCodeMask);
+       keycode = short(ev->message & keyCodeMask) >> 8 ;
+       if ( event.KeyCode() == WXK_SPACE )
+       {
+        wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
+        event.SetEventObject( this );
+
+        wxArrayInt aSelections;
+        int n, count = GetSelections(aSelections);
+        if ( count > 0 )
+        {
+               n = aSelections[0];
+               if ( HasClientObjectData() )
+                  event.SetClientObject( GetClientObject(n) );
+              else if ( HasClientUntypedData() )
+                  event.SetClientData( GetClientData(n) );
+              event.SetString( GetString(n) );
+        }
+        else
+        {
+             n = -1;
+        }
+
+        event.m_commandInt = n;
+
+        GetEventHandler()->ProcessEvent(event);
+       }
+       else if ( event.KeyCode() == WXK_DOWN || event.KeyCode() == WXK_UP )
+       {
+         ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ;
+       } 
+       else
+       {
+         if ( ev->when > m_lastTypeIn + 60 )
+         {
+           m_typeIn = "" ;
+         }
+         m_lastTypeIn = ev->when ;
+         m_typeIn += (char) event.KeyCode() ;
+         int line = FindString("*"+m_typeIn+"*") ;
+         if ( line >= 0 )
+         {
+           SetSelection(line) ;
+         }
+       }
+}
+