/////////////////////////////////////////////////////////////////////////////
// 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 <wx/wxprec.h>

#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 <wx/wx.h>
#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);
}


syntax highlighted by Code2HTML, v. 0.9.1