///////////////////////////////////////////////////////////////////////////// // Name: dbtrigger.cc // Purpose: Database Objects // Author: Daniel Horak // Modified by: // RCS-ID: $Id: dbtrigger.cc,v 1.2 2004/01/01 13:56:19 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 "config.h" #include "xml.h" #include "dbobject.h" #include "dbtrigger.h" DBTrigger::DBTrigger(DataDesignerProject *project, DataDesignerContainer *container) :DBObject(DBTriggerType, "trigger", project, container), m_event_ins(FALSE), m_event_upd(FALSE), m_event_del(FALSE), m_time(DBO_TRIGGER_TIME_AFTER), m_type(DBO_TRIGGER_TYPE_ROW) { } wxDialog *DBTrigger::Editor(bool edit) { return new DBTriggerEditor(this, edit); } void DBTrigger::LoadXmlNode(wxXmlNode *node) { if (node->GetName() == m_typestr) { DBObject::LoadXmlNode(node); wxXmlNode *child = node->GetChildren(); wxString name; while (child) { name = child->GetName(); if (name == "procedure") { LoadTextNode(child, "procedure", m_procedure); } else if (name == "event") { wxString event; LoadTextNode(child, "event", event); if (event == "insert") m_event_ins = TRUE; else if (event == "update") m_event_upd = TRUE; else if (event == "delete") m_event_del = TRUE; else wxLogMessage("Unknown trigger event specification '%s'", event.c_str()); } else if (name == "time") { wxString time; LoadTextNode(child, "time", time); if (time == "after") m_time = DBO_TRIGGER_TIME_AFTER; else if (time == "before") m_time = DBO_TRIGGER_TIME_BEFORE; else wxLogMessage("Unknown trigger time specification '%s'", time.c_str()); } else if (name == "type") { wxString type; LoadTextNode(child, "type", type); if (type == "row") m_type = DBO_TRIGGER_TYPE_ROW; else if (type == "statement") m_type = DBO_TRIGGER_TYPE_STMT; else wxLogMessage("Unknown trigger type specification '%s'", type.c_str()); } child = child->GetNext(); } } else { wxLogMessage("wrong type '%s'", node->GetName().c_str()); } } wxXmlNode *DBTrigger::GetXmlNode() { wxXmlNode *node = DBObject::GetXmlNode(); if (m_time == DBO_TRIGGER_TIME_AFTER) node->AddChild(GetTextNode("time", "after")); else if (m_time == DBO_TRIGGER_TIME_BEFORE) node->AddChild(GetTextNode("time", "before")); if (m_type == DBO_TRIGGER_TYPE_ROW) node->AddChild(GetTextNode("type", "row")); else if (m_type == DBO_TRIGGER_TYPE_STMT) node->AddChild(GetTextNode("type", "statement")); if (m_event_ins) node->AddChild(GetTextNode("event", "insert")); if (m_event_upd) node->AddChild(GetTextNode("event", "update")); if (m_event_del) node->AddChild(GetTextNode("event", "delete")); node->AddChild(GetTextNode("procedure", m_procedure)); return node; } /* * Editor */ wxString DBTriggerEditor::m_time_str[] = { _("After"), _("Before") }; wxString DBTriggerEditor::m_type_str[] = { _("Row"), _("Statement") }; DBTriggerEditor::DBTriggerEditor(DBObject *object, bool edit) : DBObjectEditor(_("Trigger"), wxSize(500,300), object, edit) { wxString **strings; int idx; r1 = new wxRadioBox(m_page_general, -1, _("Time"), wxPoint(50,60), wxSize(100,-1), 2, m_time_str, 1, wxRA_HORIZONTAL); new wxStaticBox(m_page_general, -1, _("On Action"), wxPoint(190,60), wxSize(120,90)); c21 = new wxCheckBox(m_page_general, -1, _("Insert"), wxPoint(200,70), wxSize(100,-1)); c22 = new wxCheckBox(m_page_general, -1, _("Update"), wxPoint(200,95), wxSize(100,-1)); c23 = new wxCheckBox(m_page_general, -1, _("Delete"), wxPoint(200,120), wxSize(100,-1)); r3 = new wxRadioBox(m_page_general, -1, _("Type"), wxPoint(350,60), wxSize(100,-1), 2, m_type_str, 1, wxRA_HORIZONTAL); idx = 0; strings = GetObject()->GetProject()->m_top_procedures->ListNames(); new wxStaticText(m_page_general, -1, _("Procedure"), wxPoint(10,170), wxSize(80,-1), wxALIGN_RIGHT); c4 = new wxComboBox(m_page_general, -1, wxEmptyString, wxPoint(100,170), wxSize(150,-1), 0, NULL, wxCB_READONLY | wxCB_SORT); while (strings[idx]) { c4->Append(*strings[idx]); idx++; } delete [] strings; } DBTriggerEditor::~DBTriggerEditor() { } bool DBTriggerEditor::TransferDataFromWindow() { DBTrigger *object = (DBTrigger *)GetObject(); DBObjectEditor::TransferDataFromWindow(); object->m_time = r1->GetSelection(); object->m_event_ins = c21->GetValue(); object->m_event_upd = c22->GetValue(); object->m_event_del = c23->GetValue(); object->m_type = r3->GetSelection(); object->m_procedure = c4->GetValue(); return TRUE; } bool DBTriggerEditor::TransferDataToWindow() { DBTrigger *object = (DBTrigger *)GetObject(); DBObjectEditor::TransferDataToWindow(); r1->SetSelection(object->m_time); c21->SetValue(object->m_event_ins); c22->SetValue(object->m_event_upd); c23->SetValue(object->m_event_del); r3->SetSelection(object->m_type); c4->SetValue(object->m_procedure); return TRUE; } /* * Container */ DBTriggerContainer::DBTriggerContainer(DataDesignerProject *project, const wxTreeItemId& parent) : DataDesignerContainer(project, parent, "triggers") { } DBObject *DBTriggerContainer::CreateObject() { return new DBTrigger(GetProject(), this); } void DBTriggerContainer::ShowList() { SetList(new DBTriggerListCtrl(GetProject()->GetSplitter(), this)); DataDesignerContainer::AddObjectsToListAndShow(); } /* * ObjectList */ DBTriggerListCtrl::DBTriggerListCtrl(wxWindow *parent, DataDesignerContainer *container) : DBObjectListCtrl(parent, container) { InsertColumn(1, _("Event")); InsertColumn(2, _("Procedure")); } DBTriggerListCtrl::~DBTriggerListCtrl() { } void DBTriggerListCtrl::SetObject(long item, DBObject *object) { DBTrigger *trigger = (DBTrigger *)object; // SetItem(item, 1, trigger->m_event); SetItem(item, 1, "n/a"); SetItem(item, 2, trigger->m_procedure); }