/////////////////////////////////////////////////////////////////////////////
// Name:        dbobject.h
// Purpose:     Database Objects
// Author:      Daniel Horak
// Modified by:
// RCS-ID:      $Id: dbobject.h,v 1.5 2004/01/04 18:32:16 horakdan Exp $
// Copyright:   (c) Daniel Horak
// Licence:     GPL
/////////////////////////////////////////////////////////////////////////////

#ifndef __DBOBJECT_H
#define __DBOBJECT_H

#include <wx/list.h>
#include <wx/listctrl.h>
#include "project.h"
#include "view.h"

// useful macros
#define BOOL2STR(expr)	((expr) ? _("Yes") : _("No"))

// id for misc buttons in DBObjectEditor and DBObjectList
#define ID_BUTTON_ADD           101
#define ID_BUTTON_EDIT          102
#define ID_BUTTON_DELETE        103
#define ID_BUTTON_COPYNAME      104
#define ID_BUTTON_MOVEUP        105
#define ID_BUTTON_MOVEDOWN      106

class wxXmlNode;
class wxXmlProperty;
class wxShape;

// Types of objects
enum DBObjectType {
	DBProjectType,
	DBDomainType,
	DBEntityType,
	DBViewType,
	DBSequenceType,
	DBRelationType,
	DBProcedureType,
	DBTriggerType,
	DBIndexType,
	DBConstraintType,
	DBTypeType,
	DBAttributeType,
	DBRelationAttrType,
	DBIndexAttrType,
	DBSimpleAttrType,
	DBModelType,
	DBModelEntityType,
	DBModelRelationType,
};

/*
 * --------------------------------------------------------------------------
 * Generic Database Object
 */
class DBObject : public wxObject
{
public:
	DBObject(DBObjectType type, const wxString& typestr, DataDesignerProject *project, DataDesignerContainer *container);
	
	virtual ~DBObject();
	
	DBObjectType GetType(void) { return m_type; }
	
	virtual wxDialog *Editor(bool edit) { return NULL; }	// create a dialog with editable controls for defining object
	
	virtual wxTreeItemId AppendItem();			// append object into tree
	virtual wxTreeItemId InsertItem(const wxTreeItemId& prev);	// append object into tree
	
	virtual void LoadXmlNode(wxXmlNode *node);		// fill object from XML node
	virtual wxXmlNode *GetXmlNode();			// create a XML node from object

	// utility methods for bool and text values
	void LoadTextNode(wxXmlNode *node, const wxString& name, wxString& value);
	wxXmlNode *GetTextNode(const wxString& name, const wxString& value);
	void LoadBoolNode(wxXmlNode *node, const wxString& name, bool& value, bool defval = FALSE);
	wxXmlNode *GetBoolNode(const wxString& name, const bool& value);
	void LoadBoolProperty(wxXmlNode *node, const wxString& name, bool& value, bool defval = FALSE);
	wxXmlProperty *GetBoolProperty(const wxString& name, const bool& value);
	
	bool IsA(DBObjectType type)		{ return type == m_type; }
	DataDesignerProject *GetProject()	{ return m_project; }
	wxString& GetName()			{ return m_name; }
	DataDesignerContainer *GetContainer()	{ return m_container; }
	
	void SetTreeItemId(const wxTreeItemId& id) { m_treeitemid = id; }
	wxTreeItemId GetTreeItemId()		{ return m_treeitemid; }
	
	wxShape *GetShape()			{ return m_shape; }
	virtual void CreateShape();				// create corresponding shape (and set m_shape)
	void CreatePName();					// create physical name from logical
	void CreateNextName();
	
	wxString	m_name;			// logical name
	wxString	m_pname;		// physical name
	wxString	m_desc;			// one line description
	wxString	m_remark;		// multi line remarks

private:
	DBObjectType	m_type;

protected:
	wxString	m_typestr;
	DataDesignerProject	*m_project;
	DataDesignerContainer	*m_container;
	wxTreeItemId	m_treeitemid;
	bool		m_appended;		// is appended into tree?
	wxShape		*m_shape;
};

WX_DECLARE_LIST(DBObject, DBObjectList);

/*
 * --------------------------------------------------------------------------
 * Editor for Generic Database Object
 */
class DBObjectEditor : public wxDialog
{
public:
	DBObjectEditor(const wxString& title, const wxSize& size, DBObject *object, bool edit);
	
	DBObject        *GetObject() { return m_object; }
	
	wxButton	*AddButton(wxWindowID id, const wxString& label, const wxSize& size);
	
	virtual bool	TransferDataFromWindow();
	virtual bool	TransferDataToWindow();
	
	virtual bool	Validate();

	virtual void	OnCopyName(wxCommandEvent& event);
	
private:
	DBObject        *m_object;
	int		m_button_x;
	
protected:
	wxPanel		*m_page_general;	// panel for user input
	wxPanel		*m_page_remark;		// panel for user input

	wxPanel		*m_panel_button;
	wxNotebook	*m_notebook;
	
	wxButton        *m_button_ok;
	wxButton        *m_button_cancel;
	wxButton        *m_button_apply;
	wxButton        *m_button_copyname;
	
	bool		m_edit;		// true = edit object, false = new object
	
	wxTextCtrl	*it1;		// logical name
	wxTextCtrl	*it2;		// description
	wxTextCtrl	*it3;		// remark
	wxTextCtrl	*it4;		// physical name

private:
	DECLARE_EVENT_TABLE();
};

/*
 * --------------------------------------------------------------------------
 * ListCtrl for DBObjects
 */
class DBObjectListCtrl : public wxPanel
{
public:
	DBObjectListCtrl(wxWindow *parent, DataDesignerContainer *container);
	virtual ~DBObjectListCtrl();
	
	void SetContainer(DataDesignerContainer *container) { m_container = container; }
	DataDesignerContainer *GetContainer() { return m_container; }
	
	// wrappers for listctrl
	long InsertColumn(long index, const wxString& heading);
	long InsertItem(long index, const wxString& label);
	bool SetColumnWidth(int col, int width);
	bool SetColumnTitle(int col, const wxString& title);
	bool SetItemData(long item, long data);
	long SetItem(long item, long col, const wxString& label);

	virtual void AddObject(long item, DBObject *object);
	virtual void SetObject(long item, DBObject *object) { };
	void SwapItems(long item1, long item2);

	void OnActivated(wxListEvent& event);
	void OnSelected(wxListEvent& event);
	void OnAdd(wxCommandEvent& event);
	void OnEdit(wxCommandEvent& event);
	void OnDelete(wxCommandEvent& event);
	void OnMoveUp(wxCommandEvent& event);
	void OnMoveDown(wxCommandEvent& event);
	
	void OnEditCommon();

protected:
	wxButton	*m_button_add;
	wxButton	*m_button_edit;
	wxButton	*m_button_delete;
	wxButton	*m_button_moveup;
	wxButton	*m_button_movedown;
	wxListCtrl	*m_list;
	long		m_current;
	
private:
	wxPanel		*m_bpanel;
	DataDesignerContainer	*m_container;
	
	DECLARE_EVENT_TABLE()
};

#endif // __DBOBJECT_H


syntax highlighted by Code2HTML, v. 0.9.1