From 01b494f950c9a63763683747ca330a2c70855f0f Mon Sep 17 00:00:00 2001 From: James Cowgill Date: Fri, 21 Mar 2014 12:42:00 +0000 Subject: Imported Upstream version 5.4+dfsg --- LiteEditor/foldermodel.cpp | 324 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100644 LiteEditor/foldermodel.cpp (limited to 'LiteEditor/foldermodel.cpp') diff --git a/LiteEditor/foldermodel.cpp b/LiteEditor/foldermodel.cpp new file mode 100644 index 00000000..e4ca6454 --- /dev/null +++ b/LiteEditor/foldermodel.cpp @@ -0,0 +1,324 @@ +////////////////////////////////////////////////////////////////////// +// This file was auto-generated by codelite's wxCrafter Plugin +// Do not modify this file by hand! +////////////////////////////////////////////////////////////////////// + +#include "foldermodel.h" +#include +#include + +////////////////////////////////////////// +// Implementation +////////////////////////////////////////// + +// ------------------------------------------------- +// Help method +// ------------------------------------------------- +wxVariant FolderModel::CreateIconTextVariant(const wxString &text, const wxBitmap& bmp) +{ + wxIcon icn; + icn.CopyFromBitmap( bmp); + wxDataViewIconText ict(text, icn); + wxVariant v; + v << ict; + return v; +} + +// ------------------------------------------------- +// The model class +// ------------------------------------------------- + +FolderModel::FolderModel() + : m_colCount(0) +{ +} + +FolderModel::~FolderModel() +{ + for(size_t i=0; i(item.m_pItem); + if ( node ) { + for(size_t i=0; iGetChildren().size(); ++i) { + children.Add( wxDataViewItem( node->GetChildren().at(i) ) ); + } + } + return children.GetCount(); +} + +unsigned int FolderModel::GetColumnCount() const +{ + return m_colCount; +} + +wxString FolderModel::GetColumnType(unsigned int col) const +{ + if ( !m_data.empty() && m_data.at(0)->GetData().size() > col ) { + return m_data.at(0)->GetData().at(col).GetType(); + } + return "string"; +} + +wxDataViewItem FolderModel::GetParent(const wxDataViewItem& item) const +{ + if ( IsEmpty() ) { + return wxDataViewItem(NULL); + } + + FolderModel_Item* node = reinterpret_cast(item.m_pItem); + if ( node ) { + return wxDataViewItem(node->GetParent()); + } + return wxDataViewItem(NULL); +} + +bool FolderModel::IsContainer(const wxDataViewItem& item) const +{ + FolderModel_Item* node = reinterpret_cast(item.m_pItem); + if ( node ) { + return node->IsContainer(); + } + return false; +} + +void FolderModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const +{ + FolderModel_Item* node = reinterpret_cast(item.m_pItem); + if ( node && node->GetData().size() > col ) { + variant = node->GetData().at(col); + } +} +wxDataViewItem FolderModel::DoAppendItem(const wxDataViewItem& parent, const wxVector& data, bool isContainer, wxClientData *clientData) +{ + FolderModel_Item* parentNode = reinterpret_cast(parent.m_pItem); + DoChangeItemType(parent, true); + + FolderModel_Item* child = new FolderModel_Item(); + child->SetIsContainer(isContainer); + child->SetClientObject( clientData ); + child->SetData( data ); + if ( parentNode ) { + parentNode->AddChild( child ); + + } else { + m_data.push_back( child ); + } + + return wxDataViewItem(child); +} + +wxDataViewItem FolderModel::DoInsertItem(const wxDataViewItem& insertBeforeMe, const wxVector& data, bool isContainer, wxClientData *clientData) +{ + FolderModel_Item* child = new FolderModel_Item(); + child->SetIsContainer(isContainer); + child->SetClientObject( clientData ); + child->SetData( data ); + + // find the location where to insert the new item + FolderModel_Item* node = reinterpret_cast(insertBeforeMe.m_pItem); + if ( !node ) + return wxDataViewItem(); + + wxVector::iterator where = std::find(m_data.begin(), m_data.end(), node); + + if ( where != m_data.end() ) { + // top level item + m_data.insert( where, child ); + + } else { + + if ( !node->GetParent() ) + return wxDataViewItem(); + + child->SetParent(node->GetParent()); + where = std::find(node->GetParent()->GetChildren().begin(), node->GetParent()->GetChildren().end(), node); + if ( where == node->GetParent()->GetChildren().end() ) { + node->GetParent()->GetChildren().push_back( child ); + + } else { + node->GetParent()->GetChildren().insert(where, child); + + } + } + + return wxDataViewItem(child); +} + +wxDataViewItem FolderModel::AppendItem(const wxDataViewItem &parent, const wxVector& data, wxClientData *clientData) +{ + wxDataViewItem ch = DoAppendItem(parent, data, false, clientData); + ItemAdded(parent, ch); + return ch; +} + +wxDataViewItemArray FolderModel::AppendItems(const wxDataViewItem &parent, const wxVector >& data) +{ + wxDataViewItemArray items; + for(size_t i=0; i(item.m_pItem); + if ( node && node->GetData().size() > col ) { + node->GetData().at(col) = variant; + } + return true; +} + +void FolderModel::DeleteItem(const wxDataViewItem& item) +{ + FolderModel_Item* node = reinterpret_cast(item.m_pItem); + if ( node ) { + + FolderModel_Item* parent = node->GetParent(); + wxDataViewItem parentItem(parent); + ItemDeleted(parentItem, item); + + // this will also remove it from its model parent children list + if ( parent == NULL ) { + // root item, remove it from the roots array + wxVector::iterator where = std::find(m_data.begin(), m_data.end(), node); + if ( where != m_data.end() ) { + m_data.erase(where); + } + } + + // If there are no more children, change the item back to 'normal' + if ( parent && parent->GetChildren().empty() ) + DoChangeItemType(parentItem, false); + + wxDELETE(node); + } + + if ( IsEmpty() ) + Cleared(); +} + +void FolderModel::DeleteItems(const wxDataViewItem& parent, const wxDataViewItemArray& items) +{ + // sanity + for(size_t i=0; i(items.Item(i).m_pItem); + wxUnusedVar(node); + wxASSERT(node && node->GetParent() == parent.m_pItem); + DeleteItem(items.Item(i)); + } +} + +void FolderModel::Clear() +{ + wxVector roots = m_data; + wxVector::iterator iter = roots.begin(); + for(; iter != roots.end(); ++iter) { + DeleteItem( wxDataViewItem(*iter) ); + } + m_data.clear(); + Cleared(); +} + +bool FolderModel::IsEmpty() const +{ + return m_data.empty(); +} + +wxClientData* FolderModel::GetClientObject(const wxDataViewItem& item) const +{ + FolderModel_Item* node = reinterpret_cast(item.GetID()); + if ( node ) { + return node->GetClientObject(); + } + return NULL; +} + +void FolderModel::SetClientObject(const wxDataViewItem& item, wxClientData *data) +{ + FolderModel_Item* node = reinterpret_cast(item.GetID()); + if ( node ) { + node->SetClientObject(data); + } +} + +void FolderModel::UpdateItem(const wxDataViewItem& item, const wxVector& data) +{ + FolderModel_Item* node = reinterpret_cast(item.GetID()); + if ( node ) { + node->SetData( data ); + ItemChanged( item ); + } +} + +wxDataViewItem FolderModel::InsertItem(const wxDataViewItem& insertBeforeMe, const wxVector& data, wxClientData *clientData) +{ + wxDataViewItem ch = DoInsertItem(insertBeforeMe, data, false, clientData); + if ( ch.IsOk() ) { + FolderModel_Item* node = reinterpret_cast(ch.GetID()); + ItemAdded(wxDataViewItem(node->GetParent()), ch); + } + return ch; +} + +wxVector FolderModel::GetItemColumnsData(const wxDataViewItem& item) const +{ + if ( !item.IsOk() ) + return wxVector(); + + FolderModel_Item* node = reinterpret_cast(item.GetID()); + if ( !node ) { + return wxVector(); + } + return node->GetData(); +} + +bool FolderModel::HasChildren(const wxDataViewItem& item) const +{ + if ( !item.IsOk() ) + return false; + + FolderModel_Item* node = reinterpret_cast(item.GetID()); + if ( !node ) { + return false; + } + return !node->GetChildren().empty(); +} + +void FolderModel::DoChangeItemType(const wxDataViewItem& item, bool changeToContainer) +{ + FolderModel_Item* node = reinterpret_cast(item.GetID()); + if ( !node ) + return; + + if ( ( changeToContainer && !node->IsContainer()) || // change an item from non-container to container type + ( !changeToContainer && node->IsContainer()) ) { // change an item from container to non-container type +#if defined(__WXGTK__) || defined(__WXMAC__) + // change the item to container type: + // 1st we need to delete it + ItemDeleted(wxDataViewItem(node->GetParent()), item); + + // update the node type + node->SetIsContainer(changeToContainer); + ItemAdded(wxDataViewItem(node->GetParent()), item); +#else + node->SetIsContainer(changeToContainer); +#endif + } +} -- cgit v1.2.3