]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/listbox.cpp
switching to safe yields, because we got into loops when handling print document...
[wxWidgets.git] / src / mac / carbon / listbox.cpp
index 8aa10ed2aba9f81ce1d0e3887e0353696aa3e71f..5c3dc855d0687f45cd9614cd1fe2db37328014b5 100644 (file)
@@ -105,16 +105,34 @@ static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect
             ClipRect( drawRect );
             EraseRect( drawRect );
 
+                       wxFontRefData * font = (wxFontRefData*) list->GetFont().GetRefData() ;
+
+                       if ( font )
+                       {
+                               ::TextFont( font->m_macFontNum ) ;
+                               ::TextSize( short(font->m_macFontSize) ) ;
+                               ::TextFace( font->m_macFontStyle ) ;
+                       }
+                       else
+                       {
+                       ::TextFont( kFontIDMonaco ) ;
+                       ::TextSize( 9  );
+                       ::TextFace( 0 ) ;
+                       }
+
 #if TARGET_CARBON
                bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
 
                if ( useDrawThemeText )
                {
                    Rect frame = { drawRect->top, drawRect->left + 4,
-                                  drawRect->top + kwxMacListItemHeight, drawRect->right} ;
-                CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text.c_str(), text.Length(), CFStringGetSystemEncoding(), false ) ;
+                                  drawRect->top + kwxMacListItemHeight, drawRect->right + 10000 } ;
+                CFStringRef sString = CFStringCreateWithBytes( NULL , (UInt8*) text.c_str(), text.Length(), CFStringGetSystemEncoding(), false ) ;
+                CFMutableStringRef mString = CFStringCreateMutableCopy( NULL , 0 , sString ) ;
+                   CFRelease( sString ) ;
+                               ::TruncateThemeText( mString , kThemeCurrentPortFont, kThemeStateActive, drawRect->right - drawRect->left , truncEnd , NULL ) ;
                        ::DrawThemeTextBox( mString,
-                                                               kThemeViewsFont,
+                                                               kThemeCurrentPortFont,
                                                                kThemeStateActive,
                                                                false,
                                                                &frame,
@@ -126,9 +144,6 @@ static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect
 #endif
                    {
                        MoveTo(drawRect->left + 4 , drawRect->top + 10 );
-                       ::TextFont( kFontIDMonaco ) ;
-                       ::TextSize( 9  );
-                       ::TextFace( 0 ) ;
                        DrawText(text, 0 , text.Length());
                    }
 
@@ -206,6 +221,18 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
     }
         listDef.u.userProc = macListDefUPP ;
 
+    Str255 fontName ;
+    SInt16 fontSize ;
+    Style fontStyle ;
+#if TARGET_CARBON
+       GetThemeFont(kThemeViewsFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+#else
+       GetFontName( kFontIDMonaco , fontName ) ;
+       fontSize = 9 ;
+       fontStyle = normal ;
+#endif 
+    CopyPascalStringToC( fontName , (char*) fontName ) ;
+    SetFont( wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , fontName ) ) ;
 #if TARGET_CARBON
     Size asize;
 
@@ -255,17 +282,17 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
     }
     else
     {
-        options = lOnlyOne ;
+        options = (OptionBits) lOnlyOne ;
     }
     SetListSelectionFlags((ListHandle)m_macList, options);
 
-    MacPostControlCreate() ;
-
     for ( int i = 0 ; i < n ; i++ )
     {
         Append( choices[i] ) ;
     }
 
+    MacPostControlCreate() ;
+
     LSetDrawingMode( true , (ListHandle)m_macList ) ;
 
     return TRUE;
@@ -544,9 +571,9 @@ void wxListBox::DoSetItemClientData(int N, void *Client_data)
         wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes"));
     }
 #endif // wxUSE_OWNER_DRAWN
-    wxASSERT_MSG( m_dataArray.GetCount() >= N , "invalid client_data array" ) ;
+    wxASSERT_MSG( m_dataArray.GetCount() >= (size_t) N , "invalid client_data array" ) ;
 
-    if ( m_dataArray.GetCount() > N )
+    if ( m_dataArray.GetCount() > (size_t) N )
     {
         m_dataArray[N] = (char*) Client_data ;
     }
@@ -616,7 +643,48 @@ void wxListBox::SetString(int N, const wxString& s)
 
 wxSize wxListBox::DoGetBestSize() const
 {
-    return wxSize(100, 100);
+    int lbWidth = 100;  // some defaults
+    int lbHeight = 110;
+    int wLine;
+
+       {
+               wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef) MacGetRootWindow() ) ) ; 
+
+               wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
+
+               if ( font )
+               {
+                       ::TextFont( font->m_macFontNum ) ;
+                       ::TextSize( short(font->m_macFontSize) ) ;
+                       ::TextFace( font->m_macFontStyle ) ;
+               }
+               else
+               {
+               ::TextFont( kFontIDMonaco ) ;
+               ::TextSize( 9  );
+               ::TextFace( 0 ) ;
+               }
+
+           // Find the widest line
+           for(int i = 0; i < GetCount(); i++) {
+               wxString str(GetString(i));
+               wLine = ::TextWidth( str.c_str() , 0 , str.Length() ) ;
+               lbWidth = wxMax(lbWidth, wLine);
+           }
+
+           // Add room for the scrollbar
+           lbWidth += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
+
+           // And just a bit more
+           int cy = 12 ;
+           int cx = ::TextWidth( "X" , 0 , 1 ) ;
+           lbWidth += cx ;
+           
+           // don't make the listbox too tall (limit height to around 10 items) but don't
+           // make it too small neither
+           lbHeight = (cy+4) * wxMin(wxMax(GetCount(), 3), 10);
+       }
+    return wxSize(lbWidth, lbHeight);
 }
 
 int wxListBox::GetCount() const
@@ -661,6 +729,7 @@ wxOwnerDrawn *wxListBox::CreateItem(size_t n)
 // list box control implementation
 // ============================================================================
 
+/*
 void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon)
 {
     wxListBox*          list;
@@ -675,7 +744,7 @@ void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refC
     DrawText(text, 0 , text.Length());
 
 }
-
+*/
 void wxListBox::MacDelete( int N )
 {
     LDelRow( 1 , N , (ListHandle)m_macList) ;
@@ -815,12 +884,13 @@ void wxListBox::MacSetRedraw( bool doDraw )
 void wxListBox::MacDoClick()
 {
     wxArrayInt aSelections;
-    int n, count = GetSelections(aSelections);
+    int n ;
+    size_t count = GetSelections(aSelections);
 
     if ( count == m_selectionPreImage.GetCount() )
     {
         bool hasChanged = false ;
-        for ( int i = 0 ; i < count ; ++i )
+        for ( size_t i = 0 ; i < count ; ++i )
         {
             if ( aSelections[i] != m_selectionPreImage[i] )
             {
@@ -865,8 +935,6 @@ void wxListBox::MacDoDoubleClick()
        GetEventHandler()->ProcessEvent(event) ;
 }
 
-static long sLastTypeIn = 0 ;
-
 void wxListBox::OnChar(wxKeyEvent& event)
 {
     if ( event.KeyCode() == WXK_RETURN || event.KeyCode() == WXK_NUMPAD_ENTER)