X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/68a9d9d04fa7637c4c66193448053d68a3467526..3d8704720a27b28532b9bec49f7df25b9f997d45:/src/mac/listbox.cpp

diff --git a/src/mac/listbox.cpp b/src/mac/listbox.cpp
index 8c2e856246..5c3dc855d0 100644
--- a/src/mac/listbox.cpp
+++ b/src/mac/listbox.cpp
@@ -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;
@@ -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) ;