1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/datavgen.cpp
3 // Purpose: wxDataViewCtrl native mac implementation
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
13 #if wxUSE_DATAVIEWCTRL
15 #include "wx/dataview.h"
17 #if !defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0)
21 #include "wx/mac/carbon/databrow.h"
25 #include "wx/settings.h"
26 #include "wx/dcclient.h"
30 #include "wx/renderer.h"
32 //-----------------------------------------------------------------------------
34 //-----------------------------------------------------------------------------
36 // a list of all catchable events:
37 static EventTypeSpec
const eventList
[] =
39 {kEventClassControl
, kEventControlDraw
},
40 {kEventClassControl
, kEventControlHit
}
43 //-----------------------------------------------------------------------------
45 //-----------------------------------------------------------------------------
47 static pascal OSStatus
wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
, EventRef EventReference
, void* Data
)
49 wxDataViewCtrl
* DataViewCtrlPtr((wxDataViewCtrl
*) Data
); // the 'Data' variable always contains a pointer to the data view control that installed the handler
51 wxMacCarbonEvent
CarbonEvent(EventReference
) ;
54 switch (GetEventKind(EventReference
))
56 case kEventControlDraw
:
60 DataViewCtrlPtr
->MacSetDrawingContext(CarbonEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
,typeCGContextRef
));
61 status
= ::CallNextEventHandler(handler
,EventReference
);
62 DataViewCtrlPtr
->MacSetDrawingContext(NULL
);
65 case kEventControlHit
:
66 if (CarbonEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart
,typeControlPartCode
) == kControlButtonPart
) // we only care about the header
68 ControlRef controlReference
;
69 DataBrowserPropertyID columnPropertyID
;
70 unsigned long columnIndex
;
72 wxDataViewEvent
DataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
,DataViewCtrlPtr
->GetId());
74 CarbonEvent
.GetParameter(kEventParamDirectObject
,&controlReference
);
75 // determine the column that triggered the event (this is the column that is responsible for sorting the data view):
76 status
= ::GetDataBrowserSortProperty(controlReference
,&columnPropertyID
);
77 wxCHECK(status
== noErr
,status
);
78 status
= ::GetDataBrowserTableViewColumnPosition(controlReference
,columnPropertyID
,&columnIndex
);
79 if (status
== errDataBrowserPropertyNotFound
) // user clicked into part of the header that does not have a property
80 return ::CallNextEventHandler(handler
,EventReference
);
81 wxCHECK(status
== noErr
,status
);
82 // initialize wxWidget event handler:
83 DataViewEvent
.SetEventObject(DataViewCtrlPtr
);
84 DataViewEvent
.SetColumn(columnIndex
);
85 DataViewEvent
.SetDataViewColumn(DataViewCtrlPtr
->GetColumn(columnIndex
));
86 // finally sent the equivalent wxWidget event:
87 #if wxCHECK_VERSION(2,9,0)
88 DataViewCtrlPtr
->HandleWindowEvent(DataViewEvent
);
90 DataViewCtrlPtr
->GetEventHandler()->ProcessEvent(DataViewEvent
);
92 return ::CallNextEventHandler(handler
,EventReference
);
95 return eventNotHandledErr
;
98 return eventNotHandledErr
;
99 } /* wxMacDataViewCtrlEventHandler(EventHandlerCallRef, EventRef, void*) */
101 static DataBrowserItemID
* CreateDataBrowserItemIDArray(size_t& noOfEntries
, wxDataViewItemArray
const& items
) // returns a newly allocated pointer to valid data browser item IDs
103 size_t const noOfItems
= items
.GetCount();
105 DataBrowserItemID
* itemIDs(new DataBrowserItemID
[noOfItems
]);
108 // convert all valid data view items to data browser items
110 for (size_t i
=0; i
<noOfItems
; ++i
)
113 itemIDs
[noOfEntries
] = reinterpret_cast<DataBrowserItemID
>(items
[i
].GetID());
118 } /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */
120 #if wxCHECK_VERSION(2,9,0)
121 static bool InitializeColumnDescription(DataBrowserListViewColumnDesc
& columnDescription
, wxDataViewColumn
const* columnPtr
, DataBrowserPropertyID columnPropertyID
, wxCFStringRef
const& title
)
123 static bool InitializeColumnDescription(DataBrowserListViewColumnDesc
& columnDescription
, wxDataViewColumn
const* columnPtr
, DataBrowserPropertyID columnPropertyID
, wxMacCFStringHolder
const& title
)
126 // set properties for the column:
127 columnDescription
.propertyDesc
.propertyID
= columnPropertyID
;
128 columnDescription
.propertyDesc
.propertyType
= columnPtr
->GetRenderer()->GetPropertyType();
129 columnDescription
.propertyDesc
.propertyFlags
= kDataBrowserListViewSelectionColumn
; // make the column selectable
130 if (columnPtr
->IsReorderable())
131 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewMovableColumn
;
132 if (columnPtr
->IsResizeable())
134 columnDescription
.headerBtnDesc
.minimumWidth
= 0;
135 columnDescription
.headerBtnDesc
.maximumWidth
= 30000; // 32767 is the theoretical maximum though but 30000 looks nicer
139 columnDescription
.headerBtnDesc
.minimumWidth
= columnPtr
->GetWidth();
140 columnDescription
.headerBtnDesc
.maximumWidth
= columnPtr
->GetWidth();
142 if (columnPtr
->IsSortable())
143 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewSortableColumn
;
144 if (columnPtr
->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE
)
145 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserPropertyIsEditable
;
146 if ((columnDescription
.propertyDesc
.propertyType
== kDataBrowserCustomType
) ||
147 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserDateTimeType
) ||
148 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserIconAndTextType
) ||
149 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserTextType
))
150 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
; // enables generally the possibility to have user input for the mentioned types
151 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
152 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
154 // set header's properties:
155 columnDescription
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
156 columnDescription
.headerBtnDesc
.titleOffset
= 0;
157 columnDescription
.headerBtnDesc
.titleString
= ::CFStringCreateCopy(kCFAllocatorDefault
,title
);
158 columnDescription
.headerBtnDesc
.initialOrder
= kDataBrowserOrderIncreasing
; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
159 columnDescription
.headerBtnDesc
.btnFontStyle
.flags
= kControlUseFontMask
| kControlUseJustMask
;
160 switch (columnPtr
->GetAlignment())
163 case wxALIGN_CENTER_HORIZONTAL
:
164 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teCenter
;
167 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushLeft
;
170 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushRight
;
173 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushDefault
;
175 columnDescription
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
176 columnDescription
.headerBtnDesc
.btnFontStyle
.style
= normal
;
177 if (columnPtr
->GetBitmap().IsOk())
179 columnDescription
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentIconRef
;
180 #if wxCHECK_VERSION(2,9,0)
181 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= columnPtr
->GetBitmap().GetIconRef();
183 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= columnPtr
->GetBitmap().GetBitmapData()->GetIconRef();
188 // not text only as we otherwise could not add a bitmap later
189 // columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
190 columnDescription
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentIconRef
;
191 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= NULL
;
196 } /* InitializeColumnDescription(DataBrowserListViewColumnDesc&, wxDataViewColumn const*, DataBrowserPropertyID, wxMacCFStringHolder const&) */
198 //-----------------------------------------------------------------------------
199 // local function pointers
200 //-----------------------------------------------------------------------------
202 DEFINE_ONE_SHOT_HANDLER_GETTER(wxMacDataViewCtrlEventHandler
)
204 // ---------------------------------------------------------
205 // wxMacDataViewModelNotifier
206 // ---------------------------------------------------------
208 class wxMacDataViewModelNotifier
: public wxDataViewModelNotifier
211 wxMacDataViewModelNotifier(wxMacDataViewDataBrowserListViewControl
* initDataViewControlPtr
) : m_dataViewControlPtr(initDataViewControlPtr
)
215 virtual bool ItemAdded(const wxDataViewItem
&parent
, const wxDataViewItem
&item
)
217 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
219 wxCHECK_MSG(item
.IsOk(),false,_("Added item is invalid."));
220 bool noFailureFlag
= (!(parent
.IsOk()) && (this->m_dataViewControlPtr
->AddItem(kDataBrowserNoItem
,&itemID
) == noErr
) ||
221 parent
.IsOk() && (this->m_dataViewControlPtr
->AddItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
));
223 wxDataViewCtrl
*dvc
= (wxDataViewCtrl
*) this->m_dataViewControlPtr
->GetPeer();
224 if (dvc
->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT
)
226 wxDataViewModel
*model
= GetOwner();
228 int height
= 20; // TODO find out standard height
229 unsigned int num
= dvc
->GetColumnCount();
231 for (col
= 0; col
< num
; col
++)
233 wxDataViewColumn
*column
= dvc
->GetColumn( col
);
234 if (column
->IsHidden())
237 wxDataViewCustomRenderer
*renderer
= wxDynamicCast( column
->GetRenderer(), wxDataViewCustomRenderer
);
241 model
->GetValue( value
, item
, column
->GetModelColumn() );
242 renderer
->SetValue( value
);
243 height
= wxMax( height
, renderer
->GetSize().y
);
249 this->m_dataViewControlPtr
->SetRowHeight( itemID
, height
);
252 return noFailureFlag
;
253 } /* ItemAdded(wxDataViewItem const&, wxDataViewItem const&) */
255 virtual bool ItemsAdded(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
259 DataBrowserItemID
* itemIDs
;
264 // convert all valid data view items to data browser items:
265 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
266 // insert all valid items into control:
267 noFailureFlag
= ((noOfEntries
== 0) ||
268 !(parent
.IsOk()) && (this->m_dataViewControlPtr
->AddItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
269 parent
.IsOk() && (this->m_dataViewControlPtr
->AddItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
270 // give allocated array space free again:
273 wxDataViewCtrl
*dvc
= (wxDataViewCtrl
*) this->m_dataViewControlPtr
->GetPeer();
274 if (dvc
->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT
)
276 wxDataViewItem item
= items
[0]; // TODO get all items
277 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
279 wxDataViewModel
*model
= GetOwner();
281 int height
= 20; // TODO find out standard height
282 unsigned int num
= dvc
->GetColumnCount();
284 for (col
= 0; col
< num
; col
++)
286 wxDataViewColumn
*column
= dvc
->GetColumn( col
);
287 if (column
->IsHidden())
290 wxDataViewCustomRenderer
*renderer
= wxDynamicCast( column
->GetRenderer(), wxDataViewCustomRenderer
);
294 model
->GetValue( value
, item
, column
->GetModelColumn() );
295 renderer
->SetValue( value
);
296 height
= wxMax( height
, renderer
->GetSize().y
);
302 this->m_dataViewControlPtr
->SetRowHeight( itemID
, height
);
306 return noFailureFlag
;
307 } /* ItemsAdded(wxDataViewItem const&, wxDataViewItemArray const&) */
309 virtual bool ItemChanged(wxDataViewItem
const& item
)
311 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
314 wxCHECK_MSG(item
.IsOk(),false,_("Changed item is invalid."));
315 if (this->m_dataViewControlPtr
->UpdateItems(&itemID
) == noErr
)
317 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
319 // sent the equivalent wxWidget event:
320 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,dataViewCtrlPtr
->GetId()); // variable defintion
322 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
323 dataViewEvent
.SetItem(item
);
324 // sent the equivalent wxWidget event:
325 #if wxCHECK_VERSION(2,9,0)
326 dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
);
328 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
335 } /* ItemChanged(wxDataViewItem const&) */
337 virtual bool ItemsChanged(wxDataViewItemArray
const& items
)
341 DataBrowserItemID
* itemIDs
;
346 // convert all valid data view items to data browser items:
347 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
348 // change items (ATTENTION: ONLY ITEMS OF THE ROOT ARE CHANGED BECAUSE THE PARENT PARAMETER IS MISSING):
349 noFailureFlag
= (this->m_dataViewControlPtr
->UpdateItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
,kDataBrowserItemNoProperty
) == noErr
);
352 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
354 // send for all changed items a wxWidget event:
355 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,dataViewCtrlPtr
->GetId()); // variable defintion
357 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
358 for (size_t i
=0; i
<noOfEntries
; ++i
)
360 dataViewEvent
.SetItem(reinterpret_cast<void*>(itemIDs
[i
]));
361 #if wxCHECK_VERSION(2,9,0)
362 dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
);
364 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
368 // release allocated array space:
371 return noFailureFlag
;
372 } /* ItemsChanged(wxDataViewItem const&) */
374 virtual bool ItemDeleted(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
378 // variable definition and initialization:
379 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
380 OSStatus errorStatus
;
381 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
383 // when this method is called and currently an item is being edited this item may have already been deleted in the model (the passed item and the being edited item have
384 // not to be identical because the being edited item might be below the passed item in the hierarchy);
385 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
386 // has been started and that variables can currently not be updated even when requested by the system:
387 dataViewCtrlPtr
->SetDeleting(true);
388 errorStatus
= this->m_dataViewControlPtr
->RemoveItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
);
389 // enable automatic updating again:
390 dataViewCtrlPtr
->SetDeleting(false);
391 return (errorStatus
== noErr
);
395 } /* ItemDeleted(wxDataViewItem const&, wxDataViewItem const&) */
397 virtual bool ItemsDeleted(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
401 DataBrowserItemID
* itemIDs
;
403 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
408 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,false,_("Data view control is not correctly initialized"));
409 // convert all valid data view items to data browser items:
410 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
411 // when this method is called and currently an item is being edited this item may have already been deleted in the model (the passed item and the being edited item have
412 // not to be identical because the being edited item might be below the passed item in the hierarchy);
413 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
414 // has been started and that variables can currently not be updated even when requested by the system:
415 dataViewCtrlPtr
->SetDeleting(true);
416 // insert all valid items into control:
417 noFailureFlag
= ((noOfEntries
== 0) ||
418 !(parent
.IsOk()) && (this->m_dataViewControlPtr
->RemoveItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
419 parent
.IsOk() && (this->m_dataViewControlPtr
->RemoveItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
420 // enable automatic updating again:
421 dataViewCtrlPtr
->SetDeleting(false);
422 // give allocated array space free again:
425 return noFailureFlag
;
426 } /* ItemsDeleted(wxDataViewItem const&, wxDataViewItemArray const&) */
428 virtual bool ValueChanged(wxDataViewItem
const& item
, unsigned int col
)
430 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
431 DataBrowserItemID parentID
;
433 DataBrowserPropertyID propertyID
;
435 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
438 wxCHECK_MSG(item
.IsOk(), false,_("Passed item is invalid."));
439 wxCHECK_MSG(this->GetOwner() != NULL
,false,_("Owner not initialized."));
440 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Control is wrongly initialized."));
441 parentID
= reinterpret_cast<DataBrowserItemID
>(this->GetOwner()->GetParent(item
).GetID());
442 if ((this->m_dataViewControlPtr
->GetPropertyID(col
,&propertyID
) == noErr
) &&
443 (this->m_dataViewControlPtr
->UpdateItems(parentID
,1,&itemID
,dataViewCtrlPtr
->GetColumn(col
)->GetPropertyID(),propertyID
) == noErr
))
445 // variable definition and initialization:
446 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,dataViewCtrlPtr
->GetId());
448 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
449 dataViewEvent
.SetColumn(col
);
450 dataViewEvent
.SetItem(item
);
451 // send the equivalent wxWidget event:
452 #if wxCHECK_VERSION(2,9,0)
453 dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
);
455 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
462 } /* ValueChanged(wxDataViewItem const&, unsigned int) */
464 virtual bool Cleared(void)
466 bool noFailureFlag
= (this->m_dataViewControlPtr
->RemoveItems() == noErr
);
468 wxDataViewItemArray array
;
469 GetOwner()->GetChildren( item
, array
);
470 ItemsAdded( item
, array
);
471 return noFailureFlag
;
472 } /* Cleared(void) */
474 virtual void Resort(void)
476 this->m_dataViewControlPtr
->Resort();
484 wxMacDataViewDataBrowserListViewControl
* m_dataViewControlPtr
;
487 // ---------------------------------------------------------
488 // wxDataViewRenderer
489 // ---------------------------------------------------------
491 wxDataViewRenderer::wxDataViewRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
492 :wxDataViewRendererBase(varianttype
,mode
,align
), m_alignment(align
), m_mode(mode
)
494 } /* wxDataViewRenderer::wxDataViewRenderer(wxString const&, wxDataViewCellMode) */
496 void wxDataViewRenderer::SetMode(wxDataViewCellMode mode
)
498 wxDataViewColumn
* dataViewColumnPtr
;
502 dataViewColumnPtr
= this->GetOwner();
503 if (dataViewColumnPtr
!= NULL
)
505 // variable definition and initialization:
506 wxDataViewCtrl
* dataViewCtrlPtr(dataViewColumnPtr
->GetOwner());
508 if (dataViewCtrlPtr
!= NULL
)
510 // variable definition and initialization:
511 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
513 if (macDataViewListCtrlPtr
!= NULL
)
515 // variable definition and initialization:
516 DataBrowserPropertyFlags flags
;
518 verify_noerr(macDataViewListCtrlPtr
->GetPropertyFlags(dataViewColumnPtr
->GetPropertyID(),&flags
));
519 if (mode
== wxDATAVIEW_CELL_EDITABLE
)
520 flags
|= kDataBrowserPropertyIsEditable
;
522 flags
&= ~kDataBrowserPropertyIsEditable
;
523 verify_noerr(macDataViewListCtrlPtr
->SetPropertyFlags(dataViewColumnPtr
->GetPropertyID(),flags
));
527 } /* wxDataViewRenderer::SetMode(wxDataViewCellMode) */
529 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer
,wxDataViewRendererBase
)
531 // ---------------------------------------------------------
532 // wxDataViewCustomRenderer
533 // ---------------------------------------------------------
535 wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
536 :wxDataViewRenderer(varianttype
,mode
,align
), m_editorCtrlPtr(NULL
), m_DCPtr(NULL
)
538 } /* wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const&, wxDataViewCellMode) */
540 wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void)
542 if (this->m_DCPtr
!= NULL
)
543 delete this->m_DCPtr
;
544 } /* wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) */
546 void wxDataViewCustomRenderer::RenderText( const wxString
&text
, int xoffset
, wxRect cell
, wxDC
*dc
, int state
)
548 wxDataViewCtrl
*view
= GetOwner()->GetOwner();
549 wxColour col
= (state
& wxDATAVIEW_CELL_SELECTED
) ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT
) : view
->GetForegroundColour();
550 dc
->SetTextForeground(col
);
551 dc
->DrawText( text
, cell
.x
+ xoffset
, cell
.y
+ ((cell
.height
- dc
->GetCharHeight()) / 2));
554 wxDC
* wxDataViewCustomRenderer::GetDC(void)
556 if (this->m_DCPtr
== NULL
)
558 if ((GetOwner() == NULL
) || (GetOwner()->GetOwner() == NULL
))
560 this->m_DCPtr
= new wxWindowDC(this->GetOwner()->GetOwner());
562 return this->m_DCPtr
;
563 } /* wxDataViewCustomRenderer::GetDC(void) */
565 bool wxDataViewCustomRenderer::Render(void)
568 } /* wxDataViewCustomRenderer::Render(void) */
570 void wxDataViewCustomRenderer::SetDC(wxDC
* newDCPtr
)
572 delete this->m_DCPtr
;
573 this->m_DCPtr
= newDCPtr
;
574 } /* wxDataViewCustomRenderer::SetDC(wxDC*) */
576 WXDataBrowserPropertyType
wxDataViewCustomRenderer::GetPropertyType(void) const
578 return kDataBrowserCustomType
;
579 } /* wxDataViewCustomRenderer::GetPropertyType(void) const */
581 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer
, wxDataViewRenderer
)
583 // ---------------------------------------------------------
584 // wxDataViewTextRenderer
585 // ---------------------------------------------------------
587 wxDataViewTextRenderer::wxDataViewTextRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
588 :wxDataViewRenderer(varianttype
,mode
,align
)
590 } /* wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const&, wxDataViewCellMode, int) */
592 bool wxDataViewTextRenderer::Render(void)
594 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << this->GetValue().GetType());
596 // variable definition:
597 #if wxCHECK_VERSION(2,9,0)
598 wxCFStringRef
cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
600 wxMacCFStringHolder
cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
602 return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString
) == noErr
);
603 } /* wxDataViewTextRenderer::Render(void) */
605 WXDataBrowserPropertyType
wxDataViewTextRenderer::GetPropertyType(void) const
607 return kDataBrowserTextType
;
608 } /* wxDataViewTextRenderer::GetPropertyType(void) const */
610 IMPLEMENT_CLASS(wxDataViewTextRenderer
,wxDataViewRenderer
)
612 // ---------------------------------------------------------
613 // wxDataViewTextRendererAttr
614 // ---------------------------------------------------------
616 wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
617 :wxDataViewTextRenderer(varianttype
,mode
,align
)
619 } /* wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const&, wxDataViewCellMode, int) */
621 IMPLEMENT_CLASS(wxDataViewTextRendererAttr
,wxDataViewTextRenderer
)
623 // ---------------------------------------------------------
624 // wxDataViewBitmapRenderer
625 // ---------------------------------------------------------
627 wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
628 :wxDataViewRenderer(varianttype
,mode
,align
)
632 bool wxDataViewBitmapRenderer::Render(void)
633 // This method returns 'true' if
634 // - the passed bitmap is valid and it could be assigned to the native data browser;
635 // - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
636 // In all other cases the method returns 'false'.
638 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << this->GetValue().GetType());
640 // variable definition:
643 bitmap
<< this->GetValue();
645 #if wxCHECK_VERSION(2,9,0)
646 return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap
.GetIconRef()) == noErr
);
648 return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap
.GetBitmapData()->GetIconRef()) == noErr
);
652 } /* wxDataViewBitmapRenderer::Render(void) */
654 WXDataBrowserPropertyType
wxDataViewBitmapRenderer::GetPropertyType(void) const
656 return kDataBrowserIconType
;
657 } /* wxDataViewBitmapRenderer::GetPropertyType(void) const */
659 IMPLEMENT_CLASS(wxDataViewBitmapRenderer
,wxDataViewRenderer
)
661 // ---------------------------------------------------------
662 // wxDataViewIconTextRenderer
663 // ---------------------------------------------------------
665 wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
666 :wxDataViewRenderer(varianttype
,mode
)
670 bool wxDataViewIconTextRenderer::Render(void)
672 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << this->GetValue().GetType());
674 // variable definition:
675 wxDataViewIconText iconText
;
677 iconText
<< this->GetValue();
679 // variable definition:
680 #if wxCHECK_VERSION(2,9,0)
681 wxCFStringRef
cfString(iconText
.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
683 wxMacCFStringHolder
cfString(iconText
.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
686 if (iconText
.GetIcon().IsOk())
687 if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText
.GetIcon().GetHICON())) != noErr
)
689 return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString
) == noErr
);
690 } /* wxDataViewIconTextRenderer::Render(void) */
692 WXDataBrowserPropertyType
wxDataViewIconTextRenderer::GetPropertyType(void) const
694 return kDataBrowserIconAndTextType
;
695 } /* wxDataViewIconTextRenderer::GetPropertyType(void) const */
697 IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer
,wxDataViewRenderer
)
700 // ---------------------------------------------------------
701 // wxDataViewToggleRenderer
702 // ---------------------------------------------------------
704 wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
705 :wxDataViewRenderer(varianttype
,mode
)
709 bool wxDataViewToggleRenderer::Render(void)
711 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << this->GetValue().GetType());
712 return (::SetDataBrowserItemDataButtonValue(this->GetDataReference(),this->GetValue().GetBool()) == noErr
);
713 } /* wxDataViewToggleRenderer::Render(void) */
715 WXDataBrowserPropertyType
wxDataViewToggleRenderer::GetPropertyType(void) const
717 return kDataBrowserCheckboxType
;
718 } /* wxDataViewToggleRenderer::GetPropertyType(void) const */
720 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer
,wxDataViewRenderer
)
722 // ---------------------------------------------------------
723 // wxDataViewProgressRenderer
724 // ---------------------------------------------------------
726 wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString
const& label
, wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
727 :wxDataViewRenderer(varianttype
,mode
,align
)
731 bool wxDataViewProgressRenderer::Render(void)
733 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << this->GetValue().GetType());
734 return ((::SetDataBrowserItemDataMinimum(this->GetDataReference(), 0) == noErr
) &&
735 (::SetDataBrowserItemDataMaximum(this->GetDataReference(),100) == noErr
) &&
736 (::SetDataBrowserItemDataValue (this->GetDataReference(),this->GetValue().GetLong()) == noErr
));
737 } /* wxDataViewProgressRenderer::Render(void) */
739 WXDataBrowserPropertyType
wxDataViewProgressRenderer::GetPropertyType(void) const
741 return kDataBrowserProgressBarType
;
742 } /* wxDataViewProgressRenderer::GetPropertyType(void) const */
744 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer
,wxDataViewRenderer
)
746 // ---------------------------------------------------------
747 // wxDataViewDateRenderer
748 // ---------------------------------------------------------
750 wxDataViewDateRenderer::wxDataViewDateRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
751 :wxDataViewRenderer(varianttype
,mode
,align
)
755 bool wxDataViewDateRenderer::Render(void)
757 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << this->GetValue().GetType());
758 return (::SetDataBrowserItemDataDateTime(this->GetDataReference(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan
,1904)).GetSeconds().GetLo()) == noErr
);
759 } /* wxDataViewDateRenderer::Render(void) */
761 WXDataBrowserPropertyType
wxDataViewDateRenderer::GetPropertyType(void) const
763 return kDataBrowserDateTimeType
;
764 } /* wxDataViewDateRenderer::GetPropertyType(void) const */
766 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer
,wxDataViewRenderer
)
768 // ---------------------------------------------------------
770 // ---------------------------------------------------------
772 wxDataViewColumn::wxDataViewColumn(wxString
const &title
, wxDataViewRenderer
*cell
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
773 :wxDataViewColumnBase(title
,cell
,model_column
,width
,align
,flags
), m_ascending(true),
774 m_flags(flags
& ~(wxDATAVIEW_COL_HIDDEN
)), m_maxWidth(30000), m_minWidth(0), m_width(width
>= 0 ? width
: wxDVC_DEFAULT_WIDTH
),
775 m_alignment(align
), m_title(title
)
777 } /* wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
779 wxDataViewColumn::wxDataViewColumn(wxBitmap
const& bitmap
, wxDataViewRenderer
*cell
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
780 :wxDataViewColumnBase(bitmap
,cell
,model_column
,width
,align
,flags
), m_ascending(true),
781 m_flags(flags
& ~(wxDATAVIEW_COL_HIDDEN
)), m_maxWidth(30000), m_minWidth(0), m_width(width
>= 0 ? width
: wxDVC_DEFAULT_WIDTH
),
784 } /* wxDataViewColumn::wxDataViewColumn(wxBitmap const&, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
786 void wxDataViewColumn::SetAlignment(wxAlignment align
)
788 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
791 this->m_alignment
= align
;
792 if (dataViewCtrlPtr
!= NULL
)
794 // variable definition and initialization:
795 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
797 if (macDataViewListCtrlPtr
!= NULL
)
799 // variable definition and initialization:
800 DataBrowserListViewHeaderDesc headerDescription
;
802 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
806 case wxALIGN_CENTER_HORIZONTAL
:
807 headerDescription
.btnFontStyle
.just
= teCenter
;
810 headerDescription
.btnFontStyle
.just
= teFlushLeft
;
813 headerDescription
.btnFontStyle
.just
= teFlushRight
;
816 headerDescription
.btnFontStyle
.just
= teFlushDefault
;
818 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set alignment."));
821 } /* wxDataViewColumn::SetAlignment(wxAlignment) */
823 void wxDataViewColumn::SetBitmap(wxBitmap
const& bitmap
)
825 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
828 wxDataViewColumnBase::SetBitmap(bitmap
);
829 if (dataViewCtrlPtr
!= NULL
)
831 // variable definition and initialization:
832 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
834 if (macDataViewListCtrlPtr
!= NULL
)
836 // variable definition and initialization:
837 DataBrowserListViewHeaderDesc headerDescription
;
839 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
840 if (this->GetBitmap().Ok())
841 #if wxCHECK_VERSION(2,9,0)
842 headerDescription
.btnContentInfo
.u
.iconRef
= this->GetBitmap().GetIconRef();
844 headerDescription
.btnContentInfo
.u
.iconRef
= this->GetBitmap().GetBitmapData()->GetIconRef();
847 headerDescription
.btnContentInfo
.u
.iconRef
= NULL
;
848 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set icon."));
851 } /* wxDataViewColumn::SetBitmap(wxBitmap const&) */
853 void wxDataViewColumn::SetFlags(int flags
)
855 this->SetHidden ((flags
& wxDATAVIEW_COL_HIDDEN
) != 0);
856 this->SetReorderable((flags
& wxDATAVIEW_COL_REORDERABLE
) != 0);
857 this->SetResizeable ((flags
& wxDATAVIEW_COL_RESIZABLE
) != 0);
858 this->SetSortable ((flags
& wxDATAVIEW_COL_SORTABLE
) != 0);
859 } /* wxDataViewColumn::SetFlags(int) */
861 void wxDataViewColumn::SetMaxWidth(int maxWidth
)
863 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
866 this->m_maxWidth
= maxWidth
;
867 if (dataViewCtrlPtr
!= NULL
)
869 // variable definition and initialization:
870 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
872 if (macDataViewListCtrlPtr
!= NULL
)
874 // variable definition and initialization:
875 DataBrowserListViewHeaderDesc headerDescription
;
877 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
878 headerDescription
.maximumWidth
= static_cast<UInt16
>(maxWidth
);
879 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set maximum width."));
882 } /* wxDataViewColumn::SetMaxWidth(int) */
884 void wxDataViewColumn::SetMinWidth(int minWidth
)
886 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
889 this->m_minWidth
= minWidth
;
890 if (dataViewCtrlPtr
!= NULL
)
892 // variable definition and initialization:
893 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
895 if (macDataViewListCtrlPtr
!= NULL
)
897 // variable definition and initialization:
898 DataBrowserListViewHeaderDesc headerDescription
;
900 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
901 headerDescription
.minimumWidth
= static_cast<UInt16
>(minWidth
);
902 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set minimum width."));
905 } /* wxDataViewColumn::SetMaxWidth(int) */
907 void wxDataViewColumn::SetReorderable(bool reorderable
)
909 // first set the internal flag of the column:
911 this->m_flags
|= wxDATAVIEW_COL_REORDERABLE
;
913 this->m_flags
&= ~wxDATAVIEW_COL_REORDERABLE
;
914 // if the column is associated with a control change also immediately the flags of the control:
915 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
917 if (dataViewCtrlPtr
!= NULL
)
919 // variable definition and initialization:
920 DataBrowserPropertyFlags flags
;
921 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
923 wxCHECK_RET(macDataViewListCtrlPtr
!= NULL
, _("Valid pointer to native data view control does not exist"));
924 wxCHECK_RET(macDataViewListCtrlPtr
->GetPropertyFlags(this->GetPropertyID(),&flags
) == noErr
,_("Could not get property flags."));
926 flags
|= kDataBrowserListViewMovableColumn
;
928 flags
&= ~kDataBrowserListViewMovableColumn
;
929 wxCHECK_RET(macDataViewListCtrlPtr
->SetPropertyFlags(this->GetPropertyID(),flags
) == noErr
,_("Could not set property flags."));
931 } /* wxDataViewColumn::SetReorderable(bool) */
933 void wxDataViewColumn::SetResizeable(bool resizeable
)
935 // first set the internal flag of the column:
937 this->m_flags
|= wxDATAVIEW_COL_RESIZABLE
;
939 this->m_flags
&= ~wxDATAVIEW_COL_RESIZABLE
;
940 // if the column is associated with a control change also immediately the flags of the control:
941 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
943 if (dataViewCtrlPtr
!= NULL
)
945 // variable definition and initialization:
946 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
948 if (macDataViewListCtrlPtr
!= NULL
)
950 // variable definition and initialization:
951 DataBrowserListViewHeaderDesc headerDescription
;
953 verify_noerr(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
));
955 headerDescription
.minimumWidth
= 0;
956 headerDescription
.maximumWidth
= 30000;
959 headerDescription
.minimumWidth
= this->m_width
;
960 headerDescription
.maximumWidth
= this->m_width
;
962 verify_noerr(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
));
963 macDataViewListCtrlPtr
->SetSortProperty(this->GetPropertyID());
966 } /* wxDataViewColumn::SetResizeable(bool) */
968 void wxDataViewColumn::SetSortable(bool sortable
)
970 // first set the internal flag of the column:
972 this->m_flags
|= wxDATAVIEW_COL_SORTABLE
;
974 this->m_flags
&= ~wxDATAVIEW_COL_SORTABLE
;
975 // if the column is associated with a control change also immediately the flags of the control:
976 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
978 if (dataViewCtrlPtr
!= NULL
)
980 // variable definition and initialization:
981 DataBrowserPropertyFlags flags
;
982 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
984 wxCHECK_RET(macDataViewListCtrlPtr
!= NULL
, _("Valid pointer to native data view control does not exist"));
985 wxCHECK_RET(macDataViewListCtrlPtr
->GetPropertyFlags(this->GetPropertyID(),&flags
) == noErr
,_("Could not get property flags."));
987 flags
|= kDataBrowserListViewSortableColumn
;
989 flags
&= ~kDataBrowserListViewSortableColumn
;
990 wxCHECK_RET(macDataViewListCtrlPtr
->SetPropertyFlags(this->GetPropertyID(),flags
) == noErr
,_("Could not set property flags."));
992 } /* wxDataViewColumn::SetSortable(bool) */
994 void wxDataViewColumn::SetSortOrder(bool ascending
)
996 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
999 this->m_ascending
= ascending
;
1000 if (dataViewCtrlPtr
!= NULL
)
1002 // variable definition and initialization:
1003 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
1005 if (macDataViewListCtrlPtr
!= NULL
)
1007 // variable definition and initialization:
1008 DataBrowserListViewHeaderDesc headerDescription
;
1010 verify_noerr(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
));
1012 headerDescription
.initialOrder
= kDataBrowserOrderIncreasing
;
1014 headerDescription
.initialOrder
= kDataBrowserOrderDecreasing
;
1015 verify_noerr(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
));
1016 macDataViewListCtrlPtr
->SetSortProperty(this->GetPropertyID());
1019 } /* wxDataViewColumn::SetSortOrder(bool) */
1021 void wxDataViewColumn::SetTitle(wxString
const& title
)
1023 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
1026 this->m_title
= title
;
1027 if (dataViewCtrlPtr
!= NULL
)
1029 // variable definition and initialization:
1030 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
1032 if (macDataViewListCtrlPtr
!= NULL
)
1034 // variable definition and initialization:
1035 DataBrowserListViewHeaderDesc headerDescription
;
1036 #if wxCHECK_VERSION(2,9,0)
1037 wxCFStringRef
cfTitle(title
,(dataViewCtrlPtr
->GetFont().Ok() ? dataViewCtrlPtr
->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
1039 wxMacCFStringHolder
cfTitle(title
,(dataViewCtrlPtr
->GetFont().Ok() ? dataViewCtrlPtr
->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
1042 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
1043 headerDescription
.titleString
= cfTitle
;
1044 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set header description."));
1047 } /* wxDataViewColumn::SetTitle(wxString const&) */
1049 void wxDataViewColumn::SetWidth(int width
)
1051 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
1054 if ((width
>= this->m_minWidth
) && (width
<= this->m_maxWidth
))
1056 this->m_width
= width
;
1057 if (dataViewCtrlPtr
!= NULL
)
1059 // variable definition and initialization:
1060 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
1062 if (macDataViewListCtrlPtr
!= NULL
)
1063 wxCHECK_RET(macDataViewListCtrlPtr
->SetColumnWidth(this->GetPropertyID(),static_cast<UInt16
>(width
)) == noErr
,_("Could not set column width."));
1066 } /* wxDataViewColumn::SetWidth(int) */
1068 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn
,wxDataViewColumnBase
)
1070 //-----------------------------------------------------------------------------
1072 //-----------------------------------------------------------------------------
1074 void wxDataViewCtrl::Init(void)
1076 this->m_CustomRendererPtr
= NULL
;
1077 this->m_Deleting
= false;
1078 this->m_macIsUserPane
= false;
1079 this->m_cgContext
= NULL
;
1080 } /* wxDataViewCtrl::Init(void) */
1082 bool wxDataViewCtrl::Create(wxWindow
*parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long style
, const wxValidator
& validator
)
1084 if (!(this->wxControl::Create(parent
,id
,pos
,size
,(style
| wxSUNKEN_BORDER
) & ~(wxHSCROLL
| wxVSCROLL
),validator
)))
1088 MacSetClipChildren(true) ;
1091 this->m_peer
= new wxMacDataViewDataBrowserListViewControl(this,pos
,size
,style
);
1092 this->MacPostControlCreate(pos
,size
);
1093 ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(this->m_peer
->GetControlRef()),true);
1095 InstallControlEventHandler(this->m_peer
->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList
),eventList
,this,NULL
);
1097 ::SetDataBrowserTableViewHiliteStyle( this->m_peer
->GetControlRef(), kDataBrowserTableViewFillHilite
);
1099 ::SetDataBrowserTableViewGeometry( this->m_peer
->GetControlRef(), true, false );
1102 } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */
1105 wxVisualAttributes
wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant variant
)
1107 wxVisualAttributes attr
;
1109 attr
.colFg
= wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT
);
1110 attr
.colBg
= wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX
);
1111 attr
.font
.MacCreateFromThemeFont(kThemeViewsFont
);
1116 bool wxDataViewCtrl::AssociateModel(wxDataViewModel
* model
)
1118 if (!wxDataViewCtrlBase::AssociateModel(model
))
1121 model
->AddNotifier(new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl
*>(this->m_peer
)));
1124 } /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
1126 bool wxDataViewCtrl::AppendColumn(wxDataViewColumn
* columnPtr
)
1128 DataBrowserListViewColumnDesc columnDescription
;
1130 DataBrowserPropertyID NewPropertyID
;
1132 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1134 #if wxCHECK_VERSION(2,9,0)
1135 wxCFStringRef
title(columnPtr
->GetTitle(),this->m_font
.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1137 wxMacCFStringHolder
title(columnPtr
->GetTitle(),this->m_font
.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1141 // first, some error checking:
1142 wxCHECK_MSG(MacDataViewListCtrlPtr
!= NULL
, false,_("m_peer is not or incorrectly initialized"));
1143 wxCHECK_MSG(columnPtr
!= NULL
, false,_("Column pointer must not be NULL."));
1144 wxCHECK_MSG(columnPtr
->GetRenderer() != NULL
, false,_("Column does not have a renderer."));
1145 wxCHECK_MSG(this->GetModel() != NULL
, false,_("No model associated with control."));
1146 wxCHECK_MSG((columnPtr
->GetModelColumn() >= 0) &&
1147 (columnPtr
->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
1149 // try to get new ID for the column:
1150 wxCHECK_MSG(MacDataViewListCtrlPtr
->GetFreePropertyID(&NewPropertyID
) == noErr
,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
1151 // full column variable initialization:
1152 columnPtr
->SetPropertyID(NewPropertyID
);
1153 // add column to wxWidget's internal structure:
1154 wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr
) &&
1155 this->m_ColumnPointers
.insert(ColumnPointerHashMapType::value_type(NewPropertyID
,columnPtr
)).second
,false,_("Could not add column to internal structures."));
1156 // create a column description and add column to the native control:
1157 wxCHECK_MSG(::InitializeColumnDescription(columnDescription
,columnPtr
,NewPropertyID
,title
), false,_("Column description could not be initialized."));
1158 wxCHECK_MSG(MacDataViewListCtrlPtr
->AddColumn(&columnDescription
,kDataBrowserListViewAppendColumn
) == noErr
,false,_("Column could not be added."));
1160 // final adjustments for the layout:
1161 wxCHECK_MSG(MacDataViewListCtrlPtr
->SetColumnWidth(NewPropertyID
,columnPtr
->GetWidth()) == noErr
,false,_("Column width could not be set."));
1163 // make sure that the data is up-to-date...
1164 // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
1165 // otherwise ask the control to 'update' the data in the newly appended column:
1166 if (this->GetColumnCount() == 1)
1168 this->SetExpanderColumn(columnPtr
);
1169 this->AddChildrenLevel(wxDataViewItem());
1172 MacDataViewListCtrlPtr
->UpdateItems(kDataBrowserNoItem
,0,NULL
,kDataBrowserItemNoProperty
,NewPropertyID
);
1175 } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
1177 bool wxDataViewCtrl::ClearColumns(void)
1179 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1182 while (this->m_ColumnPointers
.begin() != this->m_ColumnPointers
.end())
1184 wxCHECK_MSG(MacDataViewListCtrlPtr
->RemoveColumnByProperty(this->m_ColumnPointers
.begin()->first
) == noErr
,false,_("Could not remove column."));
1185 delete this->m_ColumnPointers
.begin()->second
;
1186 this->m_ColumnPointers
.erase(this->m_ColumnPointers
.begin());
1189 } /* wxDataViewCtrl::ClearColumns(void) */
1191 bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn
* columnPtr
)
1193 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1196 if ((MacDataViewListCtrlPtr
->RemoveColumnByProperty(columnPtr
->GetPropertyID()) == noErr
) && (this->m_ColumnPointers
.erase(columnPtr
->GetPropertyID()) > 0))
1203 } /* wxDataViewCtrl::DeleteColumn(wxDataViewColumn*) */
1205 wxDataViewColumn
* wxDataViewCtrl::GetColumn(unsigned int pos
) const
1207 DataBrowserPropertyID propertyID
;
1209 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1212 if (MacDataViewListCtrlPtr
->GetPropertyID(pos
,&propertyID
) == noErr
)
1214 // variable definition:
1215 ColumnPointerHashMapType::const_iterator
Result(this->m_ColumnPointers
.find(propertyID
));
1217 if (Result
!= this->m_ColumnPointers
.end())
1218 return Result
->second
;
1224 } /* wxDataViewCtrl::GetColumn(unsigned int pos) const */
1226 unsigned int wxDataViewCtrl::GetColumnCount(void) const
1228 return this->m_ColumnPointers
.size();
1229 } /* wxDataViewCtrl::GetColumnCount(void) const */
1231 int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn
const* columnPtr
) const
1233 if (columnPtr
!= NULL
)
1235 // variable definition and initialization:
1236 DataBrowserTableViewColumnIndex Position
;
1237 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1239 wxCHECK_MSG(MacDataViewListCtrlPtr
->GetColumnIndex(columnPtr
->GetPropertyID(),&Position
) == noErr
,-1,_("Could not determine column's position"));
1240 return static_cast<int>(Position
);
1244 } /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */
1246 bool wxDataViewCtrl::PrependColumn(wxDataViewColumn
* columnPtr
)
1248 DataBrowserListViewColumnDesc columnDescription
;
1250 DataBrowserPropertyID NewPropertyID
;
1252 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1254 #if wxCHECK_VERSION(2,9,0)
1255 wxCFStringRef
title(columnPtr
->GetTitle(),this->m_font
.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1257 wxMacCFStringHolder
title(columnPtr
->GetTitle(),this->m_font
.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1261 // first, some error checking:
1262 wxCHECK_MSG(MacDataViewListCtrlPtr
!= NULL
, false,_("m_peer is not or incorrectly initialized"));
1263 wxCHECK_MSG(columnPtr
!= NULL
, false,_("Column pointer must not be NULL."));
1264 wxCHECK_MSG(columnPtr
->GetRenderer() != NULL
, false,_("Column does not have a renderer."));
1265 wxCHECK_MSG(this->GetModel() != NULL
, false,_("No model associated with control."));
1266 wxCHECK_MSG((columnPtr
->GetModelColumn() >= 0) &&
1267 (columnPtr
->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
1269 // try to get new ID for the column:
1270 wxCHECK_MSG(MacDataViewListCtrlPtr
->GetFreePropertyID(&NewPropertyID
) == noErr
,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
1271 // full column variable initialization:
1272 columnPtr
->SetPropertyID(NewPropertyID
);
1273 // add column to wxWidget's internal structure:
1274 wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr
) &&
1275 this->m_ColumnPointers
.insert(ColumnPointerHashMapType::value_type(NewPropertyID
,columnPtr
)).second
,false,_("Could not add column to internal structures."));
1276 // create a column description and add column to the native control:
1277 wxCHECK_MSG(::InitializeColumnDescription(columnDescription
,columnPtr
,NewPropertyID
,title
),false,_("Column description could not be initialized."));
1278 wxCHECK_MSG(MacDataViewListCtrlPtr
->AddColumn(&columnDescription
,0) == noErr
, false,_("Column could not be added."));
1280 // final adjustments for the layout:
1281 wxCHECK_MSG(MacDataViewListCtrlPtr
->SetColumnWidth(NewPropertyID
,columnPtr
->GetWidth()) == noErr
,false,_("Column width could not be set."));
1283 // make sure that the data is up-to-date...
1284 // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
1285 // otherwise ask the control to 'update' the data in the newly appended column:
1286 if (this->GetColumnCount() == 1)
1288 this->SetExpanderColumn(columnPtr
);
1289 this->AddChildrenLevel(wxDataViewItem());
1292 MacDataViewListCtrlPtr
->UpdateItems(kDataBrowserNoItem
,0,NULL
,kDataBrowserItemNoProperty
,NewPropertyID
);
1295 } /* wxDataViewCtrl::PrependColumn(wxDataViewColumn*) */
1297 void wxDataViewCtrl::Collapse(wxDataViewItem
const& item
)
1299 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1302 MacDataViewListCtrlPtr
->CloseContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1303 } /* wxDataViewCtrl::Collapse(wxDataViewItem const&) */
1305 void wxDataViewCtrl::EnsureVisible(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
)
1309 // variable definition and initialization:
1310 DataBrowserPropertyID propertyID
;
1311 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1313 if (columnPtr
!= NULL
)
1314 propertyID
= columnPtr
->GetPropertyID();
1316 propertyID
= kDataBrowserNoItem
;
1317 MacDataViewListCtrlPtr
->RevealItem(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),propertyID
,kDataBrowserRevealOnly
);
1319 } /* wxDataViewCtrl::EnsureVisible(wxDataViewItem const&, wxDataViewColumn const*) */
1321 void wxDataViewCtrl::Expand(wxDataViewItem
const& item
)
1323 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1326 MacDataViewListCtrlPtr
->OpenContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1327 } /* wxDataViewCtrl::Expand(wxDataViewItem const&) */
1329 wxDataViewColumn
* wxDataViewCtrl::GetSortingColumn(void) const
1331 DataBrowserPropertyID propertyID
;
1333 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1336 if (MacDataViewListCtrlPtr
->GetSortProperty(&propertyID
) == noErr
)
1337 return this->GetColumnPtr(propertyID
);
1340 } /* wxDataViewCtrl::GetSortingColumn(void) const */
1342 unsigned int wxDataViewCtrl::GetCount(void) const
1344 ItemCount noOfItems
;
1347 wxCHECK_MSG(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
)->GetItemCount(&noOfItems
) == noErr
,0,_("Could not determine number of items"));
1349 } /* wxDataViewCtrl::GetCount(void) const */
1351 wxRect
wxDataViewCtrl::GetItemRect(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
) const
1353 if (item
.IsOk() && (columnPtr
!= NULL
))
1355 // variable definition:
1357 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1359 if (MacDataViewListCtrlPtr
->GetPartBounds(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),columnPtr
->GetPropertyID(),kDataBrowserPropertyContentPart
,&MacRectangle
) == noErr
)
1361 // variable definition:
1364 ::wxMacNativeToRect(&MacRectangle
,&rectangle
);
1372 } /* wxDataViewCtrl::GetItemRect(wxDataViewItem const&, unsigned int) const */
1374 wxDataViewItem
wxDataViewCtrl::GetSelection(void) const
1376 wxArrayDataBrowserItemID itemIDs
;
1378 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1381 if (MacDataViewListCtrlPtr
->GetSelectedItemIDs(itemIDs
) > 0)
1382 return wxDataViewItem(reinterpret_cast<void*>(itemIDs
[0]));
1384 return wxDataViewItem();
1385 } /* wxDataViewCtrl::GetSelection(void) const */
1387 int wxDataViewCtrl::GetSelections(wxDataViewItemArray
& sel
) const
1389 size_t NoOfSelectedItems
;
1391 wxArrayDataBrowserItemID itemIDs
;
1393 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1396 NoOfSelectedItems
= MacDataViewListCtrlPtr
->GetSelectedItemIDs(itemIDs
);
1398 sel
.SetCount(NoOfSelectedItems
);
1399 for (size_t i
=0; i
<NoOfSelectedItems
; ++i
)
1400 sel
[i
] = wxDataViewItem(reinterpret_cast<void*>(itemIDs
[i
]));
1401 return static_cast<int>(NoOfSelectedItems
);
1402 } /* wxDataViewCtrl::GetSelections(wxDataViewItemArray&) const */
1404 void wxDataViewCtrl::HitTest(wxPoint
const& point
, wxDataViewItem
& item
, wxDataViewColumn
*& columnPtr
) const
1406 item
= wxDataViewItem();
1408 } /* wxDataViewCtrl::HitTest(wxPoint const&, wxDataViewItem&, wxDataViewColumn*&) const */
1410 bool wxDataViewCtrl::IsSelected(wxDataViewItem
const& item
) const
1412 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1415 return MacDataViewListCtrlPtr
->IsItemSelected(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1416 } /* wxDataViewCtrl::IsSelected(wxDataViewItem const&) const */
1418 void wxDataViewCtrl::SelectAll(void)
1420 DataBrowserItemID
* itemIDPtr
;
1422 Handle
handle(::NewHandle(0));
1426 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1429 wxCHECK_RET(MacDataViewListCtrlPtr
->GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1430 NoOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1432 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1433 MacDataViewListCtrlPtr
->SetSelectedItems(NoOfItems
,itemIDPtr
,kDataBrowserItemsAssign
);
1435 DisposeHandle(handle
);
1436 } /* wxDataViewCtrl::SelectAll(void) */
1438 void wxDataViewCtrl::Select(wxDataViewItem
const& item
)
1442 // variable definition and initialization:
1443 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1444 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1446 MacDataViewListCtrlPtr
->SetSelectedItems(1,&itemID
,kDataBrowserItemsAdd
);
1448 } /* wxDataViewCtrl::Select(wxDataViewItem const&) */
1450 void wxDataViewCtrl::SetSelections(wxDataViewItemArray
const& sel
)
1452 size_t const NoOfSelections
= sel
.GetCount();
1454 DataBrowserItemID
* itemIDs
;
1456 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1459 itemIDs
= new DataBrowserItemID
[NoOfSelections
];
1460 for (size_t i
=0; i
<NoOfSelections
; ++i
)
1461 itemIDs
[i
] = reinterpret_cast<DataBrowserItemID
>(sel
[i
].GetID());
1462 MacDataViewListCtrlPtr
->SetSelectedItems(NoOfSelections
,itemIDs
,kDataBrowserItemsAssign
);
1464 } /* wxDataViewCtrl::SetSelections(wxDataViewItemArray const&) */
1466 void wxDataViewCtrl::Unselect(wxDataViewItem
const& item
)
1470 // variable definition and initialization:
1471 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1472 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1474 MacDataViewListCtrlPtr
->SetSelectedItems(1,&itemID
,kDataBrowserItemsRemove
);
1476 } /* wxDataViewCtrl::Unselect(wxDataViewItem const&) */
1478 void wxDataViewCtrl::UnselectAll(void)
1480 DataBrowserItemID
* itemIDPtr
;
1482 Handle
handle(::NewHandle(0));
1486 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1489 wxCHECK_RET(MacDataViewListCtrlPtr
->GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1490 NoOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1492 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1493 MacDataViewListCtrlPtr
->SetSelectedItems(NoOfItems
,itemIDPtr
,kDataBrowserItemsRemove
);
1495 DisposeHandle(handle
);
1496 } /* wxDataViewCtrl::UnselectAll(void) */
1499 void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem
const& parentItem
)
1503 wxDataViewItemArray items
;
1506 wxCHECK_RET(this->GetModel() != NULL
,_("Model pointer not initialized."));
1507 NoOfChildren
= this->GetModel()->GetChildren(parentItem
,items
);
1509 for (int i
=0; i
<NoOfChildren
; ++i
)
1510 (void) this->GetModel()->ItemAdded(parentItem
,items
[i
]);
1512 (void) this->GetModel()->ItemsAdded(parentItem
,items
);
1514 } /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */
1516 void wxDataViewCtrl::FinishCustomItemEditing(void)
1518 if (this->GetCustomRendererItem().IsOk())
1520 this->GetCustomRendererPtr()->FinishEditing();
1521 this->SetCustomRendererItem(wxDataViewItem());
1522 this->SetCustomRendererPtr (NULL
);
1524 } /* wxDataViewCtrl::FinishCustomItemEditing(void) */
1526 wxDataViewColumn
* wxDataViewCtrl::GetColumnPtr(WXDataBrowserPropertyID propertyID
) const
1528 // variable definition:
1529 ColumnPointerHashMapType::const_iterator
Result(this->m_ColumnPointers
.find(propertyID
));
1531 if (Result
!= this->m_ColumnPointers
.end())
1532 return Result
->second
;
1535 } /* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID) const */
1537 // inherited methods from wxDataViewCtrlBase
1538 void wxDataViewCtrl::DoSetExpanderColumn(void)
1540 if (this->GetExpanderColumn() != NULL
)
1542 // variable definition and initialization:
1543 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1545 (void) MacDataViewListCtrlPtr
->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID(),false); // second parameter explicitely passed to ensure that arrow is centered
1547 } /* wxDataViewCtrl::DoSetExpanderColumn(void) */
1549 void wxDataViewCtrl::DoSetIndent(void)
1551 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1554 (void) MacDataViewListCtrlPtr
->SetIndent(static_cast<float>(this->GetIndent()));
1555 } /* wxDataViewCtrl::DoSetIndent(void) */
1558 void wxDataViewCtrl::OnSize(wxSizeEvent
& event
)
1560 unsigned int const NoOfColumns
= this->GetColumnCount();
1563 for (unsigned int i
=0; i
<NoOfColumns
; ++i
)
1565 // variable definition and initialization:
1566 wxDataViewColumn
* dataViewColumnPtr(this->GetColumn(i
));
1568 if (dataViewColumnPtr
!= NULL
)
1570 // variable definition and initialization:
1571 wxDataViewCustomRenderer
* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer()));
1573 if (dataViewCustomRendererPtr
!= NULL
)
1574 dataViewCustomRendererPtr
->SetDC(NULL
); // reset DC because DC has changed
1578 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1579 ControlRef ref
= MacDataViewListCtrlPtr
->GetControlRef();
1580 if (NoOfColumns
== 1)
1582 ::SetDataBrowserHasScrollBars( ref
, false, true );
1583 ::AutoSizeDataBrowserListViewColumns( ref
);
1585 if (NoOfColumns
> 1)
1587 ::SetDataBrowserHasScrollBars( ref
, true, true );
1591 } /* wxDataViewCtrl::OnSize(wxSizeEvent&) */
1593 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl
,wxDataViewCtrlBase
)
1595 BEGIN_EVENT_TABLE(wxDataViewCtrl
,wxDataViewCtrlBase
)
1596 EVT_SIZE(wxDataViewCtrl::OnSize
)
1600 // !wxUSE_GENERICDATAVIEWCTRL
1603 // wxUSE_DATAVIEWCTRL