Commit c759be6f authored by CHARRAS's avatar CHARRAS

eeschema: problems found. some (not all) solved (see changelog)

parent 36554e68
...@@ -5,6 +5,21 @@ Started 2007-June-11 ...@@ -5,6 +5,21 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2008-Feb-21 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+eeschema
added : full text conversion between text, label, global label and hierarchical label
some problems fixed:
- annotation incorrectly cleared.
- reference not copied in component copy.
- incorrect redo when changing the chip name in component edition
bugs not fixed
- undo/redo problems when changing a text type between text, label, global label and hierarchical label
- incorrect annotation in complex hierarchy with multi parts per package (duplicates created).
2008-Feb-20 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr> 2008-Feb-20 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================ ================================================================================
+eeschema +eeschema
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "macros.h" #include "macros.h"
#include <wx/arrimpl.cpp> #include <wx/arrimpl.cpp>
WX_DEFINE_OBJARRAY(ArrayOfSheetLists); WX_DEFINE_OBJARRAY( ArrayOfSheetLists );
/***************************/ /***************************/
/* class DrawPartStruct */ /* class DrawPartStruct */
/* class EDA_SchComponentStruct */ /* class EDA_SchComponentStruct */
...@@ -28,8 +28,8 @@ DrawPartStruct::DrawPartStruct( KICAD_T struct_type, const wxPoint& pos ) : ...@@ -28,8 +28,8 @@ DrawPartStruct::DrawPartStruct( KICAD_T struct_type, const wxPoint& pos ) :
EDA_BaseStruct( struct_type ) EDA_BaseStruct( struct_type )
/***********************************************************************************/ /***********************************************************************************/
{ {
m_Layer = 0; m_Layer = 0;
m_Pos = pos; m_Pos = pos;
m_TimeStamp = 0; m_TimeStamp = 0;
} }
...@@ -52,128 +52,145 @@ const wxString& ReturnDefaultFieldName( int aFieldNdx ) ...@@ -52,128 +52,145 @@ const wxString& ReturnDefaultFieldName( int aFieldNdx )
{ {
// avoid unnecessarily copying wxStrings at runtime. // avoid unnecessarily copying wxStrings at runtime.
static const wxString FieldDefaultNameList[] = { static const wxString FieldDefaultNameList[] = {
_( "Ref" ), /* Reference of part, i.e. "IC21" */ _( "Ref" ), /* Reference of part, i.e. "IC21" */
_( "Value" ), /* Value of part, i.e. "3.3K" */ _( "Value" ), /* Value of part, i.e. "3.3K" */
_( "Footprint" ), /* Footprint, used by cvpcb or pcbnew, i.e. "16DIP300" */ _( "Footprint" ), /* Footprint, used by cvpcb or pcbnew, i.e. "16DIP300" */
_( "Sheet" ), /* for components which are a schematic file, schematic file name, i.e. "cnt16.sch" */ _( "Sheet" ), /* for components which are a schematic file, schematic file name, i.e. "cnt16.sch" */
wxString(_( "Field" ))+wxT("1"), wxString( _( "Field" ) ) + wxT( "1" ),
wxString(_( "Field" ))+wxT("2"), wxString( _( "Field" ) ) + wxT( "2" ),
wxString(_( "Field" ))+wxT("3"), wxString( _( "Field" ) ) + wxT( "3" ),
wxString(_( "Field" ))+wxT("4"), wxString( _( "Field" ) ) + wxT( "4" ),
wxString(_( "Field" ))+wxT("5"), wxString( _( "Field" ) ) + wxT( "5" ),
wxString(_( "Field" ))+wxT("6"), wxString( _( "Field" ) ) + wxT( "6" ),
wxString(_( "Field" ))+wxT("7"), wxString( _( "Field" ) ) + wxT( "7" ),
wxString(_( "Field" ))+wxT("8"), wxString( _( "Field" ) ) + wxT( "8" ),
wxT( "badFieldNdx!" ) // error, and "sentinel" value wxT( "badFieldNdx!" ) // error, and "sentinel" value
}; };
if( (unsigned) aFieldNdx > FIELD8 ) // catches < 0 also if( (unsigned) aFieldNdx > FIELD8 ) // catches < 0 also
aFieldNdx = FIELD8+1; // return the sentinel text aFieldNdx = FIELD8 + 1; // return the sentinel text
return FieldDefaultNameList[aFieldNdx]; return FieldDefaultNameList[aFieldNdx];
} }
/****************************************************************/ /****************************************************************/
const wxString& EDA_SchComponentStruct::ReturnFieldName( int aFieldNdx ) const const wxString& EDA_SchComponentStruct::ReturnFieldName( int aFieldNdx ) const
/****************************************************************/ /****************************************************************/
/* Return the Field name from its index (REFERENCE, VALUE ..) /* Return the Field name from its index (REFERENCE, VALUE ..)
*/ */
{ {
// avoid unnecessarily copying wxStrings. // avoid unnecessarily copying wxStrings.
if( aFieldNdx < FIELD1 || m_Field[aFieldNdx].m_Name.IsEmpty() ) if( aFieldNdx < FIELD1 || m_Field[aFieldNdx].m_Name.IsEmpty() )
return ReturnDefaultFieldName( aFieldNdx ); return ReturnDefaultFieldName( aFieldNdx );
return m_Field[aFieldNdx].m_Name; return m_Field[aFieldNdx].m_Name;
} }
/************************************/
wxString EDA_SchComponentStruct::GetPath(DrawSheetList* sheet) /****************************************************************/
/************************************/ wxString EDA_SchComponentStruct::GetPath( DrawSheetList* sheet )
/****************************************************************/
{ {
wxString str; wxString str;
str.Printf(_("%8.8lX"), m_TimeStamp );
return sheet->Path() + str; str.Printf( wxT( "%8.8lX" ), m_TimeStamp );
return sheet->Path() + str;
} }
/************************************/
/********************************************************************/
const wxString EDA_SchComponentStruct::GetRef( DrawSheetList* sheet ) const wxString EDA_SchComponentStruct::GetRef( DrawSheetList* sheet )
/************************************/ /********************************************************************/
{ {
wxString path = GetPath( sheet ); wxString path = GetPath( sheet );
unsigned int i; unsigned int i;
for(i=0; i<m_Paths.GetCount(); i++){
if( m_Paths[i].Cmp(path) == 0 ){ for( i = 0; i<m_Paths.GetCount(); i++ )
/*printf("GetRef path: %s ref: %s\n", {
CONV_TO_UTF8(m_Paths[i]), if( m_Paths[i].Cmp( path ) == 0 )
CONV_TO_UTF8(m_References[i])); */ {
return m_References[i]; /*printf("GetRef path: %s ref: %s\n",
} * CONV_TO_UTF8(m_Paths[i]),
} * CONV_TO_UTF8(m_References[i])); */
//if it was not found in m_Paths array, then see if it is in return m_References[i];
// m_Field[REFERENCE] -- if so, use this as a default for this path. }
// this will happen if we load a version 1 schematic file. }
// it will also mean that multiple instances of the same sheet by default
// all have the same component references, but perhaps this is best. //if it was not found in m_Paths array, then see if it is in
if( !m_Field[REFERENCE].m_Text.IsEmpty() ){ // m_Field[REFERENCE] -- if so, use this as a default for this path.
SetRef( sheet, m_Field[REFERENCE].m_Text ); // this will happen if we load a version 1 schematic file.
return m_Field[REFERENCE].m_Text; // it will also mean that multiple instances of the same sheet by default
} // all have the same component references, but perhaps this is best.
return m_PrefixString; if( !m_Field[REFERENCE].m_Text.IsEmpty() )
{
SetRef( sheet, m_Field[REFERENCE].m_Text );
return m_Field[REFERENCE].m_Text;
}
return m_PrefixString;
} }
/************************************/
/***********************************************************************/
void EDA_SchComponentStruct::SetRef( DrawSheetList* sheet, wxString ref ) void EDA_SchComponentStruct::SetRef( DrawSheetList* sheet, wxString ref )
/************************************/ /***********************************************************************/
{ {
//check to see if it is already there before inserting it //check to see if it is already there before inserting it
wxString path = GetPath( sheet ); wxString path = GetPath( sheet );
printf("SetRef path: %s ref: %s\n",
CONV_TO_UTF8(path), printf( "SetRef path: %s ref: %s\n",
CONV_TO_UTF8(ref)); CONV_TO_UTF8( path ),
unsigned int i; CONV_TO_UTF8( ref ) );
bool notInArray = true; unsigned int i;
for(i=0; i<m_Paths.GetCount(); i++){ bool notInArray = true;
if(m_Paths[i].Cmp(path) == 0){ for( i = 0; i<m_Paths.GetCount(); i++ )
//just update the reference text, not the timestamp. {
m_References.RemoveAt(i); if( m_Paths[i].Cmp( path ) == 0 )
m_References.Insert(ref, i); {
notInArray = false; //just update the reference text, not the timestamp.
} m_References.RemoveAt( i );
} m_References.Insert( ref, i );
if(notInArray){ notInArray = false;
m_References.Add(ref); }
m_Paths.Add(path); }
}
if(m_Field[REFERENCE].m_Text.IsEmpty() || if( notInArray )
( abs(m_Field[REFERENCE].m_Pos.x - m_Pos.x) + {
abs(m_Field[REFERENCE].m_Pos.y - m_Pos.y) > 1000)) { m_References.Add( ref );
//move it to a reasonable position.. m_Paths.Add( path );
m_Field[REFERENCE].m_Pos = m_Pos; }
m_Field[REFERENCE].m_Pos.x += 50; //a slight offset.. if( m_Field[REFERENCE].m_Text.IsEmpty()
m_Field[REFERENCE].m_Pos.y += 50; || ( abs( m_Field[REFERENCE].m_Pos.x - m_Pos.x ) +
} abs( m_Field[REFERENCE].m_Pos.y - m_Pos.y ) > 1000) )
m_Field[REFERENCE].m_Text = ref; //for drawing. {
//move it to a reasonable position..
m_Field[REFERENCE].m_Pos = m_Pos;
m_Field[REFERENCE].m_Pos.x += 50; //a slight offset..
m_Field[REFERENCE].m_Pos.y += 50;
}
m_Field[REFERENCE].m_Text = ref; //for drawing.
} }
/************************************/
/**************************************/
void EDA_SchComponentStruct::ClearRefs() void EDA_SchComponentStruct::ClearRefs()
/************************************/ /**************************************/
{ {
m_Paths.Empty(); m_Paths.Empty();
m_References.Empty(); m_References.Empty();
} }
const wxString& EDA_SchComponentStruct::GetFieldValue( int aFieldNdx ) const const wxString& EDA_SchComponentStruct::GetFieldValue( int aFieldNdx ) const
{ {
// avoid unnecessarily copying wxStrings. // avoid unnecessarily copying wxStrings.
static const wxString myEmpty = wxEmptyString; static const wxString myEmpty = wxEmptyString;
if( (unsigned) aFieldNdx > FIELD8 || m_Field[aFieldNdx].m_Text.IsEmpty() ) if( (unsigned) aFieldNdx > FIELD8 || m_Field[aFieldNdx].m_Text.IsEmpty() )
return myEmpty; return myEmpty;
return m_Field[aFieldNdx].m_Text; return m_Field[aFieldNdx].m_Text;
} }
...@@ -186,10 +203,11 @@ EDA_SchComponentStruct::EDA_SchComponentStruct( const wxPoint& pos ) : ...@@ -186,10 +203,11 @@ EDA_SchComponentStruct::EDA_SchComponentStruct( const wxPoint& pos ) :
int ii; int ii;
m_Multi = 0; /* In multi unit chip - which unit to draw. */ m_Multi = 0; /* In multi unit chip - which unit to draw. */
//m_FlagControlMulti = 0; //m_FlagControlMulti = 0;
m_UsedOnSheets.Clear(); m_UsedOnSheets.Clear();
m_Convert = 0; /* Gestion des mutiples representations (conversion De Morgan) */ m_Convert = 0; /* Gestion des mutiples representations (conversion De Morgan) */
/* The rotation/mirror transformation matrix. pos normal*/ /* The rotation/mirror transformation matrix. pos normal*/
m_Transform[0][0] = 1; m_Transform[0][0] = 1;
m_Transform[0][1] = 0; m_Transform[0][1] = 0;
...@@ -209,14 +227,14 @@ EDA_SchComponentStruct::EDA_SchComponentStruct( const wxPoint& pos ) : ...@@ -209,14 +227,14 @@ EDA_SchComponentStruct::EDA_SchComponentStruct( const wxPoint& pos ) :
m_Field[REFERENCE].m_Layer = LAYER_REFERENCEPART; m_Field[REFERENCE].m_Layer = LAYER_REFERENCEPART;
m_PinIsDangling = NULL; m_PinIsDangling = NULL;
m_PrefixString = wxString(_("U")); m_PrefixString = wxString( _( "U" ) );
} }
/**********************************************************************/ /************************************************/
EDA_Rect EDA_SchComponentStruct::GetBoundaryBox() EDA_Rect EDA_SchComponentStruct::GetBoundaryBox()
/**********************************************************************/ /************************************************/
{ {
EDA_LibComponentStruct* Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); EDA_LibComponentStruct* Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
EDA_Rect BoundaryBox; EDA_Rect BoundaryBox;
...@@ -230,7 +248,7 @@ EDA_Rect EDA_SchComponentStruct::GetBoundaryBox() ...@@ -230,7 +248,7 @@ EDA_Rect EDA_SchComponentStruct::GetBoundaryBox()
// We must reverse Y values, because matrix orientation // We must reverse Y values, because matrix orientation
// suppose Y axis normal for the library items coordinates, // suppose Y axis normal for the library items coordinates,
// m_Transform reverse Y values, but BoundaryBox ais already reversed! // m_Transform reverse Y values, but BoundaryBox is already reversed!
y0 = -BoundaryBox.GetY(); y0 = -BoundaryBox.GetY();
ym = -BoundaryBox.GetBottom(); ym = -BoundaryBox.GetBottom();
} }
...@@ -254,7 +272,7 @@ EDA_Rect EDA_SchComponentStruct::GetBoundaryBox() ...@@ -254,7 +272,7 @@ EDA_Rect EDA_SchComponentStruct::GetBoundaryBox()
EXCHG( x2, x1 ); EXCHG( x2, x1 );
if( y2 < y1 ) if( y2 < y1 )
EXCHG( y2, y1 ); EXCHG( y2, y1 );
BoundaryBox.SetX( x1 ); BoundaryBox.SetY( y1 ); BoundaryBox.SetX( x1 ); BoundaryBox.SetY( y1 );
BoundaryBox.SetWidth( x2 - x1 ); BoundaryBox.SetWidth( x2 - x1 );
BoundaryBox.SetHeight( y2 - y1 ); BoundaryBox.SetHeight( y2 - y1 );
...@@ -262,6 +280,8 @@ EDA_Rect EDA_SchComponentStruct::GetBoundaryBox() ...@@ -262,6 +280,8 @@ EDA_Rect EDA_SchComponentStruct::GetBoundaryBox()
BoundaryBox.Offset( m_Pos ); BoundaryBox.Offset( m_Pos );
return BoundaryBox; return BoundaryBox;
} }
/**************************************************************************/ /**************************************************************************/
void PartTextStruct::SwapData( PartTextStruct* copyitem ) void PartTextStruct::SwapData( PartTextStruct* copyitem )
/**************************************************************************/ /**************************************************************************/
...@@ -295,6 +315,7 @@ void EDA_SchComponentStruct::SwapData( EDA_SchComponentStruct* copyitem ) ...@@ -295,6 +315,7 @@ void EDA_SchComponentStruct::SwapData( EDA_SchComponentStruct* copyitem )
* swap data between this and copyitem * swap data between this and copyitem
*/ */
{ {
EXCHG( m_ChipName, copyitem->m_ChipName );
EXCHG( m_Pos, copyitem->m_Pos ); EXCHG( m_Pos, copyitem->m_Pos );
EXCHG( m_Multi, copyitem->m_Multi ); EXCHG( m_Multi, copyitem->m_Multi );
EXCHG( m_Convert, copyitem->m_Convert ); EXCHG( m_Convert, copyitem->m_Convert );
...@@ -320,13 +341,13 @@ void EDA_SchComponentStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) ...@@ -320,13 +341,13 @@ void EDA_SchComponentStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC )
{ {
/* restore old values and save new ones */ /* restore old values and save new ones */
SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy ); SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy );
/* save in undo list */ /* save in undo list */
( (WinEDA_SchematicFrame*) frame )->SaveCopyInUndoList( this, IS_CHANGED ); ( (WinEDA_SchematicFrame*) frame )->SaveCopyInUndoList( this, IS_CHANGED );
/* restore new values */ /* restore new values */
SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy ); SwapData( (EDA_SchComponentStruct*) g_ItemToUndoCopy );
SAFE_DELETE( g_ItemToUndoCopy ); SAFE_DELETE( g_ItemToUndoCopy );
} }
...@@ -341,14 +362,20 @@ void EDA_SchComponentStruct::ClearAnnotation() ...@@ -341,14 +362,20 @@ void EDA_SchComponentStruct::ClearAnnotation()
/* Suppress annotation ( i.i IC23 changed to IC? and part reset to 1) /* Suppress annotation ( i.i IC23 changed to IC? and part reset to 1)
*/ */
{ {
wxString defRef = m_PrefixString; wxString defRef = m_PrefixString;
defRef.Append( _("?") );
m_References.Empty(); while( defRef.Last() == '?' )
unsigned int i; defRef.RemoveLast();
for(i=0; i< m_Paths.GetCount(); i++){
m_References.Add(defRef);
}
defRef.Append( wxT( "?" ) );
m_References.Empty();
unsigned int i;
for( i = 0; i< m_Paths.GetCount(); i++ )
{
m_References.Add( defRef );
}
m_Field[REFERENCE].m_Text = defRef; //for drawing.
EDA_LibComponentStruct* Entry; EDA_LibComponentStruct* Entry;
Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
...@@ -367,8 +394,10 @@ EDA_SchComponentStruct* EDA_SchComponentStruct::GenCopy() ...@@ -367,8 +394,10 @@ EDA_SchComponentStruct* EDA_SchComponentStruct::GenCopy()
new_item->m_Multi = m_Multi; new_item->m_Multi = m_Multi;
new_item->m_ChipName = m_ChipName; new_item->m_ChipName = m_ChipName;
new_item->m_PrefixString = m_PrefixString;
//new_item->m_FlagControlMulti = m_FlagControlMulti; //new_item->m_FlagControlMulti = m_FlagControlMulti;
new_item->m_UsedOnSheets = m_UsedOnSheets; new_item->m_UsedOnSheets = m_UsedOnSheets;
new_item->m_Convert = m_Convert; new_item->m_Convert = m_Convert;
new_item->m_Transform[0][0] = m_Transform[0][0]; new_item->m_Transform[0][0] = m_Transform[0][0];
new_item->m_Transform[0][1] = m_Transform[0][1]; new_item->m_Transform[0][1] = m_Transform[0][1];
...@@ -499,15 +528,15 @@ void EDA_SchComponentStruct::SetRotationMiroir( int type_rotate ) ...@@ -499,15 +528,15 @@ void EDA_SchComponentStruct::SetRotationMiroir( int type_rotate )
} }
if( Transform ) if( Transform )
{/* The new matrix transform is the old matrix transform modified by the { /* The new matrix transform is the old matrix transform modified by the
* requested transformation, which is the TempMat transform (rot, mirror ..) * requested transformation, which is the TempMat transform (rot, mirror ..)
* in order to have (in term of matrix transform): * in order to have (in term of matrix transform):
* transform coord = new_m_Transform * coord * transform coord = new_m_Transform * coord
* where transform coord is the coord modified by new_m_Transform from the initial * where transform coord is the coord modified by new_m_Transform from the initial
* value coord. * value coord.
* new_m_Transform is computed (from old_m_Transform and TempMat) to have: * new_m_Transform is computed (from old_m_Transform and TempMat) to have:
* transform coord = old_m_Transform * coord * TempMat * transform coord = old_m_Transform * coord * TempMat
*/ */
int NewMatrix[2][2]; int NewMatrix[2][2];
NewMatrix[0][0] = m_Transform[0][0] * TempMat[0][0] + NewMatrix[0][0] = m_Transform[0][0] * TempMat[0][0] +
...@@ -612,12 +641,12 @@ wxPoint EDA_SchComponentStruct::GetScreenCoord( const wxPoint& coord ) ...@@ -612,12 +641,12 @@ wxPoint EDA_SchComponentStruct::GetScreenCoord( const wxPoint& coord )
} }
#if defined (DEBUG)
#if defined(DEBUG)
/** /**
* Function Show * Function Show
* is used to output the object tree, currently for debugging only. * is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level * @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree. * of nesting of this object within the overall tree.
* @param os The ostream& to output to. * @param os The ostream& to output to.
*/ */
...@@ -625,35 +654,36 @@ void EDA_SchComponentStruct::Show( int nestLevel, std::ostream& os ) ...@@ -625,35 +654,36 @@ void EDA_SchComponentStruct::Show( int nestLevel, std::ostream& os )
{ {
// for now, make it look like XML: // for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
" ref=\"" << ReturnFieldName(0) << '"' << " ref=\"" << ReturnFieldName( 0 ) << '"' <<
" chipName=\"" << m_ChipName.mb_str() << '"' << " chipName=\"" << m_ChipName.mb_str() << '"' <<
m_Pos << m_Pos <<
" layer=\"" << m_Layer << '"' << " layer=\"" << m_Layer << '"' <<
"/>\n"; "/>\n";
// skip the reference, it's been output already. // skip the reference, it's been output already.
for( int i=1; i<NUMBER_OF_FIELDS; ++i ) for( int i = 1; i<NUMBER_OF_FIELDS; ++i )
{ {
wxString value = GetFieldValue( i ); wxString value = GetFieldValue( i );
if( !value.IsEmpty() ) if( !value.IsEmpty() )
{ {
NestedSpace( nestLevel+1, os ) << "<field" << NestedSpace( nestLevel + 1, os ) << "<field" <<
" name=\"" << ReturnFieldName(i).mb_str() << '"' << " name=\"" << ReturnFieldName( i ).mb_str() << '"' <<
" value=\"" << value.mb_str() << "\"/>\n"; " value=\"" << value.mb_str() << "\"/>\n";
} }
} }
NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n"; NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
} }
#endif
#endif
/***************************************************************************/ /***************************************************************************/
PartTextStruct::PartTextStruct( const wxPoint& pos, const wxString& text ) : PartTextStruct::PartTextStruct( const wxPoint& pos, const wxString& text ) :
EDA_BaseStruct( DRAW_PART_TEXT_STRUCT_TYPE ), EDA_TextStruct( text ) EDA_BaseStruct( DRAW_PART_TEXT_STRUCT_TYPE )
, EDA_TextStruct( text )
/***************************************************************************/ /***************************************************************************/
{ {
m_Pos = pos; m_Pos = pos;
...@@ -708,7 +738,7 @@ EDA_Rect PartTextStruct::GetBoundaryBox() ...@@ -708,7 +738,7 @@ EDA_Rect PartTextStruct::GetBoundaryBox()
/* return /* return
* EDA_Rect contains the real (user coordinates) boundary box for a text field, * EDA_Rect contains the real (user coordinates) boundary box for a text field,
* according to the component position, rotation, mirror ... * according to the component position, rotation, mirror ...
* *
*/ */
{ {
EDA_Rect BoundaryBox; EDA_Rect BoundaryBox;
......
...@@ -117,7 +117,7 @@ void WinEDA_SchematicFrame::EditSchematicText( DrawTextStruct* TextStruct, ...@@ -117,7 +117,7 @@ void WinEDA_SchematicFrame::EditSchematicText( DrawTextStruct* TextStruct,
wxDC* DC ) wxDC* DC )
/*************************************************************************/ /*************************************************************************/
/* Edit the properties of the text (Label, Gloab label, graphic text).. ) /* Edit the properties of the text (Label, Global label, graphic text).. )
* pointed by "TextStruct" * pointed by "TextStruct"
*/ */
{ {
...@@ -330,7 +330,7 @@ void WinEDA_SchematicFrame::ConvertTextType( DrawTextStruct* Text, ...@@ -330,7 +330,7 @@ void WinEDA_SchematicFrame::ConvertTextType( DrawTextStruct* Text,
/*****************************************************************************/ /*****************************************************************************/
/* Routine to change a text type to an other one (GraphicText, label or Glabel). /* Routine to change a text type to an other one (GraphicText, label or Glabel).
* A new test, label or global label is created from the old text. * A new test, label or hierarchical or global label is created from the old text.
* the old text is deleted * the old text is deleted
*/ */
{ {
...@@ -389,10 +389,10 @@ void WinEDA_SchematicFrame::ConvertTextType( DrawTextStruct* Text, ...@@ -389,10 +389,10 @@ void WinEDA_SchematicFrame::ConvertTextType( DrawTextStruct* Text,
{ {
DrawPanel->ForceCloseManageCurseur( DrawPanel, DC ); DrawPanel->ForceCloseManageCurseur( DrawPanel, DC );
} }
if( (flags & IS_NEW) == 0 ) // Delete old text and save it in undo list if( (flags & IS_NEW) == 0 ) // Remove old text from current list and save it in undo list
{ {
Text->m_Flags = 0; Text->m_Flags = 0;
DeleteStruct( DrawPanel, DC, Text ); DeleteStruct( DrawPanel, DC, Text ); // old text is really saved in undo list
GetScreen()->SetCurItem( NULL ); GetScreen()->SetCurItem( NULL );
g_ItemToRepeat = NULL; g_ItemToRepeat = NULL;
} }
......
...@@ -380,6 +380,8 @@ void AddMenusForGLabel( wxMenu* PopMenu, DrawGlobalLabelStruct* GLabel ) ...@@ -380,6 +380,8 @@ void AddMenusForGLabel( wxMenu* PopMenu, DrawGlobalLabelStruct* GLabel )
_( "Change to Label" ), glabel2label_xpm ); _( "Change to Label" ), glabel2label_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT, ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
_( "Change to Text" ), glabel2text_xpm ); _( "Change to Text" ), glabel2text_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
_( "Change to Hierarchical Label" ), label2glabel_xpm );
ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type, ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type,
ID_POPUP_SCH_CHANGE_TYPE_TEXT, _( "Change Type" ), gl_change_xpm ); ID_POPUP_SCH_CHANGE_TYPE_TEXT, _( "Change Type" ), gl_change_xpm );
} }
...@@ -402,6 +404,8 @@ void AddMenusForHLabel( wxMenu* PopMenu, DrawHierLabelStruct* HLabel ) ...@@ -402,6 +404,8 @@ void AddMenusForHLabel( wxMenu* PopMenu, DrawHierLabelStruct* HLabel )
_( "Change to Label" ), glabel2label_xpm ); _( "Change to Label" ), glabel2label_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT, ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
_( "Change to Text" ), glabel2text_xpm ); _( "Change to Text" ), glabel2text_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL,
_( "Change to Global label" ), label2glabel_xpm );
ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type, ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type,
ID_POPUP_SCH_CHANGE_TYPE_TEXT, _( "Change Type" ), gl_change_xpm ); ID_POPUP_SCH_CHANGE_TYPE_TEXT, _( "Change Type" ), gl_change_xpm );
} }
...@@ -424,9 +428,11 @@ void AddMenusForLabel( wxMenu* PopMenu, DrawLabelStruct* Label ) ...@@ -424,9 +428,11 @@ void AddMenusForLabel( wxMenu* PopMenu, DrawLabelStruct* Label )
// add menu change type text (to label, glabel, text): // add menu change type text (to label, glabel, text):
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL, ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL,
_( "Change to Glabel" ), label2glabel_xpm ); _( "Change to Global label" ), label2glabel_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT, ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
_( "Change to Text" ), label2text_xpm ); _( "Change to Text" ), label2text_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
_( "Change to Hierarchical Label" ), label2glabel_xpm );
ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type, ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type,
ID_POPUP_SCH_CHANGE_TYPE_TEXT, _( "Change Type" ), gl_change_xpm ); ID_POPUP_SCH_CHANGE_TYPE_TEXT, _( "Change Type" ), gl_change_xpm );
} }
...@@ -450,6 +456,8 @@ void AddMenusForText( wxMenu* PopMenu, DrawTextStruct* Text ) ...@@ -450,6 +456,8 @@ void AddMenusForText( wxMenu* PopMenu, DrawTextStruct* Text )
// add menu change type text (to label, glabel, text): // add menu change type text (to label, glabel, text):
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL, ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL,
_( "Change to Label" ), label2text_xpm ); _( "Change to Label" ), label2text_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
_( "Change to Hierarchical Label" ), label2glabel_xpm );
ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL, ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL,
_( "Change to Glabel" ), label2glabel_xpm ); _( "Change to Glabel" ), label2glabel_xpm );
ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type, ADD_MENUITEM_WITH_SUBMENU( PopMenu, menu_change_type,
......
...@@ -42,6 +42,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) ...@@ -42,6 +42,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_EDIT_TEXT: case ID_POPUP_SCH_EDIT_TEXT:
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL:
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL:
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL:
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT:
case ID_POPUP_SCH_SET_SHAPE_TEXT: case ID_POPUP_SCH_SET_SHAPE_TEXT:
case ID_POPUP_SCH_ROTATE_TEXT: case ID_POPUP_SCH_ROTATE_TEXT:
...@@ -395,6 +396,12 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) ...@@ -395,6 +396,12 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
&dc, DRAW_GLOBAL_LABEL_STRUCT_TYPE ); &dc, DRAW_GLOBAL_LABEL_STRUCT_TYPE );
break; break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL:
DrawPanel->MouseToCursorSchema();
ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(),
&dc, DRAW_HIER_LABEL_STRUCT_TYPE );
break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(), ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(),
...@@ -403,7 +410,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) ...@@ -403,7 +410,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_SET_SHAPE_TEXT: case ID_POPUP_SCH_SET_SHAPE_TEXT:
// Non utilis� // Not used
break; break;
case ID_POPUP_SCH_ROTATE_FIELD: case ID_POPUP_SCH_ROTATE_FIELD:
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
COMMON_GLOBL wxString g_BuildVersion COMMON_GLOBL wxString g_BuildVersion
#ifdef EDA_BASE #ifdef EDA_BASE
(wxT("(2008-02-13)")) (wxT("(2008-02-20)"))
#endif #endif
; ;
......
...@@ -355,7 +355,7 @@ enum main_id { ...@@ -355,7 +355,7 @@ enum main_id {
ID_POPUP_SCH_ADD_JUNCTION, ID_POPUP_SCH_ADD_JUNCTION,
ID_POPUP_SCH_ADD_LABEL, ID_POPUP_SCH_ADD_LABEL,
ID_POPUP_SCH_ADD_GLABEL, ID_POPUP_SCH_ADD_GLABEL,
ID_POPUP_SCH_UNUSED0, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
ID_POPUP_SCH_UNUSED1, ID_POPUP_SCH_UNUSED1,
ID_POPUP_SCH_UNUSED2, ID_POPUP_SCH_UNUSED2,
ID_POPUP_SCH_UNUSED3, ID_POPUP_SCH_UNUSED3,
......
No preview for this file type
...@@ -2,7 +2,7 @@ msgid "" ...@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kicad\n" "Project-Id-Version: kicad\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2008-02-20 20:29+0100\n" "PO-Revision-Date: 2008-02-21 07:51+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: kicad team <jean-pierre.charras@ujf-grenoble.fr>\n" "Language-Team: kicad team <jean-pierre.charras@ujf-grenoble.fr>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
...@@ -3633,9 +3633,8 @@ msgid "Apply" ...@@ -3633,9 +3633,8 @@ msgid "Apply"
msgstr "Appliquer" msgstr "Appliquer"
#: pcbnew/specctra_import.cpp:74 #: pcbnew/specctra_import.cpp:74
#, fuzzy
msgid "Merge Specctra Session file:" msgid "Merge Specctra Session file:"
msgstr "Fichier Specctra DSN" msgstr "Fichier Specctra Session Fusionner:"
#: pcbnew/specctra_import.cpp:100 #: pcbnew/specctra_import.cpp:100
msgid "BOARD may be corrupted, do not save it." msgid "BOARD may be corrupted, do not save it."
...@@ -3643,17 +3642,17 @@ msgstr "Le PCB peut ...@@ -3643,17 +3642,17 @@ msgstr "Le PCB peut
#: pcbnew/specctra_import.cpp:102 #: pcbnew/specctra_import.cpp:102
msgid "Fix problem and try again." msgid "Fix problem and try again."
msgstr "" msgstr "Fixer le problme et recommencer."
#: pcbnew/specctra_import.cpp:116 #: pcbnew/specctra_import.cpp:116
msgid "Session file imported and merged OK." msgid "Session file imported and merged OK."
msgstr "" msgstr "Fichier Session import et fusionn correctement."
#: pcbnew/specctra_import.cpp:182 #: pcbnew/specctra_import.cpp:182
#: pcbnew/specctra_import.cpp:290 #: pcbnew/specctra_import.cpp:290
#, c-format #, c-format
msgid "Session file uses invalid layer id \"%s\"" msgid "Session file uses invalid layer id \"%s\""
msgstr "" msgstr "Le Fichier Session utilise une couche invalide n \"%s\""
#: pcbnew/specctra_import.cpp:232 #: pcbnew/specctra_import.cpp:232
msgid "Session via padstack has no shapes" msgid "Session via padstack has no shapes"
...@@ -4434,9 +4433,8 @@ msgid "Last Change" ...@@ -4434,9 +4433,8 @@ msgid "Last Change"
msgstr "Last Change" msgstr "Last Change"
#: pcbnew/class_module.cpp:1076 #: pcbnew/class_module.cpp:1076
#, fuzzy
msgid "Netlist path" msgid "Netlist path"
msgstr "Netliste: " msgstr "Chemin Netliste "
#: pcbnew/class_module.cpp:1110 #: pcbnew/class_module.cpp:1110
msgid "3D-Shape" msgid "3D-Shape"
...@@ -4575,14 +4573,14 @@ msgid "%s not found" ...@@ -4575,14 +4573,14 @@ msgid "%s not found"
msgstr "%s non trouv" msgstr "%s non trouv"
#: pcbnew/cross-probing.cpp:111 #: pcbnew/cross-probing.cpp:111
#, fuzzy, c-format #, c-format
msgid "%s pin %s not found" msgid "%s pin %s not found"
msgstr " fichier %s non trouv" msgstr "%s pin %s non trouve"
#: pcbnew/cross-probing.cpp:113 #: pcbnew/cross-probing.cpp:113
#, fuzzy, c-format #, c-format
msgid "%s pin %s found" msgid "%s pin %s found"
msgstr " non trouv" msgstr "%s pin %s trouve"
#: pcbnew/specctra_export.cpp:64 #: pcbnew/specctra_export.cpp:64
msgid "Specctra DSN file:" msgid "Specctra DSN file:"
...@@ -4604,7 +4602,7 @@ msgstr "Le composant avec valeur \"%s\" a une r ...@@ -4604,7 +4602,7 @@ msgstr "Le composant avec valeur \"%s\" a une r
#: pcbnew/specctra_export.cpp:728 #: pcbnew/specctra_export.cpp:728
#, c-format #, c-format
msgid "Multiple components have identical reference IDs of \"%s\"." msgid "Multiple components have identical reference IDs of \"%s\"."
msgstr "" msgstr "Multiple composants ont une reference identique \"%s\"."
#: pcbnew/class_drawsegment.cpp:161 #: pcbnew/class_drawsegment.cpp:161
msgid "Shape" msgid "Shape"
...@@ -5607,9 +5605,9 @@ msgid "Warning HLabel %s not connected to SheetLabel" ...@@ -5607,9 +5605,9 @@ msgid "Warning HLabel %s not connected to SheetLabel"
msgstr "Attention HLabel %s non connect a SheetLabel" msgstr "Attention HLabel %s non connect a SheetLabel"
#: eeschema/erc.cpp:562 #: eeschema/erc.cpp:562
#, fuzzy, c-format #, c-format
msgid "Warning SheetLabel %s not connected to HLabel" msgid "Warning SheetLabel %s not connected to HLabel"
msgstr "Warning SheetLabel %s non connect a GLabel" msgstr "Warning SheetLabel %s non connect a HLabel"
#: eeschema/erc.cpp:576 #: eeschema/erc.cpp:576
#, c-format #, c-format
...@@ -5645,22 +5643,21 @@ msgid "ERC control" ...@@ -5645,22 +5643,21 @@ msgid "ERC control"
msgstr "Controle ERC" msgstr "Controle ERC"
#: eeschema/erc.cpp:742 #: eeschema/erc.cpp:742
#, fuzzy
msgid "" msgid ""
"\n" "\n"
"***** Sheet Root\n" "***** Sheet Root\n"
msgstr "" msgstr ""
"\n" "\n"
"***** feuille %d (%s)\n" "***** Feuillet Racine\n"
#: eeschema/erc.cpp:745 #: eeschema/erc.cpp:745
#, fuzzy, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
"***** Sheet %s\n" "***** Sheet %s\n"
msgstr "" msgstr ""
"\n" "\n"
"***** feuille %d (%s)\n" "***** Feuille %s\n"
#: eeschema/erc.cpp:762 #: eeschema/erc.cpp:762
#, c-format #, c-format
...@@ -6119,14 +6116,14 @@ msgstr "" ...@@ -6119,14 +6116,14 @@ msgstr ""
"#Cmp ( ordre = Valeur )" "#Cmp ( ordre = Valeur )"
#: eeschema/dialog_build_BOM.cpp:1315 #: eeschema/dialog_build_BOM.cpp:1315
#, fuzzy, c-format #, c-format
msgid "> %-28.28s %s (Sheet %s) pos: %3.3f, %3.3f\n" msgid "> %-28.28s %s (Sheet %s) pos: %3.3f, %3.3f\n"
msgstr "> %-28.28s Global (feuille %.2d) pos: %3.3f, %3.3f\n" msgstr "> %-28.28s %s (Feuille %s) pos: %3.3f, %3.3f\n"
#: eeschema/dialog_build_BOM.cpp:1335 #: eeschema/dialog_build_BOM.cpp:1335
#, fuzzy, c-format #, c-format
msgid "> %-28.28s Sheet %-7.7s (Sheet %s) pos: %3.3f, %3.3f\n" msgid "> %-28.28s Sheet %-7.7s (Sheet %s) pos: %3.3f, %3.3f\n"
msgstr "> %-28.28s Sheet %-7.7s (feuille %.2d) pos: %3.3f, %3.3f\n" msgstr "> %-28.28s Sheet %-7.7s (Feuillet %s) pos: %3.3f, %3.3f\n"
#: eeschema/dialog_build_BOM.cpp:1349 #: eeschema/dialog_build_BOM.cpp:1349
msgid "#End labels\n" msgid "#End labels\n"
...@@ -6834,7 +6831,7 @@ msgstr "Visualisateur des librairies" ...@@ -6834,7 +6831,7 @@ msgstr "Visualisateur des librairies"
#: eeschema/sheet.cpp:162 #: eeschema/sheet.cpp:162
msgid "Filename (will be created upon save if it does not already exist):" msgid "Filename (will be created upon save if it does not already exist):"
msgstr "" msgstr "Nom Fichier (sera cre la sauvegarde si il n'existe pas dj):"
#: eeschema/sheet.cpp:174 #: eeschema/sheet.cpp:174
msgid "Sheetname:" msgid "Sheetname:"
...@@ -7099,26 +7096,22 @@ msgid "Place the bus to bus entry" ...@@ -7099,26 +7096,22 @@ msgid "Place the bus to bus entry"
msgstr "Addition d'entres de bus (type bus vers bus)" msgstr "Addition d'entres de bus (type bus vers bus)"
#: eeschema/menubar.cpp:254 #: eeschema/menubar.cpp:254
#, fuzzy
msgid "No connect flag" msgid "No connect flag"
msgstr "Addition de symboles de non connexion" msgstr "Symbole de Non Connexion"
#: eeschema/menubar.cpp:255 #: eeschema/menubar.cpp:255
#: eeschema/tool_sch.cpp:189 #: eeschema/tool_sch.cpp:189
#, fuzzy
msgid "Place the no connect flag" msgid "Place the no connect flag"
msgstr "Addition de symboles de non connexion" msgstr "Placer le symbole de non connexion"
#: eeschema/menubar.cpp:264 #: eeschema/menubar.cpp:264
#, fuzzy
msgid "Net name" msgid "Net name"
msgstr "NetName" msgstr "Net Name"
#: eeschema/menubar.cpp:265 #: eeschema/menubar.cpp:265
#: eeschema/tool_sch.cpp:193 #: eeschema/tool_sch.cpp:193
#, fuzzy
msgid "Place the net name" msgid "Place the net name"
msgstr "Place Feuille" msgstr "Placer le nom de net"
#: eeschema/menubar.cpp:272 #: eeschema/menubar.cpp:272
msgid "Global label" msgid "Global label"
...@@ -7126,7 +7119,7 @@ msgstr "Label Global" ...@@ -7126,7 +7119,7 @@ msgstr "Label Global"
#: eeschema/menubar.cpp:273 #: eeschema/menubar.cpp:273
msgid "Place the global label. Warning: all global labels with the same name are connected in whole hierarchy" msgid "Place the global label. Warning: all global labels with the same name are connected in whole hierarchy"
msgstr "" msgstr "Placerun label global. Attention: tous les labels globaux avec le mme nom sont connects dans toute la hierarchie"
#: eeschema/menubar.cpp:282 #: eeschema/menubar.cpp:282
#: eeschema/eelayer.h:85 #: eeschema/eelayer.h:85
...@@ -7215,9 +7208,8 @@ msgid "&Edit" ...@@ -7215,9 +7208,8 @@ msgid "&Edit"
msgstr "&Editer" msgstr "&Editer"
#: eeschema/menubar.cpp:407 #: eeschema/menubar.cpp:407
#, fuzzy
msgid "&View" msgid "&View"
msgstr "&ViewLogic" msgstr "&Voir"
#: eeschema/menubar.cpp:408 #: eeschema/menubar.cpp:408
msgid "&Place" msgid "&Place"
...@@ -10562,7 +10554,6 @@ msgid "SheetLabel (Pin Sheet)" ...@@ -10562,7 +10554,6 @@ msgid "SheetLabel (Pin Sheet)"
msgstr "Supprimer Connecteur de hirarchie" msgstr "Supprimer Connecteur de hirarchie"
#: eeschema/eelayer.h:195 #: eeschema/eelayer.h:195
#, fuzzy
msgid "Hierarchical Label" msgid "Hierarchical Label"
msgstr "Label Hirarchique" msgstr "Label Hirarchique"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment