]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/listbox.cpp
pen.h depends from brush.h in compat mode
[wxWidgets.git] / src / mac / carbon / listbox.cpp
index 35de39915c5470ee259b9accd6abe9bde51b2d3b..7a21c3bc8f461fa983c19c41564ec2d0880ba38a 100644 (file)
 #include "wx/listbox.h"
 
 #ifndef WX_PRECOMP
 #include "wx/listbox.h"
 
 #ifndef WX_PRECOMP
-    #include "wx/dynarray.h"
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/intl.h"
-    #include "wx/app.h"
     #include "wx/utils.h"
     #include "wx/utils.h"
-    #include "wx/button.h"
     #include "wx/settings.h"
     #include "wx/arrstr.h"
     #include "wx/settings.h"
     #include "wx/arrstr.h"
-    #include "wx/toplevel.h"
+    #include "wx/dcclient.h"
 #endif
 
 #endif
 
-IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems)
 
 BEGIN_EVENT_TABLE(wxListBox, wxControl)
 END_EVENT_TABLE()
 
 #include "wx/mac/uma.h"
 
 BEGIN_EVENT_TABLE(wxListBox, wxControl)
 END_EVENT_TABLE()
 
 #include "wx/mac/uma.h"
-#include "wx/dynarray.h"
 
 // ============================================================================
 // list box control implementation
 
 // ============================================================================
 // list box control implementation
@@ -62,7 +58,8 @@ bool wxListBox::Create(
 
 wxMacListControl* wxListBox::GetPeer() const
 {
 
 wxMacListControl* wxListBox::GetPeer() const
 {
-    return dynamic_cast<wxMacListControl*>(m_peer);
+    wxMacDataBrowserListControl *lb = wxDynamicCast(m_peer,wxMacDataBrowserListControl);
+    return lb ? wx_static_cast(wxMacListControl*,lb) : 0 ;
 }
 
 bool wxListBox::Create(
 }
 
 bool wxListBox::Create(
@@ -85,15 +82,15 @@ bool wxListBox::Create(
         return false;
 
     wxMacDataBrowserListControl* control = new wxMacDataBrowserListControl( this, pos, size, style );
         return false;
 
     wxMacDataBrowserListControl* control = new wxMacDataBrowserListControl( this, pos, size, style );
-    control->SetClientDataType( m_clientDataItemsType );
+    // TODO CHECK control->SetClientDataType( m_clientDataItemsType );
     m_peer = control;
 
     MacPostControlCreate( pos, size );
 
     m_peer = control;
 
     MacPostControlCreate( pos, size );
 
-    InsertItems( n, choices, 0 );
+    Append(n, choices);
 
    // Needed because it is a wxControlWithItems
 
    // Needed because it is a wxControlWithItems
-    SetBestSize( size );
+    SetInitialSize( size );
 
     return true;
 }
 
     return true;
 }
@@ -119,36 +116,29 @@ void wxListBox::EnsureVisible(int n)
     GetPeer()->MacScrollTo( n );
 }
 
     GetPeer()->MacScrollTo( n );
 }
 
-void wxListBox::Delete(unsigned int n)
+void wxListBox::DoDeleteOneItem(unsigned int n)
 {
     wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::Delete") );
 
     GetPeer()->MacDelete( n );
 }
 
 {
     wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::Delete") );
 
     GetPeer()->MacDelete( n );
 }
 
-int wxListBox::DoAppend(const wxString& item)
+int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items,
+                             unsigned int pos,
+                             void **clientData,
+                             wxClientDataType type)
 {
     InvalidateBestSize();
 
 {
     InvalidateBestSize();
 
-    return GetPeer()->MacAppend( item );
-}
-
-void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
-{
-    Clear();
-
-    unsigned int n = choices.GetCount();
-
-    for ( size_t i = 0; i < n; ++i )
+    GetPeer()->MacInsert( pos, items );
+    const unsigned int count = items.GetCount();
+    if ( clientData )
     {
     {
-        if ( clientData )
-        {
-            Append( choices[i], clientData[i] );
-        }
-        else
-            Append( choices[i] );
+        for (unsigned int i = 0; i < count; ++i)
+            AssignNewItemClientData( pos + i, clientData, i, type );
     }
 
     }
 
+    return pos + count - 1;
 }
 
 int wxListBox::FindString(const wxString& s, bool bCase) const
 }
 
 int wxListBox::FindString(const wxString& s, bool bCase) const
@@ -162,7 +152,7 @@ int wxListBox::FindString(const wxString& s, bool bCase) const
     return wxNOT_FOUND;
 }
 
     return wxNOT_FOUND;
 }
 
-void wxListBox::Clear()
+void wxListBox::DoClear()
 {
     FreeData();
 }
 {
     FreeData();
 }
