summaryrefslogtreecommitdiff
path: root/LiteEditor/foldermodel.cpp
diff options
context:
space:
mode:
authorJames Cowgill <james410@cowgill.org.uk>2014-03-21 12:42:00 +0000
committerJames Cowgill <james410@cowgill.org.uk>2014-03-21 12:42:00 +0000
commit01b494f950c9a63763683747ca330a2c70855f0f (patch)
tree00faa33f79482dc7d19db1b06e189e7760477a75 /LiteEditor/foldermodel.cpp
parenta00e9147b0128de0375a207b4f81494e7a0681d4 (diff)
Imported Upstream version 5.4+dfsg
Diffstat (limited to 'LiteEditor/foldermodel.cpp')
-rw-r--r--LiteEditor/foldermodel.cpp324
1 files changed, 324 insertions, 0 deletions
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 <wx/dvrenderers.h>
+#include <wx/variant.h>
+
+//////////////////////////////////////////
+// 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<m_data.size(); ++i) {
+ wxDELETE(m_data.at(i));
+ }
+ m_data.clear();
+}
+
+unsigned int FolderModel::GetChildren(const wxDataViewItem& item, wxDataViewItemArray& children) const
+{
+ if(item.GetID() == NULL) {
+ // Root
+ for(size_t i=0; i<m_data.size(); ++i) {
+ children.Add( wxDataViewItem( m_data.at(i) ) );
+ }
+ return children.size();
+ }
+
+ children.Clear();
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(item.m_pItem);
+ if ( node ) {
+ for(size_t i=0; i<node->GetChildren().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<FolderModel_Item*>(item.m_pItem);
+ if ( node ) {
+ return wxDataViewItem(node->GetParent());
+ }
+ return wxDataViewItem(NULL);
+}
+
+bool FolderModel::IsContainer(const wxDataViewItem& item) const
+{
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(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<FolderModel_Item*>(item.m_pItem);
+ if ( node && node->GetData().size() > col ) {
+ variant = node->GetData().at(col);
+ }
+}
+wxDataViewItem FolderModel::DoAppendItem(const wxDataViewItem& parent, const wxVector<wxVariant>& data, bool isContainer, wxClientData *clientData)
+{
+ FolderModel_Item* parentNode = reinterpret_cast<FolderModel_Item*>(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<wxVariant>& 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<FolderModel_Item*>(insertBeforeMe.m_pItem);
+ if ( !node )
+ return wxDataViewItem();
+
+ wxVector<FolderModel_Item*>::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<wxVariant>& data, wxClientData *clientData)
+{
+ wxDataViewItem ch = DoAppendItem(parent, data, false, clientData);
+ ItemAdded(parent, ch);
+ return ch;
+}
+
+wxDataViewItemArray FolderModel::AppendItems(const wxDataViewItem &parent, const wxVector<wxVector<wxVariant> >& data)
+{
+ wxDataViewItemArray items;
+ for(size_t i=0; i<data.size(); ++i) {
+ items.push_back( DoAppendItem(parent, data.at(i), false, NULL) );
+ }
+ ItemsAdded(parent, items);
+ return items;
+}
+
+bool FolderModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col)
+{
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(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<FolderModel_Item*>(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<FolderModel_Item*>::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.GetCount(); ++i) {
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(items.Item(i).m_pItem);
+ wxUnusedVar(node);
+ wxASSERT(node && node->GetParent() == parent.m_pItem);
+ DeleteItem(items.Item(i));
+ }
+}
+
+void FolderModel::Clear()
+{
+ wxVector<FolderModel_Item*> roots = m_data;
+ wxVector<FolderModel_Item*>::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<FolderModel_Item*>(item.GetID());
+ if ( node ) {
+ return node->GetClientObject();
+ }
+ return NULL;
+}
+
+void FolderModel::SetClientObject(const wxDataViewItem& item, wxClientData *data)
+{
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(item.GetID());
+ if ( node ) {
+ node->SetClientObject(data);
+ }
+}
+
+void FolderModel::UpdateItem(const wxDataViewItem& item, const wxVector<wxVariant>& data)
+{
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(item.GetID());
+ if ( node ) {
+ node->SetData( data );
+ ItemChanged( item );
+ }
+}
+
+wxDataViewItem FolderModel::InsertItem(const wxDataViewItem& insertBeforeMe, const wxVector<wxVariant>& data, wxClientData *clientData)
+{
+ wxDataViewItem ch = DoInsertItem(insertBeforeMe, data, false, clientData);
+ if ( ch.IsOk() ) {
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(ch.GetID());
+ ItemAdded(wxDataViewItem(node->GetParent()), ch);
+ }
+ return ch;
+}
+
+wxVector<wxVariant> FolderModel::GetItemColumnsData(const wxDataViewItem& item) const
+{
+ if ( !item.IsOk() )
+ return wxVector<wxVariant>();
+
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(item.GetID());
+ if ( !node ) {
+ return wxVector<wxVariant>();
+ }
+ return node->GetData();
+}
+
+bool FolderModel::HasChildren(const wxDataViewItem& item) const
+{
+ if ( !item.IsOk() )
+ return false;
+
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(item.GetID());
+ if ( !node ) {
+ return false;
+ }
+ return !node->GetChildren().empty();
+}
+
+void FolderModel::DoChangeItemType(const wxDataViewItem& item, bool changeToContainer)
+{
+ FolderModel_Item* node = reinterpret_cast<FolderModel_Item*>(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
+ }
+}