/***********************************************************************/
/* Methodes de base de gestion des classes des elements de schematique */
/***********************************************************************/

#include "fctsys.h"
#include "gr_basic.h"

#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"
#include "id.h"

#include "protos.h"



/*******************************************************************/
DrawBusEntryStruct::DrawBusEntryStruct(const wxPoint & pos, int shape, int id) :
					EDA_BaseStruct(DRAW_BUSENTRY_STRUCT_TYPE)
/*******************************************************************/
{

	m_Pos = pos;
	m_Size.x = 100;
	m_Size.y = 100;
	m_Layer = LAYER_WIRE;
	m_Width = 0;

	if( id == BUS_TO_BUS )
		{
		m_Layer = LAYER_BUS;
		m_Width = 1;
		}

	if(shape == '/' ) m_Size.y = - 100;

}


/*************************************/
wxPoint DrawBusEntryStruct::m_End(void)
/*************************************/
// retourne la coord de fin du raccord
{
	return ( wxPoint(m_Pos.x + m_Size.x, m_Pos.y + m_Size.y) );
}

/***************************************************/
DrawBusEntryStruct * DrawBusEntryStruct::GenCopy(void)
/***************************************************/
{
DrawBusEntryStruct * newitem = new DrawBusEntryStruct(m_Pos,0,0);

	newitem->m_Layer = m_Layer;
	newitem->m_Width = m_Width;
	newitem->m_Size = m_Size;
	newitem->m_Flags = m_Flags;

	return newitem;
}


	/****************************/
	/* class DrawJunctionStruct */
	/***************************/

/************************************************************/
DrawJunctionStruct::DrawJunctionStruct(const wxPoint & pos) :
			EDA_BaseStruct(DRAW_JUNCTION_STRUCT_TYPE)
/************************************************************/
{
	m_Pos = pos;
	m_Layer = LAYER_JUNCTION;
}

DrawJunctionStruct * DrawJunctionStruct::GenCopy(void)
{
DrawJunctionStruct * newitem = new DrawJunctionStruct(m_Pos);

	newitem->m_Layer = m_Layer;
	newitem->m_Flags = m_Flags;

	return newitem;
}


	/*****************************/
	/* class DrawNoConnectStruct */
	/*****************************/

DrawNoConnectStruct::DrawNoConnectStruct(const wxPoint & pos) :
			EDA_BaseStruct(DRAW_NOCONNECT_STRUCT_TYPE)
{
	m_Pos = pos;
}

DrawNoConnectStruct * DrawNoConnectStruct::GenCopy(void)
{
DrawNoConnectStruct * newitem = new DrawNoConnectStruct(m_Pos);

	newitem->m_Flags = m_Flags;

	return newitem;
}


	/**************************/
	/* class DrawMarkerStruct */
	/**************************/

DrawMarkerStruct::DrawMarkerStruct( const wxPoint & pos, const wxString & text):
		EDA_BaseStruct(DRAW_MARKER_STRUCT_TYPE)
{
	m_Pos = pos;					/* XY coordinates of marker. */
	m_Type = MARQ_UNSPEC;
	m_MarkFlags = 0;				// complements d'information
	m_Comment = text;
}

DrawMarkerStruct::~DrawMarkerStruct(void)
{
}

DrawMarkerStruct * DrawMarkerStruct::GenCopy(void)
{
DrawMarkerStruct * newitem = new DrawMarkerStruct( m_Pos, m_Comment);
	newitem->m_Type = m_Type;
	newitem->m_MarkFlags = m_MarkFlags;

	return newitem;
}


wxString DrawMarkerStruct::GetComment(void)
{
	return m_Comment;
}


	/***************************/
	/* Class EDA_DrawLineStruct */
	/***************************/

EDA_DrawLineStruct::EDA_DrawLineStruct(const wxPoint & pos, int layer ):
			EDA_BaseLineStruct(NULL, DRAW_SEGMENT_STRUCT_TYPE)
{
	m_Start = pos;
	m_End = pos;
	m_StartIsDangling = m_EndIsDangling = FALSE;

	switch(layer)
	{
		default:
			m_Layer = LAYER_NOTES; /* Mettre ds Notes */
			m_Width = GR_NORM_WIDTH;
			break;

		case LAYER_WIRE:
			m_Layer = LAYER_WIRE;
			m_Width = GR_NORM_WIDTH;
			break;
		case LAYER_BUS:
			m_Layer = LAYER_BUS;
			m_Width = GR_THICK_WIDTH;
			break;
	}
}

/***************************************************/
EDA_DrawLineStruct * EDA_DrawLineStruct::GenCopy(void)
/***************************************************/
{
EDA_DrawLineStruct * newitem = new EDA_DrawLineStruct(m_Start, m_Layer);

	newitem->m_End = m_End;

	return newitem; 
}

/************************************************************/
bool EDA_DrawLineStruct::IsOneEndPointAt(const wxPoint & pos)
/************************************************************/
/* Return TRUE if the start or the end point is in position pos
*/
{
	if ( (pos.x == m_Start.x) && (pos.y == m_Start.y) ) return TRUE;
	if ( (pos.x == m_End.x) && (pos.y == m_End.y) ) return TRUE;
	return FALSE; 
}

	/****************************/
	/* Class DrawPolylineStruct */
	/****************************/

/***********************************************************/
DrawPolylineStruct::DrawPolylineStruct(int layer):
			EDA_BaseStruct(DRAW_POLYLINE_STRUCT_TYPE)
/***********************************************************/
{
	m_NumOfPoints = 0;			/* Number of XY pairs in Points array. */
	m_Points = NULL;			/* XY pairs that forms the polyline. */
	m_Width = GR_NORM_WIDTH;

	switch ( layer )
		{
		default:
			m_Layer = LAYER_NOTES;
			break;

		case LAYER_WIRE:
		case LAYER_NOTES:
			m_Layer = layer;
			break;

		case LAYER_BUS:
			m_Layer = layer;
			m_Width = GR_THICK_WIDTH;
			break;
		}
}


/********************************************/
DrawPolylineStruct::~DrawPolylineStruct(void)
/*********************************************/
{
	if ( m_Points ) free ( m_Points );
}

/*****************************************************/
DrawPolylineStruct * DrawPolylineStruct::GenCopy(void)
/*****************************************************/
{
int memsize;

DrawPolylineStruct * newitem =
		new DrawPolylineStruct( m_Layer );

	memsize = sizeof(int) * 2 * m_NumOfPoints;
	newitem->m_NumOfPoints = m_NumOfPoints;
	newitem->m_Points = (int *) MyZMalloc(memsize);
	memcpy ( newitem->m_Points, m_Points, memsize);

	return newitem;
}



