/////////////////////////////////////////////////////////////////////////////
// Name:        dbprocedure.cc
// Purpose:     Database Objects
// Author:      Daniel Horak
// Modified by:
// RCS-ID:      $Id: dbprocedure.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 <wx/notebook.h>
#include "config.h"
#include "xml.h"
#include "dbobject.h"
#include "dbprocedure.h"
#include "servers/dbserver.h"


DBProcedure::DBProcedure(DataDesignerProject *project, DataDesignerContainer *container)
	: DBObject(DBProcedureType, "procedure", project, container)
{
}

wxDialog *DBProcedure::Editor(bool edit)
{
	return new DBProcedureEditor(this, edit);
}

void DBProcedure::LoadXmlNode(wxXmlNode *node)
{
	if (node->GetName() == m_typestr) {
		DBObject::LoadXmlNode(node);
	
		m_language = node->GetPropVal("language", wxEmptyString);
	
		wxXmlNode *child = node->GetChildren();
		
		while (child) {
			if (child->GetName() == "source") {
				LoadTextNode(child, "source", m_source);
				if (m_source.GetChar(0) == wxChar('\n'))
					m_source.Remove(0,1);
			} else if (child->GetName() == "language") {
				LoadTextNode(child, "language", m_language);
			}
			child = child->GetNext();
		}
	} else {
		wxLogMessage("wrong type '%s'", node->GetName().c_str());
	}
}

wxXmlNode *DBProcedure::GetXmlNode()
{
	wxXmlNode *node = DBObject::GetXmlNode();

	wxString source = m_source;
	
	node->AddChild(GetTextNode("language", m_language));
	source.Prepend("\n");
	node->AddChild(GetTextNode("source", source));
	
	return node;
}

/*
 * Editor
 */
DBProcedureEditor::DBProcedureEditor(DBObject *object, bool edit)
	: DBObjectEditor(_("Procedure"), wxSize(500,400), object, edit)
{
	DBServer	*server;
	
	server = GetObject()->GetProject()->GetServer();
	new wxStaticText(m_page_general, -1, _("Language"), wxPoint(10,60), wxSize(80,-1), wxALIGN_RIGHT);
	c2 = new wxComboBox(m_page_general, -1, wxEmptyString, wxPoint(100,60), wxSize(100,-1),
		server->GetLanguagesCount(), server->GetLanguages(), wxCB_SORT | wxCB_READONLY);
	
	wxPanel *m_page_source = new wxPanel(m_notebook);
	
	t1 = new wxTextCtrl(m_page_source, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_PROCESS_TAB);
	
	wxLayoutConstraints *c = new wxLayoutConstraints;
	c->top.SameAs	(m_page_source, wxTop);
	c->left.SameAs	(m_page_source, wxLeft);
	c->right.SameAs	(m_page_source, wxRight);
	c->bottom.SameAs(m_page_source, wxBottom);
	t1->SetConstraints(c);
	
	m_page_source->SetAutoLayout(TRUE);
	
	m_notebook->InsertPage(m_notebook->GetPageCount() - 1, m_page_source, _("Source code"));
}

DBProcedureEditor::~DBProcedureEditor()
{
}

bool DBProcedureEditor::TransferDataFromWindow()
{
	DBProcedure	*object = (DBProcedure *)GetObject();

	DBObjectEditor::TransferDataFromWindow();

	object->m_language	= c2->GetValue();
	object->m_source	= t1->GetValue();

	return TRUE;
}

bool DBProcedureEditor::TransferDataToWindow()
{
	DBProcedure	*object = (DBProcedure *)GetObject();
	
	DBObjectEditor::TransferDataToWindow();

	c2->SetValue(object->m_language);
	t1->SetValue(object->m_source);
	
	return TRUE;
}

/*
 * Container
 */
DBProcedureContainer::DBProcedureContainer(DataDesignerProject *project, const wxTreeItemId& parent)
	: DataDesignerContainer(project, parent, "procedures")
{
}

DBObject *DBProcedureContainer::CreateObject()
{
	return new DBProcedure(GetProject(), this);
}

void DBProcedureContainer::ShowList()
{
	SetList(new DBProcedureListCtrl(GetProject()->GetSplitter(), this));
	
	DataDesignerContainer::AddObjectsToListAndShow();
}

/*
 * ObjectList
 */
DBProcedureListCtrl::DBProcedureListCtrl(wxWindow *parent, DataDesignerContainer *container)
	: DBObjectListCtrl(parent, container)
{
}

DBProcedureListCtrl::~DBProcedureListCtrl()
{
}

void DBProcedureListCtrl::SetObject(long item, DBObject *object)
{
	DBProcedure *procedure = (DBProcedure *)object;
}


syntax highlighted by Code2HTML, v. 0.9.1