///////////////////////////////////////////////////////////////////////////// // Name: project.cc // Purpose: Data Designer Project // Author: Daniel Horak // Modified by: // RCS-ID: $Id: project.cc,v 1.6 2004/01/04 18:32:16 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 #include "config.h" #include "project.h" #include "container.h" #include "schema.h" #include "xml.h" #include "objects/dbobject.h" #include "objects/dbdomain.h" #include "objects/dbentity.h" #include "objects/dbview.h" #include "objects/dbsequence.h" #include "objects/dbrelation.h" #include "objects/dbprocedure.h" #include "objects/dbmodel.h" #include "objects/dbproject.h" #include "servers/dbserver.h" BEGIN_EVENT_TABLE(DataDesignerProject, wxTreeCtrl) EVT_TREE_ITEM_RIGHT_CLICK(-1, DataDesignerProject::OnItemRightClick) EVT_TREE_ITEM_ACTIVATED(-1, DataDesignerProject::OnItemActivated) EVT_TREE_SEL_CHANGED(-1, DataDesignerProject::OnItemSelected) EVT_TREE_BEGIN_LABEL_EDIT(-1, DataDesignerProject::OnItemBeginLabelEdit) EVT_TREE_END_LABEL_EDIT(-1, DataDesignerProject::OnItemEndLabelEdit) EVT_TREE_KEY_DOWN(-1, DataDesignerProject::OnItemKeyDown) END_EVENT_TABLE() DataDesignerProject::DataDesignerProject(DataDesignerSplitter *splitter) : wxTreeCtrl(splitter, -1, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE | wxTR_EDIT_LABELS), m_splitter(splitter), m_schema(NULL), m_initialized(FALSE), m_server(NULL) { m_dbproject = new DBProject(this); m_projectid = AddRoot(_("Project"), -1, -1, new DataDesignerItemData(m_dbproject)); m_top_domains = new DBDomainContainer (this, AppendItem(m_projectid, _("Domains"))); m_top_entities = new DBEntityContainer (this, AppendItem(m_projectid, _("Entities"))); m_top_views = new DBViewContainer (this, AppendItem(m_projectid, _("Views"))); m_top_sequences = new DBSequenceContainer(this, AppendItem(m_projectid, _("Sequences"))); m_top_relations = new DBRelationContainer(this, AppendItem(m_projectid, _("Relations"))); m_top_procedures= new DBProcedureContainer(this, AppendItem(m_projectid, _("Procedures"))); m_top_models = new DBModelContainer (this, AppendItem(m_projectid, _("Models"))); m_schemaid = AppendItem(m_projectid, _("Schema")); } DataDesignerProject::~DataDesignerProject() { delete m_top_domains; delete m_top_entities; delete m_top_views; delete m_top_sequences; delete m_top_relations; delete m_top_procedures; delete m_top_models; } bool DataDesignerProject::Open(wxInputStream& stream) { wxXmlDocument xmldoc; wxXmlNode *root, *child; wxString name; DBObject *object; wxTreeItemId parent; DataDesignerContainer *top; #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerProject::Open()"); #endif if (xmldoc.Load(stream) == FALSE) { wxLogMessage("loading error"); return FALSE; } root = xmldoc.GetRoot(); if (root->GetName() != "datadesigner") { wxLogMessage(_("wrong top-level element '") + root->GetName() + "'"); } else { child = root->GetChildren(); while (child) { name = child->GetName(); top = NULL; if (name == "domains") { top = m_top_domains; } else if (name == "entities") { top = m_top_entities; } else if (name == "views") { top = m_top_views; } else if (name == "sequences") { top = m_top_sequences; } else if (name == "relations") { top = m_top_relations; } else if (name == "procedures") { top = m_top_procedures; } else if (name == "models") { top = m_top_models; } else if (name == "project") { m_dbproject->LoadXmlNode(child); top = NULL; } else { wxLogMessage(_("unsupported element '") + name + "'"); } if (top) { top->LoadXmlNode(child); } child = child->GetNext(); } Expand(m_projectid); m_initialized = TRUE; } m_server = GetServerByName(m_dbproject->m_dbserver); if (m_server == NULL) { wxString msg; msg = _("Cannot find server '") + m_dbproject->m_dbserver + "'"; wxMessageBox(msg, _("Error"), wxOK | wxICON_ERROR); DeleteAllObjects(); return FALSE; } return TRUE; } bool DataDesignerProject::Save(wxOutputStream& stream) { wxXmlDocument xmldoc; wxXmlNode *root; #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerProject::Save()"); #endif root = new wxXmlNode(wxXML_ELEMENT_NODE, "datadesigner"); xmldoc.SetRoot(root); xmldoc.SetVersion("1.0"); xmldoc.SetFileEncoding("UTF-8"); root->AddChild(m_dbproject->GetXmlNode()); root->AddChild(m_top_domains->GetXmlNode()); root->AddChild(m_top_entities->GetXmlNode()); root->AddChild(m_top_views->GetXmlNode()); root->AddChild(m_top_sequences->GetXmlNode()); root->AddChild(m_top_relations->GetXmlNode()); root->AddChild(m_top_procedures->GetXmlNode()); root->AddChild(m_top_models->GetXmlNode()); if (! xmldoc.Save(stream)) { wxLogMessage("error during Save"); return FALSE; } return TRUE; } void DataDesignerProject::DeleteAllObjects(void) { DeleteChildren(m_top_domains->GetTreeItemId()); DeleteChildren(m_top_entities->GetTreeItemId()); DeleteChildren(m_top_views->GetTreeItemId()); DeleteChildren(m_top_sequences->GetTreeItemId()); DeleteChildren(m_top_relations->GetTreeItemId()); DeleteChildren(m_top_procedures->GetTreeItemId()); DeleteChildren(m_top_models->GetTreeItemId()); Collapse(m_projectid); // clear also project's name, ... m_dbproject->m_name = wxEmptyString; m_dbproject->m_desc = wxEmptyString; if (m_schema) { delete m_schema; m_schema = NULL; } m_initialized = FALSE; } bool DataDesignerProject::NewObject(DataDesignerContainer *top) { DBObject *object = NULL; wxDialog *editor; int res; if (!top) return FALSE; object = top->CreateObject(); if (!object) return FALSE; editor = object->Editor(FALSE); if (editor) { res = editor->ShowModal(); editor->Destroy(); if (res == wxID_OK) { object->AppendItem(); } else { delete object; } } return TRUE; } void DataDesignerProject::OnItemRightClick(wxTreeEvent& event) { wxTreeItemId itemid; DataDesignerContainer *top = NULL; if (! m_initialized) return; itemid = event.GetItem(); if (itemid == m_top_domains->GetTreeItemId()) { top = m_top_domains; } else if (itemid == m_top_entities->GetTreeItemId()) { top = m_top_entities; } else if (itemid == m_top_views->GetTreeItemId()) { top = m_top_views; } else if (itemid == m_top_relations->GetTreeItemId()) { top = m_top_relations; } else if (itemid == m_top_procedures->GetTreeItemId()) { top = m_top_procedures; } else if (itemid == m_top_models->GetTreeItemId()) { top = m_top_models; } else if (itemid == m_top_sequences->GetTreeItemId()) { top = m_top_sequences; } if (top) NewObject(top); } void DataDesignerProject::OnItemActivated(wxTreeEvent& event) { wxTreeItemId itemid, parentid; wxDialog *editor; DBObject *object = NULL; itemid = event.GetItem(); if (!m_initialized) { if (itemid == m_projectid) { editor = m_dbproject->Editor(FALSE); if (editor) { int res = editor->ShowModal(); editor->Destroy(); if (res == wxID_OK) { m_server = GetServerByName(m_dbproject->m_dbserver); if (m_server) m_initialized = TRUE; else wxLogMessage("Cannot find server '%s'", m_dbproject->m_dbserver.c_str()); } } } return; } parentid = GetParent(itemid); if ((parentid == m_top_domains->GetTreeItemId()) || (parentid == m_top_entities->GetTreeItemId()) || (parentid == m_top_views->GetTreeItemId()) || (parentid == m_top_sequences->GetTreeItemId()) || (parentid == m_top_relations->GetTreeItemId()) || (parentid == m_top_procedures->GetTreeItemId()) || (parentid == m_top_models->GetTreeItemId())) { // parental item is a container, so item is a DB object object = ((DataDesignerItemData *)GetItemData(itemid))->GetObject(); if (object) { editor = object->Editor(TRUE); if (editor) { editor->ShowModal(); editor->Destroy(); } } } else { // parent is not a container if (itemid == m_projectid) { editor = m_dbproject->Editor(FALSE); if (editor) { editor->ShowModal(); editor->Destroy(); } } } } void DataDesignerProject::OnItemSelected(wxTreeEvent& event) { wxTreeItemId itemid; DataDesignerContainer *top = NULL; if (! m_initialized) return; itemid = event.GetItem(); if (itemid == m_top_domains->GetTreeItemId()) top = m_top_domains; else if (itemid == m_top_entities->GetTreeItemId()) top = m_top_entities; else if (itemid == m_top_views->GetTreeItemId()) top = m_top_views; else if (itemid == m_top_sequences->GetTreeItemId()) top = m_top_sequences; else if (itemid == m_top_relations->GetTreeItemId()) top = m_top_relations; else if (itemid == m_top_procedures->GetTreeItemId()) top = m_top_procedures; else if (itemid == m_top_models->GetTreeItemId()) top = m_top_models; if (top) { // item is a container, so we will a list of all objects top->ShowList(); m_schema = NULL; } else { wxWindow *win2; if (itemid == m_schemaid) { // item is the main schema m_schema = new DataDesignerGlobalSchema(m_splitter, this); } else { wxTreeItemId parentid = GetParent(itemid); // check whether item is a model (its parent is m_top_models) if (parentid == m_top_models->GetTreeItemId()) { m_schema = new DataDesignerModelSchema(m_splitter, this, (DBModel *)(((DataDesignerItemData *)GetItemData(itemid))->GetObject())); } } if (m_schema) { m_schema->AddObjects(); win2 = m_splitter->GetWindow2(); if (win2 == m_schema) return; if (m_splitter->ReplaceWindow(win2, m_schema)) { m_schema->Show(TRUE); if (win2) win2->Destroy(); } } } } void DataDesignerProject::OnItemBeginLabelEdit(wxTreeEvent& event) { wxTreeItemId itemid, parentid; DBObject *object = NULL; if (! m_initialized) { event.Veto(); return; } itemid = event.GetItem(); parentid = GetParent(itemid); if ((parentid == m_top_domains->GetTreeItemId()) || (parentid == m_top_entities->GetTreeItemId()) || (parentid == m_top_views->GetTreeItemId()) || (parentid == m_top_sequences->GetTreeItemId()) || (parentid == m_top_relations->GetTreeItemId()) || (parentid == m_top_procedures->GetTreeItemId()) || (parentid == m_top_models->GetTreeItemId())) { } else { event.Veto(); } } void DataDesignerProject::OnItemEndLabelEdit(wxTreeEvent& event) { wxTreeItemId itemid; DBObject *object = NULL; if (! m_initialized) return; itemid = event.GetItem(); object = ((DataDesignerItemData *)GetItemData(itemid))->GetObject(); object->m_name = event.GetLabel(); } void DataDesignerProject::OnItemKeyDown(wxTreeEvent& event) { wxTreeItemId itemid; DBObject *object = NULL; if (! m_initialized) { event.Skip(); return; } itemid = event.GetItem(); object = ((DataDesignerItemData *)GetItemData(itemid))->GetObject(); event.Skip(); } void DataDesignerProject::SwapItems(wxTreeItemId item1, wxTreeItemId item2) { DataDesignerItemData *itemdata1 = (DataDesignerItemData *)GetItemData(item1); DataDesignerItemData *itemdata2 = (DataDesignerItemData *)GetItemData(item2); DBObject *object1 = itemdata1->GetObject(); DBObject *object2 = itemdata2->GetObject(); itemdata1->SetObject(object2); itemdata2->SetObject(object1); SetItemText(item1, object2->m_name); SetItemText(item2, object1->m_name); object1->SetTreeItemId(item2); object2->SetTreeItemId(item1); }