1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/dataview.cpp
3 // Purpose: wxDataViewCtrl native carbon implementation
5 // Id: $Id: dataview.cpp 58317 2009-01-23
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
13 #if (wxUSE_DATAVIEWCTRL == 1) && !defined(wxUSE_GENERICDATAVIEWCTRL)
17 #include "wx/toplevel.h"
19 #include "wx/settings.h"
23 #include "wx/osx/carbon/dataview.h"
24 #include "wx/osx/private.h"
25 #include "wx/osx/uma.h"
26 #include "wx/renderer.h"
30 // ============================================================================
31 // Variables used locally in dataview.cpp
32 // ============================================================================
33 static DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP
= NULL
;
34 static DataBrowserItemCompareUPP gDataBrowserTableViewItemCompareUPP
= NULL
;
35 static DataBrowserItemDataUPP gDataBrowserTableViewItemDataUPP
= NULL
;
36 static DataBrowserItemNotificationUPP gDataBrowserTableViewItemNotificationUPP
= NULL
;
38 static DataBrowserAcceptDragUPP gDataBrowserTableViewAcceptDragUPP
= NULL
;
39 static DataBrowserAddDragItemUPP gDataBrowserTableViewAddDragItemUPP
= NULL
;
40 static DataBrowserReceiveDragUPP gDataBrowserTableViewReceiveDragUPP
= NULL
;
42 static DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP
= NULL
;
43 static DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP
= NULL
;
44 static DataBrowserHitTestUPP gDataBrowserTableViewHitTestUPP
= NULL
;
45 static DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP
= NULL
;
47 // ============================================================================
48 // Functions used locally in dataview.cpp
49 // ============================================================================
50 static DataBrowserItemID
* CreateDataBrowserItemIDArray(size_t& noOfEntries
, wxDataViewItemArray
const& items
) // returns a newly allocated pointer to valid data browser item IDs
52 size_t const noOfItems
= items
.GetCount();
54 DataBrowserItemID
* itemIDs(new DataBrowserItemID
[noOfItems
]);
57 // convert all valid data view items to data browser items
59 for (size_t i
=0; i
<noOfItems
; ++i
)
62 itemIDs
[noOfEntries
] = reinterpret_cast<DataBrowserItemID
>(items
[i
].GetID());
69 static const EventTypeSpec eventList
[] =
71 { kEventClassControl
, kEventControlHit
},
72 { kEventClassControl
, kEventControlDraw
}
75 static pascal OSStatus
DataBrowserCtrlEventHandler(EventHandlerCallRef handler
, EventRef EventReference
, void* Data
)
77 wxDataViewCtrl
* DataViewCtrlPtr((wxDataViewCtrl
*) Data
); // the 'Data' variable always contains a pointer to the data view control that installed the handler
79 wxMacCarbonEvent
CarbonEvent(EventReference
) ;
82 switch (GetEventKind(EventReference
))
84 case kEventControlDraw
:
88 DataViewCtrlPtr
->MacSetDrawingContext(CarbonEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
,typeCGContextRef
));
89 status
= ::CallNextEventHandler(handler
,EventReference
);
90 DataViewCtrlPtr
->MacSetDrawingContext(NULL
);
93 case kEventControlHit
:
94 if (CarbonEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart
,typeControlPartCode
) == kControlButtonPart
) // we only care about the header
96 ControlRef controlReference
;
97 DataBrowserPropertyID columnPropertyID
;
98 DataBrowserSortOrder order
;
99 unsigned long columnIndex
;
100 wxDataViewColumn
* column
;
102 wxDataViewEvent
DataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
,DataViewCtrlPtr
->GetId());
104 CarbonEvent
.GetParameter(kEventParamDirectObject
,&controlReference
);
105 // determine the column that triggered the event (this is the column that is responsible for sorting the data view):
106 status
= ::GetDataBrowserSortProperty(controlReference
,&columnPropertyID
);
107 wxCHECK(status
== noErr
,status
);
108 status
= ::GetDataBrowserTableViewColumnPosition(controlReference
,columnPropertyID
,&columnIndex
);
109 if (status
== errDataBrowserPropertyNotFound
) // user clicked into part of the header that does not have a property
110 return ::CallNextEventHandler(handler
,EventReference
);
111 wxCHECK(status
== noErr
,status
);
112 column
= DataViewCtrlPtr
->GetColumn(columnIndex
);
113 // set the column sort order:
114 status
= ::GetDataBrowserSortOrder(controlReference
,&order
);
115 wxCHECK(status
== noErr
,status
);
116 column
->SetSortOrderVariable(order
== kDataBrowserOrderIncreasing
);
117 // initialize wxWidget event handler:
118 DataViewEvent
.SetEventObject(DataViewCtrlPtr
);
119 DataViewEvent
.SetColumn(columnIndex
);
120 DataViewEvent
.SetDataViewColumn(column
);
121 // finally sent the equivalent wxWidget event:
122 DataViewCtrlPtr
->HandleWindowEvent(DataViewEvent
);
123 return ::CallNextEventHandler(handler
,EventReference
);
126 return eventNotHandledErr
;
128 return eventNotHandledErr
;
131 static bool InitializeColumnDescription(DataBrowserListViewColumnDesc
& columnDescription
, wxDataViewColumn
const* columnPtr
, wxCFStringRef
const& title
)
133 // set properties for the column:
134 columnDescription
.propertyDesc
.propertyID
= columnPtr
->GetNativeData()->GetPropertyID();
135 columnDescription
.propertyDesc
.propertyType
= columnPtr
->GetRenderer()->GetNativeData()->GetPropertyType();
136 columnDescription
.propertyDesc
.propertyFlags
= kDataBrowserListViewSelectionColumn
; // make the column selectable
137 if (columnPtr
->IsReorderable())
138 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewMovableColumn
;
139 if (columnPtr
->IsResizeable())
141 columnDescription
.headerBtnDesc
.minimumWidth
= 0;
142 columnDescription
.headerBtnDesc
.maximumWidth
= 30000; // 32767 is the theoretical maximum though but 30000 looks nicer
146 columnDescription
.headerBtnDesc
.minimumWidth
= columnPtr
->GetWidth();
147 columnDescription
.headerBtnDesc
.maximumWidth
= columnPtr
->GetWidth();
149 if (columnPtr
->IsSortable())
150 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewSortableColumn
;
151 if ((columnPtr
->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE
) ||
152 (columnPtr
->GetRenderer()->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE
))
153 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserPropertyIsEditable
;
154 if ((columnDescription
.propertyDesc
.propertyType
== kDataBrowserCustomType
) ||
155 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserDateTimeType
) ||
156 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserIconAndTextType
) ||
157 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserTextType
))
158 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
; // enables generally the possibility to have user input for the mentioned types
159 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
160 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
162 // set header's properties:
163 columnDescription
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
164 columnDescription
.headerBtnDesc
.titleOffset
= 0;
165 columnDescription
.headerBtnDesc
.titleString
= ::CFStringCreateCopy(kCFAllocatorDefault
,title
);
166 columnDescription
.headerBtnDesc
.initialOrder
= kDataBrowserOrderIncreasing
; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
167 columnDescription
.headerBtnDesc
.btnFontStyle
.flags
= kControlUseFontMask
| kControlUseJustMask
;
168 switch (columnPtr
->GetAlignment())
171 case wxALIGN_CENTER_HORIZONTAL
:
172 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teCenter
;
175 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushLeft
;
178 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushRight
;
181 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushDefault
;
183 columnDescription
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
184 columnDescription
.headerBtnDesc
.btnFontStyle
.style
= normal
;
185 if (columnPtr
->GetBitmap().IsOk())
187 columnDescription
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentIconRef
;
188 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= columnPtr
->GetBitmap().GetIconRef();
192 // not text only as we otherwise could not add a bitmap later
193 // columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
194 columnDescription
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentIconRef
;
195 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= NULL
;
202 // ============================================================================
203 // Type definitions of locally used function pointers
204 // ============================================================================
205 DEFINE_ONE_SHOT_HANDLER_GETTER(DataBrowserCtrlEventHandler
)
207 // ============================================================================
208 // Helper functions for dataview implementation on OSX
209 // ============================================================================
210 wxWidgetImplType
* CreateDataView(wxWindowMac
* wxpeer
, wxWindowMac
* WXUNUSED(parent
), wxWindowID
WXUNUSED(id
), wxPoint
const& pos
, wxSize
const& size
,
211 long style
, long WXUNUSED(extraStyle
))
213 return new wxMacDataViewDataBrowserListViewControl(wxpeer
,pos
,size
,style
);
216 // ============================================================================
217 // wxMacDataBrowserTableViewControl
218 // ============================================================================
219 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef browser
, DataBrowserItemID itemOneID
, DataBrowserItemID itemTwoID
, DataBrowserPropertyID sortProperty
)
221 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
224 if (ControlPtr
!= NULL
)
225 return ControlPtr
->DataBrowserCompareProc(itemOneID
,itemTwoID
,sortProperty
);
230 pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser
, MenuRef
* menu
, UInt32
* helpType
, CFStringRef
* helpItemString
, AEDesc
* selection
)
232 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
235 if (ControlPtr
!= NULL
)
236 ControlPtr
->DataBrowserGetContextualMenuProc(menu
,helpType
,helpItemString
,selection
);
239 pascal OSStatus
wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemDataRef itemData
, Boolean getValue
)
241 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
244 if (ControlPtr
!= NULL
)
245 return ControlPtr
->DataBrowserGetSetItemDataProc(itemID
,propertyID
,itemData
,getValue
);
247 return errDataBrowserPropertyNotSupported
;
250 pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserItemNotification message
, DataBrowserItemDataRef itemData
)
252 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
255 if (ControlPtr
!= NULL
)
256 ControlPtr
->DataBrowserItemNotificationProc(itemID
,message
,itemData
);
259 pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemState state
, Rect
const* rectangle
, SInt16 bitDepth
, Boolean colorDevice
)
261 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
264 if (ControlPtr
!= NULL
)
265 ControlPtr
->DataBrowserDrawItemProc(itemID
,propertyID
,state
,rectangle
,bitDepth
,colorDevice
);
268 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, CFStringRef theString
, Rect
* maxEditTextRect
, Boolean
* shrinkToFit
)
270 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
273 return ((ControlPtr
!= NULL
) && ControlPtr
->DataBrowserEditItemProc(itemID
,propertyID
,theString
,maxEditTextRect
,shrinkToFit
));
276 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Rect
const* mouseRect
)
278 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
281 return ((ControlPtr
!= NULL
) && ControlPtr
->DataBrowserHitTestProc(itemID
,propertyID
,theRect
,mouseRect
));
284 pascal DataBrowserTrackingResult
wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Point startPt
, EventModifiers modifiers
)
286 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
289 if (ControlPtr
!= NULL
)
290 return ControlPtr
->DataBrowserTrackingProc(itemID
,propertyID
,theRect
,startPt
,modifiers
);
292 return kDataBrowserNothingHit
;
295 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc(ControlRef browser
, DragReference dragRef
, DataBrowserItemID itemID
)
297 wxMacDataBrowserTableViewControl
* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
300 return ((controlPtr
!= NULL
) && controlPtr
->DataBrowserAcceptDragProc(dragRef
,itemID
));
303 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc(ControlRef browser
, DragReference dragRef
, DataBrowserItemID itemID
, ItemReference
* itemRef
)
305 wxMacDataBrowserTableViewControl
* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
308 return ((controlPtr
!= NULL
) && controlPtr
->DataBrowserAddDragItemProc(dragRef
,itemID
,itemRef
));
311 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc(ControlRef browser
, DragReference dragRef
, DataBrowserItemID itemID
)
313 wxMacDataBrowserTableViewControl
* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
316 return ((controlPtr
!= NULL
) && controlPtr
->DataBrowserReceiveDragProc(dragRef
,itemID
));
319 wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow
* peer
, wxPoint
const& pos
, wxSize
const& size
, long style
)
322 Rect bounds
= wxMacGetBoundsForControl(peer
,pos
,size
);
323 OSStatus err
= ::CreateDataBrowserControl(MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),&bounds
,kDataBrowserListView
,&(m_controlRef
));
326 SetReferenceInNativeControl();
329 ::InstallControlEventHandler(m_controlRef
, GetDataBrowserCtrlEventHandlerUPP(), GetEventTypeCount(eventList
), eventList
, peer
, (EventHandlerRef
*)&m_macDataViewCtrlEventHandler
);
331 // setup standard callbacks:
332 if (gDataBrowserTableViewGetContextualMenuUPP
== NULL
) gDataBrowserTableViewGetContextualMenuUPP
= NewDataBrowserGetContextualMenuUPP(wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc
);
333 if (gDataBrowserTableViewItemCompareUPP
== NULL
) gDataBrowserTableViewItemCompareUPP
= NewDataBrowserItemCompareUPP (wxMacDataBrowserTableViewControl::DataBrowserCompareProc
);
334 if (gDataBrowserTableViewItemDataUPP
== NULL
) gDataBrowserTableViewItemDataUPP
= NewDataBrowserItemDataUPP (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc
);
335 if (gDataBrowserTableViewItemNotificationUPP
== NULL
)
337 gDataBrowserTableViewItemNotificationUPP
=
338 #if TARGET_API_MAC_OSX
339 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc
);
341 NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc
);
344 // setup drag and drop callbacks:
345 if (gDataBrowserTableViewAcceptDragUPP
== NULL
) gDataBrowserTableViewAcceptDragUPP
= NewDataBrowserAcceptDragUPP (wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc
);
346 if (gDataBrowserTableViewAddDragItemUPP
== NULL
) gDataBrowserTableViewAddDragItemUPP
= NewDataBrowserAddDragItemUPP(wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc
);
347 if (gDataBrowserTableViewReceiveDragUPP
== NULL
) gDataBrowserTableViewReceiveDragUPP
= NewDataBrowserReceiveDragUPP(wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc
);
349 DataBrowserCallbacks callbacks
; // variable definition
351 InitializeDataBrowserCallbacks(&callbacks
,kDataBrowserLatestCallbacks
);
352 callbacks
.u
.v1
.getContextualMenuCallback
= gDataBrowserTableViewGetContextualMenuUPP
;
353 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserTableViewItemDataUPP
;
354 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserTableViewItemCompareUPP
;
355 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserTableViewItemNotificationUPP
;
356 callbacks
.u
.v1
.acceptDragCallback
= gDataBrowserTableViewAcceptDragUPP
;
357 callbacks
.u
.v1
.addDragItemCallback
= gDataBrowserTableViewAddDragItemUPP
;
358 callbacks
.u
.v1
.receiveDragCallback
= gDataBrowserTableViewReceiveDragUPP
;
359 SetCallbacks(&callbacks
);
361 // setup callbacks for customized items:
362 if (gDataBrowserTableViewDrawItemUPP
== NULL
) gDataBrowserTableViewDrawItemUPP
= NewDataBrowserDrawItemUPP(wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc
);
363 if (gDataBrowserTableViewEditItemUPP
== NULL
) gDataBrowserTableViewEditItemUPP
= NewDataBrowserEditItemUPP(wxMacDataBrowserTableViewControl::DataBrowserEditItemProc
);
364 if (gDataBrowserTableViewHitTestUPP
== NULL
) gDataBrowserTableViewHitTestUPP
= NewDataBrowserHitTestUPP (wxMacDataBrowserTableViewControl::DataBrowserHitTestProc
);
365 if (gDataBrowserTableViewTrackingUPP
== NULL
) gDataBrowserTableViewTrackingUPP
= NewDataBrowserTrackingUPP(wxMacDataBrowserTableViewControl::DataBrowserTrackingProc
);
367 DataBrowserCustomCallbacks customCallbacks
; // variable definition
369 InitializeDataBrowserCustomCallbacks(&customCallbacks
,kDataBrowserLatestCallbacks
);
370 customCallbacks
.u
.v1
.drawItemCallback
= gDataBrowserTableViewDrawItemUPP
;
371 customCallbacks
.u
.v1
.editTextCallback
= gDataBrowserTableViewEditItemUPP
;
372 customCallbacks
.u
.v1
.hitTestCallback
= gDataBrowserTableViewHitTestUPP
;
373 customCallbacks
.u
.v1
.trackingCallback
= gDataBrowserTableViewTrackingUPP
;
374 SetCustomCallbacks(&customCallbacks
);
377 EnableCellSizeModification( ((style
& wxDV_VARIABLE_LINE_HEIGHT
) != 0), true );
379 DataBrowserSelectionFlags flags
; // variable definition
381 if (GetSelectionFlags(&flags
) == noErr
) // get default settings
383 if ((style
& wxDV_MULTIPLE
) != 0)
384 flags
&= ~kDataBrowserSelectOnlyOne
;
386 flags
|= kDataBrowserSelectOnlyOne
;
387 (void) SetSelectionFlags(flags
);
390 OptionBits attributes
; // variable definition
392 if (GetAttributes(&attributes
) == noErr
) // get default settings
394 if ((style
& wxDV_VERT_RULES
) != 0)
395 attributes
|= kDataBrowserAttributeListViewDrawColumnDividers
;
397 attributes
&= ~kDataBrowserAttributeListViewDrawColumnDividers
;
398 if ((style
& wxDV_ROW_LINES
) != 0)
399 attributes
|= kDataBrowserAttributeListViewAlternatingRowColors
;
401 attributes
&= ~kDataBrowserAttributeListViewAlternatingRowColors
;
402 (void) SetAttributes(attributes
);
405 if ((style
& wxDV_NO_HEADER
) != 0)
406 SetHeaderButtonHeight(0);
409 wxMacDataBrowserTableViewControl::~wxMacDataBrowserTableViewControl()
411 ::RemoveEventHandler((EventHandlerRef
) m_macDataViewCtrlEventHandler
);
417 OSStatus
wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks
const* callbacks
)
419 return ::SetDataBrowserCallbacks(m_controlRef
,callbacks
);
422 OSStatus
wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks
const* customCallbacks
)
424 return ::SetDataBrowserCustomCallbacks(m_controlRef
,customCallbacks
);
430 OSStatus
wxMacDataBrowserTableViewControl::EnableAutomaticDragTracking(bool enable
)
432 return ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(m_controlRef
),enable
);
438 OSStatus
wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID
, DataBrowserListViewHeaderDesc
* desc
) const
440 desc
->version
= kDataBrowserListViewLatestHeaderDesc
; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
441 return ::GetDataBrowserListViewHeaderDesc(m_controlRef
,propertyID
,desc
);
444 OSStatus
wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID
, DataBrowserListViewHeaderDesc
* desc
)
446 return ::SetDataBrowserListViewHeaderDesc(m_controlRef
,propertyID
,desc
);
452 OSStatus
wxMacDataBrowserTableViewControl::AutoSizeColumns()
454 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
457 OSStatus
wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enableHeight
, bool enableWidth
)
459 return ::SetDataBrowserTableViewGeometry(GetControlRef(),enableWidth
,enableHeight
);
462 OSStatus
wxMacDataBrowserTableViewControl::GetAttributes(OptionBits
* attributes
)
464 return ::DataBrowserGetAttributes(GetControlRef(),attributes
);
467 OSStatus
wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID
, UInt16
* width
) const
469 return ::GetDataBrowserTableViewNamedColumnWidth(m_controlRef
,propertyID
,width
);
472 OSStatus
wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16
*width
) const
474 return GetDataBrowserTableViewColumnWidth(m_controlRef
, width
);
477 OSStatus
wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16
* height
) const
479 return ::GetDataBrowserTableViewRowHeight(m_controlRef
,height
);
482 OSStatus
wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16
*height
)
484 return ::GetDataBrowserListViewHeaderBtnHeight(m_controlRef
,height
);
487 OSStatus
wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item
, DataBrowserPropertyID propertyID
, DataBrowserPropertyPart part
, Rect
* bounds
)
489 return ::GetDataBrowserItemPartBounds(m_controlRef
,item
,propertyID
,part
,bounds
);
492 OSStatus
wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item
, UInt16
* height
) const
494 return ::GetDataBrowserTableViewItemRowHeight(m_controlRef
,item
,height
);
497 OSStatus
wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
499 return GetDataBrowserScrollPosition(m_controlRef
, top
, left
);
502 OSStatus
wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes
)
504 return ::DataBrowserChangeAttributes(GetControlRef(),attributes
,~attributes
);
507 OSStatus
wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID
, UInt16 width
)
509 return ::SetDataBrowserTableViewNamedColumnWidth(m_controlRef
,propertyID
,width
);
512 OSStatus
wxMacDataBrowserTableViewControl::SetDefaultColumnWidth(UInt16 width
)
514 return ::SetDataBrowserTableViewColumnWidth(m_controlRef
,width
);
517 OSStatus
wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height
)
519 return ::SetDataBrowserTableViewRowHeight(m_controlRef
,height
);
522 OSStatus
wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz
, bool vert
)
524 return ::SetDataBrowserHasScrollBars(m_controlRef
,horiz
,vert
);
527 OSStatus
wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height
)
529 return ::SetDataBrowserListViewHeaderBtnHeight(m_controlRef
,height
);
532 OSStatus
wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle
)
534 return ::SetDataBrowserTableViewHiliteStyle(m_controlRef
,hiliteStyle
);
537 OSStatus
wxMacDataBrowserTableViewControl::SetIndent(float Indent
)
539 return ::DataBrowserSetMetric(m_controlRef
,kDataBrowserMetricDisclosureColumnPerDepthGap
,true,Indent
);
542 OSStatus
wxMacDataBrowserTableViewControl::SetItemRowHeight(DataBrowserItemID item
, UInt16 height
)
544 return ::SetDataBrowserTableViewItemRowHeight(m_controlRef
,item
,height
);
547 OSStatus
wxMacDataBrowserTableViewControl::SetScrollPosition(UInt32 top
, UInt32 left
)
549 return ::SetDataBrowserScrollPosition(m_controlRef
,top
,left
);
555 OSStatus
wxMacDataBrowserTableViewControl::GetColumnCount(UInt32
* numColumns
) const
557 return ::GetDataBrowserTableViewColumnCount(m_controlRef
,numColumns
);
560 OSStatus
wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID propertyID
, DataBrowserTableViewColumnIndex
* index
) const
562 return ::GetDataBrowserTableViewColumnPosition(m_controlRef
,propertyID
,index
);
565 OSStatus
wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID
* propertyID
) const
567 for (*propertyID
=kMinPropertyID
; *propertyID
<std::numeric_limits
<DataBrowserPropertyID
>::max(); ++(*propertyID
))
568 if (IsUsedPropertyID(*propertyID
) == errDataBrowserPropertyNotFound
)
570 return errDataBrowserPropertyNotSupported
;
573 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyID propertyID
, DataBrowserPropertyFlags
*flags
) const
575 return ::GetDataBrowserPropertyFlags(m_controlRef
,propertyID
,flags
);
578 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData
, DataBrowserPropertyID
* propertyID
) const
580 return ::GetDataBrowserItemDataProperty(itemData
,propertyID
);
583 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index
, DataBrowserTableViewColumnID
* propertyID
) const
585 return ::GetDataBrowserTableViewColumnProperty(m_controlRef
,index
,propertyID
);
588 OSStatus
wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyID propertyID
) const
590 // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
591 // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
592 // the column position for the property id:
593 DataBrowserTableViewColumnIndex index
;
595 return ::GetDataBrowserTableViewColumnPosition(m_controlRef
,propertyID
,&index
);
598 OSStatus
wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID
)
600 return ::RemoveDataBrowserTableViewColumn(m_controlRef
,propertyID
);
603 OSStatus
wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index
)
605 DataBrowserTableViewColumnID propertyID
;
608 GetPropertyID(index
,&propertyID
);
609 return ::RemoveDataBrowserTableViewColumn(m_controlRef
,propertyID
);
612 OSStatus
wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID
, DataBrowserTableViewColumnIndex index
)
614 return ::SetDataBrowserTableViewColumnPosition(m_controlRef
,propertyID
,index
);
617 OSStatus
wxMacDataBrowserTableViewControl::SetDisclosureColumn(DataBrowserPropertyID propertyID
, Boolean expandableRows
)
619 return ::SetDataBrowserListViewDisclosureColumn(m_controlRef
,propertyID
,expandableRows
);
622 OSStatus
wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID propertyID
, DataBrowserPropertyFlags flags
)
624 return ::SetDataBrowserPropertyFlags(m_controlRef
,propertyID
,flags
);
630 OSStatus
wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
)
632 return ::AddDataBrowserItems(m_controlRef
,container
,numItems
,items
,preSortProperty
);
635 OSStatus
wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID
* id
) const
642 status
= GetItemCount(&noOfItems
);
643 wxCHECK_MSG(status
== noErr
,status
,_("Could not retrieve number of items"));
651 // as there might be a lot of items in the data browser and mostly the data is added item by item the largest used ID number is roughly in the order of magnitude
652 // as the number of items; therefore, start from the number of items to look for a new ID:
653 for (*id
=noOfItems
; *id
<std::numeric_limits
<DataBrowserItemID
>::max(); ++(*id
))
654 if (IsUsedItemID(*id
) == errDataBrowserItemNotFound
)
656 // as the first approach was not successful, try from the beginning:
657 for (*id
=0; *id
<noOfItems
; ++(*id
))
658 if (IsUsedItemID(*id
) == errDataBrowserItemNotFound
)
660 // sorry, data browser is full:
661 return errDataBrowserItemNotAdded
;
665 OSStatus
wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID container
, Boolean recurse
, DataBrowserItemState state
, ItemCount
* numItems
) const
667 return GetDataBrowserItemCount(m_controlRef
,container
,recurse
,state
,numItems
);
670 OSStatus
wxMacDataBrowserTableViewControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
672 return GetDataBrowserTableViewItemID(m_controlRef
,row
,item
);
675 OSStatus
wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID container
, Boolean recurse
, DataBrowserItemState state
, Handle items
) const
677 return GetDataBrowserItems(m_controlRef
,container
,recurse
,state
,items
);
680 OSStatus
wxMacDataBrowserTableViewControl::GetItemRow(DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
682 return GetDataBrowserTableViewItemRow(m_controlRef
,item
,row
);
685 OSStatus
wxMacDataBrowserTableViewControl::GetItemState(DataBrowserItemID item
, DataBrowserItemState
* state
) const
687 return ::GetDataBrowserItemState(m_controlRef
,item
,state
);
690 OSStatus
wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID itemID
) const
692 // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
693 // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
694 // the column position for the property id:
695 DataBrowserTableViewColumnIndex index
;
697 return ::GetDataBrowserTableViewItemRow(m_controlRef
,itemID
,&index
);
700 OSStatus
wxMacDataBrowserTableViewControl::RemoveItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
)
702 return ::RemoveDataBrowserItems(m_controlRef
,container
,numItems
,items
,preSortProperty
);
705 OSStatus
wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item
, DataBrowserPropertyID propertyID
, DataBrowserRevealOptions options
) const
707 return ::RevealDataBrowserItem(m_controlRef
,item
,propertyID
,options
);
710 OSStatus
wxMacDataBrowserTableViewControl::UpdateItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
,
711 DataBrowserPropertyID propertyID
) const
713 return UpdateDataBrowserItems(m_controlRef
,container
,numItems
,items
,preSortProperty
,propertyID
);
719 size_t wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID
& itemIDs
) const
721 DataBrowserItemID
* itemIDPtr
;
722 Handle
handle(::NewHandle(0));
727 wxCHECK_MSG(GetItems(kDataBrowserNoItem
,true,kDataBrowserItemIsSelected
,handle
) == noErr
,0,_("Could not get selected items."));
728 noOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
730 itemIDs
.Alloc(noOfItems
);
732 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
733 for (size_t i
=0; i
<noOfItems
; ++i
)
735 itemIDs
.Add(*itemIDPtr
);
739 DisposeHandle(handle
);
743 OSStatus
wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID
* first
, DataBrowserItemID
* last
) const
745 return ::GetDataBrowserSelectionAnchor(m_controlRef
,first
,last
);
748 OSStatus
wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags
* flags
) const
750 return ::GetDataBrowserSelectionFlags(m_controlRef
,flags
);
753 bool wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID item
) const
755 return ::IsDataBrowserItemSelected(m_controlRef
,item
);
758 OSStatus
wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags flags
)
760 return ::SetDataBrowserSelectionFlags(m_controlRef
,flags
);
763 OSStatus
wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserSetOption operation
)
765 return ::SetDataBrowserSelectedItems(m_controlRef
, numItems
, items
, operation
);
768 OSStatus
wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder
* order
) const
770 return ::GetDataBrowserSortOrder(m_controlRef
,order
);
773 OSStatus
wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID
* propertyID
) const
775 return ::GetDataBrowserSortProperty(m_controlRef
,propertyID
);
778 OSStatus
wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container
, Boolean sortChildren
)
780 return ::SortDataBrowserContainer(m_controlRef
,container
,sortChildren
);
783 OSStatus
wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order
)
785 return ::SetDataBrowserSortOrder(m_controlRef
,order
);
788 OSStatus
wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID
)
790 return ::SetDataBrowserSortProperty(m_controlRef
,propertyID
);
794 // container handling
796 OSStatus
wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID
)
798 return ::CloseDataBrowserContainer(m_controlRef
,containerID
);
801 OSStatus
wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID
)
803 return ::OpenDataBrowserContainer(m_controlRef
,containerID
);
806 IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl
,wxMacControl
)
808 // ============================================================================
809 // wxMacDataBrowserListViewControl
810 // ============================================================================
815 OSStatus
wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc
*columnDesc
, DataBrowserTableViewColumnIndex position
)
817 return AddDataBrowserListViewColumn(m_controlRef
,columnDesc
,position
);
820 // ============================================================================
821 // wxMacDataViewDataBrowserListViewControl
822 // ============================================================================
825 // constructors / destructor
827 wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow
* peer
, wxPoint
const& pos
, wxSize
const& size
, long style
)
828 :wxMacDataBrowserListViewControl(peer
,pos
,size
,style
)
830 if ((style
& wxBORDER_NONE
) != 0)
831 SetData(kControlNoPart
,kControlDataBrowserIncludesFrameAndFocusTag
,(Boolean
) false);
832 (void) EnableAutomaticDragTracking();
833 (void) SetHiliteStyle(kDataBrowserTableViewFillHilite
);
837 // column related methods (inherited from wxDataViewWidgetImpl)
839 bool wxMacDataViewDataBrowserListViewControl::ClearColumns()
844 wxCHECK_MSG(GetColumnCount(&noOfColumns
) == noErr
,false,_("Could not determine number of columns."));
845 for (UInt32 i
=0; i
<noOfColumns
; ++i
)
846 wxCHECK_MSG(RemoveColumnByIndex(0) == noErr
,false,_("Could not remove column."));
850 bool wxMacDataViewDataBrowserListViewControl::DeleteColumn(wxDataViewColumn
* columnPtr
)
852 return (RemoveColumnByProperty(columnPtr
->GetNativeData()->GetPropertyID()) == noErr
);
855 void wxMacDataViewDataBrowserListViewControl::DoSetExpanderColumn(wxDataViewColumn
const* columnPtr
)
857 SetDisclosureColumn(columnPtr
->GetNativeData()->GetPropertyID(),false); // second parameter explicitely passed to ensure that arrow is centered
860 wxDataViewColumn
* wxMacDataViewDataBrowserListViewControl::GetColumn(unsigned int pos
) const
862 DataBrowserPropertyID propertyID
;
865 if (GetPropertyID(pos
,&propertyID
) == noErr
)
866 return GetColumnPtr(propertyID
);
871 int wxMacDataViewDataBrowserListViewControl::GetColumnPosition(wxDataViewColumn
const* columnPtr
) const
873 if (columnPtr
!= NULL
)
875 DataBrowserTableViewColumnIndex Position
;
877 wxCHECK_MSG(GetColumnIndex(columnPtr
->GetNativeData()->GetPropertyID(),&Position
) == noErr
,wxNOT_FOUND
,_("Could not determine column's position"));
878 return static_cast<int>(Position
);
884 bool wxMacDataViewDataBrowserListViewControl::InsertColumn(unsigned int pos
, wxDataViewColumn
* columnPtr
)
886 DataBrowserListViewColumnDesc columnDescription
;
888 DataBrowserPropertyID newPropertyID
;
892 wxCFStringRef
title(columnPtr
->GetTitle(),m_font
.Ok() ? dynamic_cast<wxDataViewCtrl
*>(GetWXPeer())->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
895 // try to get new ID for the column:
896 wxCHECK_MSG(GetFreePropertyID(&newPropertyID
) == noErr
,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
898 columnPtr
->GetNativeData()->SetPropertyID(newPropertyID
);
899 // create a column description, add column to the native control and do some final layout adjustments:
900 wxCHECK_MSG(::InitializeColumnDescription(columnDescription
,columnPtr
,title
), false,_("Column description could not be initialized."));
901 wxCHECK_MSG(AddColumn(&columnDescription
,pos
) == noErr
, false,_("Column could not be added."));
902 wxCHECK_MSG(SetColumnWidth(newPropertyID
,columnPtr
->GetWidth()) == noErr
,false,_("Column width could not be set."));
903 wxCHECK_MSG(GetColumnCount(&noOfColumns
) == noErr
, false,_("Number of columns could not be determined."));
904 if (noOfColumns
== 1)
906 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
908 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,false,_("wxWidget's control not initialized."));
909 dataViewCtrlPtr
->AddChildren(wxDataViewItem());
913 return Update(columnPtr
);
917 // item related methods (inherited from wxDataViewWidgetImpl)
919 bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
921 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
924 return (( parent
.IsOk() && AddItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
) ||
925 (!(parent
.IsOk()) && AddItem(kDataBrowserNoItem
,&itemID
) == noErr
));
928 bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
932 DataBrowserItemID
* itemIDs
;
937 // convert all valid data view items to data browser items:
938 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
939 // insert all valid items into control:
940 noFailureFlag
= ((noOfEntries
== 0) ||
941 !(parent
.IsOk()) && (AddItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
942 parent
.IsOk() && (AddItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
943 // give allocated array space free again:
946 return noFailureFlag
;
949 void wxMacDataViewDataBrowserListViewControl::Collapse(wxDataViewItem
const& item
)
951 CloseContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
954 void wxMacDataViewDataBrowserListViewControl::EnsureVisible(wxDataViewItem
const& item
, const wxDataViewColumn
* columnPtr
)
956 DataBrowserPropertyID propertyID
;
959 if (columnPtr
!= NULL
)
960 propertyID
= columnPtr
->GetNativeData()->GetPropertyID();
962 propertyID
= kDataBrowserNoItem
;
963 RevealItem(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),propertyID
,kDataBrowserRevealOnly
);
966 void wxMacDataViewDataBrowserListViewControl::Expand(wxDataViewItem
const& item
)
968 OpenContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
971 unsigned int wxMacDataViewDataBrowserListViewControl::GetCount() const
976 wxCHECK_MSG(GetItemCount(&noOfItems
) == noErr
,0,_("Could not determine number of items"));
980 wxRect
wxMacDataViewDataBrowserListViewControl::GetRectangle(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
)
985 if (GetPartBounds(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),columnPtr
->GetNativeData()->GetPropertyID(),kDataBrowserPropertyContentPart
,&MacRectangle
) == noErr
)
989 ::wxMacNativeToRect(&MacRectangle
,&rectangle
);
996 bool wxMacDataViewDataBrowserListViewControl::IsExpanded(wxDataViewItem
const& item
) const
998 DataBrowserItemState state
= 0;
1000 if (GetItemState(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),&state
) != noErr
)
1003 return ((state
& kDataBrowserContainerIsOpen
) != 0);
1006 bool wxMacDataViewDataBrowserListViewControl::Reload()
1010 wxDataViewItemArray dataViewChildren
;
1013 noFailureFlag
= (RemoveItems() == noErr
);
1014 SetScrollPosition(0,0); // even after having removed all items the scrollbars may remain at their old position -> reset them
1015 GetDataViewCtrl()->GetModel()->GetChildren(wxDataViewItem(),dataViewChildren
);
1016 GetDataViewCtrl()->GetModel()->ItemsAdded(wxDataViewItem(),dataViewChildren
);
1018 return noFailureFlag
;
1021 bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
1023 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1026 return (RemoveItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
);
1029 bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
1033 DataBrowserItemID
* itemIDs
;
1038 // convert all valid data view items to data browser items:
1039 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
1040 // insert all valid items into control:
1041 noFailureFlag
= ((noOfEntries
== 0) ||
1042 !(parent
.IsOk()) && (RemoveItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
1043 parent
.IsOk() && (RemoveItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
1044 // give allocated array space free again:
1047 return noFailureFlag
;
1050 bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewColumn
const* columnPtr
)
1052 return (UpdateItems(kDataBrowserNoItem
,0,NULL
,kDataBrowserItemNoProperty
,columnPtr
->GetNativeData()->GetPropertyID()) == noErr
);
1055 bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
1057 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1061 return (UpdateItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
);
1063 return (UpdateItem(kDataBrowserNoItem
,&itemID
) == noErr
);
1066 bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
1070 DataBrowserItemID
* itemIDs
;
1075 // convert all valid data view items to data browser items:
1076 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
1078 noFailureFlag
= (UpdateItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
,kDataBrowserItemNoProperty
) == noErr
);
1080 noFailureFlag
= (UpdateItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
,kDataBrowserItemNoProperty
) == noErr
);
1081 // release allocated array space:
1084 return noFailureFlag
;
1088 // model related methods
1090 bool wxMacDataViewDataBrowserListViewControl::AssociateModel(wxDataViewModel
* WXUNUSED(model
))
1096 // selection related methods (inherited from wxDataViewWidgetImpl)
1098 int wxMacDataViewDataBrowserListViewControl::GetSelections(wxDataViewItemArray
& sel
) const
1100 size_t noOfSelectedItems
;
1102 wxArrayDataBrowserItemID itemIDs
;
1105 noOfSelectedItems
= GetSelectedItemIDs(itemIDs
);
1107 sel
.SetCount(noOfSelectedItems
);
1108 for (size_t i
=0; i
<noOfSelectedItems
; ++i
)
1109 sel
[i
] = wxDataViewItem(reinterpret_cast<void*>(itemIDs
[i
]));
1110 return static_cast<int>(noOfSelectedItems
);
1113 bool wxMacDataViewDataBrowserListViewControl::IsSelected(wxDataViewItem
const& item
) const
1115 return IsItemSelected(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1118 void wxMacDataViewDataBrowserListViewControl::Select(wxDataViewItem
const& item
)
1120 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1123 SetSelectedItems(1,&itemID
,kDataBrowserItemsAdd
);
1126 void wxMacDataViewDataBrowserListViewControl::SelectAll()
1128 DataBrowserItemID
* itemIDPtr
;
1130 Handle
handle(::NewHandle(0));
1135 wxCHECK_RET(GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1136 noOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1138 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1139 SetSelectedItems(noOfItems
,itemIDPtr
,kDataBrowserItemsAssign
);
1141 ::DisposeHandle(handle
);
1144 void wxMacDataViewDataBrowserListViewControl::Unselect(wxDataViewItem
const& item
)
1146 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1149 SetSelectedItems(1,&itemID
,kDataBrowserItemsRemove
);
1152 void wxMacDataViewDataBrowserListViewControl::UnselectAll()
1154 DataBrowserItemID
* itemIDPtr
;
1156 Handle
handle(::NewHandle(0));
1161 wxCHECK_RET(GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1162 noOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1164 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1165 SetSelectedItems(noOfItems
,itemIDPtr
,kDataBrowserItemsRemove
);
1167 ::DisposeHandle(handle
);
1171 // sorting related methods
1173 wxDataViewColumn
* wxMacDataViewDataBrowserListViewControl::GetSortingColumn() const
1175 DataBrowserPropertyID propertyID
;
1178 if (GetSortProperty(&propertyID
) == noErr
)
1179 return GetColumnPtr(propertyID
);
1184 void wxMacDataViewDataBrowserListViewControl::Resort()
1190 // other methods (inherited from wxDataViewWidgetImpl)
1193 wxMacDataViewDataBrowserListViewControl::HitTest(const wxPoint
& WXUNUSED(point
),
1194 wxDataViewItem
& item
,
1195 wxDataViewColumn
*& columnPtr
) const
1197 // not yet implemented:
1198 item
= wxDataViewItem();
1202 void wxMacDataViewDataBrowserListViewControl::DoSetIndent(int indent
)
1204 SetIndent(static_cast<float>(indent
));
1207 void wxMacDataViewDataBrowserListViewControl::SetRowHeight(wxDataViewItem
const& item
, unsigned int height
)
1209 SetItemRowHeight(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),static_cast<UInt16
>(height
));
1212 void wxMacDataViewDataBrowserListViewControl::OnSize()
1217 GetColumnCount(&noOfColumns
);
1218 if (noOfColumns
<= 1) // no horizontal scroll bar and the only column expands to the width of the whole control
1220 SetHasScrollBars(false,true);
1223 else // otherwise keep the current column size and have scrollbars in both directions
1224 SetHasScrollBars(true,true);
1228 // callback functions (inherited from wxMacDataBrowserTableViewControl)
1230 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID
, DataBrowserItemID itemTwoID
, DataBrowserPropertyID sortProperty
)
1232 DataBrowserSortOrder sortOrder
;
1234 DataBrowserTableViewColumnIndex modelColumnIndex
;
1236 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1239 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1240 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1241 if (sortProperty
>= kMinPropertyID
)
1243 // variable definition and initialization:
1244 wxDataViewColumn
* ColumnPtr(GetColumnPtr(sortProperty
));
1246 wxCHECK_MSG(ColumnPtr
!= NULL
,false,_("Could not determine column index."));
1247 modelColumnIndex
= ColumnPtr
->GetModelColumn();
1250 modelColumnIndex
= 0;
1251 GetSortOrder(&sortOrder
);
1252 return static_cast<Boolean
>(dataViewCtrlPtr
->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID
)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID
)),
1253 modelColumnIndex
,sortOrder
!= kDataBrowserOrderDecreasing
) < 0);
1256 void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef
* menu
, UInt32
* helpType
, CFStringRef
* helpItemString
, AEDesc
* WXUNUSED(selection
))
1257 // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
1259 wxArrayDataBrowserItemID itemIDs
;
1261 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1264 wxCHECK_RET(dataViewCtrlPtr
!= NULL
,_("wxWidget control pointer is not a data view pointer"));
1265 // initialize parameters so that no context menu will be displayed automatically by the native data browser:
1267 *helpType
= kCMHelpItemNoHelp
;
1268 *helpItemString
= NULL
;
1269 // create information for a context menu event:
1270 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU
,dataViewCtrlPtr
->GetId());
1272 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1273 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
1274 // get the item information;
1275 // theoretically more than one ID can be returned but the event can only handle one item, therefore all item related data is using the data of the first item in the array:
1276 if (GetSelectedItemIDs(itemIDs
) > 0)
1277 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs
[0])));
1278 // finally send the equivalent wxWidget event:
1279 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1282 OSStatus
wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemDataRef itemData
, Boolean getValue
)
1286 // variable definitions:
1287 wxDataViewCtrl
* dataViewCtrlPtr
;
1289 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1290 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1291 if (dataViewCtrlPtr
->IsDeleting())
1292 return noErr
; // if a delete process is running the data of editable fields cannot be saved because the associated model variable may already have been deleted
1295 // variable definitions:
1296 OSStatus errorStatus
;
1297 wxDataViewColumn
* dataViewColumnPtr
;
1299 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
1300 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1301 wxCHECK_MSG((dataViewColumnPtr
!= NULL
) && (dataViewColumnPtr
->GetRenderer() != NULL
),errDataBrowserNotConfigured
,_("There is no column or renderer for the specified column index."));
1303 wxDataViewItem
dvItem(reinterpret_cast<void*>(itemID
));
1304 unsigned int col
= dataViewColumnPtr
->GetModelColumn();
1306 switch (dataViewColumnPtr
->GetRenderer()->GetNativeData()->GetPropertyType())
1308 case kDataBrowserCheckboxType
:
1310 // variable definition:
1311 ThemeButtonValue buttonValue
;
1313 errorStatus
= ::GetDataBrowserItemDataButtonValue(itemData
,&buttonValue
);
1314 if (errorStatus
== noErr
)
1316 if (buttonValue
== kThemeButtonOn
)
1318 // variable definition and initialization:
1319 wxVariant
modifiedData(true);
1321 if (dataViewCtrlPtr
->GetModel()->ChangeValue(modifiedData
, dvItem
, col
))
1324 return errDataBrowserInvalidPropertyData
;
1326 else if (buttonValue
== kThemeButtonOff
)
1328 // variable definition and initialization:
1329 wxVariant
modifiedData(false);
1331 if (dataViewCtrlPtr
->GetModel()->ChangeValue(modifiedData
, dvItem
, col
))
1334 return errDataBrowserInvalidPropertyData
;
1337 return errDataBrowserInvalidPropertyData
;
1342 case kDataBrowserTextType
:
1344 // variable definitions:
1345 CFStringRef stringReference
;
1347 errorStatus
= ::GetDataBrowserItemDataText(itemData
,&stringReference
);
1348 if (errorStatus
== noErr
)
1350 // variable definitions and initializations:
1351 #if wxCHECK_VERSION(2,9,0)
1352 wxCFStringRef
modifiedString(stringReference
);
1354 wxMacCFStringHolder
modifiedString(stringReference
);
1356 wxVariant
modifiedData(modifiedString
.AsString());
1358 if (dataViewCtrlPtr
->GetModel()->ChangeValue(modifiedData
, dvItem
, col
))
1361 return errDataBrowserInvalidPropertyData
;
1367 return errDataBrowserPropertyNotSupported
;
1373 if (propertyID
>= kMinPropertyID
) // in case data columns set the data
1375 // variable definitions:
1377 wxDataViewColumn
* dataViewColumnPtr
;
1378 wxDataViewCtrl
* dataViewCtrlPtr
;
1380 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1381 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1382 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
1383 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1384 wxCHECK_MSG(dataViewColumnPtr
!= NULL
,errDataBrowserNotConfigured
,_("No column for the specified column position existing."));
1385 wxCHECK_MSG(dataViewColumnPtr
->GetRenderer() != NULL
,errDataBrowserNotConfigured
,_("No renderer specified for column."));
1386 dataViewCtrlPtr
->GetModel()->GetValue(variant
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn());
1387 if (!(variant
.IsNull()))
1389 dataViewColumnPtr
->GetRenderer()->GetNativeData()->SetItemDataRef(itemData
);
1390 dataViewColumnPtr
->GetRenderer()->SetValue(variant
);
1391 wxCHECK_MSG(dataViewColumnPtr
->GetRenderer()->MacRender(),errDataBrowserNotConfigured
,_("Rendering failed."));
1395 else // react on special system requests
1399 case kDataBrowserContainerIsClosableProperty
:
1401 // variable definitions:
1402 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1404 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1405 // initialize wxWidget event:
1406 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING
,dataViewCtrlPtr
->GetId()); // variable definition
1408 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1409 dataViewEvent
.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1410 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
1411 // finally send the equivalent wxWidget event:
1412 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1413 // opening the container is allowed if not vetoed:
1414 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewEvent
.IsAllowed());
1416 case kDataBrowserContainerIsOpenableProperty
:
1418 // variable definitions:
1419 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1421 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1422 // initialize wxWidget event:
1423 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING
,dataViewCtrlPtr
->GetId()); // variable definition
1425 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1426 dataViewEvent
.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1427 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
1428 // finally send the equivalent wxWidget event:
1429 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1430 // opening the container is allowed if not vetoed:
1431 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewEvent
.IsAllowed());
1433 case kDataBrowserItemIsContainerProperty
:
1435 // variable definition:
1436 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1438 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1439 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
1440 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewCtrlPtr
->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID
))));
1442 case kDataBrowserItemIsEditableProperty
:
1443 return ::SetDataBrowserItemDataBooleanValue(itemData
,true);
1447 return errDataBrowserPropertyNotSupported
;
1450 void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID
, DataBrowserItemNotification message
, DataBrowserItemDataRef itemData
)
1452 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1455 // check if the data view control pointer still exists because this call back function can still be called when the control has already been deleted:
1456 if (dataViewCtrlPtr
!= NULL
)
1459 case kDataBrowserContainerClosed
:
1460 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1462 // initialize wxWidget event:
1463 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED
,dataViewCtrlPtr
->GetId()); // variable definition
1465 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1466 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1467 // finally send the equivalent wxWidget event:
1468 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1471 case kDataBrowserContainerOpened
:
1472 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1474 // initialize wxWidget event:
1475 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED
,dataViewCtrlPtr
->GetId()); // variable definition
1477 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1478 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1479 // finally send the equivalent wxWidget event:
1480 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1481 // add children to the expanded container:
1482 dataViewCtrlPtr
->AddChildren(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1485 case kDataBrowserEditStarted
:
1486 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1488 // initialize wxWidget event:
1489 DataBrowserPropertyID propertyID
;
1490 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
,dataViewCtrlPtr
->GetId()); // variable definition
1492 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1493 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1494 if (GetPropertyID(itemData
,&propertyID
) == noErr
)
1496 // variable definition and initialization:
1497 DataBrowserTableViewColumnIndex columnIndex
;
1499 wxCHECK_RET(GetColumnIndex(propertyID
,&columnIndex
),_("Column index not found."));
1500 dataViewEvent
.SetColumn(columnIndex
);
1501 dataViewEvent
.SetDataViewColumn(GetColumnPtr(propertyID
));
1503 // finally send the equivalent wxWidget event:
1504 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1507 case kDataBrowserEditStopped
:
1509 // initialize wxWidget event:
1510 DataBrowserPropertyID propertyID
;
1511 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE
,dataViewCtrlPtr
->GetId()); // variable definition
1513 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1514 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1515 if (GetPropertyID(itemData
,&propertyID
) == noErr
)
1517 // variable definition and initialization:
1518 DataBrowserTableViewColumnIndex columnIndex
;
1520 wxCHECK_RET(GetColumnIndex(propertyID
,&columnIndex
),_("Column index not found."));
1521 dataViewEvent
.SetColumn(columnIndex
);
1522 dataViewEvent
.SetDataViewColumn(GetColumnPtr(propertyID
));
1524 // finally send the equivalent wxWidget event:
1525 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1528 case kDataBrowserItemAdded
:
1529 dataViewCtrlPtr
->FinishCustomItemEditing();
1531 case kDataBrowserItemDeselected
:
1532 dataViewCtrlPtr
->FinishCustomItemEditing();
1534 case kDataBrowserItemDoubleClicked
:
1536 // initialize wxWidget event:
1537 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED
,dataViewCtrlPtr
->GetId()); // variable definition
1539 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1540 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1541 // finally send the equivalent wxWidget event:
1542 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1545 case kDataBrowserItemRemoved
:
1546 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1548 case kDataBrowserItemSelected
:
1549 break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
1550 case kDataBrowserSelectionSetChanged
:
1552 // initialize wxWidget event:
1553 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED
,dataViewCtrlPtr
->GetId()); // variable definition
1555 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1556 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
1557 // finally send the equivalent wxWidget event:
1558 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1561 case kDataBrowserTargetChanged
: // no idea if this notification is ever sent
1563 case kDataBrowserUserStateChanged
:
1565 // finish custom item editing if necessary:
1566 dataViewCtrlPtr
->FinishCustomItemEditing();
1567 // update column widths:
1568 for (size_t i
=0; i
<dataViewCtrlPtr
->GetColumnCount(); ++i
)
1570 // constant definition for abbreviational purposes:
1571 wxDataViewColumn
* const columnPtr
= dataViewCtrlPtr
->GetColumnPtr(i
);
1572 // variable definition:
1575 wxCHECK_RET(GetColumnWidth(columnPtr
->GetNativeData()->GetPropertyID(),&columnWidth
) == noErr
,_("Column width could not be determined"));
1576 columnPtr
->SetWidthVariable(columnWidth
);
1578 // update sorting orders:
1579 DataBrowserPropertyID propertyID
; // variable definition
1581 if ((GetSortProperty(&propertyID
) == noErr
) && (propertyID
>= kMinPropertyID
))
1583 DataBrowserSortOrder sortOrder
;
1584 DataBrowserTableViewColumnIndex columnIndex
;
1586 if ((GetSortOrder(&sortOrder
) == noErr
) && (GetColumnIndex(propertyID
,&columnIndex
) == noErr
))
1588 // variable definition and initialization:
1589 wxDataViewColumn
* columnPtr
;
1590 columnPtr
= dataViewCtrlPtr
->GetColumn(columnIndex
);
1591 // check if the sort order has changed:
1592 if ( columnPtr
->IsSortOrderAscending() && (sortOrder
== kDataBrowserOrderDecreasing
) ||
1593 !(columnPtr
->IsSortOrderAscending()) && (sortOrder
== kDataBrowserOrderIncreasing
))
1595 columnPtr
->SetSortOrder(!(columnPtr
->IsSortOrderAscending()));
1596 // initialize wxWidget event:
1597 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED
,dataViewCtrlPtr
->GetId()); // variable defintion
1599 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1600 dataViewEvent
.SetColumn(columnIndex
);
1601 dataViewEvent
.SetDataViewColumn(columnPtr
);
1602 // finally send the equivalent wxWidget event:
1603 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1613 wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID
,
1614 DataBrowserPropertyID propertyID
,
1615 DataBrowserItemState state
,
1616 Rect
const* rectangle
,
1617 SInt16
WXUNUSED(bitDepth
),
1618 Boolean
WXUNUSED(colorDevice
))
1620 DataBrowserTableViewColumnIndex columnIndex
;
1622 wxDataViewColumn
* dataViewColumnPtr
;
1624 wxDataViewCtrl
* dataViewCtrlPtr
;
1626 wxDataViewCustomRenderer
* dataViewCustomRendererPtr
;
1628 wxVariant dataToRender
;
1630 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1631 wxCHECK_RET(dataViewCtrlPtr
!= NULL
, _("Pointer to data view control not set correctly."));
1632 wxCHECK_RET(dataViewCtrlPtr
->GetModel() != NULL
, _("Pointer to model not set correctly."));
1633 wxCHECK_RET(GetColumnIndex(propertyID
,&columnIndex
) == noErr
,_("Could not determine column index."));
1634 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1635 wxCHECK_RET(dataViewColumnPtr
!= NULL
,_("No column for the specified column existing."));
1636 dataViewCustomRendererPtr
= dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer());
1637 wxCHECK_RET(dataViewCustomRendererPtr
!= NULL
,_("No renderer or invalid renderer type specified for custom data column."));
1638 dataViewCtrlPtr
->GetModel()->GetValue(dataToRender
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn());
1639 dataViewCustomRendererPtr
->SetValue(dataToRender
);
1641 wxDataViewItem
dataItem( reinterpret_cast<void*>(itemID
) );
1642 dataViewCtrlPtr
->GetModel()->GetValue(dataToRender
,dataItem
,dataViewColumnPtr
->GetModelColumn());
1643 dataViewCustomRendererPtr
->SetValue(dataToRender
);
1645 // try to determine the content's size (drawable part):
1647 RgnHandle
rgn(NewRgn());
1648 UInt16 headerHeight
;
1650 if (GetControlRegion(m_controlRef
,kControlContentMetaPart
,rgn
) == noErr
)
1651 GetRegionBounds(rgn
,&content
);
1653 GetControlBounds(m_controlRef
, &content
);
1655 // space for the header
1656 GetHeaderButtonHeight(&headerHeight
);
1657 content
.top
+= headerHeight
;
1658 // extra space for the frame (todo: do not how to determine the space automatically from the control)
1662 content
.bottom
-= 3;
1663 // extra space for the scrollbars:
1664 content
.bottom
-= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y
);
1665 content
.right
-= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X
);
1667 wxDC
*dc
= dataViewCustomRendererPtr
->GetDC();
1669 int active_border_fudge
= 0;
1670 if (dataViewCtrlPtr
->HasFocus() && !dataViewCtrlPtr
->HasFlag( wxBORDER_NONE
))
1671 active_border_fudge
= 1;
1673 active_border_fudge
= -2;
1675 wxRect
cellrect( static_cast<int>(rectangle
->left
+ active_border_fudge
),
1676 static_cast<int>(rectangle
->top
+ active_border_fudge
),
1677 static_cast<int>(1+rectangle
->right
-rectangle
->left
),
1678 static_cast<int>(rectangle
->bottom
-rectangle
->top
) );
1680 bool is_active
= IsControlActive( m_controlRef
);
1681 if (state
== kDataBrowserItemIsSelected
)
1683 wxColour
col( wxMacCreateCGColorFromHITheme( (is_active
) ?
1684 kThemeBrushAlternatePrimaryHighlightColor
1685 : kThemeBrushSecondaryHighlightColor
) );
1687 wxRect rect
= cellrect
;
1689 GetDataBrowserItemPartBounds( m_controlRef
, itemID
, propertyID
,
1690 kDataBrowserPropertyEnclosingPart
, &itemrect
);
1691 rect
.x
= itemrect
.left
-2;
1692 rect
.width
= itemrect
.right
-itemrect
.left
+3;
1694 wxDCPenChanger
setPen(*dc
, *wxTRANSPARENT_PEN
);
1695 wxDCBrushChanger
setBrush(*dc
, col
);
1696 dc
->DrawRectangle(rect
);
1699 wxDataViewModel
*model
= dataViewCtrlPtr
->GetModel();
1700 if ((columnIndex
== 0) || !model
->IsContainer(dataItem
) || model
->HasContainerColumns(dataItem
))
1702 // make sure that 'Render' can draw only in the allowed area:
1703 dc
->SetClippingRegion(content
.left
,content
.top
,content
.right
-content
.left
+1,content
.bottom
-content
.top
+1);
1704 (void) (dataViewCustomRendererPtr
->Render( cellrect
, dc
,
1705 ((state
== kDataBrowserItemIsSelected
) ? wxDATAVIEW_CELL_SELECTED
: 0)));
1706 dc
->DestroyClippingRegion(); // probably not necessary
1709 dataViewCustomRendererPtr
->SetDC(NULL
);
1713 wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(
1714 DataBrowserItemID
WXUNUSED(itemID
),
1715 DataBrowserPropertyID
WXUNUSED(propertyID
),
1716 CFStringRef
WXUNUSED(theString
),
1717 Rect
* WXUNUSED(maxEditTextRect
),
1718 Boolean
* WXUNUSED(shrinkToFit
))
1723 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID
WXUNUSED(itemID
), DataBrowserPropertyID
WXUNUSED(property
), Rect
const* WXUNUSED(theRect
), Rect
const* WXUNUSED(mouseRect
))
1728 DataBrowserTrackingResult
wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Point
WXUNUSED(startPt
), EventModifiers
WXUNUSED(modifiers
))
1730 wxDataViewColumn
* dataViewColumnPtr
;
1732 wxDataViewCtrl
* dataViewCtrlPtr
;
1734 wxDataViewCustomRenderer
* dataViewCustomRendererPtr
;
1736 wxDataViewItem dataViewCustomRendererItem
;
1739 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1740 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1741 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1742 dataViewCustomRendererItem
= reinterpret_cast<void*>(itemID
);
1743 wxCHECK_MSG(dataViewCustomRendererItem
.IsOk(),kDataBrowserNothingHit
,_("Invalid data view item"));
1744 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1745 wxCHECK_MSG(dataViewColumnPtr
!= NULL
,kDataBrowserNothingHit
,_("No column existing."));
1746 dataViewCustomRendererPtr
= dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer());
1747 wxCHECK_MSG(dataViewCustomRendererPtr
!= NULL
,kDataBrowserNothingHit
,_("No renderer or invalid renderer type specified for custom data column."));
1748 // if the currently edited item is identical to the to be edited nothing is done (this hit should only be handled in the control itself):
1749 if (dataViewCtrlPtr
->GetCustomRendererItem() == dataViewCustomRendererItem
)
1750 return kDataBrowserContentHit
;
1751 // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
1752 if (dataViewCtrlPtr
->GetCustomRendererPtr() != NULL
)
1754 dataViewCtrlPtr
->GetCustomRendererPtr()->FinishEditing();
1755 dataViewCtrlPtr
->SetCustomRendererItem(wxDataViewItem());
1756 dataViewCtrlPtr
->SetCustomRendererPtr (NULL
);
1758 // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
1759 if (dataViewCustomRendererPtr
->HasEditorCtrl())
1761 // variable definition:
1764 ::wxMacNativeToRect(theRect
,&wxRectangle
);
1765 dataViewCustomRendererPtr
->StartEditing(dataViewCustomRendererItem
,wxRectangle
);
1766 dataViewCtrlPtr
->SetCustomRendererItem(dataViewCustomRendererItem
);
1767 dataViewCtrlPtr
->SetCustomRendererPtr (dataViewCustomRendererPtr
);
1769 return kDataBrowserContentHit
;
1772 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserAcceptDragProc(DragReference dragRef
, DataBrowserItemID itemID
)
1776 UInt16 noOfDraggedItems
;
1778 wxDataViewCtrl
* dataViewCtrlPtr
;
1781 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1782 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1783 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1785 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1786 ::CountDragItems(dragRef
,&noOfDraggedItems
);
1787 for (UInt16 indexDraggedItem
=1; indexDraggedItem
<=noOfDraggedItems
; ++indexDraggedItem
)
1789 // collect native information:
1790 ItemReference itemRef
;
1791 wxDataObjectComposite
* dataObjects
;
1792 wxMemoryBuffer buffer
;
1794 ::GetDragItemReferenceNumber(dragRef
,indexDraggedItem
,&itemRef
); // the index begins with 1!
1795 dataObjects
= GetDnDDataObjects(dragRef
,itemRef
);
1796 // create wxWidget's event:
1797 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE
,dataViewCtrlPtr
->GetId());
1799 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1800 dataViewEvent
.SetItem(reinterpret_cast<void*>(itemID
)); // this is the item that receives the event
1801 // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
1802 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
1803 dataViewEvent
.SetDataObject(dataObjects
);
1804 dataViewEvent
.SetDataFormat(GetDnDDataFormat(dataObjects
));
1805 if (dataViewEvent
.GetDataFormat().GetType() != wxDF_INVALID
)
1807 dataViewEvent
.SetDataSize(dataObjects
->GetDataSize(dataViewEvent
.GetDataFormat().GetType()));
1808 dataObjects
->GetDataHere(dataViewEvent
.GetDataFormat().GetType(),buffer
.GetWriteBuf(dataViewEvent
.GetDataSize()));
1809 buffer
.UngetWriteBuf(dataViewEvent
.GetDataSize());
1810 dataViewEvent
.SetDataBuffer(buffer
.GetData());
1814 acceptDrag
= dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
) && dataViewEvent
.IsAllowed();
1822 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserAddDragItemProc(DragReference dragRef
, DataBrowserItemID itemID
, ItemReference
* itemRef
)
1824 Boolean addDragItem
;
1826 wxDataViewCtrl
* dataViewCtrlPtr
;
1828 wxDataViewItem dataViewItem
;
1831 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1832 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1833 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1834 dataViewItem
= reinterpret_cast<void*>(itemID
);
1835 wxCHECK_MSG(dataViewItem
.IsOk(),false,_("Invalid data view item"));
1837 // send a begin drag event and proceed with dragging unless the event is vetoed:
1838 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG
,dataViewCtrlPtr
->GetId());
1840 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1841 dataViewEvent
.SetItem(dataViewItem
);
1842 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
1843 // the dataview event object is also initialized with a default set of data; as it is a set of data and the user should be able to easily complete
1844 // the object a wxDataObjectComposite object is used;
1845 // currently, the composite object only contains a TAB concatenated string of all data:
1846 wxDataObjectComposite
* dataObject(new wxDataObjectComposite());
1848 dataObject
->Add(new wxTextDataObject(::ConcatenateDataViewItemValues(dataViewCtrlPtr
,dataViewItem
)));
1849 dataViewEvent
.SetDataObject(dataObject
);
1850 // check if event has not been vetoed:
1851 addDragItem
= dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
) && dataViewEvent
.IsAllowed();
1854 // for the internal drag & drop functions create two flavors:
1855 // - the data browser's item id;
1856 // - the data contained the dataview event object (if available).
1857 // Definition: a flavor is the type dependent representation of identical data.
1858 // Example: a number can be represented by its value and by its value converted to a string. In this case the flavor
1859 // of the number's internal representation is typeSInt32 while its string representation has got the flavor 'TEXT'.
1860 // Item id is one of the flavors:
1861 wxCHECK_MSG(::AddDragItemFlavor(dragRef
,*itemRef
,typeUInt32
,&itemID
,sizeof(itemID
),0) == noErr
,false,_("Unable to handle native drag&drop data"));
1862 // if the dataview event object contains data it is used for additional flavors; all natively known flavors are supported:
1863 if (dataViewEvent
.GetDataObject() != NULL
)
1865 // constant definition for abbreviational purposes:
1866 size_t const noOfFormats
= dataViewEvent
.GetDataObject()->GetFormatCount();
1868 if (noOfFormats
> 0)
1870 // variable definition:
1871 wxDataFormat
* dataFormats
;
1873 dataFormats
= new wxDataFormat
[noOfFormats
];
1874 dataViewEvent
.GetDataObject()->GetAllFormats(dataFormats
,wxDataObject::Get
);
1875 for (size_t i
=0; i
<noOfFormats
; ++i
)
1876 switch (dataFormats
[i
].GetType())
1879 wxFAIL_MSG(_("Data object has invalid data format"));
1883 // constant definition for abbreviational purposes:
1884 size_t const dataSize
= dataViewEvent
.GetDataObject()->GetDataSize(wxDF_TEXT
);
1885 // variable definition and initialization:
1886 wxMemoryBuffer
dataObject(dataSize
);
1888 dataViewEvent
.GetDataObject()->GetDataHere(wxDF_TEXT
,dataObject
.GetWriteBuf(dataSize
));
1889 dataObject
.UngetWriteBuf(dataSize
);
1890 if (::AddDragItemFlavor(dragRef
,*itemRef
,'TEXT',dataObject
.GetData(),dataSize
,0) != noErr
)
1891 wxFAIL_MSG(_("Adding flavor TEXT failed"));
1894 case wxDF_UNICODETEXT
:
1896 // constant definition for abbreviational purposes:
1897 size_t const dataSize
= dataViewEvent
.GetDataObject()->GetDataSize(wxDF_TEXT
);
1898 // as there is no direct access to the data copy it to a memory buffer:
1899 wxMemoryBuffer
dataObject(dataSize
);
1901 dataViewEvent
.GetDataObject()->GetDataHere(wxDF_TEXT
,dataObject
.GetWriteBuf(dataSize
));
1902 dataObject
.UngetWriteBuf(dataSize
);
1903 // if the data is stored in unicode format the internal representation is utf-8 (not mentioned in the documentation but in the source code);
1904 // DnD uses fixed utf-16 representation -> use the OSX functions for a conversion:
1905 CFDataRef
osxData (::CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
,reinterpret_cast<UInt8
*>(dataObject
.GetData()),dataSize
,kCFAllocatorNull
));
1906 CFStringRef
osxString(::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault
,osxData
,kCFStringEncodingUTF8
));
1908 // the osxString contains now the data and therefore the previously occupied memory can be released and re-used:
1909 ::CFRelease(osxData
);
1910 osxData
= ::CFStringCreateExternalRepresentation(kCFAllocatorDefault
,osxString
,kCFStringEncodingUTF16
,32);
1911 if (::AddDragItemFlavor(dragRef
,*itemRef
,'utxt',::CFDataGetBytePtr(osxData
),::CFDataGetLength(osxData
),0) != noErr
)
1912 wxFAIL_MSG(_("Adding flavor utxt failed"));
1914 ::CFRelease(osxData
);
1915 ::CFRelease(osxString
);
1929 case wxDF_ENHMETAFILE
:
1934 break; // not (yet) supported data formats
1936 wxFAIL_MSG(_("Unknown data format"));
1938 delete[] dataFormats
;
1942 // clean-up and return result:
1947 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserReceiveDragProc(DragReference dragRef
, DataBrowserItemID itemID
)
1949 UInt16 noOfDraggedItems
;
1951 wxDataViewCtrl
* dataViewCtrlPtr
;
1954 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1955 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1956 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1958 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1959 ::CountDragItems(dragRef
,&noOfDraggedItems
);
1960 for (UInt16 indexDraggedItem
=1; indexDraggedItem
<=noOfDraggedItems
; ++indexDraggedItem
)
1963 ItemReference itemRef
;
1964 wxDataObjectComposite
* dataObjects
;
1965 wxMemoryBuffer buffer
;
1967 // collect native information:
1968 ::GetDragItemReferenceNumber(dragRef
,indexDraggedItem
,&itemRef
); // the index begins with 1!
1969 dataObjects
= GetDnDDataObjects(dragRef
,itemRef
);
1970 // create wxWidget's event:
1971 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP
,dataViewCtrlPtr
->GetId());
1973 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1974 dataViewEvent
.SetItem(reinterpret_cast<void*>(itemID
)); // this is the item that receives the event
1975 // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
1976 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
1977 dataViewEvent
.SetDataObject(dataObjects
);
1978 dataViewEvent
.SetDataFormat(GetDnDDataFormat(dataObjects
));
1979 if (dataViewEvent
.GetDataFormat().GetType() != wxDF_INVALID
)
1981 dataViewEvent
.SetDataSize(dataObjects
->GetDataSize(dataViewEvent
.GetDataFormat().GetType()));
1982 dataObjects
->GetDataHere(dataViewEvent
.GetDataFormat().GetType(),buffer
.GetWriteBuf(dataViewEvent
.GetDataSize()));
1983 buffer
.UngetWriteBuf(dataViewEvent
.GetDataSize());
1984 dataViewEvent
.SetDataBuffer(buffer
.GetData());
1988 receiveDrag
= dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
) && dataViewEvent
.IsAllowed();
1997 // drag & drop helper methods
1999 wxDataFormat
wxMacDataViewDataBrowserListViewControl::GetDnDDataFormat(wxDataObjectComposite
* dataObjects
)
2001 wxDataFormat resultFormat
;
2004 if (dataObjects
!= NULL
)
2006 bool compatible(true);
2008 size_t const noOfFormats
= dataObjects
->GetFormatCount();
2011 wxDataFormat
* formats
;
2013 // get all formats and check afterwards if the formats are compatible; if they are compatible the preferred format is returned otherwise
2014 // wxDF_INVALID is returned;
2015 // currently compatible types (ordered by priority are):
2016 // - wxDF_UNICODETEXT - wxDF_TEXT
2017 formats
= new wxDataFormat
[noOfFormats
];
2018 dataObjects
->GetAllFormats(formats
);
2020 while ((indexFormat
< noOfFormats
) && compatible
)
2022 switch (resultFormat
.GetType())
2025 resultFormat
.SetType(formats
[indexFormat
].GetType()); // first format (should only be reached if indexFormat == 0
2028 if (formats
[indexFormat
].GetType() == wxDF_UNICODETEXT
)
2029 resultFormat
.SetType(wxDF_UNICODETEXT
);
2030 else // incompatible
2032 resultFormat
.SetType(wxDF_INVALID
);
2036 case wxDF_UNICODETEXT
:
2037 if (formats
[indexFormat
].GetType() != wxDF_TEXT
)
2039 resultFormat
.SetType(wxDF_INVALID
);
2044 resultFormat
.SetType(wxDF_INVALID
); // not (yet) supported format
2053 resultFormat
= wxDF_INVALID
;
2054 return resultFormat
;
2057 wxDataObjectComposite
* wxMacDataViewDataBrowserListViewControl::GetDnDDataObjects(DragReference dragRef
, ItemReference itemRef
) const
2061 wxDataObjectComposite
* dataObject
;
2064 ::CountDragItemFlavors(dragRef
,itemRef
,&noOfFlavors
);
2065 if (noOfFlavors
> 0)
2067 // as the native drag data can be separated into TEXT and UTXT a pointer to a wxTextDataObject is used to track the existence of 'TEXT' and 'utxt' flavors:
2068 wxTextDataObject
* textDataObject(NULL
);
2070 dataObject
= new wxDataObjectComposite();
2071 for (UInt16 indexFlavor
=1; indexFlavor
<=noOfFlavors
; ++indexFlavor
)
2073 // variable definition:
2074 FlavorType flavorDataObject
;
2076 if (::GetFlavorType(dragRef
,itemRef
,indexFlavor
,&flavorDataObject
) == noErr
) // GetFlavorType uses a 1 based index!
2077 switch (flavorDataObject
)
2080 if (textDataObject
== NULL
) // otherwise a 'utxt' flavor has already been found that gets priority compared to the 'TEXT' flavor
2082 // variable definitions:
2083 Size nativeDataSize
;
2084 wxMemoryBuffer nativeData
;
2086 if ((::GetFlavorDataSize(dragRef
,itemRef
,'TEXT',&nativeDataSize
) == noErr
) &&
2087 (::GetFlavorData(dragRef
,itemRef
,'TEXT',nativeData
.GetWriteBuf(nativeDataSize
),&nativeDataSize
,0) == noErr
))
2089 nativeData
.UngetWriteBuf(nativeDataSize
);
2090 textDataObject
= new wxTextDataObject();
2091 if (textDataObject
->SetData(nativeData
.GetDataLen(),nativeData
.GetData()))
2092 dataObject
->Add(textDataObject
);
2095 delete textDataObject
;
2096 textDataObject
= NULL
;
2103 // variable definition:
2104 Size nativeDataSize
;
2106 if (::GetFlavorDataSize(dragRef
,itemRef
,'utxt',&nativeDataSize
) == noErr
)
2108 CFMutableDataRef draggedData
;
2110 draggedData
= ::CFDataCreateMutable(kCFAllocatorDefault
,nativeDataSize
);
2111 ::CFDataSetLength(draggedData
,nativeDataSize
);
2112 if (::GetFlavorData(dragRef
,itemRef
,'utxt',::CFDataGetMutableBytePtr(draggedData
),&nativeDataSize
,0) == noErr
)
2114 // convert internally used UTF-16 representation to a UTF-8 representation:
2116 CFStringRef osxString
;
2118 osxString
= ::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault
,draggedData
,kCFStringEncodingUTF16
); // BOM character is handled by this function automatically
2119 osxData
= ::CFStringCreateExternalRepresentation(kCFAllocatorDefault
,osxString
,kCFStringEncodingUTF8
,32);
2120 if (textDataObject
== NULL
)
2122 textDataObject
= new wxTextDataObject();
2123 if (textDataObject
->SetData(::CFDataGetLength(osxData
),::CFDataGetBytePtr(osxData
)))
2124 dataObject
->Add(textDataObject
);
2127 delete textDataObject
;
2128 textDataObject
= NULL
;
2131 else // overwrite data because the 'utxt' flavor has priority over the 'TEXT' flavor
2132 (void) textDataObject
->SetData(::CFDataGetLength(osxData
),::CFDataGetBytePtr(osxData
));
2134 ::CFRelease(osxData
);
2135 ::CFRelease(osxString
);
2138 ::CFRelease(draggedData
);
2153 wxDataViewColumn
* wxMacDataViewDataBrowserListViewControl::GetColumnPtr(DataBrowserPropertyID propertyID
) const
2155 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
2157 if (dataViewCtrlPtr
!= NULL
)
2159 size_t const noOfColumns
= dataViewCtrlPtr
->GetColumnCount();
2161 for (size_t i
=0; i
<noOfColumns
; ++i
)
2162 if (dataViewCtrlPtr
->GetColumnPtr(i
)->GetNativeData()->GetPropertyID() == propertyID
)
2163 return dataViewCtrlPtr
->GetColumnPtr(i
);
2168 // ---------------------------------------------------------
2169 // wxDataViewRenderer
2170 // ---------------------------------------------------------
2171 wxDataViewRenderer::wxDataViewRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2172 :wxDataViewRendererBase(varianttype
,mode
,align
), m_alignment(align
), m_mode(mode
), m_NativeDataPtr(NULL
)
2176 wxDataViewRenderer::~wxDataViewRenderer()
2178 delete m_NativeDataPtr
;
2181 void wxDataViewRenderer::SetAlignment(int align
)
2183 m_alignment
= align
;
2189 // get the browser control or NULL if anything went wrong (it's not supposed to
2190 // so we assert if it did)
2191 wxMacDataViewDataBrowserListViewControl
*
2192 GetBrowserFromCol(wxDataViewColumn
*col
)
2194 wxCHECK_MSG( col
, NULL
, "should have a valid column" );
2196 wxDataViewCtrl
* const dvc
= col
->GetOwner();
2197 wxCHECK_MSG( dvc
, NULL
, "column must be associated with the control" );
2199 return static_cast<wxMacDataViewDataBrowserListViewControl
*>(dvc
->GetPeer());
2202 } // anonymous namespace
2204 void wxDataViewRenderer::SetMode(wxDataViewCellMode mode
)
2206 wxDataViewColumn
* const col
= GetOwner();
2207 wxMacDataViewDataBrowserListViewControl
* const
2208 browser
= GetBrowserFromCol(col
);
2209 wxCHECK_RET( browser
, "must be fully initialized" );
2211 const DataBrowserPropertyID colID
= col
->GetNativeData()->GetPropertyID();
2213 DataBrowserPropertyFlags flags
;
2214 verify_noerr( browser
->GetPropertyFlags(colID
, &flags
) );
2216 if ( (mode
== wxDATAVIEW_CELL_EDITABLE
) ||
2217 (mode
== wxDATAVIEW_CELL_ACTIVATABLE
) )
2218 flags
|= kDataBrowserPropertyIsEditable
;
2220 flags
&= ~kDataBrowserPropertyIsEditable
;
2222 verify_noerr( browser
->SetPropertyFlags(colID
, flags
) );
2225 void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode
)
2227 wxDataViewColumn
* const col
= GetOwner();
2229 wxMacDataViewDataBrowserListViewControl
* const
2230 browser
= GetBrowserFromCol(col
);
2231 wxCHECK_RET( browser
, "must be fully initialized" );
2233 const DataBrowserPropertyID colID
= col
->GetNativeData()->GetPropertyID();
2235 DataBrowserPropertyFlags flags
;
2236 browser
->GetPropertyFlags(colID
, &flags
);
2238 flags
&= ~(kDataBrowserDoNotTruncateText
|
2239 kDataBrowserTruncateTextAtStart
|
2240 kDataBrowserTruncateTextMiddle
|
2241 kDataBrowserTruncateTextAtEnd
);
2246 case wxELLIPSIZE_NONE
:
2247 flagToSet
= kDataBrowserDoNotTruncateText
;
2250 case wxELLIPSIZE_START
:
2251 flagToSet
= kDataBrowserTruncateTextAtStart
;
2254 case wxELLIPSIZE_MIDDLE
:
2255 flagToSet
= kDataBrowserTruncateTextMiddle
;
2258 case wxELLIPSIZE_END
:
2259 flagToSet
= kDataBrowserTruncateTextAtEnd
;
2263 wxCHECK_RET( flagToSet
, "unknown wxEllipsizeMode value" );
2266 verify_noerr( browser
->SetPropertyFlags(colID
, flags
) );
2269 wxEllipsizeMode
wxDataViewRenderer::GetEllipsizeMode() const
2271 wxDataViewColumn
* const col
= GetOwner();
2273 wxMacDataViewDataBrowserListViewControl
* const
2274 browser
= GetBrowserFromCol(col
);
2275 wxCHECK_MSG( browser
, wxELLIPSIZE_NONE
, "must be fully initialized" );
2277 const DataBrowserPropertyID colID
= col
->GetNativeData()->GetPropertyID();
2279 DataBrowserPropertyFlags flags
;
2280 browser
->GetPropertyFlags(colID
, &flags
);
2282 if ( flags
& kDataBrowserDoNotTruncateText
)
2283 return wxELLIPSIZE_NONE
;
2284 if ( flags
& kDataBrowserTruncateTextAtStart
)
2285 return wxELLIPSIZE_START
;
2286 if ( flags
& kDataBrowserTruncateTextMiddle
)
2287 return wxELLIPSIZE_MIDDLE
;
2288 if ( flags
& kDataBrowserTruncateTextAtEnd
)
2289 return wxELLIPSIZE_END
;
2291 wxFAIL_MSG( "unknown flags" );
2293 return wxELLIPSIZE_NONE
;
2296 void wxDataViewRenderer::SetNativeData(wxDataViewRendererNativeData
* newNativeDataPtr
)
2298 delete m_NativeDataPtr
;
2299 m_NativeDataPtr
= newNativeDataPtr
;
2302 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer
,wxDataViewRendererBase
)
2304 // ---------------------------------------------------------
2305 // wxDataViewCustomRenderer
2306 // ---------------------------------------------------------
2307 wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2308 :wxDataViewRenderer(varianttype
,mode
,align
), m_editorCtrlPtr(NULL
), m_DCPtr(NULL
)
2310 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCustomType
));
2313 bool wxDataViewCustomRenderer::MacRender()
2318 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer
, wxDataViewRenderer
)
2320 // ---------------------------------------------------------
2321 // wxDataViewTextRenderer
2322 // ---------------------------------------------------------
2323 wxDataViewTextRenderer::wxDataViewTextRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2324 :wxDataViewRenderer(varianttype
,mode
,align
)
2326 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserTextType
));
2329 bool wxDataViewTextRenderer::MacRender()
2331 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << GetValue().GetType());
2333 wxCFStringRef
cfString(GetValue().GetString(),(GetView()->GetFont().Ok() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2334 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString
) == noErr
);
2337 IMPLEMENT_CLASS(wxDataViewTextRenderer
,wxDataViewRenderer
)
2339 // ---------------------------------------------------------
2340 // wxDataViewBitmapRenderer
2341 // ---------------------------------------------------------
2342 wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2343 :wxDataViewRenderer(varianttype
,mode
,align
)
2345 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconType
));
2348 bool wxDataViewBitmapRenderer::MacRender()
2349 // This method returns 'true' if
2350 // - the passed bitmap is valid and it could be assigned to the native data browser;
2351 // - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
2352 // In all other cases the method returns 'false'.
2354 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << GetValue().GetType());
2358 bitmap
<< GetValue();
2359 return (!(bitmap
.Ok()) || (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),bitmap
.GetIconRef()) == noErr
));
2362 IMPLEMENT_CLASS(wxDataViewBitmapRenderer
,wxDataViewRenderer
)
2364 // ---------------------------------------------------------
2365 // wxDataViewIconTextRenderer
2366 // ---------------------------------------------------------
2367 wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(
2368 const wxString
& varianttype
,
2369 wxDataViewCellMode mode
,
2370 int WXUNUSED(align
))
2371 :wxDataViewRenderer(varianttype
,mode
)
2373 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconAndTextType
));
2376 bool wxDataViewIconTextRenderer::MacRender()
2378 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << GetValue().GetType());
2380 wxDataViewIconText iconText
;
2382 iconText
<< GetValue();
2384 wxCFStringRef
cfString(iconText
.GetText(),(GetView()->GetFont().Ok() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2386 if (iconText
.GetIcon().IsOk())
2387 if (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),MAC_WXHICON(iconText
.GetIcon().GetHICON())) != noErr
)
2389 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString
) == noErr
);
2392 IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer
,wxDataViewRenderer
)
2395 // ---------------------------------------------------------
2396 // wxDataViewToggleRenderer
2397 // ---------------------------------------------------------
2398 wxDataViewToggleRenderer::wxDataViewToggleRenderer(
2399 const wxString
& varianttype
,
2400 wxDataViewCellMode mode
,
2401 int WXUNUSED(align
))
2402 :wxDataViewRenderer(varianttype
,mode
)
2404 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCheckboxType
));
2407 bool wxDataViewToggleRenderer::MacRender()
2409 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << GetValue().GetType());
2410 return (::SetDataBrowserItemDataButtonValue(GetNativeData()->GetItemDataRef(),GetValue().GetBool()) == noErr
);
2413 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer
,wxDataViewRenderer
)
2415 // ---------------------------------------------------------
2416 // wxDataViewProgressRenderer
2417 // ---------------------------------------------------------
2418 wxDataViewProgressRenderer::wxDataViewProgressRenderer(
2419 const wxString
& WXUNUSED(label
),
2420 wxString
const& varianttype
,
2421 wxDataViewCellMode mode
,
2423 :wxDataViewRenderer(varianttype
,mode
,align
)
2425 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserProgressBarType
));
2428 bool wxDataViewProgressRenderer::MacRender()
2430 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << GetValue().GetType());
2431 return ((::SetDataBrowserItemDataMinimum(GetNativeData()->GetItemDataRef(), 0) == noErr
) &&
2432 (::SetDataBrowserItemDataMaximum(GetNativeData()->GetItemDataRef(),100) == noErr
) &&
2433 (::SetDataBrowserItemDataValue (GetNativeData()->GetItemDataRef(),GetValue().GetLong()) == noErr
));
2436 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer
,wxDataViewRenderer
)
2438 // ---------------------------------------------------------
2439 // wxDataViewDateRenderer
2440 // ---------------------------------------------------------
2441 wxDataViewDateRenderer::wxDataViewDateRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2442 :wxDataViewRenderer(varianttype
,mode
,align
)
2444 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserDateTimeType
));
2447 bool wxDataViewDateRenderer::MacRender()
2449 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << GetValue().GetType());
2450 return (::SetDataBrowserItemDataDateTime(GetNativeData()->GetItemDataRef(),GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan
,1904)).GetSeconds().GetLo()) == noErr
);
2453 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer
,wxDataViewRenderer
)
2455 // ---------------------------------------------------------
2457 // ---------------------------------------------------------
2458 wxDataViewColumn::wxDataViewColumn(const wxString
& title
, wxDataViewRenderer
* renderer
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
2459 :wxDataViewColumnBase(renderer
, model_column
), m_NativeDataPtr(new wxDataViewColumnNativeData()), m_title(title
)
2461 InitCommon(width
, align
, flags
);
2462 if ((renderer
!= NULL
) && (renderer
->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT
))
2463 renderer
->SetAlignment(align
);
2466 wxDataViewColumn::wxDataViewColumn(const wxBitmap
& bitmap
, wxDataViewRenderer
* renderer
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
2467 :wxDataViewColumnBase(bitmap
, renderer
, model_column
), m_NativeDataPtr(new wxDataViewColumnNativeData())
2469 InitCommon(width
, align
, flags
);
2470 if ((renderer
!= NULL
) && (renderer
->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT
))
2471 renderer
->SetAlignment(align
);
2474 wxDataViewColumn::~wxDataViewColumn()
2476 delete m_NativeDataPtr
;
2479 int wxDataViewColumn::GetWidth() const
2481 // FIXME: This returns the last programatically set width and will not work if
2482 // the user changes the column's width by dragging it with the mouse.
2486 bool wxDataViewColumn::IsSortKey() const
2488 wxDataViewCtrl
* const dataViewCtrlPtr(GetOwner());
2489 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(
2490 dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(
2491 dataViewCtrlPtr
->GetPeer()));
2493 DataBrowserPropertyID propertyID
;
2494 return (macDataViewListCtrlPtr
->GetSortProperty(&propertyID
) == noErr
) &&
2495 (propertyID
== GetNativeData()->GetPropertyID());
2498 void wxDataViewColumn::SetAlignment(wxAlignment align
)
2500 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2503 m_alignment
= align
;
2504 if (dataViewCtrlPtr
!= NULL
)
2506 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2508 if (macDataViewListCtrlPtr
!= NULL
)
2510 DataBrowserListViewHeaderDesc headerDescription
;
2512 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2515 case wxALIGN_CENTER
:
2516 case wxALIGN_CENTER_HORIZONTAL
:
2517 headerDescription
.btnFontStyle
.just
= teCenter
;
2520 headerDescription
.btnFontStyle
.just
= teFlushLeft
;
2523 headerDescription
.btnFontStyle
.just
= teFlushRight
;
2526 headerDescription
.btnFontStyle
.just
= teFlushDefault
;
2528 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set alignment."));
2533 void wxDataViewColumn::SetBitmap(wxBitmap
const& bitmap
)
2535 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2538 wxDataViewColumnBase::SetBitmap(bitmap
);
2539 if (dataViewCtrlPtr
!= NULL
)
2541 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2543 if (macDataViewListCtrlPtr
!= NULL
)
2545 DataBrowserListViewHeaderDesc headerDescription
;
2547 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2548 if (GetBitmap().Ok())
2549 headerDescription
.btnContentInfo
.u
.iconRef
= GetBitmap().GetIconRef();
2551 headerDescription
.btnContentInfo
.u
.iconRef
= NULL
;
2552 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set icon."));
2557 void wxDataViewColumn::SetMaxWidth(int maxWidth
)
2559 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2562 m_maxWidth
= maxWidth
;
2563 if (dataViewCtrlPtr
!= NULL
)
2565 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2567 if (macDataViewListCtrlPtr
!= NULL
)
2569 DataBrowserListViewHeaderDesc headerDescription
;
2571 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2572 headerDescription
.maximumWidth
= static_cast<UInt16
>(maxWidth
);
2573 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set maximum width."));
2578 void wxDataViewColumn::SetMinWidth(int minWidth
)
2580 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2583 m_minWidth
= minWidth
;
2584 if (dataViewCtrlPtr
!= NULL
)
2586 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2588 if (macDataViewListCtrlPtr
!= NULL
)
2590 DataBrowserListViewHeaderDesc headerDescription
;
2592 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2593 headerDescription
.minimumWidth
= static_cast<UInt16
>(minWidth
);
2594 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set minimum width."));
2599 void wxDataViewColumn::SetReorderable(bool reorderable
)
2601 // first set the internal flag of the column:
2603 m_flags
|= wxDATAVIEW_COL_REORDERABLE
;
2605 m_flags
&= ~wxDATAVIEW_COL_REORDERABLE
;
2606 // if the column is associated with a control change also immediately the flags of the control:
2607 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2609 if (dataViewCtrlPtr
!= NULL
)
2611 DataBrowserPropertyFlags flags
;
2612 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2614 wxCHECK_RET(macDataViewListCtrlPtr
!= NULL
, _("Valid pointer to native data view control does not exist"));
2615 wxCHECK_RET(macDataViewListCtrlPtr
->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags
) == noErr
,_("Could not get property flags."));
2617 flags
|= kDataBrowserListViewMovableColumn
;
2619 flags
&= ~kDataBrowserListViewMovableColumn
;
2620 wxCHECK_RET(macDataViewListCtrlPtr
->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags
) == noErr
,_("Could not set property flags."));
2624 void wxDataViewColumn::SetResizeable(bool resizeable
)
2626 // first set the internal flag of the column:
2628 m_flags
|= wxDATAVIEW_COL_RESIZABLE
;
2630 m_flags
&= ~wxDATAVIEW_COL_RESIZABLE
;
2631 // if the column is associated with a control change also immediately the flags of the control:
2632 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2634 if (dataViewCtrlPtr
!= NULL
)
2636 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2638 if (macDataViewListCtrlPtr
!= NULL
)
2640 DataBrowserListViewHeaderDesc headerDescription
;
2642 verify_noerr(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2645 if (GetMinWidth() >= GetMaxWidth())
2650 headerDescription
.minimumWidth
= m_minWidth
;
2651 headerDescription
.maximumWidth
= m_maxWidth
;
2655 headerDescription
.minimumWidth
= m_width
;
2656 headerDescription
.maximumWidth
= m_width
;
2658 verify_noerr(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2659 macDataViewListCtrlPtr
->SetSortProperty(GetNativeData()->GetPropertyID());
2664 void wxDataViewColumn::SetSortable(bool sortable
)
2666 // first set the internal flag of the column:
2668 m_flags
|= wxDATAVIEW_COL_SORTABLE
;
2670 m_flags
&= ~wxDATAVIEW_COL_SORTABLE
;
2671 // if the column is associated with a control change also immediately the flags of the control:
2672 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2674 if (dataViewCtrlPtr
!= NULL
)
2676 DataBrowserPropertyFlags flags
;
2677 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2679 wxCHECK_RET(macDataViewListCtrlPtr
!= NULL
, _("Valid pointer to native data view control does not exist"));
2680 wxCHECK_RET(macDataViewListCtrlPtr
->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags
) == noErr
,_("Could not get property flags."));
2682 flags
|= kDataBrowserListViewSortableColumn
;
2684 flags
&= ~kDataBrowserListViewSortableColumn
;
2685 wxCHECK_RET(macDataViewListCtrlPtr
->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags
) == noErr
,_("Could not set property flags."));
2689 void wxDataViewColumn::SetSortOrder(bool ascending
)
2691 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2694 m_ascending
= ascending
;
2695 if (dataViewCtrlPtr
!= NULL
)
2697 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2699 if (macDataViewListCtrlPtr
!= NULL
)
2701 DataBrowserListViewHeaderDesc headerDescription
;
2703 verify_noerr(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2705 headerDescription
.initialOrder
= kDataBrowserOrderIncreasing
;
2707 headerDescription
.initialOrder
= kDataBrowserOrderDecreasing
;
2708 verify_noerr(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2709 macDataViewListCtrlPtr
->SetSortProperty(GetNativeData()->GetPropertyID());
2714 void wxDataViewColumn::SetTitle(wxString
const& title
)
2716 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2720 if (dataViewCtrlPtr
!= NULL
)
2722 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2724 if (macDataViewListCtrlPtr
!= NULL
)
2726 DataBrowserListViewHeaderDesc headerDescription
;
2727 wxCFStringRef
cfTitle(title
,(dataViewCtrlPtr
->GetFont().Ok() ? dataViewCtrlPtr
->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2729 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2730 headerDescription
.titleString
= cfTitle
;
2731 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set header description."));
2736 void wxDataViewColumn::SetWidth(int width
)
2738 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2741 if ((width
>= m_minWidth
) && (width
<= m_maxWidth
))
2744 if (dataViewCtrlPtr
!= NULL
)
2746 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2748 if (macDataViewListCtrlPtr
!= NULL
)
2749 wxCHECK_RET(macDataViewListCtrlPtr
->SetColumnWidth(GetNativeData()->GetPropertyID(),static_cast<UInt16
>(width
)) == noErr
,_("Could not set column width."));
2754 void wxDataViewColumn::SetAsSortKey(bool WXUNUSED(sort
))
2756 // see wxGTK native wxDataViewColumn implementation
2757 wxFAIL_MSG( "not implemented" );
2760 void wxDataViewColumn::SetNativeData(wxDataViewColumnNativeData
* newNativeDataPtr
)
2762 delete m_NativeDataPtr
;
2763 m_NativeDataPtr
= newNativeDataPtr
;
2766 #endif // wxUSE_DATAVIEWCTRL && !wxUSE_GENERICDATAVIEWCTRL