@@ -191,22 +181,12 @@ void *wxListBox::DoGetItemClientData(unsigned int n) const
     return GetPeer()->MacGetClientData( n );
 }
 
     return GetPeer()->MacGetClientData( n );
 }
 
-wxClientData *wxListBox::DoGetItemClientObject(unsigned int n) const
-{
-    return (wxClientData*)DoGetItemClientData( n );
-}
-
 void wxListBox::DoSetItemClientData(unsigned int n, void *clientData)
 {
     wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetClientData") );
     GetPeer()->MacSetClientData( n , clientData);
 }
 
 void wxListBox::DoSetItemClientData(unsigned int n, void *clientData)
 {
     wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetClientData") );
     GetPeer()->MacSetClientData( n , clientData);
 }
 
-void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData)
-{
-    DoSetItemClientData(n, clientData);
-}
-
 // Return number of selections and an array of selected integers
 int wxListBox::GetSelections(wxArrayInt& aSelections) const
 {
 // Return number of selections and an array of selected integers
 int wxListBox::GetSelections(wxArrayInt& aSelections) const
 {
@@ -226,15 +206,6 @@ wxString wxListBox::GetString(unsigned int n) const
     return GetPeer()->MacGetString(n);
 }
 
     return GetPeer()->MacGetString(n);
 }
 
-void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
-{
-    wxCHECK_RET( IsValidInsert(pos), wxT("invalid index in wxListBox::InsertItems") );
-
-    InvalidateBestSize();
-
-    GetPeer()->MacInsert( pos, items );
-}
-
 void wxListBox::SetString(unsigned int n, const wxString& s)
 {
     GetPeer()->MacSetString( n, s );
 void wxListBox::SetString(unsigned int n, const wxString& s)
 {
     GetPeer()->MacSetString( n, s );
@@ -247,44 +218,17 @@ wxSize wxListBox::DoGetBestSize() const
     int wLine;
 
     {
     int wLine;
 
     {
-        wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef)MacGetTopLevelWindowRef() ) );
-
-        // TODO: clean this up
-        if ( m_font.Ok() )
-        {
-            ::TextFont( m_font.MacGetFontNum() );
-            ::TextSize( m_font.MacGetFontSize() );
-            ::TextFace( m_font.MacGetFontStyle() );
-        }
-        else
-        {
-            ::TextFont( kFontIDMonaco );
-            ::TextSize( 9 );
-            ::TextFace( 0 );
-        }
+        wxClientDC dc(const_cast<wxListBox*>(this));
+        dc.SetFont(GetFont());
 
         // Find the widest line
         for (unsigned int i = 0; i < GetCount(); i++)
         {
             wxString str( GetString( i ) );
 
 
         // Find the widest line
         for (unsigned int i = 0; i < GetCount(); i++)
         {
             wxString str( GetString( i ) );
 
-#if wxUSE_UNICODE
-            Point bounds = {0, 0};
-            SInt16 baseline;
-
-            // NB: what if m_font.Ok() == false ???
-            ::GetThemeTextDimensions(
-                wxMacCFStringHolder( str, m_font.GetEncoding() ),
-                kThemeCurrentPortFont,
-                kThemeStateActive,
-                false,
-                &bounds,
-                &baseline );
-            wLine = bounds.h;
-#else
-            wLine = ::TextWidth( str.c_str(), 0, str.length() );
-#endif
-
+            wxCoord width, height ;
+            dc.GetTextExtent( str , &width, &height);
+            wLine = width ;
             lbWidth = wxMax( lbWidth, wLine );
         }
 
             lbWidth = wxMax( lbWidth, wLine );
         }
 
@@ -293,7 +237,10 @@ wxSize wxListBox::DoGetBestSize() const
 
         // And just a bit more
         int cy = 12;
 
         // And just a bit more
         int cy = 12;
-        int cx = ::TextWidth( "X", 0, 1 );
+
+        wxCoord width, height ;
+        dc.GetTextExtent( wxT("XX") , &width, &height);
+        int cx = width ;
         lbWidth += cx;
 
         // don't make the listbox too tall (limit height to around 10 items)
         lbWidth += cx;
 
         // don't make the listbox too tall (limit height to around 10 items)
@@ -322,7 +269,7 @@ wxListBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
 
     attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
     attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX );
 
     attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
     attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX );
-    attr.font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
+    attr.font.MacCreateFromThemeFont(kThemeViewsFont);
 
     return attr;
 }
 
     return attr;
 }
@@ -341,12 +288,6 @@ int wxListBox::DoListHitTest(const wxPoint& inpoint) const
 
     wxPoint point = inpoint;
 
 
     wxPoint point = inpoint;
 
