X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6608fdab17beec0a485a96a6d03a1d071c2fba5e..9d5507f7a2701395e1d5c121bd877bb9066ee6ea:/src/mac/carbon/dataview.cpp?ds=sidebyside diff --git a/src/mac/carbon/dataview.cpp b/src/mac/carbon/dataview.cpp index 1bb46b5f1f..845c0dd9b0 100644 --- a/src/mac/carbon/dataview.cpp +++ b/src/mac/carbon/dataview.cpp @@ -21,10 +21,12 @@ #include "wx/mac/carbon/databrow.h" #ifndef WX_PRECOMP - #include "wx/timer.h" + #include "wx/timer.h" + #include "wx/settings.h" + #include "wx/dcclient.h" + #include "wx/icon.h" #endif -#include "wx/icon.h" #include "wx/renderer.h" //----------------------------------------------------------------------------- @@ -82,7 +84,7 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler DataViewEvent.SetColumn(columnIndex); DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex)); // finally sent the equivalent wxWidget event: - DataViewCtrlPtr->GetEventHandler()->ProcessEvent(DataViewEvent); + DataViewCtrlPtr->HandleWindowEvent(DataViewEvent); return ::CallNextEventHandler(handler,EventReference); } /* if */ else @@ -92,6 +94,86 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler return eventNotHandledErr; } /* wxMacDataViewCtrlEventHandler(EventHandlerCallRef, EventRef, void*) */ +static DataBrowserItemID* CreateDataBrowserItemIDArray(size_t& noOfEntries, wxDataViewItemArray const& items) // returns a newly allocated pointer to valid data browser item IDs +{ + size_t const noOfItems = items.GetCount(); + + DataBrowserItemID* itemIDs(new DataBrowserItemID[noOfItems]); + + + // convert all valid data view items to data browser items + noOfEntries = 0; + for (size_t i=0; i(items[i].GetID()); + ++noOfEntries; + } /* if */ + // done: + return itemIDs; +} /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */ + +static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxMacCFStringHolder const& title) +{ + // set properties for the column: + columnDescription.propertyDesc.propertyID = columnPropertyID; + columnDescription.propertyDesc.propertyType = columnPtr->GetRenderer()->GetPropertyType(); + columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable + if (columnPtr->IsSortable()) + columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn; +#if 0 + if (columnPtr->IsMovable()) + columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn; +#endif + if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE) + columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable; + if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) || + (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) || + (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType)) + columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton; +#endif + // set header's properties: + columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; + if (columnPtr->IsResizeable()) + { + columnDescription.headerBtnDesc.minimumWidth = 0; + columnDescription.headerBtnDesc.maximumWidth = 30000; // 32767 is the theoretical maximum though but 30000 looks nicer + } /* if */ + else + { + columnDescription.headerBtnDesc.minimumWidth = columnPtr->GetWidth(); + columnDescription.headerBtnDesc.maximumWidth = columnPtr->GetWidth(); + } /* if */ + columnDescription.headerBtnDesc.titleOffset = 0; + columnDescription.headerBtnDesc.titleString = ::CFStringCreateCopy(kCFAllocatorDefault,title); + columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework) + columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask; + switch (columnPtr->GetAlignment()) + { + case wxALIGN_CENTER: + case wxALIGN_CENTER_HORIZONTAL: + columnDescription.headerBtnDesc.btnFontStyle.just = teCenter; + break; + case wxALIGN_LEFT: + columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft; + break; + case wxALIGN_RIGHT: + columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight; + break; + default: + columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault; + } /* switch */ + columnDescription.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont; + columnDescription.headerBtnDesc.btnFontStyle.style = normal; + columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef; + if (columnPtr->GetBitmap().Ok()) + columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetIconRef(); + // done: + return true; +} /* InitializeColumnDescription(DataBrowserListViewColumnDesc&, wxDataViewColumn const*, DataBrowserPropertyID, wxMacCFStringHolder const&) */ + //----------------------------------------------------------------------------- // local function pointers //----------------------------------------------------------------------------- @@ -119,24 +201,44 @@ public: parent.IsOk() && (this->m_dataViewControlPtr->AddItem(reinterpret_cast(parent.GetID()),&itemID) == noErr)); } /* ItemAdded(wxDataViewItem const&, wxDataViewItem const&) */ + virtual bool ItemsAdded(wxDataViewItem const& parent, wxDataViewItemArray const& items) + { + bool noFailureFlag; + + DataBrowserItemID* itemIDs; + + size_t noOfEntries; + + + // convert all valid data view items to data browser items: + itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items); + // insert all valid items into control: + noFailureFlag = ((noOfEntries == 0) || + !(parent.IsOk()) && (this->m_dataViewControlPtr->AddItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) || + parent.IsOk() && (this->m_dataViewControlPtr->AddItems(reinterpret_cast(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr)); + // give allocated array space free again: + delete[] itemIDs; + // done: + return noFailureFlag; + } /* ItemsAdded(wxDataViewItem const&, wxDataViewItemArray const&) */ + virtual bool ItemChanged(wxDataViewItem const& item) { DataBrowserItemID itemID(reinterpret_cast(item.GetID())); - wxCHECK_MSG(item.IsOk(), false,_("Changed item is invalid.")); - wxCHECK_MSG(this->GetOwner() != NULL,false,_("Owner not initialized.")); + wxCHECK_MSG(item.IsOk(),false,_("Changed item is invalid.")); if (this->m_dataViewControlPtr->UpdateItems(&itemID) == noErr) { wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->m_dataViewControlPtr->GetPeer())); // sent the equivalent wxWidget event: - wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_VALUE_ITEM_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion + wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion dataViewEvent.SetEventObject(dataViewCtrlPtr); dataViewEvent.SetItem(item); // sent the equivalent wxWidget event: - dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); + dataViewCtrlPtr->HandleWindowEvent(dataViewEvent); // done return true; } /* if */ @@ -144,6 +246,39 @@ public: return false; } /* ItemChanged(wxDataViewItem const&) */ + virtual bool ItemsChanged(wxDataViewItemArray const& items) + { + bool noFailureFlag; + + DataBrowserItemID* itemIDs; + + size_t noOfEntries; + + + // convert all valid data view items to data browser items: + itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items); + // change items (ATTENTION: ONLY ITEMS OF THE ROOT ARE CHANGED BECAUSE THE PARENT PARAMETER IS MISSING): + noFailureFlag = (this->m_dataViewControlPtr->UpdateItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr); + if (noFailureFlag) + { + wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->m_dataViewControlPtr->GetPeer())); + + // send for all changed items a wxWidget event: + wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion + + dataViewEvent.SetEventObject(dataViewCtrlPtr); + for (size_t i=0; i(itemIDs[i])); + dataViewCtrlPtr->HandleWindowEvent(dataViewEvent); + } /* for */ + } /* if */ + // release allocated array space: + delete[] itemIDs; + // done: + return noFailureFlag; + } /* ItemsChanged(wxDataViewItem const&) */ + virtual bool ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item) { if (item.IsOk()) @@ -154,10 +289,12 @@ public: wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->m_dataViewControlPtr->GetPeer())); // 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 - // not to be identical because the being edited item might be below the passed item in the hierarchy); therefore, the control is informed that currently a deleting process - // is started and that variables can currently not be updated even when requested by the system: + // not to be identical because the being edited item might be below the passed item in the hierarchy); + // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process + // has been started and that variables can currently not be updated even when requested by the system: dataViewCtrlPtr->SetDeleting(true); errorStatus = this->m_dataViewControlPtr->RemoveItem(reinterpret_cast(parent.GetID()),&itemID); + // enable automatic updating again: dataViewCtrlPtr->SetDeleting(false); return (errorStatus == noErr); } /* if */ @@ -165,6 +302,37 @@ public: return false; } /* ItemDeleted(wxDataViewItem const&, wxDataViewItem const&) */ + virtual bool ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items) + { + bool noFailureFlag; + + DataBrowserItemID* itemIDs; + + wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->m_dataViewControlPtr->GetPeer())); + + size_t noOfEntries; + + + wxCHECK_MSG(dataViewCtrlPtr != NULL,false,_("Data view control is not correctly initialized")); + // convert all valid data view items to data browser items: + itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items); + // 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 + // not to be identical because the being edited item might be below the passed item in the hierarchy); + // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process + // has been started and that variables can currently not be updated even when requested by the system: + dataViewCtrlPtr->SetDeleting(true); + // insert all valid items into control: + noFailureFlag = ((noOfEntries == 0) || + !(parent.IsOk()) && (this->m_dataViewControlPtr->RemoveItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) || + parent.IsOk() && (this->m_dataViewControlPtr->RemoveItems(reinterpret_cast(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr)); + // enable automatic updating again: + dataViewCtrlPtr->SetDeleting(false); + // give allocated array space free again: + delete[] itemIDs; + // done: + return noFailureFlag; + } /* ItemsDeleted(wxDataViewItem const&, wxDataViewItemArray const&) */ + virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col) { DataBrowserItemID itemID(reinterpret_cast(item.GetID())); @@ -189,7 +357,7 @@ public: dataViewEvent.SetColumn(col); dataViewEvent.SetItem(item); // send the equivalent wxWidget event: - dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); + dataViewCtrlPtr->HandleWindowEvent(dataViewEvent); // done return true; } /* if */ @@ -199,10 +367,7 @@ public: virtual bool Cleared(void) { - if (this->m_dataViewControlPtr->RemoveItems() == noErr) - return true; - else - return false; + return (this->m_dataViewControlPtr->RemoveItems() == noErr); } /* Cleared(void) */ virtual void Resort(void) @@ -277,13 +442,21 @@ wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) delete this->m_DCPtr; } /* wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) */ +void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ) +{ + wxDataViewCtrl *view = GetOwner()->GetOwner(); + wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? *wxWHITE : view->GetForegroundColour(); + dc->SetTextForeground(col); + dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2)); +} + wxDC* wxDataViewCustomRenderer::GetDC(void) { if (this->m_DCPtr == NULL) { if ((GetOwner() == NULL) || (GetOwner()->GetOwner() == NULL)) return NULL; - this->m_DCPtr = new wxClientDC(this->GetOwner()->GetOwner()); + this->m_DCPtr = new wxWindowDC(this->GetOwner()->GetOwner()); } /* if */ return this->m_DCPtr; } /* wxDataViewCustomRenderer::GetDC(void) */ @@ -299,6 +472,10 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr) this->m_DCPtr = newDCPtr; } /* wxDataViewCustomRenderer::SetDC(wxDC*) */ +WXDataBrowserPropertyType wxDataViewCustomRenderer::GetPropertyType(void) const +{ + return kDataBrowserCustomType; +} /* wxDataViewCustomRenderer::GetPropertyType(void) const */ IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer) @@ -324,8 +501,24 @@ bool wxDataViewTextRenderer::Render(void) return false; } /* wxDataViewTextRenderer::Render(void) */ +WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType(void) const +{ + return kDataBrowserTextType; +} /* wxDataViewTextRenderer::GetPropertyType(void) const */ + IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer) +// --------------------------------------------------------- +// wxDataViewTextRendererAttr +// --------------------------------------------------------- +#pragma mark - +wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align) + :wxDataViewTextRenderer(varianttype,mode,align) +{ +} /* wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const&, wxDataViewCellMode, int) */ + +IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer) + // --------------------------------------------------------- // wxDataViewBitmapRenderer // --------------------------------------------------------- @@ -343,7 +536,7 @@ bool wxDataViewBitmapRenderer::Render(void) bitmap << this->GetValue(); if (bitmap.Ok()) - return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr); + return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetIconRef()) == noErr); else return true; } /* if */ @@ -351,6 +544,11 @@ bool wxDataViewBitmapRenderer::Render(void) return false; } /* wxDataViewBitmapRenderer::Render(void) */ +WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType(void) const +{ + return kDataBrowserIconType; +} /* wxDataViewBitmapRenderer::GetPropertyType(void) const */ + IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer) // --------------------------------------------------------- @@ -373,14 +571,24 @@ bool wxDataViewIconTextRenderer::Render(void) // variable definition: wxMacCFStringHolder cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding())); + + if (iconText.GetIcon().IsOk()) + { + if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr) + return false; + } - return ((::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) == noErr) && - (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr)); + return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr); } /* if */ else return false; } /* wxDataViewIconTextRenderer::Render(void) */ +WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType(void) const +{ + return kDataBrowserIconAndTextType; +} /* wxDataViewIconTextRenderer::GetPropertyType(void) const */ + IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer) @@ -401,6 +609,11 @@ bool wxDataViewToggleRenderer::Render(void) return false; } /* wxDataViewToggleRenderer::Render(void) */ +WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType(void) const +{ + return kDataBrowserCheckboxType; +} /* wxDataViewToggleRenderer::GetPropertyType(void) const */ + IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer) // --------------------------------------------------------- @@ -422,6 +635,11 @@ bool wxDataViewProgressRenderer::Render(void) return false; } /* wxDataViewProgressRenderer::Render(void) */ +WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType(void) const +{ + return kDataBrowserProgressBarType; +} /* wxDataViewProgressRenderer::GetPropertyType(void) const */ + IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer) // --------------------------------------------------------- @@ -441,6 +659,11 @@ bool wxDataViewDateRenderer::Render(void) return false; } /* wxDataViewDateRenderer::Render(void) */ +WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType(void) const +{ + return kDataBrowserDateTimeType; +} /* wxDataViewDateRenderer::GetPropertyType(void) const */ + IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer) // --------------------------------------------------------- @@ -516,7 +739,7 @@ void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap) wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description.")); if (this->GetBitmap().Ok()) - headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetBitmapData()->GetIconRef(); + headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetIconRef(); else headerDescription.btnContentInfo.u.iconRef = NULL; wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon.")); @@ -710,6 +933,8 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, InstallControlEventHandler(this->m_peer->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList),eventList,this,NULL); + ::SetDataBrowserTableViewHiliteStyle( this->m_peer->GetControlRef(), kDataBrowserTableViewFillHilite ); + return true; } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */ @@ -723,108 +948,51 @@ bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model) return true; } /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */ -bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr) +bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr) { + DataBrowserListViewColumnDesc columnDescription; + DataBrowserPropertyID NewPropertyID; wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding()); + // 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 ((MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr) && this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr)) + wxCHECK_MSG(MacDataViewListCtrlPtr != NULL, false,_("m_peer is not or incorrectly initialized")); + wxCHECK_MSG(columnPtr != NULL, false,_("Column pointer must not be NULL.")); + wxCHECK_MSG(columnPtr->GetRenderer() != NULL, false,_("Column does not have a renderer.")); + wxCHECK_MSG(this->GetModel() != NULL, false,_("No model associated with control.")); + wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) && + (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model.")); + + // try to get new ID for the column: + wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached.")); + // full column variable initialization: + columnPtr->SetPropertyID(NewPropertyID); + // add column to wxWidget's internal structure: + wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) && + this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures.")); + // create a column description and add column to the native control: + wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title), false,_("Column description could not be initialized.")); + wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn) == noErr,false,_("Column could not be added.")); + + // final adjustments for the layout: + wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set.")); + + // make sure that the data is up-to-date... + // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column, + // otherwise ask the control to 'update' the data in the newly appended column: + if (this->GetColumnCount() == 1) { - // insert column into hash map: - this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,dataViewColumnPtr)); - - // variable definitions: - DataBrowserListViewColumnDesc columnDescription; - wxMacCFStringHolder cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding())); - - // initialize column description: - dataViewColumnPtr->SetPropertyID(NewPropertyID); - columnDescription.propertyDesc.propertyID = NewPropertyID; - columnDescription.propertyDesc.propertyType = dataViewColumnPtr->GetRenderer()->GetPropertyType(); - columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable - if (dataViewColumnPtr->IsSortable()) - columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn; -#if 0 - if (dataViewColumnPtr->IsMovable()) - columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn; -#endif - if (dataViewColumnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE) - columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable; -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 - if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) || - (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) || - (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType)) - columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; -#endif -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton; -#endif - columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; - if (dataViewColumnPtr->IsResizeable()) - { - columnDescription.headerBtnDesc.minimumWidth = 0; - columnDescription.headerBtnDesc.maximumWidth = 30000; - } /* if */ - else - { - columnDescription.headerBtnDesc.minimumWidth = dataViewColumnPtr->GetWidth(); - columnDescription.headerBtnDesc.maximumWidth = dataViewColumnPtr->GetWidth(); - } /* if */ - columnDescription.headerBtnDesc.titleOffset = 0; - columnDescription.headerBtnDesc.titleString = cfTitle; // we cannot directly use the wxMacCFStringHolder constructor call because then the CFStringRef is released - // having called 'AddColumn' where the title (CFStringRef) is going to be used - columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing; - columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask; - switch (dataViewColumnPtr->GetAlignment()) - { - case wxALIGN_CENTER: - case wxALIGN_CENTER_HORIZONTAL: - columnDescription.headerBtnDesc.btnFontStyle.just = teCenter; - break; - case wxALIGN_LEFT: - columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft; - break; - case wxALIGN_RIGHT: - columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight; - break; - default: - columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault; - } /* switch */ - columnDescription.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont; - columnDescription.headerBtnDesc.btnFontStyle.style = normal; - columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef; - if (dataViewColumnPtr->GetBitmap().Ok()) - columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = dataViewColumnPtr->GetBitmap().GetBitmapData()->GetIconRef(); - // add column: - wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn) == noErr,false,_("Column could not be added.")); - - // final adjustments for the layout: - wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,dataViewColumnPtr->GetWidth()) == noErr,false,_("Column width could not be set.")); - - // make sure that the data is up-to-date... - // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column, - // otherwise ask the control to 'update' the data in the newly appended column: - if (this->GetColumnCount() == 1) - { - this->SetExpanderColumn(dataViewColumnPtr); - this->AddChildrenLevel(wxDataViewItem()); - } /* if */ - else - MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID); - // done: - return true; + this->SetExpanderColumn(columnPtr); + this->AddChildrenLevel(wxDataViewItem()); } /* if */ else - return false; + MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID); + // done: + return true; } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */ bool wxDataViewCtrl::ClearColumns(void) @@ -896,6 +1064,53 @@ int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const return wxNOT_FOUND; } /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */ +bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr) +{ + DataBrowserListViewColumnDesc columnDescription; + + DataBrowserPropertyID NewPropertyID; + + wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); + + wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding()); + + + // first, some error checking: + wxCHECK_MSG(MacDataViewListCtrlPtr != NULL, false,_("m_peer is not or incorrectly initialized")); + wxCHECK_MSG(columnPtr != NULL, false,_("Column pointer must not be NULL.")); + wxCHECK_MSG(columnPtr->GetRenderer() != NULL, false,_("Column does not have a renderer.")); + wxCHECK_MSG(this->GetModel() != NULL, false,_("No model associated with control.")); + wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) && + (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model.")); + + // try to get new ID for the column: + wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached.")); + // full column variable initialization: + columnPtr->SetPropertyID(NewPropertyID); + // add column to wxWidget's internal structure: + wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) && + this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures.")); + // create a column description and add column to the native control: + wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title),false,_("Column description could not be initialized.")); + wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,0) == noErr, false,_("Column could not be added.")); + + // final adjustments for the layout: + wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set.")); + + // make sure that the data is up-to-date... + // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column, + // otherwise ask the control to 'update' the data in the newly appended column: + if (this->GetColumnCount() == 1) + { + this->SetExpanderColumn(columnPtr); + this->AddChildrenLevel(wxDataViewItem()); + } /* if */ + else + MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID); + // done: + return true; +} /* wxDataViewCtrl::PrependColumn(wxDataViewColumn*) */ + void wxDataViewCtrl::Collapse(wxDataViewItem const& item) { wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast(this->m_peer)); @@ -1107,11 +1322,15 @@ void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const& parentItem) wxCHECK_RET(this->GetModel() != NULL,_("Model pointer not initialized.")); NoOfChildren = this->GetModel()->GetChildren(parentItem,items); +#if 0 for (int i=0; iGetModel()->ItemAdded(parentItem,items[i]); +#else + (void) this->GetModel()->ItemsAdded(parentItem,items); +#endif } /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */ -wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID propertyID) const +wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(WXDataBrowserPropertyID propertyID) const { // variable definition: ColumnPointerHashMapType::const_iterator Result(this->m_ColumnPointers.find(propertyID));