From c17b2e31516424a77fd54b8fc192eac133269ce4 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 30 Aug 2007 13:09:20 +0000 Subject: [PATCH] Patch from Hartwig for wxMac implementation git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48459 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/mac/carbon/databrow.h | 11 +- include/wx/mac/carbon/dataview.h | 57 +++++++++-- src/mac/carbon/databrow.cpp | 142 +++++++++++++++++++++----- src/mac/carbon/dataview.cpp | 166 ++++++++++++++++++++++++++----- 4 files changed, 317 insertions(+), 59 deletions(-) diff --git a/include/wx/mac/carbon/databrow.h b/include/wx/mac/carbon/databrow.h index ea75a0755d..1477b5f126 100644 --- a/include/wx/mac/carbon/databrow.h +++ b/include/wx/mac/carbon/databrow.h @@ -120,6 +120,7 @@ public: OSStatus SetHasScrollBars( bool horiz, bool vert ); OSStatus SetHeaderButtonHeight( UInt16 height ); OSStatus SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle ); + OSStatus SetIndent(float Indent); OSStatus SetRowHeight( DataBrowserItemID item , UInt16 height); OSStatus SetScrollPosition( UInt32 top , UInt32 left ); @@ -135,7 +136,8 @@ public: OSStatus IsUsedPropertyID(DataBrowserPropertyID propertyID) const; // checks if passed property id is used by the control; no error is returned if the id exists - OSStatus RemoveColumn(DataBrowserTableViewColumnIndex index); + OSStatus RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID); + OSStatus RemoveColumnByIndex (DataBrowserTableViewColumnIndex index); OSStatus SetColumnIndex (DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index); OSStatus SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows=true); @@ -207,6 +209,13 @@ public: OSStatus SetSortOrder (DataBrowserSortOrder order); OSStatus SetSortProperty(DataBrowserPropertyID propertyID); +// +// container handling +// + OSStatus CloseContainer(DataBrowserItemID containerID); + + OSStatus OpenContainer(DataBrowserItemID containerID); + protected : // // callback functions diff --git a/include/wx/mac/carbon/dataview.h b/include/wx/mac/carbon/dataview.h index df2d9f0841..09a1ce8743 100644 --- a/include/wx/mac/carbon/dataview.h +++ b/include/wx/mac/carbon/dataview.h @@ -193,7 +193,7 @@ public: // implementation // virtual bool Render(void); // declared in wxDataViewRenderer but will not be used here, therefore calling this function will - // return 'false' without having done anything + // return 'true' without having done anything virtual DataBrowserPropertyType GetPropertyType(void) const { @@ -281,6 +281,33 @@ private: // wxDataViewToggleRenderer // --------------------------------------------------------- +class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewRenderer +{ +public: + wxDataViewIconTextRenderer(wxString const& varianttype = wxT("wxDataViewIconText"), wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT); + +// +// inherited functions from wxDataViewRenderer +// + virtual bool Render(void); + +// +// implementation +// + virtual DataBrowserPropertyType GetPropertyType(void) const + { + return kDataBrowserIconAndTextType; + } + +protected: +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewToggleRenderer +// --------------------------------------------------------- + class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer { public: @@ -490,17 +517,23 @@ public: bool Create(wxWindow *parent, wxWindowID id, wxPoint const& pos=wxDefaultPosition, wxSize const& size=wxDefaultSize, long style=0, wxValidator const& validator=wxDefaultValidator); - // inherited methods from 'wxDataViewCtrlBase': - virtual bool AppendColumn(wxDataViewColumn* columnPtr); - - virtual bool AssociateModel(wxDataViewModel* model); - virtual wxControl* GetMainWindow(void) // should disappear as it is not of any use for the native implementation { return this; } + // inherited methods from 'wxDataViewCtrlBase': + virtual bool AssociateModel(wxDataViewModel* model); + + virtual bool AppendColumn(wxDataViewColumn* columnPtr); + virtual bool ClearColumns(void); + virtual bool DeleteColumn(wxDataViewColumn* columnPtr); + virtual wxDataViewColumn* GetColumn(unsigned int pos) const; + virtual unsigned int GetColumnCount(void) const; + + virtual void Collapse(wxDataViewItem const& item); virtual void EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr=NULL); + virtual void Expand(wxDataViewItem const& item); virtual wxRect GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const; virtual wxDataViewItem GetSelection(void) const; @@ -516,8 +549,7 @@ public: virtual void Unselect(wxDataViewItem const& item); virtual void UnselectAll(void); - - + // // implementation // @@ -525,6 +557,10 @@ public: // adds all children of the passed parent to the control; if 'parentItem' is invalid the root(s) is/are added: void AddChildrenLevel(wxDataViewItem const& parentItem); + // returns a pointer to a column; + // in case the pointer cannot be found NULL is returned: + wxDataViewColumn* GetColumnPtr(DataBrowserPropertyID propertyID) const; + // checks if currently a delete process is running: bool IsDeleting(void) const { @@ -559,6 +595,9 @@ protected: void OnSize(wxSizeEvent &event); private: + // type definitions: + WX_DECLARE_HASH_MAP(DataBrowserPropertyID,wxDataViewColumn*,wxIntegerHash,wxIntegerEqual,ColumnPointerHashMapType); + // initializing of local variables: void Init(void); @@ -572,7 +611,7 @@ private: void* m_cgContext; // pointer to core graphics context - wxDataViewModelNotifier* m_NotifierPtr; // the notifier is NOT owned by this class but by the associated model + ColumnPointerHashMapType m_ColumnPointers; // all column pointers are stored in a hash map with the property ID as a key // wxWidget internal stuff: DECLARE_DYNAMIC_CLASS(wxDataViewCtrl) diff --git a/src/mac/carbon/databrow.cpp b/src/mac/carbon/databrow.cpp index 9e8236b740..fa3d7556f0 100644 --- a/src/mac/carbon/databrow.cpp +++ b/src/mac/carbon/databrow.cpp @@ -273,20 +273,25 @@ OSStatus wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height) return ::SetDataBrowserTableViewRowHeight(this->m_controlRef,height); } -OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars( bool horiz, bool vert ) +OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz, bool vert) { - return SetDataBrowserHasScrollBars(this->m_controlRef, horiz, vert ); -} + return ::SetDataBrowserHasScrollBars(this->m_controlRef,horiz,vert); +} /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */ OSStatus wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height) { - return SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef, height ); -} + return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height); +} /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */ -OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle ) +OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle) { - return SetDataBrowserTableViewHiliteStyle(this->m_controlRef, hiliteStyle ); -} + return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef,hiliteStyle); +} /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle) */ + +OSStatus wxMacDataBrowserTableViewControl::SetIndent(float Indent) +{ + return ::DataBrowserSetMetric(this->m_controlRef,kDataBrowserMetricDisclosureColumnPerDepthGap,true,Indent); +} /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */ OSStatus wxMacDataBrowserTableViewControl::SetRowHeight(DataBrowserItemID item, UInt16 height) { @@ -344,14 +349,19 @@ OSStatus wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyI return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,&index); } /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */ -OSStatus wxMacDataBrowserTableViewControl::RemoveColumn(DataBrowserTableViewColumnIndex index) +OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID) +{ + return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID); +} /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */ + +OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index) { DataBrowserTableViewColumnID propertyID; this->GetPropertyID(index,&propertyID); return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID); -} /* wxMacDataBrowserTableViewControl::RemoveColumn(DataBrowserTableViewColumnIndex) */ +} /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */ OSStatus wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index) { @@ -526,6 +536,19 @@ OSStatus wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID return ::SetDataBrowserSortProperty(this->m_controlRef,propertyID); } +// +// container handling +// +OSStatus wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID) +{ + return ::CloseDataBrowserContainer(this->m_controlRef,containerID); +} /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */ + +OSStatus wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID) +{ + return ::OpenDataBrowserContainer(this->m_controlRef,containerID); +} /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */ + IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl,wxMacControl) // ============================================================================ @@ -714,27 +737,27 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc( if (propertyID >= kMinPropertyID) // in case data columns set the data { // variable definitions: - DataBrowserTableViewColumnIndex columnIndex; - OSStatus errorStatus; - wxVariant variant; - wxDataViewColumn* dataViewColumnPtr; - wxDataViewCtrl* dataViewCtrlPtr; + wxVariant variant; + wxDataViewColumn* dataViewColumnPtr; + wxDataViewCtrl* dataViewCtrlPtr; dataViewCtrlPtr = dynamic_cast(this->GetPeer()); wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly.")); wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly.")); - errorStatus = this->GetColumnIndex(propertyID,&columnIndex); - wxCHECK_MSG(errorStatus == noErr,errorStatus,_("Column index does not exist.")); - dataViewColumnPtr = dataViewCtrlPtr->GetColumn(columnIndex); + dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID); wxCHECK_MSG(dataViewColumnPtr != NULL,errDataBrowserNotConfigured,_("No column for the specified column position existing.")); wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,errDataBrowserNotConfigured,_("No renderer specified for column.")); dataViewCtrlPtr->GetModel()->GetValue(variant,wxDataViewItem(reinterpret_cast(itemID)),dataViewColumnPtr->GetModelColumn()); - dataViewColumnPtr->GetRenderer()->SetDataReference(itemData); - dataViewColumnPtr->GetRenderer()->SetValue(variant); - wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed.")); + if (!(variant.IsNull())) + { + dataViewColumnPtr->GetRenderer()->SetDataReference(itemData); + dataViewColumnPtr->GetRenderer()->SetValue(variant); + wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed.")); + } /* if */ return noErr; } /* if */ else // react on special system requests + { switch (propertyID) { case kDataBrowserContainerIsClosableProperty: @@ -753,7 +776,6 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc( // opening the container is allowed if not vetoed: return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed()); } /* block */ - return noErr; case kDataBrowserContainerIsOpenableProperty: { // variable definitions: @@ -782,11 +804,12 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc( case kDataBrowserItemIsEditableProperty: return ::SetDataBrowserItemDataBooleanValue(itemData,true); } /* switch */ + } /* if */ } /* if */ return errDataBrowserPropertyNotSupported; } /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */ -void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef WXUNUSED(itemData)) +void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData) { switch (message) { @@ -823,6 +846,60 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(Da dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); } /* block */ break; + case kDataBrowserEditStarted: + { + // variable definitions: + wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->GetPeer())); + + if (dataViewCtrlPtr != NULL) + { + // initialize wxWidget event: + DataBrowserPropertyID propertyID; + wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition + + dataViewEvent.SetEventObject(dataViewCtrlPtr); + dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast(itemID))); + if (this->GetPropertyID(itemData,&propertyID) == noErr) + { + // variable definition and initialization: + DataBrowserTableViewColumnIndex columnIndex; + + wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found.")); + dataViewEvent.SetColumn(columnIndex); + dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID)); + } /* if */ + // finally send the equivalent wxWidget event: + dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); + } /* if */ + } /* block */ + break; + case kDataBrowserEditStopped: + { + // variable definitions: + wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->GetPeer())); + + if (dataViewCtrlPtr != NULL) + { + // initialize wxWidget event: + DataBrowserPropertyID propertyID; + wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition + + dataViewEvent.SetEventObject(dataViewCtrlPtr); + dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast(itemID))); + if (this->GetPropertyID(itemData,&propertyID) == noErr) + { + // variable definition and initialization: + DataBrowserTableViewColumnIndex columnIndex; + + wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found.")); + dataViewEvent.SetColumn(columnIndex); + dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID)); + } /* if */ + // finally send the equivalent wxWidget event: + dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); + } /* if */ + } /* block */ + break; case kDataBrowserItemAdded: { // variable definitions: @@ -838,6 +915,23 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(Da dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); } /* block */ break; + case kDataBrowserItemDeselected: + { + // variable definitions: + wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->GetPeer())); + + if (dataViewCtrlPtr != NULL) // can become NULL if an item is still selected while removing the data browser + { + // initialize wxWidget event: + wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DESELECTED,dataViewCtrlPtr->GetId()); // variable definition + + dataViewEvent.SetEventObject(dataViewCtrlPtr); + dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast(itemID))); + // finally send the equivalent wxWidget event: + dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); + } /* if */ + } /* block */ + break; case kDataBrowserItemDoubleClicked: { // variable definitions: @@ -885,6 +979,8 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(Da dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); } /* block */ break; + case kDataBrowserSelectionSetChanged: + break; case kDataBrowserUserStateChanged: { DataBrowserPropertyID propertyID; diff --git a/src/mac/carbon/dataview.cpp b/src/mac/carbon/dataview.cpp index df0e175ccf..97c0fe9b9d 100644 --- a/src/mac/carbon/dataview.cpp +++ b/src/mac/carbon/dataview.cpp @@ -277,7 +277,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase) // --------------------------------------------------------- #pragma mark - wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) - :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL) + :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL) { } /* wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const&, wxDataViewCellMode) */ @@ -300,7 +300,7 @@ wxDC* wxDataViewCustomRenderer::GetDC(void) bool wxDataViewCustomRenderer::Render(void) { - return false; + return true; } /* wxDataViewCustomRenderer::Render(void) */ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr) @@ -363,6 +363,38 @@ bool wxDataViewBitmapRenderer::Render(void) IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer) +// --------------------------------------------------------- +// wxDataViewIconTextRenderer +// --------------------------------------------------------- +#pragma mark - +wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) + :wxDataViewRenderer(varianttype,mode) +{ +} + +bool wxDataViewIconTextRenderer::Render(void) +{ + wxLogMessage(wxString(_("Types: ")) << this->GetValue().GetType() << wxT(' ') << this->GetVariantType()); + if (this->GetValue().GetType() == this->GetVariantType()) + { + // variable definition: + wxDataViewIconText iconText; + + iconText << this->GetValue(); + + // variable definition: + wxMacCFStringHolder cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding())); + + return ((::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) == noErr) && + (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr)); + } /* if */ + else + return false; +} /* wxDataViewIconTextRenderer::Render(void) */ + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer) + + // --------------------------------------------------------- // wxDataViewToggleRenderer // --------------------------------------------------------- @@ -670,7 +702,6 @@ void wxDataViewCtrl::Init(void) { this->m_Deleting = false; this->m_macIsUserPane = false; - this->m_NotifierPtr = NULL; this->m_cgContext = NULL; } /* wxDataViewCtrl::Init(void) */ @@ -692,25 +723,40 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, return true; } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */ +bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model) +{ + if (!wxDataViewCtrlBase::AssociateModel(model)) + return false; + + model->AddNotifier(new wxMacDataViewModelNotifier(dynamic_cast(this->m_peer))); + + return true; +} /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */ + bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr) { + DataBrowserPropertyID NewPropertyID; + + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + + // first, some error checking: + wxCHECK_MSG(MacDataViewListCtrlPtr != NULL, false,_("m_peer is not or incorrectly initialized")); wxCHECK_MSG(dataViewColumnPtr != NULL, false,_("Column pointer must not be NULL.")); wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL, false,_("Column does not have a renderer.")); wxCHECK_MSG(this->GetModel() != NULL, false,_("No model associated with control.")); wxCHECK_MSG((dataViewColumnPtr->GetModelColumn() >= 0) && (dataViewColumnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model.")); - if (this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr)) + if ((MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr) && this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr)) { + // insert column into hash map: + this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,dataViewColumnPtr)); + // variable definitions: - DataBrowserPropertyID NewPropertyID; - DataBrowserListViewColumnDesc columnDescription; - wxMacCFStringHolder cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding())); - wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + DataBrowserListViewColumnDesc columnDescription; + wxMacCFStringHolder cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding())); // initialize column description: - wxCHECK_MSG(MacDataViewListCtrlPtr != NULL, false,_("m_peer is not or incorrectly initialized")); - wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Maximum number of columns reached.")); dataViewColumnPtr->SetPropertyID(NewPropertyID); if (dataViewColumnPtr->GetWidth() <= 0) dataViewColumnPtr->SetWidth(wxDVC_DEFAULT_WIDTH); @@ -735,7 +781,7 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr) columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton; #endif columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; - if (dataViewColumnPtr->IsResizable()) + if (dataViewColumnPtr->IsResizeable()) { columnDescription.headerBtnDesc.minimumWidth = 0; columnDescription.headerBtnDesc.maximumWidth = 30000; @@ -775,10 +821,6 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr) // final adjustments for the layout: wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,dataViewColumnPtr->GetWidth()) == noErr,false,_("Column width could not be set.")); -#if 0 - if (dataViewColumnPtr->IsSortable()) // if the current column is marked sortable this column will become the active sortable column, otherwise don't do anything - MacDataViewListCtrlPtr->SetSortProperty(NewPropertyID); -#endif if (dataViewColumnPtr == this->GetExpanderColumn()) // if the current column is marked expandable this column will become the active expandable column MacDataViewListCtrlPtr->SetDisclosureColumn(NewPropertyID,true); @@ -795,16 +837,67 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr) return false; } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */ -bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model) +bool wxDataViewCtrl::ClearColumns(void) { - if (!wxDataViewCtrlBase::AssociateModel(model)) + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + + + while (this->m_ColumnPointers.begin() != this->m_ColumnPointers.end()) + { + wxCHECK_MSG(MacDataViewListCtrlPtr->RemoveColumnByProperty(this->m_ColumnPointers.begin()->first) == noErr,false,_("Could not remove column.")); + delete this->m_ColumnPointers.begin()->second; + this->m_ColumnPointers.erase(this->m_ColumnPointers.begin()); + } /* while */ + return true; +} /* wxDataViewCtrl::ClearColumns(void) */ + +bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn* columnPtr) +{ + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + + + if ((MacDataViewListCtrlPtr->RemoveColumnByProperty(columnPtr->GetPropertyID()) == noErr) && (this->m_ColumnPointers.erase(columnPtr->GetPropertyID()) > 0)) + { + delete columnPtr; + return true; + } /* if */ + else return false; +} /* wxDataViewCtrl::DeleteColumn(wxDataViewColumn*) */ + +wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const +{ + DataBrowserPropertyID propertyID; - this->m_NotifierPtr = new wxMacDataViewModelNotifier(dynamic_cast(this->m_peer)); - model->AddNotifier(this->m_NotifierPtr); + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); - return true; -} /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */ + + if (MacDataViewListCtrlPtr->GetPropertyID(pos,&propertyID) == noErr) + { + // variable definition: + ColumnPointerHashMapType::const_iterator Result(this->m_ColumnPointers.find(propertyID)); + + if (Result != this->m_ColumnPointers.end()) + return Result->second; + else + return NULL; + } /* if */ + else + return NULL; +} /* wxDataViewCtrl::GetColumn(unsigned int pos) const */ + +unsigned int wxDataViewCtrl::GetColumnCount(void) const +{ + return this->m_ColumnPointers.size(); +} /* wxDataViewCtrl::GetColumnCount(void) const */ + +void wxDataViewCtrl::Collapse(wxDataViewItem const& item) +{ + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + + + MacDataViewListCtrlPtr->CloseContainer(reinterpret_cast(item.GetID())); +} /* wxDataViewCtrl::Collapse(wxDataViewItem const&) */ void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) { @@ -822,6 +915,14 @@ void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn } /* if */ } /* wxDataViewCtrl::EnsureVisible(wxDataViewItem const&, wxDataViewColumn const*) */ +void wxDataViewCtrl::Expand(wxDataViewItem const& item) +{ + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + + + MacDataViewListCtrlPtr->OpenContainer(reinterpret_cast(item.GetID())); +} /* wxDataViewCtrl::Expand(wxDataViewItem const&) */ + wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const { if (item.IsOk() && (columnPtr != NULL)) @@ -984,23 +1085,36 @@ void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const& parentItem) } /* while */ } /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */ +wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID propertyID) const +{ + // variable definition: + ColumnPointerHashMapType::const_iterator Result(this->m_ColumnPointers.find(propertyID)); + + if (Result != this->m_ColumnPointers.end()) + return Result->second; + else + return NULL; +} /* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID) const */ + // inherited methods from wxDataViewCtrlBase void wxDataViewCtrl::DoSetExpanderColumn(void) { - if (this->GetExpanderColumn() < this->GetColumnCount()) + if (this->GetExpanderColumn() != NULL) { // variable definition and initialization: - DataBrowserPropertyID propertyID; wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); - if (MacDataViewListCtrlPtr->GetPropertyID(this->GetExpanderColumn(),&propertyID) == noErr) - (void) MacDataViewListCtrlPtr->SetDisclosureColumn(propertyID); + (void) MacDataViewListCtrlPtr->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID()); } /* if */ } /* wxDataViewCtrl::DoSetExpanderColumn(void) */ void wxDataViewCtrl::DoSetIndent(void) { -} /* wxDataViewCtrl::DoSetExpanderColumn(void) */ + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + + + (void) MacDataViewListCtrlPtr->SetIndent(static_cast(this->GetIndent())); +} /* wxDataViewCtrl::DoSetIndent(void) */ // event handling: void wxDataViewCtrl::OnSize(wxSizeEvent& event) -- 2.47.2