+ if ( m_release && m_ref != NULL )
+ CFRelease( m_ref );
+ m_ref = NULL;
+ }
+
+ refType Detach()
+ {
+ refType val = m_ref;
+ m_release = false;
+ m_ref = NULL;
+ return val;
+ }
+
+ void Set( refType ref , bool release = true )
+ {
+ Release();
+ m_release = release;
+ m_ref = ref;
+ }
+
+ operator refType () const { return m_ref; }
+
+private :
+ refType m_ref;
+ bool m_release;
+
+ DECLARE_NO_COPY_CLASS( wxMacCFRefHolder )
+};
+
+#if wxUSE_GUI
+
+/*
+GWorldPtr wxMacCreateGWorld( int width , int height , int depth );
+void wxMacDestroyGWorld( GWorldPtr gw );
+PicHandle wxMacCreatePict( GWorldPtr gw , GWorldPtr mask = NULL );
+CIconHandle wxMacCreateCIcon(GWorldPtr image , GWorldPtr mask , short dstDepth , short iconSize );
+void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue );
+CTabHandle wxMacCreateColorTable( int numColors );
+*/
+void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType = 0 );
+void wxMacReleaseBitmapButton( ControlButtonContentInfo*info );
+
+#define MAC_WXCOLORREF(a) (*((RGBColor*)&(a)))
+#define MAC_WXHBITMAP(a) (GWorldPtr(a))
+#define MAC_WXHMETAFILE(a) (PicHandle(a))
+#define MAC_WXHICON(a) (IconRef(a))
+#define MAC_WXHCURSOR(a) (CursHandle(a))
+#define MAC_WXHRGN(a) (RgnHandle(a))
+#define MAC_WXHWND(a) (WindowPtr(a))
+#define MAC_WXRECPTR(a) ((Rect*)a)
+#define MAC_WXPOINTPTR(a) ((Point*)a)
+#define MAC_WXHMENU(a) ((MenuHandle)a)
+
+struct wxOpaqueWindowRef
+{
+ wxOpaqueWindowRef( WindowRef ref ) { m_data = ref; }
+ operator WindowRef() { return m_data; }
+private :
+ WindowRef m_data;
+};
+
+void wxMacRectToNative( const wxRect *wx , Rect *n );
+void wxMacNativeToRect( const Rect *n , wxRect* wx );
+void wxMacPointToNative( const wxPoint* wx , Point *n );
+void wxMacNativeToPoint( const Point *n , wxPoint* wx );
+
+wxWindow * wxFindControlFromMacControl(ControlRef inControl );
+wxTopLevelWindowMac* wxFindWinFromMacWindow( WindowRef inWindow );
+wxMenu* wxFindMenuFromMacMenu(MenuRef inMenuRef);
+
+int wxMacCommandToId( UInt32 macCommandId );
+UInt32 wxIdToMacCommand( int wxId );
+wxMenu* wxFindMenuFromMacCommand( const HICommand &macCommandId , wxMenuItem* &item );
+
+extern wxWindow* g_MacLastWindow;
+pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data );
+Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin = true );
+
+ControlActionUPP GetwxMacLiveScrollbarActionProc();
+
+class wxMacControl
+{
+public :
+ wxMacControl( wxWindow* peer , bool isRootControl = false );
+ wxMacControl( wxWindow* peer , ControlRef control );
+ wxMacControl( wxWindow* peer , WXWidget control );
+ virtual ~wxMacControl();
+
+ void Init();
+
+ virtual void Dispose();
+
+ bool Ok() const { return GetControlRef() != NULL; }
+
+ void SetReferenceInNativeControl();
+ static wxMacControl* GetReferenceFromNativeControl(ControlRef control);
+
+ virtual ControlRef * GetControlRefAddr() { return &m_controlRef; }
+ virtual ControlRef GetControlRef() const { return m_controlRef; }
+
+ virtual void SetReference( SInt32 data );
+ /*
+ void operator= (ControlRef c) { m_controlRef = c; }
+ operator ControlRef () { return m_controlRef; }
+ operator ControlRef * () { return &m_controlRef; }
+ */
+ // accessing data and values
+
+ virtual OSStatus SetData( ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData );
+ virtual OSStatus GetData( ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const;
+ virtual OSStatus GetDataSize( ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const;
+ virtual OSStatus SendEvent( EventRef ref , OptionBits inOptions = 0 );
+ virtual OSStatus SendHICommand( HICommand &command , OptionBits inOptions = 0 );
+
+ virtual OSStatus SendHICommand( UInt32 commandID , OptionBits inOptions = 0 );
+
+ virtual SInt32 GetValue() const;
+ virtual SInt32 GetMaximum() const;
+ virtual SInt32 GetMinimum() const;
+
+ virtual void SetValue( SInt32 v );
+ virtual void SetMinimum( SInt32 v );
+ virtual void SetMaximum( SInt32 v );
+
+ virtual void SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum );
+ virtual void SetRange( SInt32 minimum , SInt32 maximum );
+
+ virtual OSStatus SetFocus( ControlFocusPart focusPart );
+ virtual bool HasFocus() const;
+ virtual bool NeedsFocusRect() const;
+ virtual void SetNeedsFocusRect( bool needs );
+
+ // templated helpers
+
+ Size GetDataSize( ControlPartCode inPartCode , ResType inTag ) const
+ {
+ Size sz;
+ verify_noerr( GetDataSize( inPartCode , inTag , &sz ) );
+ return sz;
+ }
+ template <typename T> OSStatus SetData( ControlPartCode inPartCode , ResType inTag , const T *data )
+ {
+ return SetData( inPartCode , inTag , sizeof( T ) , data );
+ }
+ template <typename T> OSStatus SetData( ControlPartCode inPartCode , ResType inTag , const T& data )
+ {
+ return SetData( inPartCode , inTag , sizeof( T ) , &data );
+ }
+ template <typename T> OSStatus SetData( ResType inTag , const T *data )
+ {
+ return SetData( kControlEntireControl , inTag , sizeof( T ) , data );
+ }
+ template <typename T> OSStatus SetData( ResType inTag , const T& data )
+ {
+ return SetData( kControlEntireControl , inTag , sizeof( T ) , &data );
+ }
+ template <typename T> OSStatus GetData( ControlPartCode inPartCode , ResType inTag , T *data ) const
+ {
+ Size dummy;
+ return GetData( inPartCode , inTag , sizeof( T ) , data , &dummy );
+ }
+ template <typename T> T GetData( ControlPartCode inPartCode , ResType inTag ) const
+ {
+ T value;
+ OSStatus err = GetData<T>( inPartCode , inTag , &value );
+
+ wxASSERT_MSG( err == noErr,
+ wxString::Format(wxT("GetData Failed for Part [%i] and Tag [%i]"),
+ inPartCode, (int)inTag) );
+ return value;
+ }
+ template <typename T> OSStatus GetData( ResType inTag , T *data ) const
+ {
+ Size dummy;
+ return GetData( kControlEntireControl , inTag , sizeof( T ) , data , &dummy );
+ }
+ template <typename T> T GetData( ResType inTag ) const
+ {
+ return GetData<T>( kControlEntireControl , inTag );
+ }
+
+ // Flash the control for the specified amount of time
+ virtual void Flash( ControlPartCode part , UInt32 ticks = 8 );
+
+ virtual void VisibilityChanged( bool shown );
+ virtual void SuperChangedPosition();
+
+
+ virtual void SetFont( const wxFont & font , const wxColour& foreground , long windowStyle );
+ virtual void SetBackground( const wxBrush &brush );
+ virtual ControlPartCode HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers );
+ void SetActionProc( ControlActionUPP actionProc );
+ void SetViewSize( SInt32 viewSize );
+ SInt32 GetViewSize() const;
+
+ virtual bool IsVisible() const;
+ virtual void SetVisibility( bool visible , bool redraw );
+ virtual bool IsEnabled() const;
+ virtual bool IsActive() const;
+ virtual void Enable( bool enable );
+
+ // invalidates this control and all children
+ virtual void InvalidateWithChildren();
+ virtual void SetDrawingEnabled( bool enable );
+#ifdef __WXMAC_OSX__
+ virtual bool GetNeedsDisplay() const;
+#endif
+ // where is in native window relative coordinates
+ virtual void SetNeedsDisplay( RgnHandle where );
+ // where is in native window relative coordinates
+ virtual void SetNeedsDisplay( Rect* where = NULL );
+
+ // if rect = NULL, entire view
+ virtual void ScrollRect( wxRect *rect , int dx , int dy );
+
+ // in native parent window relative coordinates
+ virtual void GetRect( Rect *r );
+
+ // in native parent window relative coordinates
+ virtual void SetRect( Rect *r );
+
+ virtual void GetRectInWindowCoords( Rect *r );
+ virtual void GetBestRect( Rect *r );
+ virtual void SetLabel( const wxString &title );
+ // converts from Toplevel-Content relative to local
+ static void Convert( wxPoint *pt , wxMacControl *convert , wxMacControl *to );
+
+ virtual void GetFeatures( UInt32 *features );
+ virtual OSStatus GetRegion( ControlPartCode partCode , RgnHandle region );
+ virtual OSStatus SetZOrder( bool above , wxMacControl* other );
+
+ bool IsRootControl() { return m_isRootControl; }
+
+ wxWindow* GetPeer() const
+ {
+ return m_peer;
+ }
+
+ // to be moved into a tab control class
+
+ virtual OSStatus SetTabEnabled( SInt16 tabNo , bool enable );
+protected :
+ ControlRef m_controlRef;
+ wxFont m_font;
+ long m_windowStyle;
+ wxWindow* m_peer;
+ bool m_needsFocusRect;
+ bool m_isRootControl;
+};
+
+// ============================================================================
+// DataBrowser Wrapper
+// ============================================================================
+//
+// basing on DataBrowserItemIDs
+//
+
+class wxMacDataBrowserControl : public wxMacControl
+{
+public :
+ wxMacDataBrowserControl( wxWindow* peer, const wxPoint& pos, const wxSize& size, long style);
+
+ OSStatus SetCallbacks( const DataBrowserCallbacks *callbacks );
+
+ OSStatus GetItemCount( DataBrowserItemID container,
+ Boolean recurse,
+ DataBrowserItemState state,
+ UInt32 *numItems) const;
+
+ OSStatus GetItems( DataBrowserItemID container,
+ Boolean recurse,
+ DataBrowserItemState state,
+ Handle items) const;
+
+
+ OSStatus AddColumn( DataBrowserListViewColumnDesc *columnDesc,
+ DataBrowserTableViewColumnIndex position );
+
+ OSStatus AutoSizeColumns();
+
+ OSStatus SetHasScrollBars( bool horiz, bool vert );
+ OSStatus SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle );
+
+ OSStatus SetHeaderButtonHeight( UInt16 height );
+ OSStatus GetHeaderButtonHeight( UInt16 *height );
+
+ OSStatus UpdateItems( DataBrowserItemID container, UInt32 numItems,
+ const DataBrowserItemID *items,
+ DataBrowserPropertyID preSortProperty,
+ DataBrowserPropertyID propertyID ) const;
+
+ OSStatus AddItems( DataBrowserItemID container, UInt32 numItems,
+ const DataBrowserItemID *items,
+ DataBrowserPropertyID preSortProperty );
+ OSStatus RemoveItems( DataBrowserItemID container, UInt32 numItems,
+ const DataBrowserItemID *items,
+ DataBrowserPropertyID preSortProperty );
+ OSStatus RevealItem( DataBrowserItemID item,
+ DataBrowserPropertyID propertyID,
+ DataBrowserRevealOptions options ) const;
+
+ OSStatus SetSelectionFlags( DataBrowserSelectionFlags );
+ OSStatus GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const;
+ bool IsItemSelected( DataBrowserItemID item ) const;
+ OSStatus SetSelectedItems( UInt32 numItems,
+ const DataBrowserItemID *items,
+ DataBrowserSetOption operation );
+
+ OSStatus GetItemID( DataBrowserTableViewRowIndex row,
+ DataBrowserItemID * item ) const;
+ OSStatus GetItemRow( DataBrowserItemID item,
+ DataBrowserTableViewRowIndex * row ) const;
+
+ OSStatus SetDefaultRowHeight( UInt16 height );
+ OSStatus GetDefaultRowHeight( UInt16 * height ) const;
+
+ OSStatus SetRowHeight( DataBrowserItemID item , UInt16 height);
+ OSStatus GetRowHeight( DataBrowserItemID item , UInt16 *height) const;
+
+ OSStatus GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const;
+ OSStatus SetColumnWidth( DataBrowserPropertyID column , UInt16 width );
+
+ OSStatus GetDefaultColumnWidth( UInt16 *width ) const;
+ OSStatus SetDefaultColumnWidth( UInt16 width );
+
+ OSStatus GetColumnCount( UInt32* numColumns) const;
+
+ OSStatus GetColumnPosition( DataBrowserPropertyID column, UInt32 *position) const;
+ OSStatus SetColumnPosition( DataBrowserPropertyID column, UInt32 position);
+
+ OSStatus GetScrollPosition( UInt32 *top , UInt32 *left ) const;
+ OSStatus SetScrollPosition( UInt32 top , UInt32 left );
+
+ OSStatus GetSortProperty( DataBrowserPropertyID *column ) const;
+ OSStatus SetSortProperty( DataBrowserPropertyID column );
+
+ OSStatus GetSortOrder( DataBrowserSortOrder *order ) const;
+ OSStatus SetSortOrder( DataBrowserSortOrder order );
+
+ OSStatus GetPropertyFlags( DataBrowserPropertyID property, DataBrowserPropertyFlags *flags ) const;
+ OSStatus SetPropertyFlags( DataBrowserPropertyID property, DataBrowserPropertyFlags flags );
+
+ OSStatus GetHeaderDesc( DataBrowserPropertyID property, DataBrowserListViewHeaderDesc *desc ) const;
+ OSStatus SetHeaderDesc( DataBrowserPropertyID property, DataBrowserListViewHeaderDesc *desc );
+
+ OSStatus SetDisclosureColumn( DataBrowserPropertyID property , Boolean expandableRows );
+protected :
+
+ static pascal void DataBrowserItemNotificationProc(
+ ControlRef browser,
+ DataBrowserItemID itemID,
+ DataBrowserItemNotification message,
+ DataBrowserItemDataRef itemData );
+
+ virtual void ItemNotification(
+ DataBrowserItemID itemID,
+ DataBrowserItemNotification message,
+ DataBrowserItemDataRef itemData) = 0;
+
+ static pascal OSStatus DataBrowserGetSetItemDataProc(
+ ControlRef browser,
+ DataBrowserItemID itemID,
+ DataBrowserPropertyID property,
+ DataBrowserItemDataRef itemData,
+ Boolean changeValue );
+
+ virtual OSStatus GetSetItemData(
+ DataBrowserItemID itemID,
+ DataBrowserPropertyID property,
+ DataBrowserItemDataRef itemData,
+ Boolean changeValue ) = 0;
+
+ static pascal Boolean DataBrowserCompareProc(
+ ControlRef browser,
+ DataBrowserItemID itemOneID,
+ DataBrowserItemID itemTwoID,
+ DataBrowserPropertyID sortProperty);
+
+ virtual Boolean CompareItems(DataBrowserItemID itemOneID,
+ DataBrowserItemID itemTwoID,
+ DataBrowserPropertyID sortProperty) = 0;
+};
+
+// ============================================================================
+// Higher-level Databrowser
+// ============================================================================
+//
+// basing on data item objects
+//
+
+// forward decl
+
+class wxMacDataItemBrowserControl;
+
+// base class for databrowser items
+
+class wxMacDataItem
+{
+public :
+ wxMacDataItem();
+ virtual ~wxMacDataItem();
+
+ virtual bool IsLessThan(wxMacDataItemBrowserControl *owner ,
+ const wxMacDataItem*,
+ DataBrowserPropertyID property) const;
+
+ // returns true if access was successful, otherwise false
+ virtual OSStatus GetSetData(wxMacDataItemBrowserControl *owner ,
+ DataBrowserPropertyID property,
+ DataBrowserItemDataRef itemData,
+ bool changeValue );
+
+ virtual void Notification(wxMacDataItemBrowserControl *owner ,
+ DataBrowserItemNotification message,
+ DataBrowserItemDataRef itemData ) const;
+};
+
+typedef wxMacDataItem* wxMacDataItemPtr;
+const wxMacDataItemPtr wxMacDataBrowserRootContainer = NULL;
+
+WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxMacDataItemPtr, wxArrayMacDataItemPtr, class WXDLLIMPEXP_CORE);
+
+class wxMacDataItemBrowserControl : public wxMacDataBrowserControl
+{
+public :
+ wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style);
+
+ unsigned int GetItemCount(const wxMacDataItem* container, bool recurse , DataBrowserItemState state) const;
+ void GetItems(const wxMacDataItem* container, bool recurse ,
+ DataBrowserItemState state, wxArrayMacDataItemPtr &items ) const;
+
+ unsigned int GetLineFromItem(const wxMacDataItem *item) const;
+ wxMacDataItem * GetItemFromLine(unsigned int n) const;
+
+ void UpdateItem(const wxMacDataItem *container, const wxMacDataItem *item,
+ DataBrowserPropertyID property) const;
+ void UpdateItems(const wxMacDataItem *container, wxArrayMacDataItemPtr &items,
+ DataBrowserPropertyID property) const;
+
+ void AddItem(wxMacDataItem *container, wxMacDataItem *item);
+ void AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &items );
+
+ void RemoveAllItems(wxMacDataItem *container);
+ void RemoveItem(wxMacDataItem *container, wxMacDataItem* item);
+ void RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &items);
+
+ void SetSelectedItem( wxMacDataItem* item , DataBrowserSetOption option);
+ void SetSelectedItems( wxArrayMacDataItemPtr &items , DataBrowserSetOption option);
+ void SetSelectedAllItems( DataBrowserSetOption option);
+ Boolean IsItemSelected( const wxMacDataItem* item) const;
+
+ void RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options);
+
+ void GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const;
+
+ // item aware methods, to be used in subclasses
+
+ virtual Boolean CompareItems(const wxMacDataItem* itemOneID,
+ const wxMacDataItem* itemTwoID,
+ DataBrowserPropertyID sortProperty);
+
+ virtual OSStatus GetSetItemData(wxMacDataItem* itemID,
+ DataBrowserPropertyID property,
+ DataBrowserItemDataRef itemData,
+ Boolean changeValue );
+
+ virtual void ItemNotification(
+ const wxMacDataItem* itemID,
+ DataBrowserItemNotification message,
+ DataBrowserItemDataRef itemData);
+
+ // as we are getting the same events for human and API selection we have to suppress
+ // events in the latter case, since this will be used from many subclasses we keep it here
+
+ bool IsSelectionSuppressed() const { return m_suppressSelection; }
+ bool SuppressSelection( bool suppress );
+
+protected:
+ // ID aware base methods, should be 'final' ie not changed in subclasses
+
+ virtual Boolean CompareItems(DataBrowserItemID itemOneID,
+ DataBrowserItemID itemTwoID,
+ DataBrowserPropertyID sortProperty);
+
+ virtual OSStatus GetSetItemData(DataBrowserItemID itemID,
+ DataBrowserPropertyID property,
+ DataBrowserItemDataRef itemData,
+ Boolean changeValue );
+
+ virtual void ItemNotification(
+ DataBrowserItemID itemID,
+ DataBrowserItemNotification message,
+ DataBrowserItemDataRef itemData);
+
+private :
+
+ bool m_suppressSelection;
+};
+
+class wxMacDataItemBrowserSelectionSuppressor
+{
+public :
+ wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser);
+ ~wxMacDataItemBrowserSelectionSuppressor();
+
+private :
+
+ bool m_former;
+ wxMacDataItemBrowserControl* m_browser;
+};
+
+// ============================================================================
+// platform listbox implementation
+// ============================================================================
+//
+// exposed for reuse in wxCheckListBox
+
+class wxMacListBoxItem : public wxMacDataItem
+{
+public :
+ wxMacListBoxItem();