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"
28 #include "wx/renderer.h"
30 //-----------------------------------------------------------------------------
32 //-----------------------------------------------------------------------------
34 // a list of all catchable events:
35 static EventTypeSpec
const eventList
[] =
37 {kEventClassControl
, kEventControlDraw
},
38 {kEventClassControl
, kEventControlHit
}
41 //-----------------------------------------------------------------------------
43 //-----------------------------------------------------------------------------
45 static pascal OSStatus
wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
, EventRef EventReference
, void* Data
)
47 wxDataViewCtrl
* DataViewCtrlPtr((wxDataViewCtrl
*) Data
); // the 'Data' variable always contains a pointer to the data view control that installed the handler
49 wxMacCarbonEvent
CarbonEvent(EventReference
) ;
52 switch (GetEventKind(EventReference
))
54 case kEventControlDraw
:
58 DataViewCtrlPtr
->MacSetDrawingContext(CarbonEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
,typeCGContextRef
));
59 status
= ::CallNextEventHandler(handler
,EventReference
);
60 DataViewCtrlPtr
->MacSetDrawingContext(NULL
);
63 case kEventControlHit
:
64 if (CarbonEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart
,typeControlPartCode
) == kControlButtonPart
) // we only care about the header
66 ControlRef controlReference
;
67 DataBrowserPropertyID columnPropertyID
;
68 unsigned long columnIndex
;
70 wxDataViewEvent
DataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
,DataViewCtrlPtr
->GetId());
72 CarbonEvent
.GetParameter(kEventParamDirectObject
,&controlReference
);
73 // determine the column that triggered the event (this is the column that is responsible for sorting the data view):
74 status
= ::GetDataBrowserSortProperty(controlReference
,&columnPropertyID
);
75 wxCHECK(status
== noErr
,status
);
76 status
= ::GetDataBrowserTableViewColumnPosition(controlReference
,columnPropertyID
,&columnIndex
);
77 if (status
== errDataBrowserPropertyNotFound
) // user clicked into part of the header that does not have a property
78 return ::CallNextEventHandler(handler
,EventReference
);
79 wxCHECK(status
== noErr
,status
);
80 // initialize wxWidget event handler:
81 DataViewEvent
.SetEventObject(DataViewCtrlPtr
);
82 DataViewEvent
.SetColumn(columnIndex
);
83 DataViewEvent
.SetDataViewColumn(DataViewCtrlPtr
->GetColumn(columnIndex
));
84 // finally sent the equivalent wxWidget event:
85 DataViewCtrlPtr
->GetEventHandler()->ProcessEvent(DataViewEvent
);
86 return ::CallNextEventHandler(handler
,EventReference
);
89 return eventNotHandledErr
;
92 return eventNotHandledErr
;
93 } /* wxMacDataViewCtrlEventHandler(EventHandlerCallRef, EventRef, void*) */
95 static DataBrowserItemID
* CreateDataBrowserItemIDArray(size_t& noOfEntries
, wxDataViewItemArray
const& items
) // returns a newly allocated pointer to valid data browser item IDs
97 size_t const noOfItems
= items
.GetCount();
99 DataBrowserItemID
* itemIDs(new DataBrowserItemID
[noOfItems
]);
102 // convert all valid data view items to data browser items
104 for (size_t i
=0; i
<noOfItems
; ++i
)
107 itemIDs
[noOfEntries
] = reinterpret_cast<DataBrowserItemID
>(items
[i
].GetID());
112 } /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */
114 //-----------------------------------------------------------------------------
115 // local function pointers
116 //-----------------------------------------------------------------------------
118 DEFINE_ONE_SHOT_HANDLER_GETTER(wxMacDataViewCtrlEventHandler
)
120 // ---------------------------------------------------------
121 // wxMacDataViewModelNotifier
122 // ---------------------------------------------------------
124 class wxMacDataViewModelNotifier
: public wxDataViewModelNotifier
127 wxMacDataViewModelNotifier(wxMacDataViewDataBrowserListViewControl
* initDataViewControlPtr
) : m_dataViewControlPtr(initDataViewControlPtr
)
131 virtual bool ItemAdded(const wxDataViewItem
&parent
, const wxDataViewItem
&item
)
133 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
136 wxCHECK_MSG(item
.IsOk(),false,_("Added item is invalid."));
137 return (!(parent
.IsOk()) && (this->m_dataViewControlPtr
->AddItem(kDataBrowserNoItem
,&itemID
) == noErr
) ||
138 parent
.IsOk() && (this->m_dataViewControlPtr
->AddItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
));
139 } /* ItemAdded(wxDataViewItem const&, wxDataViewItem const&) */
141 virtual bool ItemsAdded(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
145 DataBrowserItemID
* itemIDs
;
150 // convert all valid data view items to data browser items:
151 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
152 // insert all valid items into control:
153 noFailureFlag
= ((noOfEntries
== 0) ||
154 !(parent
.IsOk()) && (this->m_dataViewControlPtr
->AddItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
155 parent
.IsOk() && (this->m_dataViewControlPtr
->AddItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
156 // give allocated array space free again:
159 return noFailureFlag
;
160 } /* ItemsAdded(wxDataViewItem const&, wxDataViewItemArray const&) */
162 virtual bool ItemChanged(wxDataViewItem
const& item
)
164 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
167 wxCHECK_MSG(item
.IsOk(),false,_("Changed item is invalid."));
168 if (this->m_dataViewControlPtr
->UpdateItems(&itemID
) == noErr
)
170 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
172 // sent the equivalent wxWidget event:
173 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,dataViewCtrlPtr
->GetId()); // variable defintion
175 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
176 dataViewEvent
.SetItem(item
);
177 // sent the equivalent wxWidget event:
178 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
184 } /* ItemChanged(wxDataViewItem const&) */
186 virtual bool ItemsChanged(wxDataViewItemArray
const& items
)
190 DataBrowserItemID
* itemIDs
;
195 // convert all valid data view items to data browser items:
196 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
197 // change items (ATTENTION: ONLY ITEMS OF THE ROOT ARE CHANGED BECAUSE THE PARENT PARAMETER IS MISSING):
198 noFailureFlag
= (this->m_dataViewControlPtr
->UpdateItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
,kDataBrowserItemNoProperty
) == noErr
);
201 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
203 // send for all changed items a wxWidget event:
204 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,dataViewCtrlPtr
->GetId()); // variable defintion
206 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
207 for (size_t i
=0; i
<noOfEntries
; ++i
)
209 dataViewEvent
.SetItem(reinterpret_cast<void*>(itemIDs
[i
]));
210 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
213 // release allocated array space:
216 return noFailureFlag
;
217 } /* ItemsChanged(wxDataViewItem const&) */
219 virtual bool ItemDeleted(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
223 // variable definition and initialization:
224 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
225 OSStatus errorStatus
;
226 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
228 // 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
229 // not to be identical because the being edited item might be below the passed item in the hierarchy);
230 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
231 // has been started and that variables can currently not be updated even when requested by the system:
232 dataViewCtrlPtr
->SetDeleting(true);
233 errorStatus
= this->m_dataViewControlPtr
->RemoveItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
);
234 // enable automatic updating again:
235 dataViewCtrlPtr
->SetDeleting(false);
236 return (errorStatus
== noErr
);
240 } /* ItemDeleted(wxDataViewItem const&, wxDataViewItem const&) */
242 virtual bool ItemsDeleted(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
246 DataBrowserItemID
* itemIDs
;
248 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
253 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,false,_("Data view control is not correctly initialized"));
254 // convert all valid data view items to data browser items:
255 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
256 // 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
257 // not to be identical because the being edited item might be below the passed item in the hierarchy);
258 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
259 // has been started and that variables can currently not be updated even when requested by the system:
260 dataViewCtrlPtr
->SetDeleting(true);
261 // insert all valid items into control:
262 noFailureFlag
= ((noOfEntries
== 0) ||
263 !(parent
.IsOk()) && (this->m_dataViewControlPtr
->RemoveItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
264 parent
.IsOk() && (this->m_dataViewControlPtr
->RemoveItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
265 // enable automatic updating again:
266 dataViewCtrlPtr
->SetDeleting(false);
267 // give allocated array space free again:
270 return noFailureFlag
;
271 } /* ItemsDeleted(wxDataViewItem const&, wxDataViewItemArray const&) */
273 virtual bool ValueChanged(wxDataViewItem
const& item
, unsigned int col
)
275 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
276 DataBrowserItemID parentID
;
278 DataBrowserPropertyID propertyID
;
280 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->m_dataViewControlPtr
->GetPeer()));
283 wxCHECK_MSG(item
.IsOk(), false,_("Passed item is invalid."));
284 wxCHECK_MSG(this->GetOwner() != NULL
,false,_("Owner not initialized."));
285 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Control is wrongly initialized."));
286 parentID
= reinterpret_cast<DataBrowserItemID
>(this->GetOwner()->GetParent(item
).GetID());
287 if ((this->m_dataViewControlPtr
->GetPropertyID(col
,&propertyID
) == noErr
) &&
288 (this->m_dataViewControlPtr
->UpdateItems(parentID
,1,&itemID
,dataViewCtrlPtr
->GetColumn(col
)->GetPropertyID(),propertyID
) == noErr
))
290 // variable definition and initialization:
291 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,dataViewCtrlPtr
->GetId());
293 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
294 dataViewEvent
.SetColumn(col
);
295 dataViewEvent
.SetItem(item
);
296 // send the equivalent wxWidget event:
297 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
303 } /* ValueChanged(wxDataViewItem const&, unsigned int) */
305 virtual bool Cleared(void)
307 return (this->m_dataViewControlPtr
->RemoveItems() == noErr
);
308 } /* Cleared(void) */
310 virtual void Resort(void)
312 this->m_dataViewControlPtr
->Resort();
320 wxMacDataViewDataBrowserListViewControl
* m_dataViewControlPtr
;
323 // ---------------------------------------------------------
324 // wxDataViewRenderer
325 // ---------------------------------------------------------
327 wxDataViewRenderer::wxDataViewRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
328 :wxDataViewRendererBase(varianttype
,mode
,align
), m_alignment(align
), m_mode(mode
)
330 } /* wxDataViewRenderer::wxDataViewRenderer(wxString const&, wxDataViewCellMode) */
332 void wxDataViewRenderer::SetMode(wxDataViewCellMode mode
)
334 wxDataViewColumn
* dataViewColumnPtr
;
338 dataViewColumnPtr
= this->GetOwner();
339 if (dataViewColumnPtr
!= NULL
)
341 // variable definition and initialization:
342 wxDataViewCtrl
* dataViewCtrlPtr(dataViewColumnPtr
->GetOwner());
344 if (dataViewCtrlPtr
!= NULL
)
346 // variable definition and initialization:
347 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
349 if (macDataViewListCtrlPtr
!= NULL
)
351 // variable definition and initialization:
352 DataBrowserPropertyFlags flags
;
354 verify_noerr(macDataViewListCtrlPtr
->GetPropertyFlags(dataViewColumnPtr
->GetPropertyID(),&flags
));
355 if (mode
== wxDATAVIEW_CELL_EDITABLE
)
356 flags
|= kDataBrowserPropertyIsEditable
;
358 flags
&= ~kDataBrowserPropertyIsEditable
;
359 verify_noerr(macDataViewListCtrlPtr
->SetPropertyFlags(dataViewColumnPtr
->GetPropertyID(),flags
));
363 } /* wxDataViewRenderer::SetMode(wxDataViewCellMode) */
365 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer
,wxDataViewRendererBase
)
367 // ---------------------------------------------------------
368 // wxDataViewCustomRenderer
369 // ---------------------------------------------------------
371 wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
372 :wxDataViewRenderer(varianttype
,mode
,align
), m_editorCtrlPtr(NULL
), m_DCPtr(NULL
)
374 } /* wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const&, wxDataViewCellMode) */
376 wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void)
378 if (this->m_DCPtr
!= NULL
)
379 delete this->m_DCPtr
;
380 } /* wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) */
382 void wxDataViewCustomRenderer::RenderText( const wxString
&text
, int xoffset
, wxRect cell
, wxDC
*dc
, int state
)
384 wxDataViewCtrl
*view
= GetOwner()->GetOwner();
385 wxColour col
= (state
& wxDATAVIEW_CELL_SELECTED
) ?
386 wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT
) :
387 view
->GetForegroundColour();
388 dc
->SetTextForeground(col
);
389 dc
->DrawText( text
, cell
.x
+ xoffset
, cell
.y
+ ((cell
.height
- dc
->GetCharHeight()) / 2));
392 wxDC
* wxDataViewCustomRenderer::GetDC(void)
394 if (this->m_DCPtr
== NULL
)
396 if ((GetOwner() == NULL
) || (GetOwner()->GetOwner() == NULL
))
398 this->m_DCPtr
= new wxClientDC(this->GetOwner()->GetOwner());
400 return this->m_DCPtr
;
401 } /* wxDataViewCustomRenderer::GetDC(void) */
403 bool wxDataViewCustomRenderer::Render(void)
406 } /* wxDataViewCustomRenderer::Render(void) */
408 void wxDataViewCustomRenderer::SetDC(wxDC
* newDCPtr
)
410 delete this->m_DCPtr
;
411 this->m_DCPtr
= newDCPtr
;
412 } /* wxDataViewCustomRenderer::SetDC(wxDC*) */
415 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer
, wxDataViewRenderer
)
417 // ---------------------------------------------------------
418 // wxDataViewTextRenderer
419 // ---------------------------------------------------------
421 wxDataViewTextRenderer::wxDataViewTextRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
422 :wxDataViewRenderer(varianttype
,mode
,align
)
424 } /* wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const&, wxDataViewCellMode, int) */
426 bool wxDataViewTextRenderer::Render(void)
428 if (this->GetValue().GetType() == this->GetVariantType())
430 // variable definition:
431 wxMacCFStringHolder
cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
433 return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString
) == noErr
);
437 } /* wxDataViewTextRenderer::Render(void) */
439 IMPLEMENT_CLASS(wxDataViewTextRenderer
,wxDataViewRenderer
)
441 // ---------------------------------------------------------
442 // wxDataViewBitmapRenderer
443 // ---------------------------------------------------------
445 wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
446 :wxDataViewRenderer(varianttype
,mode
,align
)
450 bool wxDataViewBitmapRenderer::Render(void)
452 if (this->GetValue().GetType() == this->GetVariantType())
456 bitmap
<< this->GetValue();
458 return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap
.GetBitmapData()->GetIconRef()) == noErr
);
464 } /* wxDataViewBitmapRenderer::Render(void) */
466 IMPLEMENT_CLASS(wxDataViewBitmapRenderer
,wxDataViewRenderer
)
468 // ---------------------------------------------------------
469 // wxDataViewIconTextRenderer
470 // ---------------------------------------------------------
472 wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
473 :wxDataViewRenderer(varianttype
,mode
)
477 bool wxDataViewIconTextRenderer::Render(void)
479 if (this->GetValue().GetType() == this->GetVariantType())
481 // variable definition:
482 wxDataViewIconText iconText
;
484 iconText
<< this->GetValue();
486 // variable definition:
487 wxMacCFStringHolder
cfString(iconText
.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
489 return ((::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText
.GetIcon().GetHICON())) == noErr
) &&
490 (::SetDataBrowserItemDataText(this->GetDataReference(),cfString
) == noErr
));
494 } /* wxDataViewIconTextRenderer::Render(void) */
496 IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer
,wxDataViewRenderer
)
499 // ---------------------------------------------------------
500 // wxDataViewToggleRenderer
501 // ---------------------------------------------------------
503 wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
504 :wxDataViewRenderer(varianttype
,mode
)
508 bool wxDataViewToggleRenderer::Render(void)
510 if (this->GetValue().GetType() == this->GetVariantType())
511 return (::SetDataBrowserItemDataButtonValue(this->GetDataReference(),this->GetValue().GetBool()) == noErr
);
514 } /* wxDataViewToggleRenderer::Render(void) */
516 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer
,wxDataViewRenderer
)
518 // ---------------------------------------------------------
519 // wxDataViewProgressRenderer
520 // ---------------------------------------------------------
522 wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString
const& label
, wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
523 :wxDataViewRenderer(varianttype
,mode
,align
)
527 bool wxDataViewProgressRenderer::Render(void)
529 if (this->GetValue().GetType() == this->GetVariantType())
530 return ((::SetDataBrowserItemDataMinimum(this->GetDataReference(), 0) == noErr
) &&
531 (::SetDataBrowserItemDataMaximum(this->GetDataReference(),100) == noErr
) &&
532 (::SetDataBrowserItemDataValue (this->GetDataReference(),this->GetValue().GetLong()) == noErr
));
535 } /* wxDataViewProgressRenderer::Render(void) */
537 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer
,wxDataViewRenderer
)
539 // ---------------------------------------------------------
540 // wxDataViewDateRenderer
541 // ---------------------------------------------------------
543 wxDataViewDateRenderer::wxDataViewDateRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
544 :wxDataViewRenderer(varianttype
,mode
,align
)
548 bool wxDataViewDateRenderer::Render(void)
550 if (this->GetValue().GetType() == this->GetVariantType())
551 return (::SetDataBrowserItemDataDateTime(this->GetDataReference(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan
,1904)).GetSeconds().GetLo()) == noErr
);
554 } /* wxDataViewDateRenderer::Render(void) */
556 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer
,wxDataViewRenderer
)
558 // ---------------------------------------------------------
560 // ---------------------------------------------------------
562 wxDataViewColumn::wxDataViewColumn(wxString
const &title
, wxDataViewRenderer
*cell
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
563 :wxDataViewColumnBase(title
,cell
,model_column
,width
,wxALIGN_CENTER
,flags
), m_ascending(true),
564 m_flags(flags
& ~(wxDATAVIEW_COL_HIDDEN
)), m_maxWidth(30000), m_minWidth(0), m_width(width
>= 0 ? width
: wxDVC_DEFAULT_WIDTH
),
565 m_alignment(align
), m_title(title
)
567 } /* wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
569 wxDataViewColumn::wxDataViewColumn(wxBitmap
const& bitmap
, wxDataViewRenderer
*cell
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
570 :wxDataViewColumnBase(bitmap
,cell
,model_column
,width
,wxALIGN_CENTER
,flags
), m_ascending(true),
571 m_flags(flags
& ~(wxDATAVIEW_COL_HIDDEN
)), m_maxWidth(30000), m_minWidth(0), m_width(width
>= 0 ? width
: wxDVC_DEFAULT_WIDTH
),
574 } /* wxDataViewColumn::wxDataViewColumn(wxBitmap const&, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
576 void wxDataViewColumn::SetAlignment(wxAlignment align
)
578 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
581 this->m_alignment
= align
;
582 if (dataViewCtrlPtr
!= NULL
)
584 // variable definition and initialization:
585 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
587 if (macDataViewListCtrlPtr
!= NULL
)
589 // variable definition and initialization:
590 DataBrowserListViewHeaderDesc headerDescription
;
592 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
596 case wxALIGN_CENTER_HORIZONTAL
:
597 headerDescription
.btnFontStyle
.just
= teCenter
;
600 headerDescription
.btnFontStyle
.just
= teFlushLeft
;
603 headerDescription
.btnFontStyle
.just
= teFlushRight
;
606 headerDescription
.btnFontStyle
.just
= teFlushDefault
;
608 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set alignment."));
611 } /* wxDataViewColumn::SetAlignment(wxAlignment) */
613 void wxDataViewColumn::SetBitmap(wxBitmap
const& bitmap
)
615 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
618 wxDataViewColumnBase::SetBitmap(bitmap
);
619 if (dataViewCtrlPtr
!= NULL
)
621 // variable definition and initialization:
622 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
624 if (macDataViewListCtrlPtr
!= NULL
)
626 // variable definition and initialization:
627 DataBrowserListViewHeaderDesc headerDescription
;
629 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
630 if (this->GetBitmap().Ok())
631 headerDescription
.btnContentInfo
.u
.iconRef
= this->GetBitmap().GetBitmapData()->GetIconRef();
633 headerDescription
.btnContentInfo
.u
.iconRef
= NULL
;
634 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set icon."));
637 } /* wxDataViewColumn::SetBitmap(wxBitmap const&) */
639 void wxDataViewColumn::SetFlags(int flags
)
641 this->SetHidden ((flags
& wxDATAVIEW_COL_HIDDEN
) != 0);
642 this->SetResizeable((flags
& wxDATAVIEW_COL_RESIZABLE
) != 0);
643 this->SetSortable ((flags
& wxDATAVIEW_COL_SORTABLE
) != 0);
644 } /* wxDataViewColumn::SetFlags(int) */
646 void wxDataViewColumn::SetMaxWidth(int maxWidth
)
648 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
651 this->m_maxWidth
= maxWidth
;
652 if (dataViewCtrlPtr
!= NULL
)
654 // variable definition and initialization:
655 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
657 if (macDataViewListCtrlPtr
!= NULL
)
659 // variable definition and initialization:
660 DataBrowserListViewHeaderDesc headerDescription
;
662 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
663 headerDescription
.maximumWidth
= static_cast<UInt16
>(maxWidth
);
664 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set maximum width."));
667 } /* wxDataViewColumn::SetMaxWidth(int) */
669 void wxDataViewColumn::SetMinWidth(int minWidth
)
671 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
674 this->m_minWidth
= minWidth
;
675 if (dataViewCtrlPtr
!= NULL
)
677 // variable definition and initialization:
678 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
680 if (macDataViewListCtrlPtr
!= NULL
)
682 // variable definition and initialization:
683 DataBrowserListViewHeaderDesc headerDescription
;
685 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
686 headerDescription
.minimumWidth
= static_cast<UInt16
>(minWidth
);
687 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set minimum width."));
690 } /* wxDataViewColumn::SetMaxWidth(int) */
692 void wxDataViewColumn::SetResizeable(bool WXUNUSED(resizeable
))
694 } /* wxDataViewColumn::SetResizeable(bool) */
696 void wxDataViewColumn::SetSortable(bool sortable
)
698 // variable definition and initialization:
699 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
701 if (dataViewCtrlPtr
!= NULL
)
703 // variable definition and initialization:
704 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
706 if (macDataViewListCtrlPtr
!= NULL
)
708 // variable definition and initialization:
709 DataBrowserPropertyFlags flags
;
711 wxCHECK_RET(macDataViewListCtrlPtr
->GetPropertyFlags(this->GetPropertyID(),&flags
) == noErr
,_("Could not get property flags."));
714 this->m_flags
|= wxDATAVIEW_COL_SORTABLE
;
715 flags
|= kDataBrowserListViewSortableColumn
;
719 this->m_flags
&= ~wxDATAVIEW_COL_SORTABLE
;
720 flags
&= ~kDataBrowserPropertyIsEditable
;
722 wxCHECK_RET(macDataViewListCtrlPtr
->SetPropertyFlags(this->GetPropertyID(),flags
) == noErr
,_("Could not set property flags."));
725 } /* wxDataViewColumn::SetSortable(bool) */
727 void wxDataViewColumn::SetSortOrder(bool ascending
)
729 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
732 this->m_ascending
= ascending
;
733 if (dataViewCtrlPtr
!= NULL
)
735 // variable definition and initialization:
736 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
738 if (macDataViewListCtrlPtr
!= NULL
)
740 // variable definition and initialization:
741 DataBrowserListViewHeaderDesc headerDescription
;
743 verify_noerr(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
));
745 headerDescription
.initialOrder
= kDataBrowserOrderIncreasing
;
747 headerDescription
.initialOrder
= kDataBrowserOrderDecreasing
;
748 verify_noerr(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
));
749 macDataViewListCtrlPtr
->SetSortProperty(this->GetPropertyID());
752 } /* wxDataViewColumn::SetSortOrder(bool) */
754 void wxDataViewColumn::SetTitle(wxString
const& title
)
756 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
759 this->m_title
= title
;
760 if (dataViewCtrlPtr
!= NULL
)
762 // variable definition and initialization:
763 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
765 if (macDataViewListCtrlPtr
!= NULL
)
767 // variable definition and initialization:
768 DataBrowserListViewHeaderDesc headerDescription
;
769 wxMacCFStringHolder
cfTitle(title
,(dataViewCtrlPtr
->GetFont().Ok() ? dataViewCtrlPtr
->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
771 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
772 headerDescription
.titleString
= cfTitle
;
773 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(this->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set header description."));
776 } /* wxDataViewColumn::SetTitle(wxString const&) */
778 void wxDataViewColumn::SetWidth(int width
)
780 wxDataViewCtrl
* dataViewCtrlPtr(this->GetOwner());
783 if ((width
>= this->m_minWidth
) && (width
<= this->m_maxWidth
))
785 this->m_width
= width
;
786 if (dataViewCtrlPtr
!= NULL
)
788 // variable definition and initialization:
789 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
791 if (macDataViewListCtrlPtr
!= NULL
)
792 wxCHECK_RET(macDataViewListCtrlPtr
->SetColumnWidth(this->GetPropertyID(),static_cast<UInt16
>(width
)) == noErr
,_("Could not set column width."));
795 } /* wxDataViewColumn::SetWidth(int) */
797 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn
,wxDataViewColumnBase
)
799 //-----------------------------------------------------------------------------
801 //-----------------------------------------------------------------------------
803 void wxDataViewCtrl::Init(void)
805 this->m_Deleting
= false;
806 this->m_macIsUserPane
= false;
807 this->m_cgContext
= NULL
;
808 } /* wxDataViewCtrl::Init(void) */
810 bool wxDataViewCtrl::Create(wxWindow
*parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long style
, const wxValidator
& validator
)
812 if (!(this->wxControl::Create(parent
,id
,pos
,size
,(style
| wxSUNKEN_BORDER
) & ~(wxHSCROLL
| wxVSCROLL
),validator
)))
816 MacSetClipChildren(true) ;
819 this->m_peer
= new wxMacDataViewDataBrowserListViewControl(this,pos
,size
,style
);
820 this->MacPostControlCreate(pos
,size
);
821 ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(this->m_peer
->GetControlRef()),true);
823 InstallControlEventHandler(this->m_peer
->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList
),eventList
,this,NULL
);
826 } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */
828 bool wxDataViewCtrl::AssociateModel(wxDataViewModel
* model
)
830 if (!wxDataViewCtrlBase::AssociateModel(model
))
833 model
->AddNotifier(new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl
*>(this->m_peer
)));
836 } /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
838 bool wxDataViewCtrl::AppendColumn(wxDataViewColumn
* dataViewColumnPtr
)
840 DataBrowserPropertyID NewPropertyID
;
842 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
845 // first, some error checking:
846 wxCHECK_MSG(MacDataViewListCtrlPtr
!= NULL
, false,_("m_peer is not or incorrectly initialized"));
847 wxCHECK_MSG(dataViewColumnPtr
!= NULL
, false,_("Column pointer must not be NULL."));
848 wxCHECK_MSG(dataViewColumnPtr
->GetRenderer() != NULL
, false,_("Column does not have a renderer."));
849 wxCHECK_MSG(this->GetModel() != NULL
, false,_("No model associated with control."));
850 wxCHECK_MSG((dataViewColumnPtr
->GetModelColumn() >= 0) &&
851 (dataViewColumnPtr
->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
852 if ((MacDataViewListCtrlPtr
->GetFreePropertyID(&NewPropertyID
) == noErr
) && this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr
))
854 // insert column into hash map:
855 this->m_ColumnPointers
.insert(ColumnPointerHashMapType::value_type(NewPropertyID
,dataViewColumnPtr
));
857 // variable definitions:
858 DataBrowserListViewColumnDesc columnDescription
;
859 wxMacCFStringHolder
cfTitle(dataViewColumnPtr
->GetTitle(),(this->m_font
.Ok() ? this->m_font
.GetEncoding() : wxLocale::GetSystemEncoding()));
861 // initialize column description:
862 dataViewColumnPtr
->SetPropertyID(NewPropertyID
);
863 columnDescription
.propertyDesc
.propertyID
= NewPropertyID
;
864 columnDescription
.propertyDesc
.propertyType
= dataViewColumnPtr
->GetRenderer()->GetPropertyType();
865 columnDescription
.propertyDesc
.propertyFlags
= kDataBrowserListViewSelectionColumn
; // make the column selectable
866 if (dataViewColumnPtr
->IsSortable())
867 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewSortableColumn
;
869 if (dataViewColumnPtr
->IsMovable())
870 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewMovableColumn
;
872 if (dataViewColumnPtr
->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE
)
873 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserPropertyIsEditable
;
874 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
875 if ((columnDescription
.propertyDesc
.propertyType
== kDataBrowserTextType
) ||
876 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserIconAndTextType
) ||
877 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserDateTimeType
))
878 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
880 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
881 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
883 columnDescription
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
884 if (dataViewColumnPtr
->IsResizeable())
886 columnDescription
.headerBtnDesc
.minimumWidth
= 0;
887 columnDescription
.headerBtnDesc
.maximumWidth
= 30000;
891 columnDescription
.headerBtnDesc
.minimumWidth
= dataViewColumnPtr
->GetWidth();
892 columnDescription
.headerBtnDesc
.maximumWidth
= dataViewColumnPtr
->GetWidth();
894 columnDescription
.headerBtnDesc
.titleOffset
= 0;
895 columnDescription
.headerBtnDesc
.titleString
= cfTitle
; // we cannot directly use the wxMacCFStringHolder constructor call because then the CFStringRef is released
896 // having called 'AddColumn' where the title (CFStringRef) is going to be used
897 columnDescription
.headerBtnDesc
.initialOrder
= kDataBrowserOrderIncreasing
;
898 columnDescription
.headerBtnDesc
.btnFontStyle
.flags
= kControlUseFontMask
| kControlUseJustMask
;
899 switch (dataViewColumnPtr
->GetAlignment())
902 case wxALIGN_CENTER_HORIZONTAL
:
903 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teCenter
;
906 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushLeft
;
909 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushRight
;
912 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushDefault
;
914 columnDescription
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
915 columnDescription
.headerBtnDesc
.btnFontStyle
.style
= normal
;
916 columnDescription
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentIconRef
;
917 if (dataViewColumnPtr
->GetBitmap().Ok())
918 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= dataViewColumnPtr
->GetBitmap().GetBitmapData()->GetIconRef();
920 wxCHECK_MSG(MacDataViewListCtrlPtr
->AddColumn(&columnDescription
,kDataBrowserListViewAppendColumn
) == noErr
,false,_("Column could not be added."));
922 // final adjustments for the layout:
923 wxCHECK_MSG(MacDataViewListCtrlPtr
->SetColumnWidth(NewPropertyID
,dataViewColumnPtr
->GetWidth()) == noErr
,false,_("Column width could not be set."));
925 // make sure that the data is up-to-date...
926 // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
927 // otherwise ask the control to 'update' the data in the newly appended column:
928 if (this->GetColumnCount() == 1)
930 this->SetExpanderColumn(dataViewColumnPtr
);
931 this->AddChildrenLevel(wxDataViewItem());
934 MacDataViewListCtrlPtr
->UpdateItems(kDataBrowserNoItem
,0,NULL
,kDataBrowserItemNoProperty
,NewPropertyID
);
940 } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
942 bool wxDataViewCtrl::ClearColumns(void)
944 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
947 while (this->m_ColumnPointers
.begin() != this->m_ColumnPointers
.end())
949 wxCHECK_MSG(MacDataViewListCtrlPtr
->RemoveColumnByProperty(this->m_ColumnPointers
.begin()->first
) == noErr
,false,_("Could not remove column."));
950 delete this->m_ColumnPointers
.begin()->second
;
951 this->m_ColumnPointers
.erase(this->m_ColumnPointers
.begin());
954 } /* wxDataViewCtrl::ClearColumns(void) */
956 bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn
* columnPtr
)
958 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
961 if ((MacDataViewListCtrlPtr
->RemoveColumnByProperty(columnPtr
->GetPropertyID()) == noErr
) && (this->m_ColumnPointers
.erase(columnPtr
->GetPropertyID()) > 0))
968 } /* wxDataViewCtrl::DeleteColumn(wxDataViewColumn*) */
970 wxDataViewColumn
* wxDataViewCtrl::GetColumn(unsigned int pos
) const
972 DataBrowserPropertyID propertyID
;
974 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
977 if (MacDataViewListCtrlPtr
->GetPropertyID(pos
,&propertyID
) == noErr
)
979 // variable definition:
980 ColumnPointerHashMapType::const_iterator
Result(this->m_ColumnPointers
.find(propertyID
));
982 if (Result
!= this->m_ColumnPointers
.end())
983 return Result
->second
;
989 } /* wxDataViewCtrl::GetColumn(unsigned int pos) const */
991 unsigned int wxDataViewCtrl::GetColumnCount(void) const
993 return this->m_ColumnPointers
.size();
994 } /* wxDataViewCtrl::GetColumnCount(void) const */
996 int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn
const* columnPtr
) const
998 if (columnPtr
!= NULL
)
1000 // variable definition and initialization:
1001 DataBrowserTableViewColumnIndex Position
;
1002 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1004 wxCHECK_MSG(MacDataViewListCtrlPtr
->GetColumnIndex(columnPtr
->GetPropertyID(),&Position
) == noErr
,-1,_("Could not determine column's position"));
1005 return static_cast<int>(Position
);
1009 } /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */
1011 void wxDataViewCtrl::Collapse(wxDataViewItem
const& item
)
1013 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1016 MacDataViewListCtrlPtr
->CloseContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1017 } /* wxDataViewCtrl::Collapse(wxDataViewItem const&) */
1019 void wxDataViewCtrl::EnsureVisible(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
)
1023 // variable definition and initialization:
1024 DataBrowserPropertyID propertyID
;
1025 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1027 if (columnPtr
!= NULL
)
1028 propertyID
= columnPtr
->GetPropertyID();
1030 propertyID
= kDataBrowserNoItem
;
1031 MacDataViewListCtrlPtr
->RevealItem(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),propertyID
,kDataBrowserRevealOnly
);
1033 } /* wxDataViewCtrl::EnsureVisible(wxDataViewItem const&, wxDataViewColumn const*) */
1035 void wxDataViewCtrl::Expand(wxDataViewItem
const& item
)
1037 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1040 MacDataViewListCtrlPtr
->OpenContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1041 } /* wxDataViewCtrl::Expand(wxDataViewItem const&) */
1043 wxDataViewColumn
* wxDataViewCtrl::GetSortingColumn(void) const
1045 DataBrowserPropertyID propertyID
;
1047 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1050 if (MacDataViewListCtrlPtr
->GetSortProperty(&propertyID
) == noErr
)
1051 return this->GetColumnPtr(propertyID
);
1054 } /* wxDataViewCtrl::GetSortingColumn(void) const */
1056 unsigned int wxDataViewCtrl::GetCount(void) const
1058 ItemCount noOfItems
;
1061 wxCHECK_MSG(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
)->GetItemCount(&noOfItems
) == noErr
,0,_("Could not determine number of items"));
1063 } /* wxDataViewCtrl::GetCount(void) const */
1065 wxRect
wxDataViewCtrl::GetItemRect(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
) const
1067 if (item
.IsOk() && (columnPtr
!= NULL
))
1069 // variable definition:
1071 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1073 if (MacDataViewListCtrlPtr
->GetPartBounds(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),columnPtr
->GetPropertyID(),kDataBrowserPropertyContentPart
,&MacRectangle
) == noErr
)
1075 // variable definition:
1078 ::wxMacNativeToRect(&MacRectangle
,&rectangle
);
1086 } /* wxDataViewCtrl::GetItemRect(wxDataViewItem const&, unsigned int) const */
1088 wxDataViewItem
wxDataViewCtrl::GetSelection(void) const
1090 wxArrayDataBrowserItemID itemIDs
;
1092 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1095 if (MacDataViewListCtrlPtr
->GetSelectedItemIDs(itemIDs
) > 0)
1096 return wxDataViewItem(reinterpret_cast<void*>(itemIDs
[0]));
1098 return wxDataViewItem();
1099 } /* wxDataViewCtrl::GetSelection(void) const */
1101 int wxDataViewCtrl::GetSelections(wxDataViewItemArray
& sel
) const
1103 size_t NoOfSelectedItems
;
1105 wxArrayDataBrowserItemID itemIDs
;
1107 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1110 NoOfSelectedItems
= MacDataViewListCtrlPtr
->GetSelectedItemIDs(itemIDs
);
1112 sel
.SetCount(NoOfSelectedItems
);
1113 for (size_t i
=0; i
<NoOfSelectedItems
; ++i
)
1114 sel
[i
] = wxDataViewItem(reinterpret_cast<void*>(itemIDs
[i
]));
1115 return static_cast<int>(NoOfSelectedItems
);
1116 } /* wxDataViewCtrl::GetSelections(wxDataViewItemArray&) const */
1118 void wxDataViewCtrl::HitTest(wxPoint
const& point
, wxDataViewItem
& item
, wxDataViewColumn
*& columnPtr
) const
1120 item
= wxDataViewItem();
1122 } /* wxDataViewCtrl::HitTest(wxPoint const&, wxDataViewItem&, wxDataViewColumn*&) const */
1124 bool wxDataViewCtrl::IsSelected(wxDataViewItem
const& item
) const
1126 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1129 return MacDataViewListCtrlPtr
->IsItemSelected(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1130 } /* wxDataViewCtrl::IsSelected(wxDataViewItem const&) const */
1132 void wxDataViewCtrl::SelectAll(void)
1134 DataBrowserItemID
* itemIDPtr
;
1136 Handle
handle(::NewHandle(0));
1140 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1143 wxCHECK_RET(MacDataViewListCtrlPtr
->GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1144 NoOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1146 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1147 MacDataViewListCtrlPtr
->SetSelectedItems(NoOfItems
,itemIDPtr
,kDataBrowserItemsAssign
);
1149 DisposeHandle(handle
);
1150 } /* wxDataViewCtrl::SelectAll(void) */
1152 void wxDataViewCtrl::Select(wxDataViewItem
const& item
)
1156 // variable definition and initialization:
1157 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1158 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1160 MacDataViewListCtrlPtr
->SetSelectedItems(1,&itemID
,kDataBrowserItemsAdd
);
1162 } /* wxDataViewCtrl::Select(wxDataViewItem const&) */
1164 void wxDataViewCtrl::SetSelections(wxDataViewItemArray
const& sel
)
1166 size_t const NoOfSelections
= sel
.GetCount();
1168 DataBrowserItemID
* itemIDs
;
1170 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1173 itemIDs
= new DataBrowserItemID
[NoOfSelections
];
1174 for (size_t i
=0; i
<NoOfSelections
; ++i
)
1175 itemIDs
[i
] = reinterpret_cast<DataBrowserItemID
>(sel
[i
].GetID());
1176 MacDataViewListCtrlPtr
->SetSelectedItems(NoOfSelections
,itemIDs
,kDataBrowserItemsAssign
);
1178 } /* wxDataViewCtrl::SetSelections(wxDataViewItemArray const&) */
1180 void wxDataViewCtrl::Unselect(wxDataViewItem
const& item
)
1184 // variable definition and initialization:
1185 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1186 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1188 MacDataViewListCtrlPtr
->SetSelectedItems(1,&itemID
,kDataBrowserItemsRemove
);
1190 } /* wxDataViewCtrl::Unselect(wxDataViewItem const&) */
1192 void wxDataViewCtrl::UnselectAll(void)
1194 DataBrowserItemID
* itemIDPtr
;
1196 Handle
handle(::NewHandle(0));
1200 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1203 wxCHECK_RET(MacDataViewListCtrlPtr
->GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1204 NoOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1206 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1207 MacDataViewListCtrlPtr
->SetSelectedItems(NoOfItems
,itemIDPtr
,kDataBrowserItemsRemove
);
1209 DisposeHandle(handle
);
1210 } /* wxDataViewCtrl::UnselectAll(void) */
1213 void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem
const& parentItem
)
1217 wxDataViewItemArray items
;
1220 wxCHECK_RET(this->GetModel() != NULL
,_("Model pointer not initialized."));
1221 NoOfChildren
= this->GetModel()->GetChildren(parentItem
,items
);
1223 for (int i
=0; i
<NoOfChildren
; ++i
)
1224 (void) this->GetModel()->ItemAdded(parentItem
,items
[i
]);
1226 (void) this->GetModel()->ItemsAdded(parentItem
,items
);
1228 } /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */
1230 wxDataViewColumn
* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID propertyID
) const
1232 // variable definition:
1233 ColumnPointerHashMapType::const_iterator
Result(this->m_ColumnPointers
.find(propertyID
));
1235 if (Result
!= this->m_ColumnPointers
.end())
1236 return Result
->second
;
1239 } /* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID) const */
1241 // inherited methods from wxDataViewCtrlBase
1242 void wxDataViewCtrl::DoSetExpanderColumn(void)
1244 if (this->GetExpanderColumn() != NULL
)
1246 // variable definition and initialization:
1247 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1249 (void) MacDataViewListCtrlPtr
->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID());
1251 } /* wxDataViewCtrl::DoSetExpanderColumn(void) */
1253 void wxDataViewCtrl::DoSetIndent(void)
1255 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(this->m_peer
));
1258 (void) MacDataViewListCtrlPtr
->SetIndent(static_cast<float>(this->GetIndent()));
1259 } /* wxDataViewCtrl::DoSetIndent(void) */
1262 void wxDataViewCtrl::OnSize(wxSizeEvent
& event
)
1264 unsigned int const NoOfColumns
= this->GetColumnCount();
1267 for (unsigned int i
=0; i
<NoOfColumns
; ++i
)
1269 // variable definition and initialization:
1270 wxDataViewColumn
* dataViewColumnPtr(this->GetColumn(i
));
1272 if (dataViewColumnPtr
!= NULL
)
1274 // variable definition and initialization:
1275 wxDataViewCustomRenderer
* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer()));
1277 if (dataViewCustomRendererPtr
!= NULL
)
1278 dataViewCustomRendererPtr
->SetDC(NULL
); // reset DC because DC has changed
1282 } /* wxDataViewCtrl::OnSize(wxSizeEvent&) */
1284 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl
,wxDataViewCtrlBase
)
1286 BEGIN_EVENT_TABLE(wxDataViewCtrl
,wxDataViewCtrlBase
)
1287 EVT_SIZE(wxDataViewCtrl::OnSize
)
1291 // !wxUSE_GENERICDATAVIEWCTRL
1294 // wxUSE_DATAVIEWCTRL