-    // interestingly enough 10.2 (and below?) have GetDataBrowserItemPartBounds
-    // giving root window coordinates but 10.3 and above give client coordinates
-    // so we only compare using root window coordinates on 10.3 and up
-    if ( UMAGetSystemVersion() < 0x1030 )
-        MacClientToRootWindow(&point.x, &point.y);
-
     // get column property ID (req. for call to itempartbounds)
     DataBrowserTableViewColumnID colId = 0;
     err = GetDataBrowserTableViewColumnProperty(m_peer->GetControlRef(), 0, &colId);
     // get column property ID (req. for call to itempartbounds)
     DataBrowserTableViewColumnID colId = 0;
     err = GetDataBrowserTableViewColumnProperty(m_peer->GetControlRef(), 0, &colId);
@@ -451,9 +392,9 @@ wxMacListBoxItem::~wxMacListBoxItem()
 
 void wxMacListBoxItem::Notification(wxMacDataItemBrowserControl *owner ,
     DataBrowserItemNotification message,
 
 void wxMacListBoxItem::Notification(wxMacDataItemBrowserControl *owner ,
     DataBrowserItemNotification message,
-    DataBrowserItemDataRef itemData ) const
+    DataBrowserItemDataRef WXUNUSED(itemData) ) const
 {
 {
-    wxMacDataBrowserListControl *lb = dynamic_cast<wxMacDataBrowserListControl*>(owner);
+    wxMacDataBrowserListControl *lb = wxDynamicCast(owner,wxMacDataBrowserListControl);
 
     // we want to depend on as little as possible to make sure tear-down of controls is safe
 
 
     // we want to depend on as little as possible to make sure tear-down of controls is safe
 
@@ -506,12 +447,14 @@ void wxMacListBoxItem::Notification(wxMacDataItemBrowserControl *owner ,
 
         // direct notification is not always having the listbox GetSelection()
         // having in synch with event, so use wxPostEvent instead
 
         // direct notification is not always having the listbox GetSelection()
         // having in synch with event, so use wxPostEvent instead
-        // list->GetEventHandler()->ProcessEvent(event);
+        // list->HandleWindowEvent(event);
 
         wxPostEvent( list->GetEventHandler(), event );
     }
 }
 
 
         wxPostEvent( list->GetEventHandler(), event );
     }
 }
 
+IMPLEMENT_DYNAMIC_CLASS( wxMacDataBrowserListControl , wxMacDataItemBrowserControl )
+
 wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxWindow *peer, const wxPoint& pos, const wxSize& size, long style)
     : wxMacDataItemBrowserControl( peer, pos, size, style )
 {
 wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxWindow *peer, const wxPoint& pos, const wxSize& size, long style)
     : wxMacDataItemBrowserControl( peer, pos, size, style )
 {
@@ -527,7 +470,7 @@ wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxWindow *peer, const
     }
     else if ( style & wxLB_EXTENDED )
     {
     }
     else if ( style & wxLB_EXTENDED )
     {
-        // default behaviour
+        options |= kDataBrowserCmdTogglesSelection;
     }
     else
     {
     }
     else
     {
@@ -555,9 +498,7 @@ wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxWindow *peer, const
     columnDesc.propertyDesc.propertyID = kTextColumnId;
     columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
     columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
     columnDesc.propertyDesc.propertyID = kTextColumnId;
     columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
     columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
-#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
     columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
     columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
-#endif
 
     verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
 
 
     verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
 
@@ -566,9 +507,7 @@ wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxWindow *peer, const
     columnDesc.propertyDesc.propertyID = kNumericOrderColumnId;
     columnDesc.propertyDesc.propertyType = kDataBrowserPropertyRelevanceRankPart;
     columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
     columnDesc.propertyDesc.propertyID = kNumericOrderColumnId;
     columnDesc.propertyDesc.propertyType = kDataBrowserPropertyRelevanceRankPart;
     columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
-#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
     columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
     columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
-#endif
 
     verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
 
 
     verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
 
@@ -636,8 +575,7 @@ static pascal void ListBoxDrawProc(
         // TODO: switch over to wxSystemSettingsNative::GetColour() when kThemeBrushSecondaryHighlightColor
         // is incorporated Panther DB starts using kThemeBrushSecondaryHighlightColor
         // for inactive browser highlighting
         // TODO: switch over to wxSystemSettingsNative::GetColour() when kThemeBrushSecondaryHighlightColor
         // is incorporated Panther DB starts using kThemeBrushSecondaryHighlightColor
         // for inactive browser highlighting
-        Gestalt( gestaltSystemVersion, &systemVersion );
-        if ( (systemVersion >= 0x00001030) && !IsControlActive( browser ) )
+        if ( !IsControlActive( browser ) )
             colorBrushID = kThemeBrushSecondaryHighlightColor;
         else
             colorBrushID = kThemeBrushPrimaryHighlightColor;
             colorBrushID = kThemeBrushSecondaryHighlightColor;
         else
             colorBrushID = kThemeBrushPrimaryHighlightColor;