]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/utils.cpp
cleanup
[wxWidgets.git] / src / mac / carbon / utils.cpp
index 119e67de76d74476e17b8d4e7f48f7d0f01453a7..b39f646238f2f97b1e580cf6051db51b49cd9976 100644 (file)
     #include <TextCommon.h>
     #include <TextEncodingConverter.h>
 #endif
+
+#include "wx/mac/private/timer.h"
 #endif // wxUSE_GUI
 
+#include "wx/evtloop.h"
 #include "wx/mac/private.h"
 
 #if defined(__MWERKS__) && wxUSE_UNICODE
@@ -303,7 +306,13 @@ WXDLLEXPORT bool wxGetEnv(const wxString& var, wxString *value)
 }
 
 // set the env var name to the given value, return true on success
-WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxChar *value)
+WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxString& value)
+{
+    // TODO : under classic there is no environement support, under X yes
+    return false;
+}
+
+WXDLLEXPORT bool wxUnsetEnv(const wxString& var)
 {
     // TODO : under classic there is no environement support, under X yes
     return false;
@@ -378,84 +387,16 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
     return wxPORT_MAC;
 }
 
-// Reading and writing resources (eg WIN.INI, .Xdefaults)
-#if wxUSE_RESOURCES
-bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file)
-{
-    // TODO
-    return false;
-}
-
-bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file)
-{
-    wxString buf;
-    buf.Printf(wxT("%.4f"), value);
-
-    return wxWriteResource(section, entry, buf, file);
-}
-
-bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file)
-{
-    wxString buf;
-    buf.Printf(wxT("%ld"), value);
-
-    return wxWriteResource(section, entry, buf, file);
-}
-
-bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file)
-{
-    wxString buf;
-    buf.Printf(wxT("%d"), value);
-
-    return wxWriteResource(section, entry, buf, file);
-}
-
-bool wxGetResource(const wxString& section, const wxString& entry, char **value, const wxString& file)
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
-    // TODO
-    return false;
+    return new wxEventLoop;
 }
 
-bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file)
+wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
 {
-    char *s = NULL;
-    bool succ = wxGetResource(section, entry, (char **)&s, file);
-    if (succ)
-    {
-        *value = (float)strtod(s, NULL);
-        delete[] s;
-    }
-
-    return succ;
+    return new wxCarbonTimerImpl(timer);
 }
 
-bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file)
-{
-    char *s = NULL;
-    bool succ = wxGetResource(section, entry, (char **)&s, file);
-    if (succ)
-    {
-        *value = strtol(s, NULL, 10);
-        delete[] s;
-    }
-
-    return succ;
-}
-
-bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file)
-{
-    char *s = NULL;
-    bool succ = wxGetResource(section, entry, (char **)&s, file);
-    if (succ)
-    {
-        *value = (int)strtol(s, NULL, 10);
-        delete[] s;
-    }
-
-    return succ;
-}
-#endif // wxUSE_RESOURCES
-
 int gs_wxBusyCursorCount = 0;
 extern wxCursor    gMacCurrentCursor;
 wxCursor        gMacStoredActiveCursor;
@@ -522,7 +463,7 @@ wxString wxMacFindFolder( short        vol,
 
 // Check whether this window wants to process messages, e.g. Stop button
 // in long calculations.
-bool wxCheckForInterrupt(wxWindow *wnd)
+bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd))
 {
     // TODO
     return false;
@@ -569,13 +510,12 @@ int wxDisplayDepth()
 void wxDisplaySize(int *width, int *height)
 {
 #if wxMAC_USE_CORE_GRAPHICS
-    CGRect bounds ;
     // TODO adapt for multi-displays
-    bounds = CGDisplayBounds(CGMainDisplayID());
+    CGRect bounds = CGDisplayBounds(CGMainDisplayID());
     if ( width )
-        *width = bounds.size.width ;
+        *width = (int)bounds.size.width ;
     if ( height )
-        *height = bounds.size.height;
+        *height = (int)bounds.size.height;
 #else
     BitMap screenBits;
     GetQDGlobalsScreenBits( &screenBits );
@@ -649,10 +589,10 @@ wxString wxGetOsDescription()
 }
 
 #ifndef __DARWIN__
-wxChar *wxGetUserHome (const wxString& user)
+wxString wxGetUserHome (const wxString& user)
 {
     // TODO
-    return NULL;
+    return wxString();
 }
 
 bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspaceSize_t *pFree)
@@ -822,6 +762,13 @@ OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType in
 // Control Access Support
 // ----------------------------------------------------------------------------
 
+IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject )
+
+wxMacControl::wxMacControl() 
+{
+    Init();
+}
+
 wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl )
 {
     Init();
@@ -857,12 +804,14 @@ void wxMacControl::Init()
 
 void wxMacControl::Dispose()
 {
+    wxASSERT_MSG( m_controlRef != NULL , wxT("Control Handle already NULL, Dispose called twice ?") );
     wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
 
-    CFIndex count = CFGetRetainCount( m_controlRef ) ;
-    wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in Dispose") );
-
-    ::DisposeControl( m_controlRef );
+    // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
+    // we can have situations when being embedded, where the control gets deleted behind our back, so only
+    // CFRelease if we are safe
+    if ( IsValidControlHandle(m_controlRef) )
+        CFRelease(m_controlRef);
     m_controlRef = NULL;
 }
 
@@ -983,7 +932,7 @@ bool wxMacControl::NeedsFocusRect() const
     return m_needsFocusRect;
 }
 
