1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/utils.cpp
3 // Purpose: Various utilities
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #include "wx/wxprec.h"
21 #include "wx/toplevel.h"
26 #include "wx/apptrait.h"
35 // #include "MoreFilesX.h"
37 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
38 #include <AudioToolbox/AudioServices.h>
41 #include "wx/osx/private.h"
43 #include "wx/osx/private/timer.h"
46 #include "wx/evtloop.h"
48 #if defined(__MWERKS__) && wxUSE_UNICODE
49 #if __MWERKS__ < 0x4100
59 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
60 if ( AudioServicesPlayAlertSound
!= NULL
)
61 AudioServicesPlayAlertSound(kUserPreferredAlert
);
64 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
76 wxTimerImpl
* wxGUIAppTraits::CreateTimerImpl(wxTimer
*timer
)
78 return new wxOSXTimerImpl(timer
);
81 int gs_wxBusyCursorCount
= 0;
82 extern wxCursor gMacCurrentCursor
;
83 wxCursor gMacStoredActiveCursor
;
85 // Set the cursor to the busy cursor for all windows
86 void wxBeginBusyCursor(const wxCursor
*cursor
)
88 if (gs_wxBusyCursorCount
++ == 0)
90 gMacStoredActiveCursor
= gMacCurrentCursor
;
95 //else: nothing to do, already set
98 // Restore cursor to normal
99 void wxEndBusyCursor()
101 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
102 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
104 if (--gs_wxBusyCursorCount
== 0)
106 gMacStoredActiveCursor
.MacInstall();
107 gMacStoredActiveCursor
= wxNullCursor
;
109 wxSetCursor(wxNullCursor
);
113 // true if we're between the above two calls
116 return (gs_wxBusyCursorCount
> 0);
123 wxString
wxMacFindFolderNoSeparator( short vol
,
125 Boolean createFolder
)
130 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
132 strDir
= wxMacFSRefToPath( &fsRef
);
138 wxString
wxMacFindFolder( short vol
,
140 Boolean createFolder
)
142 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
148 // ============================================================================
149 // GUI-only functions from now on
150 // ============================================================================
154 // ----------------------------------------------------------------------------
155 // Launch document with default app
156 // ----------------------------------------------------------------------------
158 bool wxLaunchDefaultApplication(const wxString
& document
, int flags
)
162 static const char * const OPEN_CMD
= "/usr/bin/open";
163 if ( wxFileExists(OPEN_CMD
) &&
164 wxExecute(wxString(OPEN_CMD
) + " " + document
) )
170 // ----------------------------------------------------------------------------
171 // Launch default browser
172 // ----------------------------------------------------------------------------
174 bool wxDoLaunchDefaultBrowser(const wxString
& url
, int flags
)
177 wxCFRef
< CFURLRef
> curl( CFURLCreateWithString( kCFAllocatorDefault
,
178 wxCFStringRef( url
), NULL
) );
179 OSStatus err
= LSOpenCFURLRef( curl
, NULL
);
187 wxLogDebug(wxT("Browser Launch error %d"), (int) err
);
192 // ----------------------------------------------------------------------------
193 // Miscellaneous functions
194 // ----------------------------------------------------------------------------
196 void wxGetMousePosition( int* x
, int* y
)
206 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
208 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
210 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
213 *x
= bounds
.origin
.x
;
215 *y
= bounds
.origin
.y
;
217 *width
= bounds
.size
.width
;
219 *height
= bounds
.size
.height
;
222 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
228 *width
= r
.right
- r
.left
;
230 *height
= r
.bottom
- r
.top
;
237 // ----------------------------------------------------------------------------
238 // Common Event Support
239 // ----------------------------------------------------------------------------
243 OSStatus err
= noErr
;
247 // lead sometimes to race conditions, although all calls used should be thread safe ...
248 static wxMacCarbonEvent s_wakeupEvent
;
249 if ( !s_wakeupEvent
.IsValid() )
251 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
252 kEventAttributeNone
);
257 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
259 s_wakeupEvent
.SetCurrentTime();
260 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
261 kEventPriorityHigh
);
264 wxMacCarbonEvent wakeupEvent
;
265 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
266 kEventAttributeNone
);
267 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
268 kEventPriorityHigh
);
277 // ----------------------------------------------------------------------------
278 // Native Struct Conversions
279 // ----------------------------------------------------------------------------
281 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
285 n
->right
= wx
->x
+ wx
->width
;
286 n
->bottom
= wx
->y
+ wx
->height
;
289 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
293 wx
->width
= n
->right
- n
->left
;
294 wx
->height
= n
->bottom
- n
->top
;
297 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
303 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
309 // ----------------------------------------------------------------------------
310 // Carbon Event Support
311 // ----------------------------------------------------------------------------
313 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
315 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
318 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
320 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
323 // ----------------------------------------------------------------------------
324 // Control Access Support
325 // ----------------------------------------------------------------------------
328 // ============================================================================
329 // DataBrowser Wrapper
330 // ============================================================================
332 // basing on DataBrowserItemIDs
335 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
337 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
339 DataBrowserItemID itemID
,
340 DataBrowserItemNotification message
,
341 DataBrowserItemDataRef itemData
)
343 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
346 ctl
->ItemNotification(itemID
, message
, itemData
);
350 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
352 DataBrowserItemID itemID
,
353 DataBrowserPropertyID property
,
354 DataBrowserItemDataRef itemData
,
355 Boolean changeValue
)
357 OSStatus err
= errDataBrowserPropertyNotSupported
;
358 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
361 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
366 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
368 DataBrowserItemID itemOneID
,
369 DataBrowserItemID itemTwoID
,
370 DataBrowserPropertyID sortProperty
)
372 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
375 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
380 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
381 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
382 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
384 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
387 long WXUNUSED(style
))
388 : wxMacControl( peer
)
390 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
391 OSStatus err
= ::CreateDataBrowserControl(
392 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
393 &bounds
, kDataBrowserListView
, &m_controlRef
);
394 SetReferenceInNativeControl();
396 if ( gDataBrowserItemCompareUPP
== NULL
)
397 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
398 if ( gDataBrowserItemDataUPP
== NULL
)
399 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
400 if ( gDataBrowserItemNotificationUPP
== NULL
)
402 gDataBrowserItemNotificationUPP
=
403 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
406 DataBrowserCallbacks callbacks
;
407 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
409 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
410 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
411 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
412 SetCallbacks( &callbacks
);
416 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
418 DataBrowserItemState state
,
419 ItemCount
*numItems
) const
421 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
424 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
426 DataBrowserItemState state
,
429 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
432 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
434 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
437 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
438 DataBrowserTableViewColumnIndex position
)
440 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
443 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
444 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
447 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
449 DataBrowserTableViewColumnID id
;
450 GetColumnIDFromIndex( position
, &id
);
451 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
454 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
456 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
459 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
461 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
464 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
466 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
469 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
471 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
474 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
476 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
479 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
481 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
484 OSStatus
wxMacDataBrowserControl::UpdateItems(
485 DataBrowserItemID container
,
487 const DataBrowserItemID
*items
,
488 DataBrowserPropertyID preSortProperty
,
489 DataBrowserPropertyID propertyID
) const
491 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
494 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
496 return IsDataBrowserItemSelected( m_controlRef
, item
);
499 OSStatus
wxMacDataBrowserControl::AddItems(
500 DataBrowserItemID container
,
502 const DataBrowserItemID
*items
,
503 DataBrowserPropertyID preSortProperty
)
505 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
508 OSStatus
wxMacDataBrowserControl::RemoveItems(
509 DataBrowserItemID container
,
511 const DataBrowserItemID
*items
,
512 DataBrowserPropertyID preSortProperty
)
514 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
517 OSStatus
wxMacDataBrowserControl::RevealItem(
518 DataBrowserItemID item
,
519 DataBrowserPropertyID propertyID
,
520 DataBrowserRevealOptions options
) const
522 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
525 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
527 const DataBrowserItemID
*items
,
528 DataBrowserSetOption operation
)
530 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
533 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
535 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
538 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
540 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
543 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
545 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
548 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
550 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
553 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
555 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
558 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
560 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
563 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
565 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
568 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
570 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
573 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
575 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
578 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
580 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
583 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
585 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
588 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
590 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
593 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
594 DataBrowserTableViewColumnIndex
*position
) const
596 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
599 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
601 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
604 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
606 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
609 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
611 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
614 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
616 return GetDataBrowserSortProperty( m_controlRef
, column
);
619 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
621 return SetDataBrowserSortProperty( m_controlRef
, column
);
624 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
626 return GetDataBrowserSortOrder( m_controlRef
, order
);
629 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
631 return SetDataBrowserSortOrder( m_controlRef
, order
);
634 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
635 DataBrowserPropertyFlags
*flags
) const
637 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
640 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
641 DataBrowserPropertyFlags flags
)
643 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
646 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
647 DataBrowserListViewHeaderDesc
*desc
) const
649 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
652 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
653 DataBrowserListViewHeaderDesc
*desc
)
655 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
658 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
659 Boolean expandableRows
)
661 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
664 // ============================================================================
665 // Higher-level Databrowser
666 // ============================================================================
668 // basing on data item objects
671 wxMacDataItem::wxMacDataItem()
676 // m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
679 wxMacDataItem::~wxMacDataItem()
683 void wxMacDataItem::SetOrder( SInt32 order
)
688 SInt32
wxMacDataItem::GetOrder() const
693 void wxMacDataItem::SetData( void* data)
698 void* wxMacDataItem::GetData() const
703 short wxMacDataItem::GetColumn()
708 void wxMacDataItem::SetColumn( short col )
713 void wxMacDataItem::SetLabel( const wxString& str)
716 m_cfLabel = wxCFStringRef( str , wxLocale::GetSystemEncoding());
719 const wxString& wxMacDataItem::GetLabel() const
725 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
726 const wxMacDataItem
* rhs
,
727 DataBrowserPropertyID sortProperty
) const
731 if ( sortProperty
== kNumericOrderColumnId
)
732 retval
= m_order
< rhs
->m_order
;
737 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
738 DataBrowserPropertyID property
,
739 DataBrowserItemDataRef itemData
,
742 OSStatus err
= errDataBrowserPropertyNotSupported
;
745 if ( property
== kNumericOrderColumnId
)
747 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
755 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
756 DataBrowserItemNotification
WXUNUSED(message
),
757 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
761 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
763 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
764 wxMacDataBrowserControl( peer
, pos
, size
, style
)
766 m_suppressSelection
= false;
767 m_sortOrder
= SortOrder_None
;
768 m_clientDataItemsType
= wxClientData_None
;
771 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
773 m_former
= browser
->SuppressSelection(true);
777 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
779 m_browser
->SuppressSelection(m_former
);
782 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
784 bool former
= m_suppressSelection
;
785 m_suppressSelection
= suppress
;
790 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
791 DataBrowserItemID itemTwoID
,
792 DataBrowserPropertyID sortProperty
)
794 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
795 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
796 return CompareItems( itemOne
, itemTwo
, sortProperty
);
799 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
800 const wxMacDataItem
* itemTwo
,
801 DataBrowserPropertyID sortProperty
)
803 Boolean retval
= false;
804 if ( itemOne
!= NULL
)
805 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
809 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
810 DataBrowserItemID itemID
,
811 DataBrowserPropertyID property
,
812 DataBrowserItemDataRef itemData
,
813 Boolean changeValue
)
815 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
816 return GetSetItemData(item
, property
, itemData
, changeValue
);
819 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
821 DataBrowserPropertyID property
,
822 DataBrowserItemDataRef itemData
,
823 Boolean changeValue
)
825 OSStatus err
= errDataBrowserPropertyNotSupported
;
828 case kDataBrowserContainerIsClosableProperty
:
829 case kDataBrowserContainerIsSortableProperty
:
830 case kDataBrowserContainerIsOpenableProperty
:
831 // right now default behaviour on these
836 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
844 void wxMacDataItemBrowserControl::ItemNotification(
845 DataBrowserItemID itemID
,
846 DataBrowserItemNotification message
,
847 DataBrowserItemDataRef itemData
)
849 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
850 ItemNotification( item
, message
, itemData
);
853 void wxMacDataItemBrowserControl::ItemNotification(
854 const wxMacDataItem
* item
,
855 DataBrowserItemNotification message
,
856 DataBrowserItemDataRef itemData
)
859 item
->Notification( this, message
, itemData
);
862 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
863 bool recurse
, DataBrowserItemState state
) const
865 ItemCount numItems
= 0;
866 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
867 recurse
, state
, &numItems
) );
871 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
874 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
878 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
879 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
881 Handle handle
= NewHandle(0);
882 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
883 recurse
, state
, handle
) );
885 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
887 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
888 for ( int i
= 0; i
< itemCount
; ++i
)
890 items
.Add(itemsArray
[i
]);
893 DisposeHandle( handle
);
896 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
898 DataBrowserTableViewRowIndex row
;
899 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
900 wxCHECK( err
== noErr
, (unsigned)-1 );
904 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
906 DataBrowserItemID id
;
907 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
908 wxCHECK( err
== noErr
, NULL
);
909 return (wxMacDataItem
*) id
;
912 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
913 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
915 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
916 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
919 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
920 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
922 unsigned int noItems
= itemArray
.GetCount();
923 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
924 for ( unsigned int i
= 0; i
< noItems
; ++i
)
925 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
927 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
928 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
932 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
933 const wxString
& title
, SInt16 just
, int defaultWidth
)
935 DataBrowserListViewColumnDesc columnDesc
;
936 columnDesc
.headerBtnDesc
.titleOffset
= 0;
937 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
939 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
940 kControlUseFontMask
| kControlUseJustMask
;
942 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
943 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
944 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
945 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
947 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
948 // defined for other modes?
951 enc
= m_font
.GetEncoding();
953 enc
= wxLocale::GetSystemEncoding();
954 wxCFStringRef
cfTitle( title
, enc
);
955 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
957 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
958 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
960 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
961 columnDesc
.propertyDesc
.propertyType
= colType
;
962 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
963 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
964 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
966 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
968 if (defaultWidth
> 0){
969 SetColumnWidth(colId
, defaultWidth
);
974 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
976 DataBrowserPropertyID id
;
977 GetColumnIDFromIndex(colId
, &id
);
978 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
981 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
983 DataBrowserPropertyID id
;
984 GetColumnIDFromIndex(colId
, &id
);
986 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
990 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
992 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
993 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
996 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
998 unsigned int noItems
= itemArray
.GetCount();
999 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1000 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1001 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1003 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1004 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1008 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1010 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1011 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1012 verify_noerr( err
);
1015 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1017 unsigned int noItems
= itemArray
.GetCount();
1018 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1019 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1020 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1022 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1023 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1024 verify_noerr( err
);
1028 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1030 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1031 verify_noerr( err
);
1034 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1036 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1039 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1041 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1044 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1046 unsigned int noItems
= itemArray
.GetCount();
1047 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1048 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1049 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1051 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1055 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1057 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1060 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1062 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1065 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1067 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1070 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1072 return m_clientDataItemsType
;
1074 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1076 m_clientDataItemsType
= clientDataItemsType
;
1079 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
1081 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
1082 RemoveItem( wxMacDataBrowserRootContainer
, item
);
1085 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, wxMacDataItem
* item
)
1087 if ( m_sortOrder
== SortOrder_None
)
1090 // increase the order of the lines to be shifted
1091 unsigned int lines
= MacGetCount();
1092 for ( unsigned int i
= n
; i
< lines
; ++i
)
1094 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
1095 iter
->SetOrder( iter
->GetOrder() + 1 );
1099 // I don't understand what this code is supposed to do, RR.
1100 SInt32 frontLineOrder
= 0;
1103 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
1104 frontLineOrder
= iter
->GetOrder()+1;
1107 item
->SetOrder( n
);
1111 AddItem( wxMacDataBrowserRootContainer
, item
);
1114 void wxMacDataItemBrowserControl::MacClear()
1116 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1117 RemoveAllItems(wxMacDataBrowserRootContainer
);
1120 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1122 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);