Adding multi-line feature in PCBNEW and EESCHEMA

This commit is contained in:
drannou 2009-04-28 19:34:42 +00:00
parent fab8dece8f
commit fb25b5c403
12 changed files with 194 additions and 82 deletions

View File

@ -171,7 +171,7 @@ EDA_TextStruct::EDA_TextStruct( const wxString& text )
m_Orient = 0; /* Orient in 0.1 degrees */
m_Attributs = 0;
m_Mirror = false; // display mirror if true
m_HJustify = GR_TEXT_HJUSTIFY_CENTER;
m_HJustify = GR_TEXT_HJUSTIFY_LEFT;
m_VJustify = GR_TEXT_VJUSTIFY_CENTER; /* Justifications Horiz et Vert du texte */
m_Width = 0; /* thickness */
m_Italic = false; /* true = italic shape */
@ -264,7 +264,6 @@ void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
int aDrawMode,
GRFillMode aDisplayMode, EDA_Colors aAnchor_color )
/***************************************************************/
/** Function Draw
* @param aPanel = the current DrawPanel
* @param aDC = the current Device Context
@ -274,45 +273,69 @@ void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
* @param aDisplayMode = FILAIRE, FILLED or SKETCH
* @param EDA_Colors aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ).
*/
{
int width;
wxPoint pos = m_Pos;
wxArrayString* list = wxStringSplit( m_Text, '\n');
width = m_Width;
if( aDisplayMode == FILAIRE )
width = 0;
if( aDrawMode != -1 )
GRSetDrawMode( aDC, aDrawMode );
/* Draw text anchor, if allowed */
if( aAnchor_color != UNSPECIFIED_COLOR )
for( int i=0;i<list->Count();i++)
{
int anchor_size = aPanel->GetScreen()->Unscale( 2 );
aAnchor_color = (EDA_Colors) (aAnchor_color & MASKCOLOR);
int cX = m_Pos.x + aOffset.x;
int cY = m_Pos.y + aOffset.y;
GRLine( &aPanel->m_ClipBox, aDC, cX - anchor_size, cY,
cX + anchor_size, cY, 0, aAnchor_color );
GRLine( &aPanel->m_ClipBox, aDC, cX, cY - anchor_size,
cX, cY + anchor_size, 0, aAnchor_color );
wxString txt = list->Item(i);
wxSize size=DrawOneLine(aPanel,aDC,aOffset,aColor,aDrawMode,aDisplayMode,aAnchor_color,txt,pos);
pos.y+=1.5*(size.y);
}
if( aDisplayMode == SKETCH )
width = -width;
wxSize size = m_Size;
if ( m_Mirror )
size.x = -size.x;
DrawGraphicText( aPanel, aDC,
aOffset + m_Pos, aColor, m_Text,
m_Orient, size,
m_HJustify, m_VJustify, width, m_Italic );
delete (list);
}
wxSize EDA_TextStruct::DrawOneLine( WinEDA_DrawPanel* aPanel, wxDC* aDC,
const wxPoint& aOffset, EDA_Colors aColor,
int aDrawMode,
GRFillMode aDisplayMode, EDA_Colors aAnchor_color,
wxString txt, wxPoint pos )
{
int width = m_Width;
if( aDisplayMode == FILAIRE )
width = 0;
if( aDrawMode != -1 )
GRSetDrawMode( aDC, aDrawMode );
/* Draw text anchor, if allowed */
if( aAnchor_color != UNSPECIFIED_COLOR )
{
int anchor_size = aPanel->GetScreen()->Unscale( 2 );
aAnchor_color = (EDA_Colors) (aAnchor_color & MASKCOLOR);
int cX = pos.x + aOffset.x;
int cY = pos.y + aOffset.y;
GRLine( &aPanel->m_ClipBox, aDC, cX - anchor_size, cY,
cX + anchor_size, cY, 0, aAnchor_color );
GRLine( &aPanel->m_ClipBox, aDC, cX, cY - anchor_size,
cX, cY + anchor_size, 0, aAnchor_color );
}
if( aDisplayMode == SKETCH )
width = -width;
wxSize size = m_Size;
if ( m_Mirror )
size.x = -size.x;
DrawGraphicText( aPanel, aDC,
aOffset + pos, aColor, txt,
m_Orient, size,
m_HJustify, m_VJustify, width, m_Italic );
return size;
}
/******************/
/* Class EDA_Rect */
/******************/

