///////////////////////////////////////////////////////////////////////////// // Name: container.cc // Purpose: Data Designer Project // Author: Daniel Horak // Modified by: // RCS-ID: $Id: container.cc,v 1.3 2003/12/28 18:51:43 horakdan Exp $ // Copyright: (c) Daniel Horak // Licence: GPL ///////////////////////////////////////////////////////////////////////////// // ============================================================================ // declarations // ============================================================================ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #include #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include #endif #include #include "config.h" #include "container.h" #include "xml.h" #include "objects/dbobject.h" #include "schema.h" DataDesignerContainer::DataDesignerContainer(DataDesignerProject *project, const wxTreeItemId& parent, const wxString& name) : m_name(name), m_treeitemid(parent), m_enabled(TRUE), m_project(project), m_list(NULL), m_lastid(0) { } DataDesignerContainer::~DataDesignerContainer() { m_project->Delete(m_treeitemid); } void DataDesignerContainer::LoadXmlNode(wxXmlNode *node) { wxXmlNode *child; DBObject *object; wxString number; if (node->GetName() == m_name) { number = node->GetPropVal("lastid", "0"); m_lastid = wxAtoi(number); child = node->GetChildren(); while (child) { object = CreateObject(); if (object) { object->AppendItem(); object->LoadXmlNode(child); } child = child->GetNext(); } } } DBObject *DataDesignerContainer::CreateObject() { return NULL; } wxXmlNode *DataDesignerContainer::GetXmlNode() { wxXmlNode *node; wxTreeItemId child; long cookie; wxString number; node = new wxXmlNode(wxXML_ELEMENT_NODE, m_name); number.Printf("%d", m_lastid); node->AddProperty("lastid", number); child = m_project->GetFirstChild(m_treeitemid, cookie); while (child.IsOk()) { node->AddChild((((DataDesignerItemData *)m_project->GetItemData(child))->GetObject())->GetXmlNode()); child = m_project->GetNextChild(m_treeitemid, cookie); } return node; } wxString **DataDesignerContainer::ListNames() { int count; wxString **strings; wxTreeItemId child; long cookie; int idx; count = m_project->GetChildrenCount(m_treeitemid, FALSE); strings = new wxString * [count+1]; idx = 0; child = m_project->GetFirstChild(m_treeitemid, cookie); while (child.IsOk()) { strings[idx++] = &(((DataDesignerItemData *)m_project->GetItemData(child))->GetObject())->GetName(); child = m_project->GetNextChild(m_treeitemid, cookie); } strings[idx] = NULL; return strings; } DBObject *DataDesignerContainer::GetObjectByName(const wxString& name) { DBObject *object = NULL; wxTreeItemId child; long cookie; #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerContainer::GetObjectByName - " + name); #endif child = m_project->GetFirstChild(m_treeitemid, cookie); while (child.IsOk()) { object = ((DataDesignerItemData *)m_project->GetItemData(child))->GetObject(); if (object->GetName() == name) break; child = m_project->GetNextChild(m_treeitemid, cookie); object = NULL; } return object; } void DataDesignerContainer::AddObjectsToList() { DBObject *object = NULL; wxTreeItemId child; long cookie; long item; if (m_list) { item = 0; child = m_project->GetFirstChild(m_treeitemid, cookie); while (child.IsOk()) { object = ((DataDesignerItemData *)m_project->GetItemData(child))->GetObject(); m_list->AddObject(item++, object); child = m_project->GetNextChild(m_treeitemid, cookie); } } } void DataDesignerContainer::AddObjectsToListAndShow() { if (m_list) { AddObjectsToList(); DataDesignerSplitter *splitter = m_project->GetSplitter(); wxWindow *win2 = splitter->GetWindow2(); if (splitter->ReplaceWindow(win2, m_list)) { m_list->Show(TRUE); // destroy "closed" window if (win2) win2->Destroy(); } } } void DataDesignerContainer::AddObjectsToSchema() { DBObject *object = NULL; DataDesignerSchema *schema; wxTreeItemId child; long cookie; schema = m_project->GetSchema(); if (! schema) { wxLogMessage("DataDesignerContainer::AddObjectsToSchema - no schema"); return; } child = m_project->GetFirstChild(m_treeitemid, cookie); while (child.IsOk()) { object = ((DataDesignerItemData *)m_project->GetItemData(child))->GetObject(); if (object) { schema->AddObject(object); } child = m_project->GetNextChild(m_treeitemid, cookie); } } int DataDesignerContainer::GetChildrenCount() { int res = 0; if (m_project != NULL) { res = m_project->GetChildrenCount(m_treeitemid, FALSE); } return res; } void DataDesignerContainer::OnDraw(wxDC& dc) { DBObject *object = NULL; DataDesignerSchema *schema; wxTreeItemId child; long cookie; wxShape *shape; schema = m_project->GetSchema(); if (! schema) return; child = m_project->GetFirstChild(m_treeitemid, cookie); while (child.IsOk()) { object = ((DataDesignerItemData *)m_project->GetItemData(child))->GetObject(); if (object) { if (! object->GetShape()) object->CreateShape(); if ((shape = object->GetShape())) shape->Draw(dc); } child = m_project->GetNextChild(m_treeitemid, cookie); } }