X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e6c3d3e655c4637764f60eb28a3d7e7ed3d9732b..079b2f6ba2a999a3f9a284e5265abf43f7200635:/src/mac/carbon/utils.cpp diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp index 929be2b656..9afe0b6d5b 100644 --- a/src/mac/carbon/utils.cpp +++ b/src/mac/carbon/utils.cpp @@ -57,8 +57,11 @@ #include #include #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,83 +387,15 @@ 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) -{ - // TODO - return false; -} - -bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file) +wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() { - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); - if (succ) - { - *value = (float)strtod(s, NULL); - delete[] s; - } - - return succ; -} - -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; + return new wxEventLoop; } -bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file) +wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) { - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); - if (succ) - { - *value = (int)strtol(s, NULL, 10); - delete[] s; - } - - return succ; + return new wxCarbonTimerImpl(timer); } -#endif // wxUSE_RESOURCES int gs_wxBusyCursorCount = 0; extern wxCursor gMacCurrentCursor; @@ -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 ); @@ -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; } @@ -1288,13 +1237,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( wxMacControl::GetReferenceFromNativeControl( browser ) ); + wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl); if ( ctl != 0 ) { ctl->ItemNotification(itemID, message, itemData); @@ -1309,7 +1260,7 @@ pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc( Boolean changeValue ) { OSStatus err = errDataBrowserPropertyNotSupported; - wxMacDataBrowserControl* ctl = dynamic_cast( wxMacControl::GetReferenceFromNativeControl( browser ) ); + wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl); if ( ctl != 0 ) { err = ctl->GetSetItemData(itemID, property, itemData, changeValue); @@ -1323,7 +1274,7 @@ pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc( DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty) { - wxMacDataBrowserControl* ctl = dynamic_cast( wxMacControl::GetReferenceFromNativeControl( browser ) ); + wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl); if ( ctl != 0 ) { return ctl->CompareItems(itemOneID, itemTwoID, sortProperty); @@ -1395,12 +1346,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 +1576,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 +1613,7 @@ short wxMacDataItem::GetColumn() void wxMacDataItem::SetColumn( short col ) { m_colId = col; -} +} void wxMacDataItem::SetLabel( const wxString& str) { @@ -1678,13 +1630,13 @@ bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *owner , const wxMacDataItem* rhs, DataBrowserPropertyID sortProperty) const { - const wxMacDataItem* otherItem = dynamic_cast(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; @@ -1729,6 +1681,7 @@ void wxMacDataItem::Notification(wxMacDataItemBrowserControl *owner , { } +IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl ) wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) : wxMacDataBrowserControl( peer, pos, size, style ) @@ -1806,7 +1759,7 @@ OSStatus wxMacDataItemBrowserControl::GetSetItemData( // right now default behaviour on these break; default : - + if ( item != NULL ){ err = item->GetSetData( this, property , itemData , changeValue ); } @@ -1843,7 +1796,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 +1867,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 +1881,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 @@ -2126,7 +2082,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 ); @@ -2354,9 +2310,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 ); - HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceWindow, window ); + HIViewRef contentView ; + // TODO check toolbar offset + HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ; + HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView ); pt->h = p.x; pt->v = p.y; #else @@ -2366,9 +2325,12 @@ 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 ); - HIPointConvert( &p, kHICoordSpaceWindow, window, kHICoordSpace72DPIGlobal, NULL ); + HIViewRef contentView ; + // TODO check toolbar offset + HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ; + HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL ); pt->h = p.x; pt->v = p.y; #else