View File

@ -378,6 +378,38 @@ int ReturnValueFromString( int Units, const wxString& TextValue,
return Value;
}
/**
* Function wxStringSplit
* Split a String to a String List when founding 'splitter'
* @return the list
* @param txt : wxString : a String text
* @param splitter : wxChar : the 'split' character
*/
/**********************************************************/
wxArrayString* wxStringSplit(wxString txt, wxChar splitter)
/**********************************************************/
{
wxArrayString* list = new wxArrayString();
while (1)
{
int index=txt.Find(splitter);
if (index == wxNOT_FOUND)
break;
wxString tmp;
tmp = txt.Mid(0,index);
txt = txt.Mid( index+1, txt.size() - index);
list->Add(tmp);
}
if (!txt.IsEmpty())
{
list->Add(txt);
}
return list;
}
/******************************************************************/
double To_User_Unit( bool is_metric, int val, int internal_unit_value )

View File

@ -12,13 +12,13 @@
/**********************************************************************************/
/* Classe WinEDA_EnterText pour entrer une ligne texte au clavier dans les frames */
/* Classe WinEDA_EnterText pour entrer une ou plusieurs ligne texte au clavier dans les frames */
/**********************************************************************************/
WinEDA_EnterText::WinEDA_EnterText( wxWindow* parent,
const wxString& Title,
const wxString& TextToEdit,
wxBoxSizer* BoxSizer,
const wxSize& Size )
const wxSize& Size, bool Multiline )
{
m_Modify = FALSE;
if( ! TextToEdit.IsEmpty() )
@ -28,7 +28,12 @@ WinEDA_EnterText::WinEDA_EnterText( wxWindow* parent,
BoxSizer->Add( m_Title, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE, 5 );
m_FrameText = new wxTextCtrl( parent, -1, TextToEdit, wxDefaultPosition, Size );
long style = 0;
if (Multiline)
style = wxTE_MULTILINE;
m_FrameText = new wxTextCtrl( parent, -1, TextToEdit, wxDefaultPosition, Size,style );
m_FrameText->SetInsertionPoint( 1 );
BoxSizer->Add( m_FrameText,

View File

@ -189,46 +189,68 @@ void SCH_TEXT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode );
wxArrayString* list = wxStringSplit(m_Text, '\n');
wxPoint pos;
int orientation;
GRTextHorizJustifyType Hjustify;
GRTextVertJustifyType Vjustify;
pos = m_Pos + offset;
switch( m_Orient )
{
case 0: /* Horiz Normal Orientation (left justified) */
DrawGraphicText( panel, DC,
wxPoint( m_Pos.x + offset.x, m_Pos.y - TXTMARGE + offset.y ),
color, m_Text, TEXT_ORIENT_HORIZ, m_Size,
GR_TEXT_HJUSTIFY_LEFT,
GR_TEXT_VJUSTIFY_BOTTOM, width, m_Italic, true );
orientation = TEXT_ORIENT_HORIZ;
Hjustify = GR_TEXT_HJUSTIFY_LEFT;
Vjustify = GR_TEXT_VJUSTIFY_BOTTOM;
pos.y-=TXTMARGE;
break;
case 1: /* Vert Orientation UP */
DrawGraphicText( panel, DC,
wxPoint( m_Pos.x - TXTMARGE + offset.x,
m_Pos.y + offset.y ),
color, m_Text, TEXT_ORIENT_VERT, m_Size,
GR_TEXT_HJUSTIFY_RIGHT,
GR_TEXT_VJUSTIFY_BOTTOM, width, m_Italic, true );
orientation = TEXT_ORIENT_VERT;
Hjustify = GR_TEXT_HJUSTIFY_RIGHT;
Vjustify = GR_TEXT_VJUSTIFY_BOTTOM;
pos.x-=TXTMARGE;
break;
case 2: /* Horiz Orientation - Right justified */
DrawGraphicText( panel, DC,
wxPoint( m_Pos.x + offset.x, m_Pos.y -
TXTMARGE + offset.y ),
color, m_Text, TEXT_ORIENT_HORIZ, m_Size,
GR_TEXT_HJUSTIFY_RIGHT,
GR_TEXT_VJUSTIFY_BOTTOM, width, m_Italic, true );
orientation = TEXT_ORIENT_HORIZ;
Hjustify = GR_TEXT_HJUSTIFY_RIGHT;
Vjustify = GR_TEXT_VJUSTIFY_BOTTOM;
pos.y-=TXTMARGE;
break;
case 3: /* Vert Orientation BOTTOM */
DrawGraphicText( panel, DC,
wxPoint( m_Pos.x - TXTMARGE + offset.x,
m_Pos.y + offset.y ),
color, m_Text, TEXT_ORIENT_VERT, m_Size,
GR_TEXT_HJUSTIFY_RIGHT,
GR_TEXT_VJUSTIFY_TOP, width, m_Italic, true );
orientation = TEXT_ORIENT_VERT;
Hjustify = GR_TEXT_HJUSTIFY_RIGHT;
Vjustify = GR_TEXT_VJUSTIFY_TOP;
pos.x-=TXTMARGE;
break;
}
for( int i=0;i<list->Count();i++)
{
wxString txt = list->Item(i);
DrawGraphicText( panel, DC,
pos,
color, txt, orientation, m_Size,
Hjustify,
Vjustify, width, m_Italic, true );
if (orientation == TEXT_ORIENT_HORIZ)
pos.y+= 1.5*(m_Size.y);
else
pos.x+= 1.5*(m_Size.x);
}
delete (list);
if( m_IsDangling )
DrawDanglingSymbol( panel, DC, m_Pos + offset, color );
}

View File

@ -21,8 +21,22 @@
int DialogLabelEditor::ShowModally( WinEDA_SchematicFrame* parent, SCH_TEXT * CurrentText )
{
int ret;
bool multiline;
DialogLabelEditor* dialog = new DialogLabelEditor( parent, CurrentText );
switch( CurrentText->Type() )
{
case TYPE_SCH_GLOBALLABEL:
case TYPE_SCH_HIERLABEL:
case TYPE_SCH_LABEL:
multiline = false;
break;
default:
multiline = true;
break;
}
DialogLabelEditor* dialog = new DialogLabelEditor( parent, CurrentText, multiline );
// doing any post construction resizing is better done here than in
// OnInitDialog() since it tends to flash/redraw the dialog less.
@ -35,8 +49,8 @@ int DialogLabelEditor::ShowModally( WinEDA_SchematicFrame* parent, SCH_TEXT * C
DialogLabelEditor::DialogLabelEditor( WinEDA_SchematicFrame* parent, SCH_TEXT* CurrentText ) :
DialogLabelEditor_Base( parent )
DialogLabelEditor::DialogLabelEditor( WinEDA_SchematicFrame* parent, SCH_TEXT* CurrentText,bool multiline ) :
DialogLabelEditor_Base( parent,wxID_ANY,multiline )
{
m_Parent = parent;
m_CurrentText = CurrentText;
@ -67,6 +81,7 @@ void DialogLabelEditor::init()
default:
SetTitle( _( "Text Properties" ) );
m_TextLabel->Disconnect(wxEVT_COMMAND_TEXT_ENTER , wxCommandEventHandler ( DialogLabelEditor::onEnterKey ), NULL, this);
break;
}
@ -111,6 +126,14 @@ void DialogLabelEditor::init()
}
}
/*!
* wxTE_PROCESS_ENTER event handler for m_TextLabel
*/
void DialogLabelEditor::onEnterKey( wxCommandEvent& event )
{
TextPropertiesAccept( event );
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK
@ -132,12 +155,3 @@ void DialogLabelEditor::OnButtonCANCEL_Click( wxCommandEvent& event )
EndModal( -1 );
}
/*!
* wxTE_PROCESS_ENTER event handler for m_TextLabel
*/
void DialogLabelEditor::onEnterKey( wxCommandEvent& event )
{
TextPropertiesAccept( event );
}

View File

@ -18,7 +18,7 @@ private:
protected:
// these are protected so that the static ShowModally() gets used.
DialogLabelEditor( WinEDA_SchematicFrame* parent, SCH_TEXT * CurrentText);
DialogLabelEditor( WinEDA_SchematicFrame* parent, SCH_TEXT * CurrentText, bool multiline);
~DialogLabelEditor(){};
@ -35,7 +35,7 @@ public:
private:
void init( );
void onEnterKey( wxCommandEvent& event );
void onEnterKey( wxCommandEvent& event );
void OnButtonOKClick( wxCommandEvent& event );
void OnButtonCANCEL_Click( wxCommandEvent& event );
void TextPropertiesAccept( wxCommandEvent& event );

View File

@ -9,7 +9,7 @@
///////////////////////////////////////////////////////////////////////////
DialogLabelEditor_Base::DialogLabelEditor_Base( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
DialogLabelEditor_Base::DialogLabelEditor_Base( wxWindow* parent, wxWindowID id, bool multiline, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
@ -19,11 +19,18 @@ DialogLabelEditor_Base::DialogLabelEditor_Base( wxWindow* parent, wxWindowID id,
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxVERTICAL );
m_staticText1 = new wxStaticText( this, wxID_ANY, _("Text"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText1->Wrap( -1 );
m_staticText1 = new wxStaticText( this, wxID_ANY, _("Text"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText1->Wrap( -1 );
bSizer2->Add( m_staticText1, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_TextLabel = new wxTextCtrl( this, wxID_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
if (multiline)
{
m_TextLabel = new wxTextCtrl( this, wxID_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_MULTILINE );
}
else
{
m_TextLabel = new wxTextCtrl( this, wxID_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
}
m_TextLabel->SetToolTip( _("Enter the text to be used within the schematic") );
bSizer2->Add( m_TextLabel, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );

View File

@ -56,7 +56,7 @@ class DialogLabelEditor_Base : public wxDialog
public:
DialogLabelEditor_Base( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Text Editor"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 600,300 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
DialogLabelEditor_Base( wxWindow* parent, wxWindowID id = wxID_ANY, bool multiline = false, const wxString& title = _("Text Editor"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 600,300 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DialogLabelEditor_Base();
};

View File

@ -527,6 +527,10 @@ public:
int aDisplayMode, GRFillMode aDisplay_mode = FILAIRE,
EDA_Colors aAnchor_color = UNSPECIFIED_COLOR );
wxSize DrawOneLine( WinEDA_DrawPanel* aPanel, wxDC* aDC,
const wxPoint& aOffset, EDA_Colors aColor,
int aDisplayMode, GRFillMode aDisplay_mode = FILAIRE,
EDA_Colors aAnchor_color = UNSPECIFIED_COLOR, wxString txt=wxString(),wxPoint pos=wxPoint(0,0) );
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.

View File

@ -351,6 +351,11 @@ void PutValueInLocalUnits( wxTextCtrl& TextCtr, int Value,
int ReturnValueFromTextCtrl( const wxTextCtrl& TextCtr,
int Internal_Unit );
/* return a String List from a string, whith a specific splitter*/
//WX_DECLARE_LIST( wxString, StringList );
//WX_DEFINE_LIST( StringList );
wxArrayString* wxStringSplit(wxString txt, wxChar splitter);
/**
* Function To_User_Unit
* Convert in inch or mm the variable "val" (double)given in internal units

View File

@ -398,7 +398,7 @@ public:
// Constructor and destructor
WinEDA_EnterText( wxWindow* parent, const wxString& Title,
const wxString& TextToEdit, wxBoxSizer* BoxSizer,
const wxSize& Size );
const wxSize& Size, bool Multiline = false );
~WinEDA_EnterText()
{

View File

@ -107,7 +107,7 @@ WinEDA_TextPCBPropertiesFrame::WinEDA_TextPCBPropertiesFrame( WinEDA_PcbFrame* p
m_Name = new WinEDA_EnterText( this, _( "Text:" ),
TextPCB->m_Text,
LeftBoxSizer, wxSize( 200, -1 ) );
LeftBoxSizer, wxSize( 200, 60 ),true );
m_Name->SetFocus();
m_Name->SetSelection( -1, -1 );
@ -232,7 +232,7 @@ void WinEDA_TextPCBPropertiesFrame::OnOkClick( wxCommandEvent& event )
CurrentTextPCB->SetLayer( m_SelLayerBox->GetChoice() );
CurrentTextPCB->m_Italic = m_Style->GetSelection() ? 1 : 0;
if( m_DC ) // Displya new text
if( m_DC ) // Display new text
{
CurrentTextPCB->Draw( m_Parent->DrawPanel, m_DC, GR_OR );
}