-void wxMacControl::VisibilityChanged(bool shown)
+void wxMacControl::VisibilityChanged(bool WXUNUSED(shown))
 {
 }
 
@@ -994,6 +943,7 @@ void wxMacControl::SuperChangedPosition()
 void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
 {
     m_font = font;
+#ifndef __LP64__
     ControlFontStyleRec fontStyle;
     if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
     {
@@ -1044,6 +994,7 @@ void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , l
     }
 
     ::SetControlFontStyle( m_controlRef , &fontStyle );
+#endif
 }
 
 void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) )
@@ -1288,13 +1239,15 @@ wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control)
 // basing on DataBrowserItemIDs
 //
 
+IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl , wxMacControl )
+
 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
     ControlRef browser,
     DataBrowserItemID itemID,
     DataBrowserItemNotification message,
     DataBrowserItemDataRef itemData )
 {
-    wxMacDataBrowserControl* ctl = dynamic_cast<wxMacDataBrowserControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
+    wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
     if ( ctl != 0 )
     {
         ctl->ItemNotification(itemID, message, itemData);
@@ -1309,7 +1262,7 @@ pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
     Boolean changeValue )
 {
     OSStatus err = errDataBrowserPropertyNotSupported;
-    wxMacDataBrowserControl* ctl = dynamic_cast<wxMacDataBrowserControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
+    wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
     if ( ctl != 0 )
     {
         err = ctl->GetSetItemData(itemID, property, itemData, changeValue);
@@ -1323,7 +1276,7 @@ pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc(
     DataBrowserItemID itemTwoID,
     DataBrowserPropertyID sortProperty)
 {
-    wxMacDataBrowserControl* ctl = dynamic_cast<wxMacDataBrowserControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
+    wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
     if ( ctl != 0 )
     {
         return ctl->CompareItems(itemOneID, itemTwoID, sortProperty);
@@ -1335,7 +1288,11 @@ DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL;
 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL;
 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP = NULL;
 
-wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer, const wxPoint& pos, const wxSize& size, long style) : wxMacControl( peer )
+wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer,
+                                                  const wxPoint& pos,
+                                                  const wxSize& size,
+                                                  long WXUNUSED(style))
+                       : wxMacControl( peer )
 {
     Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
     OSStatus err = ::CreateDataBrowserControl(
@@ -1395,12 +1352,12 @@ OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *colu
 }
 
 OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){
-    return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id ); 
+    return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id );
 }
 
 OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position )
 {
-    DataBrowserTableViewColumnID id; 
+    DataBrowserTableViewColumnID id;
     GetColumnIDFromIndex( position, &id );
     return RemoveDataBrowserTableViewColumn( m_controlRef, id );
 }
@@ -1625,6 +1582,7 @@ OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID pro
 wxMacDataItem::wxMacDataItem()
 {
     m_data = NULL;
+
     m_order = 0;
     m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
 }
@@ -1661,7 +1619,7 @@ short wxMacDataItem::GetColumn()
 void wxMacDataItem::SetColumn( short col )
 {
     m_colId = col;
-} 
+}
 
 void wxMacDataItem::SetLabel( const wxString& str)
 {
@@ -1674,24 +1632,24 @@ const wxString& wxMacDataItem::GetLabel() const
     return m_label;
 }
 
-bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *owner ,
+bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
     const wxMacDataItem* rhs,
     DataBrowserPropertyID sortProperty) const
 {
-    const wxMacDataItem* otherItem = dynamic_cast<const wxMacDataItem*>(rhs);
+    const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs);
     bool retval = false;
-    
+
     if ( sortProperty == m_colId ){
         retval = m_label.CmpNoCase( otherItem->m_label) < 0;
     }
-    
+
     else if ( sortProperty == kNumericOrderColumnId )
         retval = m_order < otherItem->m_order;
 
     return retval;
 }
 
-OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *owner ,
+OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *WXUNUSED(owner) ,
     DataBrowserPropertyID property,
     DataBrowserItemDataRef itemData,
     bool changeValue )
@@ -1723,12 +1681,13 @@ OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *owner ,
     return err;
 }
 
-void wxMacDataItem::Notification(wxMacDataItemBrowserControl *owner ,
-    DataBrowserItemNotification message,
-    DataBrowserItemDataRef itemData ) const
+void wxMacDataItem::Notification(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
+    DataBrowserItemNotification WXUNUSED(message),
+    DataBrowserItemDataRef WXUNUSED(itemData) ) const
 {
 }
 
+IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl )
 
 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) :
     wxMacDataBrowserControl( peer, pos, size, style )
