mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 18:23:15 +02:00
* fixed a bug in hierarchal shematics where a loop (e.g. same file included at different points in the hierarchy) would cause infinite memory use. * added a edit footprint hotkey to eeschema, since it seems I'm always editing '0603' '0402' etc. on the common components, and it was difficult to edit this information before.
904 lines
29 KiB
C++
904 lines
29 KiB
C++
/********************************/
|
||
/* Scehematic component edition */
|
||
/********************************/
|
||
|
||
#include "fctsys.h"
|
||
#include "gr_basic.h"
|
||
|
||
#include "common.h"
|
||
#include "program.h"
|
||
#include "libcmp.h"
|
||
#include "general.h"
|
||
|
||
#include "wx/checklst.h"
|
||
|
||
#include "protos.h"
|
||
|
||
|
||
/* Fonctions exportees */
|
||
|
||
/* Fonctions locales */
|
||
static void AbortMoveCmpField( WinEDA_DrawPanel* Panel, wxDC* DC );
|
||
static void MoveCmpField( WinEDA_DrawPanel* panel, wxDC* DC, bool erase );
|
||
|
||
/* variables locales */
|
||
static PartTextStruct* CurrentField;
|
||
static int Multiflag;
|
||
static int TextFieldSize = DEFAULT_SIZE_TEXT;
|
||
static wxPoint OldPos;
|
||
|
||
|
||
/************************************/
|
||
/* class WinEDA_PartPropertiesFrame */
|
||
/************************************/
|
||
#define ID_ON_SELECT_FIELD 3000
|
||
|
||
#include "dialog_edit_component_in_schematic.cpp"
|
||
|
||
/**********************************************************************/
|
||
void InstallCmpeditFrame( WinEDA_SchematicFrame* parent, wxPoint& pos,
|
||
EDA_SchComponentStruct* cmp )
|
||
/*********************************************************************/
|
||
|
||
/* Create the dialog box for the current component edition
|
||
*/
|
||
{
|
||
parent->DrawPanel->m_IgnoreMouseEvents = TRUE;
|
||
if( cmp->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
|
||
{
|
||
DisplayError( parent,
|
||
wxT( "InstallCmpeditFrame() error: This struct is not a component" ) );
|
||
}
|
||
else
|
||
{
|
||
WinEDA_ComponentPropertiesFrame* frame =
|
||
new WinEDA_ComponentPropertiesFrame( parent, cmp );
|
||
frame->ShowModal();
|
||
frame->Destroy();
|
||
}
|
||
|
||
parent->DrawPanel->MouseToCursorSchema();
|
||
parent->DrawPanel->m_IgnoreMouseEvents = FALSE;
|
||
}
|
||
|
||
|
||
/*****************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::InitBuffers()
|
||
/*****************************************************/
|
||
|
||
/* Init the buffers to a default value,
|
||
* or to values from Component!= NULL
|
||
*/
|
||
{
|
||
int ii;
|
||
|
||
m_CurrentFieldId = REFERENCE;
|
||
|
||
/* Init default values */
|
||
for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ )
|
||
{
|
||
m_FieldSize[ii] = DEFAULT_SIZE_TEXT;
|
||
m_FieldFlags[ii] = 1;
|
||
m_FieldOrient[ii] = 0;
|
||
}
|
||
|
||
if( m_Cmp == NULL )
|
||
return;
|
||
|
||
for( ii = REFERENCE; ii < NUMBER_OF_FIELDS; ii++ )
|
||
{
|
||
m_FieldName[ii] = m_Cmp->ReturnFieldName( ii );
|
||
m_FieldText[ii] = m_Cmp->m_Field[ii].m_Text;
|
||
m_FieldSize[ii] = m_Cmp->m_Field[ii].m_Size.x;
|
||
m_FieldFlags[ii] =
|
||
(m_Cmp->m_Field[ii].m_Attributs & TEXT_NO_VISIBLE) ? 0 : 1;
|
||
m_FieldOrient[ii] = m_Cmp->m_Field[ii].m_Orient == TEXT_ORIENT_VERT ? 1 : 0;
|
||
|
||
if( m_Cmp->m_Field[ii].m_Text.IsEmpty() )
|
||
continue;
|
||
|
||
// These values have meaning only if this field is not void:
|
||
m_FieldPosition[ii] = m_Cmp->m_Field[ii].m_Pos;
|
||
m_FieldPosition[ii].x -= m_Cmp->m_Pos.x;
|
||
m_FieldPosition[ii].y -= m_Cmp->m_Pos.y;
|
||
}
|
||
}
|
||
|
||
|
||
/****************************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::CopyDataToPanelField()
|
||
/****************************************************************/
|
||
|
||
/* Set the values displayed on the panel field according to
|
||
* the current field number
|
||
*/
|
||
{
|
||
int fieldId = m_CurrentFieldId;
|
||
|
||
for( int ii = FIELD1; ii < NUMBER_OF_FIELDS; ii++ )
|
||
m_FieldSelection->SetString( ii, m_FieldName[ii] );
|
||
|
||
if( fieldId == VALUE && m_LibEntry && m_LibEntry->m_Options == ENTRY_POWER )
|
||
m_FieldTextCtrl->Enable( FALSE );
|
||
|
||
if( m_FieldFlags[fieldId] )
|
||
m_ShowFieldTextCtrl->SetValue( TRUE );
|
||
else
|
||
m_ShowFieldTextCtrl->SetValue( FALSE );
|
||
|
||
// If the field value is empty and the position is zero, we set the
|
||
// initial position as a small offset from the ref field, and orient
|
||
// it the same as the ref field. That is likely to put it at least
|
||
// close to the desired position.
|
||
if( ( m_FieldPosition[fieldId] == wxPoint( 0, 0 ) )
|
||
&& m_FieldText[fieldId].IsEmpty() )
|
||
{
|
||
m_VorientFieldText->SetValue( m_FieldOrient[REFERENCE] != 0 );
|
||
m_FieldPositionCtrl->SetValue( m_FieldPosition[REFERENCE].x + 100,
|
||
m_FieldPosition[REFERENCE].y + 100 );
|
||
}
|
||
else
|
||
{
|
||
m_FieldPositionCtrl->SetValue( m_FieldPosition[fieldId].x, m_FieldPosition[fieldId].y );
|
||
m_VorientFieldText->SetValue( m_FieldOrient[fieldId] != 0 );
|
||
}
|
||
|
||
m_FieldNameCtrl->SetValue( m_FieldName[fieldId] );
|
||
if( fieldId < FIELD1 )
|
||
m_FieldNameCtrl->Enable( FALSE );
|
||
else
|
||
m_FieldNameCtrl->Enable( TRUE );
|
||
m_FieldTextCtrl->SetValue( m_FieldText[fieldId] );
|
||
m_FieldTextCtrl->SetValue( m_FieldSize[fieldId] );
|
||
}
|
||
|
||
|
||
/****************************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::CopyPanelFieldToData()
|
||
/****************************************************************/
|
||
|
||
/* Copy the values displayed on the panel field to the buffers according to
|
||
* the current field number
|
||
*/
|
||
{
|
||
int id = m_CurrentFieldId;
|
||
|
||
m_FieldFlags[id] = m_ShowFieldTextCtrl->GetValue();
|
||
m_FieldOrient[id] = m_VorientFieldText->GetValue();
|
||
m_FieldText[id] = m_FieldTextCtrl->GetText();
|
||
m_FieldName[id] = m_FieldNameCtrl->GetValue();
|
||
m_FieldPosition[id] = m_FieldPositionCtrl->GetValue();
|
||
m_FieldSize[id] = m_FieldTextCtrl->GetTextSize();
|
||
}
|
||
|
||
|
||
/*************************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::BuildPanelFields()
|
||
/*************************************************************/
|
||
{
|
||
int ii, FieldId;
|
||
wxPoint field_pos;
|
||
|
||
m_CurrentFieldId = FieldId = REFERENCE;
|
||
|
||
// Create the box field selection:
|
||
wxString fieldnamelist[NUMBER_OF_FIELDS];
|
||
for( ii = 0; ii < NUMBER_OF_FIELDS; ii++ )
|
||
{
|
||
if( m_FieldName[ii].IsEmpty() )
|
||
fieldnamelist[ii] = ReturnDefaultFieldName( ii );
|
||
else
|
||
fieldnamelist[ii] = m_FieldName[ii];
|
||
}
|
||
|
||
m_FieldSelection = new wxRadioBox( m_PanelField, ID_ON_SELECT_FIELD,
|
||
_( "Field to edit" ), wxDefaultPosition, wxDefaultSize,
|
||
NUMBER_OF_FIELDS, fieldnamelist, 2, wxRA_SPECIFY_COLS );
|
||
m_FieldSelectionBoxSizer->Add( m_FieldSelection, 0, wxGROW | wxALL, 5 );
|
||
|
||
// Create the box for field name display
|
||
m_FieldNameCtrl = new WinEDA_EnterText( m_PanelField,
|
||
_( "Field Name:" ), m_FieldName[FieldId],
|
||
m_FieldDatasBoxSizer, wxSize( 200, -1 ) );
|
||
if( FieldId < FIELD1 )
|
||
m_FieldNameCtrl->Enable( FALSE );
|
||
else
|
||
m_FieldNameCtrl->Enable( TRUE );
|
||
|
||
// Create the box for text editing (text, size)
|
||
m_FieldTextCtrl = new WinEDA_GraphicTextCtrl( m_PanelField,
|
||
_(
|
||
"Field Text:" ),
|
||
m_FieldText[FieldId],
|
||
m_FieldSize[FieldId],
|
||
g_UnitMetric,
|
||
m_FieldDatasBoxSizer, 200,
|
||
m_Parent->m_InternalUnits );
|
||
|
||
// Create the box for text editing (position)
|
||
m_FieldPositionCtrl = new WinEDA_PositionCtrl( m_PanelField, _( "Pos" ),
|
||
m_FieldPosition[FieldId],
|
||
g_UnitMetric,
|
||
m_FieldDatasBoxSizer,
|
||
m_Parent->m_InternalUnits );
|
||
|
||
CopyDataToPanelField();
|
||
}
|
||
|
||
|
||
/**********************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::BuildPanelBasic()
|
||
/**********************************************************/
|
||
|
||
/* create the basic panel for component properties editing
|
||
*/
|
||
{
|
||
int Nb_Max_Unit = m_SelectUnit->GetCount();
|
||
int ii;
|
||
|
||
int nb_units = m_LibEntry ? MAX( m_LibEntry->m_UnitCount, 1 ) : 0;
|
||
|
||
// Disable non existant units selection buttons
|
||
for( ii = nb_units; ii < Nb_Max_Unit; ii++ )
|
||
{
|
||
m_SelectUnit->Enable( ii, FALSE );
|
||
}
|
||
|
||
if( m_Cmp->m_Multi <= Nb_Max_Unit )
|
||
m_SelectUnit->SetSelection( m_Cmp->m_Multi - 1 );
|
||
|
||
ii = m_Cmp->GetRotationMiroir() & ~(CMP_MIROIR_X | CMP_MIROIR_Y);
|
||
|
||
if( ii == CMP_ORIENT_90 )
|
||
m_OrientUnit->SetSelection( 1 );
|
||
else if( ii == CMP_ORIENT_180 )
|
||
m_OrientUnit->SetSelection( 2 );
|
||
else if( ii == CMP_ORIENT_270 )
|
||
m_OrientUnit->SetSelection( 3 );
|
||
|
||
ii = m_Cmp->GetRotationMiroir() & (CMP_MIROIR_X | CMP_MIROIR_Y);
|
||
if( ii == CMP_MIROIR_X )
|
||
m_MirrorUnit->SetSelection( 1 );
|
||
else if( ii == CMP_MIROIR_Y )
|
||
m_MirrorUnit->SetSelection( 2 );
|
||
|
||
// Positionnement de la selection normal/convert
|
||
if( m_Cmp->m_Convert > 1 )
|
||
m_ConvertButt->SetValue( TRUE );
|
||
|
||
if( (m_LibEntry == NULL) || LookForConvertPart( m_LibEntry ) <= 1 )
|
||
{
|
||
m_ConvertButt->Enable( FALSE );
|
||
}
|
||
|
||
// Show the "Parts Locked" option:
|
||
if( !m_LibEntry || !m_LibEntry->m_UnitSelectionLocked )
|
||
{
|
||
m_MsgPartLocked->Show( false );
|
||
}
|
||
|
||
// Positionnement de la reference en librairie
|
||
m_RefInLib->SetValue( m_Cmp->m_ChipName );
|
||
}
|
||
|
||
|
||
/*************************************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::SelectNewField( wxCommandEvent& event )
|
||
/*************************************************************************/
|
||
|
||
/* called when changing the current field selected
|
||
* Save the current field settings in buffer and display the new one
|
||
*/
|
||
{
|
||
CopyPanelFieldToData();
|
||
m_CurrentFieldId = m_FieldSelection->GetSelection();
|
||
CopyDataToPanelField();
|
||
}
|
||
|
||
|
||
/***********************************************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::ComponentPropertiesAccept( wxCommandEvent& event )
|
||
/***********************************************************************************/
|
||
|
||
/* Update the new parameters for the current edited component
|
||
*/
|
||
{
|
||
wxPoint cmp_pos = m_Cmp->m_Pos;
|
||
wxClientDC dc( m_Parent->DrawPanel );
|
||
wxString newname;
|
||
|
||
/* save old cmp in undo list if not already in edit, or moving ... */
|
||
if( m_Cmp->m_Flags == 0 )
|
||
m_Parent->SaveCopyInUndoList( m_Cmp, IS_CHANGED );
|
||
|
||
CopyPanelFieldToData();
|
||
|
||
m_Parent->DrawPanel->PrepareGraphicContext( &dc );
|
||
|
||
|
||
RedrawOneStruct( m_Parent->DrawPanel, &dc, m_Cmp, g_XorMode );
|
||
|
||
newname = m_RefInLib->GetValue();
|
||
newname.MakeUpper();
|
||
newname.Replace( wxT( " " ), wxT( "_" ) );
|
||
|
||
if( newname.IsEmpty() )
|
||
DisplayError( this, _( "No Component Name!" ) );
|
||
else if( newname.CmpNoCase( m_Cmp->m_ChipName ) )
|
||
{
|
||
if( FindLibPart( newname.GetData(), wxEmptyString, FIND_ALIAS ) == NULL )
|
||
{
|
||
wxString msg;
|
||
msg.Printf( _( "Component [%s] not found!" ), newname.GetData() );
|
||
DisplayError( this, msg );
|
||
}
|
||
else // Changement de composant!
|
||
{
|
||
m_Cmp->m_ChipName = newname;
|
||
}
|
||
}
|
||
|
||
// Mise a jour de la representation:
|
||
if( m_ConvertButt->IsEnabled() )
|
||
(m_ConvertButt->GetValue() == TRUE) ?
|
||
m_Cmp->m_Convert = 2 : m_Cmp->m_Convert = 1;
|
||
|
||
//Mise a jour de la selection de l'<27>l<EFBFBD>ment dans le boitier
|
||
if( m_Cmp->m_Multi )
|
||
m_Cmp->m_Multi = m_SelectUnit->GetSelection() + 1;
|
||
|
||
//Mise a jour de l'orientation:
|
||
switch( m_OrientUnit->GetSelection() )
|
||
{
|
||
case 0:
|
||
m_Cmp->SetRotationMiroir( CMP_ORIENT_0 );
|
||
break;
|
||
|
||
case 1:
|
||
m_Cmp->SetRotationMiroir( CMP_ORIENT_90 );
|
||
break;
|
||
|
||
case 2:
|
||
m_Cmp->SetRotationMiroir( CMP_ORIENT_180 );
|
||
break;
|
||
|
||
case 3:
|
||
m_Cmp->SetRotationMiroir( CMP_ORIENT_270 );
|
||
break;
|
||
}
|
||
|
||
switch( m_MirrorUnit->GetSelection() )
|
||
{
|
||
case 0:
|
||
break;
|
||
|
||
case 1:
|
||
m_Cmp->SetRotationMiroir( CMP_MIROIR_X );
|
||
break;
|
||
|
||
case 2:
|
||
m_Cmp->SetRotationMiroir( CMP_MIROIR_Y );
|
||
break;
|
||
}
|
||
|
||
|
||
// Mise a jour des textes
|
||
for( int ii = REFERENCE; ii < NUMBER_OF_FIELDS; ii++ )
|
||
{
|
||
if( ii == REFERENCE ) // la reference ne peut etre vide
|
||
{
|
||
if( !m_FieldText[ii].IsEmpty() )
|
||
m_Cmp->m_Field[ii].m_Text = m_FieldText[ii];
|
||
}
|
||
else if( ii == VALUE ) // la valeur ne peut etre vide et ne peut etre change sur un POWER
|
||
{
|
||
EDA_LibComponentStruct* Entry = FindLibPart( m_Cmp->m_ChipName.GetData(
|
||
), wxEmptyString, FIND_ROOT );
|
||
if( Entry && (Entry->m_Options == ENTRY_POWER) )
|
||
m_Cmp->m_Field[ii].m_Text = m_Cmp->m_ChipName;
|
||
else if( !m_FieldText[ii].IsEmpty() )
|
||
{
|
||
m_Cmp->m_Field[ii].m_Text = m_FieldText[ii];
|
||
}
|
||
}
|
||
else
|
||
m_Cmp->m_Field[ii].m_Text = m_FieldText[ii];
|
||
|
||
if( ii >= FIELD1 && m_FieldName[ii] != ReturnDefaultFieldName( ii ) )
|
||
m_Cmp->m_Field[ii].m_Name = m_FieldName[ii];
|
||
else
|
||
m_Cmp->m_Field[ii].m_Name.Empty();
|
||
|
||
m_Cmp->m_Field[ii].m_Size.x =
|
||
m_Cmp->m_Field[ii].m_Size.y = m_FieldSize[ii];
|
||
if( m_FieldFlags[ii] )
|
||
m_Cmp->m_Field[ii].m_Attributs &= ~TEXT_NO_VISIBLE;
|
||
else
|
||
m_Cmp->m_Field[ii].m_Attributs |= TEXT_NO_VISIBLE;
|
||
m_Cmp->m_Field[ii].m_Orient = m_FieldOrient[ii] ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ;
|
||
m_Cmp->m_Field[ii].m_Pos = m_FieldPosition[ii];
|
||
m_Cmp->m_Field[ii].m_Pos.x += cmp_pos.x;
|
||
m_Cmp->m_Field[ii].m_Pos.y += cmp_pos.y;
|
||
}
|
||
|
||
m_Parent->m_CurrentScreen->SetModify();
|
||
|
||
RedrawOneStruct( m_Parent->DrawPanel, &dc, m_Cmp, GR_DEFAULT_DRAWMODE );
|
||
m_Parent->TestDanglingEnds( m_Parent->m_CurrentScreen->EEDrawList, &dc );
|
||
|
||
EndModal( 0 );
|
||
}
|
||
|
||
|
||
/************************************************************************************/
|
||
void WinEDA_SchematicFrame::StartMoveCmpField( PartTextStruct* Field, wxDC* DC )
|
||
/************************************************************************************/
|
||
|
||
/* Prepare le deplacement du texte en cours d'edition
|
||
*/
|
||
{
|
||
EDA_LibComponentStruct* Entry;
|
||
|
||
|
||
CurrentField = Field;
|
||
if( Field == NULL )
|
||
return;
|
||
|
||
if( Field->m_Text == wxEmptyString )
|
||
{
|
||
DisplayError( this, _( "No Field to move" ), 10 );
|
||
return;
|
||
}
|
||
|
||
wxPoint pos, newpos;
|
||
int x1, y1;
|
||
EDA_SchComponentStruct* Cmp = (EDA_SchComponentStruct*) CurrentField->m_Parent;
|
||
|
||
delete g_ItemToUndoCopy;
|
||
g_ItemToUndoCopy = Cmp->GenCopy();
|
||
|
||
pos = Cmp->m_Pos;
|
||
|
||
/* Les positions sont calculees par la matrice TRANSPOSEE de la matrice
|
||
* de rotation-miroir */
|
||
x1 = Field->m_Pos.x - pos.x;
|
||
y1 = Field->m_Pos.y - pos.y;
|
||
|
||
// Empirically this is necessary. The Y coordinate appears to be inverted
|
||
// under some circumstances, but that inversion is not preserved by all
|
||
// combinations of mirroring and rotation. The following clause is true
|
||
// when the number of rotations and the number of mirrorings are both odd.
|
||
if( Cmp->m_Transform[1][0] * Cmp->m_Transform[0][1] < 0 )
|
||
{
|
||
y1 = -y1;
|
||
}
|
||
newpos.x = pos.x + Cmp->m_Transform[0][0] * x1 + Cmp->m_Transform[1][0] * y1;
|
||
newpos.y = pos.y + Cmp->m_Transform[0][1] * x1 + Cmp->m_Transform[1][1] * y1;
|
||
|
||
DrawPanel->CursorOff( DC );
|
||
m_CurrentScreen->m_Curseur = newpos;
|
||
DrawPanel->MouseToCursorSchema();
|
||
|
||
OldPos = Field->m_Pos;
|
||
Multiflag = 0;
|
||
if( Field->m_FieldId == REFERENCE )
|
||
{
|
||
Entry = FindLibPart( Cmp->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
|
||
if( Entry != NULL )
|
||
{
|
||
if( Entry->m_UnitCount > 1 )
|
||
Multiflag = 1;
|
||
}
|
||
}
|
||
|
||
DrawPanel->ForceCloseManageCurseur = AbortMoveCmpField;
|
||
DrawPanel->ManageCurseur = MoveCmpField;
|
||
Field->m_Flags = IS_MOVED;
|
||
|
||
DrawPanel->CursorOn( DC );
|
||
}
|
||
|
||
|
||
/**********************************************************************************/
|
||
void WinEDA_SchematicFrame::EditCmpFieldText( PartTextStruct* Field, wxDC* DC )
|
||
/**********************************************************************************/
|
||
/* Edit the field Field (text, size) */
|
||
{
|
||
int FieldNumber, flag;
|
||
EDA_LibComponentStruct* Entry;
|
||
|
||
if( Field == NULL )
|
||
{
|
||
DisplayError( this, _( "No Field To Edit" ), 10 );
|
||
return;
|
||
}
|
||
|
||
EDA_SchComponentStruct* Cmp = (EDA_SchComponentStruct*) Field->m_Parent;
|
||
|
||
FieldNumber = Field->m_FieldId;
|
||
if( FieldNumber == VALUE )
|
||
{
|
||
Entry = FindLibPart( Cmp->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
|
||
if( Entry && (Entry->m_Options == ENTRY_POWER) )
|
||
{
|
||
DisplayInfo( this,
|
||
_(
|
||
"Part is a POWER, value cannot be modified!\nYou must create a new power" )
|
||
);
|
||
return;
|
||
}
|
||
}
|
||
|
||
flag = 0;
|
||
if( FieldNumber == REFERENCE )
|
||
{
|
||
Entry = FindLibPart( Cmp->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
|
||
if( Entry != NULL )
|
||
{
|
||
if( Entry->m_UnitCount > 1 )
|
||
flag = 1;
|
||
}
|
||
}
|
||
|
||
|
||
/* save old cmp in undo list if not already in edit, or moving ... */
|
||
if( Field->m_Flags == 0 )
|
||
SaveCopyInUndoList( Cmp, IS_CHANGED );
|
||
|
||
wxString newtext = Field->m_Text;
|
||
DrawPanel->m_IgnoreMouseEvents = TRUE;
|
||
Get_Message( Field->m_Name, newtext, this );
|
||
DrawPanel->MouseToCursorSchema();
|
||
DrawPanel->m_IgnoreMouseEvents = FALSE;
|
||
|
||
DrawTextField( DrawPanel, DC, Field, flag, g_XorMode );
|
||
|
||
if( !newtext.IsEmpty() )
|
||
{
|
||
if( Field->m_Text.IsEmpty() )
|
||
{
|
||
Field->m_Pos = Cmp->m_Pos;
|
||
Field->m_Size.x = Field->m_Size.y = TextFieldSize;
|
||
}
|
||
Field->m_Text = newtext;
|
||
}
|
||
else /* Nouveau texte NULL */
|
||
{
|
||
if( FieldNumber == REFERENCE )
|
||
{
|
||
DisplayError( this, _( "Reference needed !, No change" ) );
|
||
}
|
||
else if( FieldNumber == VALUE )
|
||
{
|
||
DisplayError( this, _( "Value needed !, No change" ) );
|
||
}
|
||
else
|
||
{
|
||
Field->m_Text = wxT( "~" );
|
||
}
|
||
}
|
||
|
||
DrawTextField( DrawPanel, DC, Field, flag, g_XorMode );
|
||
Cmp->Display_Infos( this );
|
||
m_CurrentScreen->SetModify();
|
||
}
|
||
|
||
|
||
/************************************************************************/
|
||
static void MoveCmpField( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
|
||
/************************************************************************/
|
||
|
||
/* Routine de deplacement d'un texte type Field.
|
||
* Celle routine est normalement attachee au deplacement du curseur
|
||
*/
|
||
{
|
||
wxPoint pos;
|
||
int x1, y1;
|
||
int FieldNumber;
|
||
|
||
if( CurrentField == NULL )
|
||
return;
|
||
|
||
EDA_SchComponentStruct* Cmp = (EDA_SchComponentStruct*) CurrentField->m_Parent;
|
||
FieldNumber = CurrentField->m_FieldId;
|
||
|
||
/* Effacement: */
|
||
if( erase )
|
||
DrawTextField( panel, DC, CurrentField, Multiflag, g_XorMode );
|
||
|
||
pos = ( (EDA_SchComponentStruct*) CurrentField->m_Parent )->m_Pos;
|
||
|
||
/* Les positions sont caculees par la matrice TRANSPOSEE de la matrice
|
||
* de rotation-miroir */
|
||
x1 = panel->GetScreen()->m_Curseur.x - pos.x;
|
||
y1 = panel->GetScreen()->m_Curseur.y - pos.y;
|
||
CurrentField->m_Pos.x = pos.x + Cmp->m_Transform[0][0] * x1 + Cmp->m_Transform[1][0] * y1;
|
||
CurrentField->m_Pos.y = pos.y + Cmp->m_Transform[0][1] * x1 + Cmp->m_Transform[1][1] * y1;
|
||
|
||
DrawTextField( panel, DC, CurrentField, Multiflag, g_XorMode );
|
||
}
|
||
|
||
|
||
/******************************************************************/
|
||
static void AbortMoveCmpField( WinEDA_DrawPanel* Panel, wxDC* DC )
|
||
/******************************************************************/
|
||
{
|
||
Panel->ForceCloseManageCurseur = NULL;
|
||
Panel->ManageCurseur = NULL;
|
||
if( CurrentField )
|
||
{
|
||
DrawTextField( Panel, DC, CurrentField, Multiflag, g_XorMode );
|
||
CurrentField->m_Flags = 0;
|
||
CurrentField->m_Pos = OldPos;
|
||
DrawTextField( Panel, DC, CurrentField, Multiflag, GR_DEFAULT_DRAWMODE );
|
||
}
|
||
CurrentField = NULL;
|
||
delete g_ItemToUndoCopy; g_ItemToUndoCopy = NULL;
|
||
}
|
||
|
||
|
||
/*********************************************************************************/
|
||
void WinEDA_SchematicFrame::RotateCmpField( PartTextStruct* Field, wxDC* DC )
|
||
/*********************************************************************************/
|
||
{
|
||
int FieldNumber, flag;
|
||
EDA_LibComponentStruct* Entry;
|
||
|
||
if( Field == NULL )
|
||
return;
|
||
if( Field->m_Text == wxEmptyString )
|
||
return;
|
||
|
||
EDA_SchComponentStruct* Cmp = (EDA_SchComponentStruct*) Field->m_Parent;
|
||
|
||
FieldNumber = Field->m_FieldId;
|
||
flag = 0;
|
||
if( FieldNumber == REFERENCE )
|
||
{
|
||
Entry = FindLibPart( ( (EDA_SchComponentStruct*) Field->m_Parent )->m_ChipName.GetData(),
|
||
wxEmptyString, FIND_ROOT );
|
||
if( Entry != NULL )
|
||
{
|
||
if( Entry->m_UnitCount > 1 )
|
||
flag = 1;
|
||
}
|
||
}
|
||
|
||
/* save old cmp in undo list if not already in edit, or moving ... */
|
||
if( Field->m_Flags == 0 )
|
||
SaveCopyInUndoList( Cmp, IS_CHANGED );
|
||
|
||
DrawTextField( DrawPanel, DC, Field, flag, g_XorMode );
|
||
|
||
if( Field->m_Orient == TEXT_ORIENT_HORIZ )
|
||
Field->m_Orient = TEXT_ORIENT_VERT;
|
||
else
|
||
Field->m_Orient = TEXT_ORIENT_HORIZ;
|
||
DrawTextField( DrawPanel, DC, Field, flag, g_XorMode );
|
||
|
||
GetScreen()->SetModify();
|
||
}
|
||
|
||
|
||
/*********************************************************************/
|
||
void PartTextStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC )
|
||
/*********************************************************************/
|
||
{
|
||
int FieldNumber, flag;
|
||
EDA_LibComponentStruct* Entry;
|
||
|
||
frame->DrawPanel->ManageCurseur = NULL;
|
||
frame->DrawPanel->ForceCloseManageCurseur = NULL;
|
||
|
||
EDA_SchComponentStruct* Cmp = (EDA_SchComponentStruct*) m_Parent;
|
||
/* save old cmp in undo list */
|
||
if( g_ItemToUndoCopy && ( g_ItemToUndoCopy->Type() == Cmp->Type()) )
|
||
{
|
||
Cmp->SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy );
|
||
( (WinEDA_SchematicFrame*) frame )->SaveCopyInUndoList( Cmp, IS_CHANGED );
|
||
Cmp->SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy );
|
||
}
|
||
|
||
FieldNumber = m_FieldId;
|
||
flag = 0;
|
||
if( FieldNumber == REFERENCE )
|
||
{
|
||
Entry = FindLibPart( Cmp->m_ChipName.GetData(),
|
||
wxEmptyString, FIND_ROOT );
|
||
if( Entry != NULL )
|
||
{
|
||
if( Entry->m_UnitCount > 1 )
|
||
flag = 1;
|
||
}
|
||
}
|
||
|
||
DrawTextField( frame->DrawPanel, DC, this, flag, GR_DEFAULT_DRAWMODE );
|
||
m_Flags = 0;
|
||
frame->GetScreen()->SetCurItem( NULL );
|
||
frame->GetScreen()->SetModify();
|
||
CurrentField = NULL;
|
||
}
|
||
|
||
|
||
/**************************************************************************************************/
|
||
void WinEDA_SchematicFrame::EditComponentReference( EDA_SchComponentStruct* Cmp, wxDC* DC )
|
||
/**************************************************************************************************/
|
||
/* Edit the component text reference*/
|
||
{
|
||
wxString msg;
|
||
EDA_LibComponentStruct* Entry;
|
||
int flag = 0;
|
||
|
||
if( Cmp == NULL )
|
||
return;
|
||
|
||
Entry = FindLibPart( Cmp->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
|
||
if( Entry == NULL )
|
||
return;
|
||
|
||
if( Entry->m_UnitCount > 1 )
|
||
flag = 1;
|
||
|
||
PartTextStruct* TextField = &Cmp->m_Field[REFERENCE];
|
||
|
||
msg = TextField->m_Text;
|
||
Get_Message( _( "Reference" ), msg, this );
|
||
|
||
if( !msg.IsEmpty() ) // New text entered
|
||
{
|
||
/* save old cmp in undo list if not already in edit, or moving ... */
|
||
if( Cmp->m_Flags == 0 )
|
||
SaveCopyInUndoList( Cmp, IS_CHANGED );
|
||
|
||
DrawTextField( DrawPanel, DC, &Cmp->m_Field[REFERENCE], flag, g_XorMode );
|
||
TextField->m_Text = msg;
|
||
DrawTextField( DrawPanel, DC, &Cmp->m_Field[REFERENCE], flag,
|
||
Cmp->m_Flags ? g_XorMode : GR_DEFAULT_DRAWMODE );
|
||
GetScreen()->SetModify();
|
||
}
|
||
Cmp->Display_Infos( this );
|
||
}
|
||
|
||
|
||
/*****************************************************************************************/
|
||
void WinEDA_SchematicFrame::EditComponentValue( EDA_SchComponentStruct* Cmp, wxDC* DC )
|
||
/*****************************************************************************************/
|
||
/* Routine de changement du texte selectionne */
|
||
{
|
||
wxString msg;
|
||
EDA_LibComponentStruct* Entry;
|
||
int flag = 0;
|
||
|
||
if( Cmp == NULL )
|
||
return;
|
||
|
||
Entry = FindLibPart( Cmp->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
|
||
if( Entry == NULL )
|
||
return;
|
||
if( Entry->m_UnitCount > 1 )
|
||
flag = 1;
|
||
|
||
PartTextStruct* TextField = &Cmp->m_Field[VALUE];
|
||
|
||
msg = TextField->m_Text;
|
||
if( Get_Message( _( "Value" ), msg, this ) )
|
||
msg.Empty(); //allow the user to remove the value.
|
||
|
||
if( !msg.IsEmpty() && !msg.IsEmpty())
|
||
{
|
||
/* save old cmp in undo list if not already in edit, or moving ... */
|
||
if( Cmp->m_Flags == 0 )
|
||
SaveCopyInUndoList( Cmp, IS_CHANGED );
|
||
|
||
DrawTextField( DrawPanel, DC, &Cmp->m_Field[VALUE], flag, g_XorMode );
|
||
TextField->m_Text = msg;
|
||
DrawTextField( DrawPanel, DC, &Cmp->m_Field[VALUE], flag,
|
||
Cmp->m_Flags ? g_XorMode : GR_DEFAULT_DRAWMODE );
|
||
m_CurrentScreen->SetModify();
|
||
}
|
||
|
||
Cmp->Display_Infos( this );
|
||
}
|
||
|
||
/*****************************************************************************************/
|
||
void WinEDA_SchematicFrame::EditComponentFootprint( EDA_SchComponentStruct* Cmp, wxDC* DC )
|
||
/*****************************************************************************************/
|
||
{
|
||
wxString msg;
|
||
EDA_LibComponentStruct* Entry;
|
||
int flag = 0;
|
||
bool wasEmpty = false;
|
||
|
||
if( Cmp == NULL )
|
||
return;
|
||
|
||
Entry = FindLibPart( Cmp->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
|
||
if( Entry == NULL )
|
||
return;
|
||
if( Entry->m_UnitCount > 1 )
|
||
flag = 1;
|
||
|
||
PartTextStruct* TextField = &Cmp->m_Field[FOOTPRINT];
|
||
|
||
msg = TextField->m_Text;
|
||
if(msg.IsEmpty() )
|
||
wasEmpty = true;
|
||
if( Get_Message( _( "Footprint" ), msg, this ) )
|
||
msg.Empty(); //allow the user to remove the value.
|
||
|
||
/* save old cmp in undo list if not already in edit, or moving ... */
|
||
if( Cmp->m_Flags == 0 )
|
||
SaveCopyInUndoList( Cmp, IS_CHANGED );
|
||
DrawTextField( DrawPanel, DC, &Cmp->m_Field[FOOTPRINT], flag, g_XorMode );
|
||
//move the field if it was new.
|
||
if(wasEmpty && !msg.IsEmpty())
|
||
{
|
||
Cmp->m_Field[FOOTPRINT].m_Pos = Cmp->m_Field[REFERENCE].m_Pos;
|
||
//add offset here - ? suitable heuristic below?
|
||
Cmp->m_Field[FOOTPRINT].m_Pos.x +=
|
||
(Cmp->m_Field[REFERENCE].m_Pos.x - Cmp->m_Pos.x) > 0 ?
|
||
(Cmp->m_Field[REFERENCE].m_Size.x) : (-1*Cmp->m_Field[REFERENCE].m_Size.x);
|
||
Cmp->m_Field[FOOTPRINT].m_Pos.y +=
|
||
(Cmp->m_Field[REFERENCE].m_Pos.y - Cmp->m_Pos.y) > 0 ?
|
||
(Cmp->m_Field[REFERENCE].m_Size.y) : (-1*Cmp->m_Field[REFERENCE].m_Size.y);
|
||
|
||
Cmp->m_Field[FOOTPRINT].m_Orient = Cmp->m_Field[REFERENCE].m_Orient;
|
||
}
|
||
TextField->m_Text = msg;
|
||
|
||
DrawTextField( DrawPanel, DC, &Cmp->m_Field[FOOTPRINT], flag,
|
||
Cmp->m_Flags ? g_XorMode : GR_DEFAULT_DRAWMODE );
|
||
m_CurrentScreen->SetModify();
|
||
|
||
Cmp->Display_Infos( this );
|
||
}
|
||
/*****************************************************************************/
|
||
void WinEDA_ComponentPropertiesFrame::SetInitCmp( wxCommandEvent& event )
|
||
/*****************************************************************************/
|
||
|
||
/* Replace le composant en position normale, dimensions et positions
|
||
* fields comme definies en librairie
|
||
*/
|
||
{
|
||
EDA_LibComponentStruct* Entry;
|
||
|
||
if( m_Cmp == NULL )
|
||
return;
|
||
|
||
Entry = FindLibPart( m_Cmp->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
|
||
|
||
if( Entry == NULL )
|
||
return;
|
||
|
||
wxClientDC dc( m_Parent->DrawPanel );
|
||
m_Parent->DrawPanel->PrepareGraphicContext( &dc );
|
||
|
||
RedrawOneStruct( m_Parent->DrawPanel, &dc, m_Cmp, g_XorMode );
|
||
|
||
/* Mise aux valeurs par defaut des champs et orientation */
|
||
m_Cmp->m_Field[REFERENCE].m_Pos.x =
|
||
Entry->m_Prefix.m_Pos.x + m_Cmp->m_Pos.x;
|
||
m_Cmp->m_Field[REFERENCE].m_Pos.y =
|
||
Entry->m_Prefix.m_Pos.y + m_Cmp->m_Pos.y;
|
||
m_Cmp->m_Field[REFERENCE].m_Orient = Entry->m_Prefix.m_Orient;
|
||
m_Cmp->m_Field[REFERENCE].m_Size = Entry->m_Prefix.m_Size;
|
||
m_Cmp->m_Field[REFERENCE].m_HJustify = Entry->m_Prefix.m_HJustify;
|
||
m_Cmp->m_Field[REFERENCE].m_VJustify = Entry->m_Prefix.m_VJustify;
|
||
|
||
m_Cmp->m_Field[VALUE].m_Pos.x =
|
||
Entry->m_Name.m_Pos.x + m_Cmp->m_Pos.x;
|
||
m_Cmp->m_Field[VALUE].m_Pos.y =
|
||
Entry->m_Name.m_Pos.y + m_Cmp->m_Pos.y;
|
||
m_Cmp->m_Field[VALUE].m_Orient = Entry->m_Name.m_Orient;
|
||
m_Cmp->m_Field[VALUE].m_Size = Entry->m_Name.m_Size;
|
||
m_Cmp->m_Field[VALUE].m_HJustify = Entry->m_Name.m_HJustify;
|
||
m_Cmp->m_Field[VALUE].m_VJustify = Entry->m_Name.m_VJustify;
|
||
|
||
m_Cmp->SetRotationMiroir( CMP_NORMAL );
|
||
|
||
m_Parent->m_CurrentScreen->SetModify();
|
||
|
||
RedrawOneStruct( m_Parent->DrawPanel, &dc, m_Cmp, GR_DEFAULT_DRAWMODE );
|
||
EndModal( 1 );
|
||
}
|