@@ -1806,7 +1765,7 @@ OSStatus wxMacDataItemBrowserControl::GetSetItemData(
             // right now default behaviour on these
             break;
         default :
-            
+
             if ( item != NULL ){
                 err = item->GetSetData( this, property , itemData , changeValue );
             }
@@ -1843,7 +1802,7 @@ unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* cont
     return numItems;
 }
 
-unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container, 
+unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container,
         bool recurse ) const
 {
     return GetItemCount( container, recurse, kDataBrowserItemIsSelected );
@@ -1914,11 +1873,11 @@ void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyTyp
     columnDesc.headerBtnDesc.btnFontStyle.flags =
         kControlUseFontMask | kControlUseJustMask;
 
-    columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly; 
+    columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
     columnDesc.headerBtnDesc.btnFontStyle.just = just;
     columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
     columnDesc.headerBtnDesc.btnFontStyle.style = normal;
-    
+
     // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
     // defined for other modes?
     wxFontEncoding enc;
@@ -1928,14 +1887,17 @@ void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyTyp
         enc = wxLocale::GetSystemEncoding();
     wxMacCFStringHolder cfTitle;
     cfTitle.Assign( title, enc );
-    columnDesc.headerBtnDesc.titleString = cfTitle; 
+    columnDesc.headerBtnDesc.titleString = cfTitle;
 
     columnDesc.headerBtnDesc.minimumWidth = 0;
     columnDesc.headerBtnDesc.maximumWidth = 30000;
 
     columnDesc.propertyDesc.propertyID = (kMinColumnId + colId);
     columnDesc.propertyDesc.propertyType = colType;
-    columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn | kDataBrowserListViewTypeSelectColumn; 
+    columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+    columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
+#endif
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
     columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
 #endif
@@ -2064,36 +2026,9 @@ void wxMacDataItemBrowserControl::MacDelete( unsigned int n )
     RemoveItem( wxMacDataBrowserRootContainer, item );
 }
 
-void wxMacDataItemBrowserControl::MacInsert( unsigned int n, const wxString& text, int column )
-{
-    wxMacDataItem* newItem = CreateItem();
-    newItem->SetLabel( text );
-    if ( column != -1 )
-        newItem->SetColumn( kMinColumnId + column );
-
-    if ( m_sortOrder == SortOrder_None )
-    {
-        // increase the order of the lines to be shifted
-        unsigned int lines = MacGetCount();
-        for ( unsigned int i = n; i < lines; ++i)
-        {
-            wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
-            iter->SetOrder( iter->GetOrder() + 1 );
-        }
-
-        SInt32 frontLineOrder = 0;
-        if ( n > 0 )
-        {
-            wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
-            frontLineOrder = iter->GetOrder();
-        }
-        newItem->SetOrder( frontLineOrder + 1 );
-    }
-
-    AddItem( wxMacDataBrowserRootContainer, newItem );
-}
-
-void wxMacDataItemBrowserControl::MacInsert( unsigned int n, const wxArrayString& items, int column )
+void wxMacDataItemBrowserControl::MacInsert( unsigned int n,
+                                             const wxArrayStringsAdapter& items,
+                                             int column )
 {
     size_t itemsCount = items.GetCount();
     if ( itemsCount == 0 )
@@ -2126,7 +2061,7 @@ void wxMacDataItemBrowserControl::MacInsert( unsigned int n, const wxArrayString
         item->SetLabel( items[i]);
         if ( column != -1 )
             item->SetColumn( kMinColumnId + column );
-        
+
         if ( m_sortOrder == SortOrder_None )
             item->SetOrder( frontLineOrder + 1 + i );
 
@@ -2248,7 +2183,15 @@ void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n) const
 
 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n )
 {
-    RevealItem( GetItemFromLine( n) , kDataBrowserRevealWithoutSelecting );
+    UInt32 top , left ;
+    GetScrollPosition( &top , &left ) ;
+    wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
+
+    UInt16 height ;
+    GetRowHeight( (DataBrowserItemID) item , &height ) ;
+    SetScrollPosition( n * ((UInt32)height) , left ) ;
+
+    RevealItem( item , kDataBrowserRevealWithoutSelecting );
 }
 
 
@@ -2354,12 +2297,12 @@ wxMacPortSaver::~wxMacPortSaver()
 
 void wxMacGlobalToLocal( WindowRef window , Point*pt )
 {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4 
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
     HIPoint p = CGPointMake( pt->h, pt->v );
-       HIViewRef contentView ;
-       // TODO check toolbar offset 
+    HIViewRef contentView ;
+    // TODO check toolbar offset
     HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
-       HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
+    HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
     pt->h = p.x;
     pt->v = p.y;
 #else
@@ -2369,10 +2312,10 @@ void wxMacGlobalToLocal( WindowRef window , Point*pt )
 
 void wxMacLocalToGlobal( WindowRef window , Point*pt )
 {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4 
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
     HIPoint p = CGPointMake( pt->h, pt->v );
-       HIViewRef contentView ;
-       // TODO check toolbar offset 
+    HIViewRef contentView ;
+    // TODO check toolbar offset
     HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
     HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
     pt->h = p.x;