390 lines
11 KiB
C++
390 lines
11 KiB
C++
/**************************************************/
|
|
/* traitement des editions des textes sur modules */
|
|
/**************************************************/
|
|
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
|
|
#include "common.h"
|
|
#include "pcbnew.h"
|
|
|
|
#include "protos.h"
|
|
|
|
#define L_MIN_DESSIN 1 /* seuil de largeur des segments pour trace autre que filaire */
|
|
|
|
/* Routines Locales */
|
|
static void Move_Texte_Pcb(WinEDA_DrawPanel * panel, wxDC * DC, bool erase) ;
|
|
static void Exit_Texte_Pcb(WinEDA_DrawPanel * Panel, wxDC *DC) ;
|
|
|
|
/* Variables locales : */
|
|
static wxPoint old_pos; // position originelle du texte selecte
|
|
|
|
|
|
enum id_TextPCB_properties
|
|
{
|
|
ID_ACCEPT_TEXTE_PCB_PROPERTIES = 1900,
|
|
ID_CLOSE_TEXTE_PCB_PROPERTIES,
|
|
ID_TEXTPCB_SELECT_LAYER
|
|
};
|
|
|
|
/************************************/
|
|
/* class WinEDA_TextPCBPropertiesFrame */
|
|
/************************************/
|
|
|
|
class WinEDA_TextPCBPropertiesFrame: public wxDialog
|
|
{
|
|
private:
|
|
|
|
WinEDA_PcbFrame * m_Parent;
|
|
wxDC * m_DC;
|
|
TEXTE_PCB * CurrentTextPCB;
|
|
WinEDA_EnterText * m_Name;
|
|
WinEDA_PositionCtrl * m_TxtPosCtrl;
|
|
WinEDA_SizeCtrl * m_TxtSizeCtrl;
|
|
WinEDA_ValueCtrl * m_TxtWidthCtlr;
|
|
wxRadioBox * m_Orient;
|
|
wxRadioBox * m_Mirror;
|
|
WinEDAChoiceBox * m_SelLayerBox;
|
|
|
|
public:
|
|
// Constructor and destructor
|
|
WinEDA_TextPCBPropertiesFrame(WinEDA_PcbFrame *parent,
|
|
TEXTE_PCB * TextPCB, wxDC * DC, const wxPoint & pos);
|
|
~WinEDA_TextPCBPropertiesFrame(void)
|
|
{
|
|
}
|
|
|
|
private:
|
|
void TextPCBPropertiesAccept(wxCommandEvent& event);
|
|
void OnQuit(wxCommandEvent& event);
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
BEGIN_EVENT_TABLE(WinEDA_TextPCBPropertiesFrame, wxDialog)
|
|
EVT_BUTTON(ID_ACCEPT_TEXTE_PCB_PROPERTIES,
|
|
WinEDA_TextPCBPropertiesFrame::TextPCBPropertiesAccept)
|
|
EVT_BUTTON(ID_CLOSE_TEXTE_PCB_PROPERTIES,
|
|
WinEDA_TextPCBPropertiesFrame::OnQuit)
|
|
END_EVENT_TABLE()
|
|
|
|
|
|
/********************************************************************/
|
|
void WinEDA_PcbFrame::InstallTextPCBOptionsFrame(TEXTE_PCB * TextPCB,
|
|
wxDC * DC, const wxPoint & pos)
|
|
/********************************************************************/
|
|
{
|
|
DrawPanel->m_IgnoreMouseEvents = TRUE;
|
|
WinEDA_TextPCBPropertiesFrame * frame = new WinEDA_TextPCBPropertiesFrame(this,
|
|
TextPCB, DC, pos);
|
|
frame->ShowModal(); frame->Destroy();
|
|
DrawPanel->MouseToCursorSchema();
|
|
DrawPanel->m_IgnoreMouseEvents = FALSE;
|
|
}
|
|
|
|
|
|
/************************************************************************************/
|
|
WinEDA_TextPCBPropertiesFrame::WinEDA_TextPCBPropertiesFrame(WinEDA_PcbFrame *parent,
|
|
TEXTE_PCB * TextPCB,wxDC * DC,
|
|
const wxPoint & framepos):
|
|
wxDialog(parent, -1, _("TextPCB properties"), framepos, wxSize(390, 340),
|
|
DIALOG_STYLE)
|
|
/************************************************************************************/
|
|
{
|
|
wxButton * Button;
|
|
|
|
m_Parent = parent;
|
|
SetFont(*g_DialogFont);
|
|
m_DC = DC;
|
|
Centre();
|
|
|
|
CurrentTextPCB = TextPCB;
|
|
|
|
wxBoxSizer * MainBoxSizer = new wxBoxSizer(wxHORIZONTAL);
|
|
SetSizer(MainBoxSizer);
|
|
wxBoxSizer * LeftBoxSizer = new wxBoxSizer(wxVERTICAL);
|
|
wxBoxSizer * MiddleBoxSizer = new wxBoxSizer(wxVERTICAL);
|
|
wxBoxSizer * RightBoxSizer = new wxBoxSizer(wxVERTICAL);
|
|
MainBoxSizer->Add(LeftBoxSizer, 0, wxGROW|wxALL, 5);
|
|
MainBoxSizer->Add(MiddleBoxSizer, 0, wxGROW|wxALL, 5);
|
|
MainBoxSizer->Add(RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
|
|
|
/* Creation des boutons de commande */
|
|
Button = new wxButton(this, ID_ACCEPT_TEXTE_PCB_PROPERTIES, _("Ok") );
|
|
Button->SetForegroundColour(*wxRED);
|
|
RightBoxSizer->Add(Button, 0, wxGROW|wxALL, 5);
|
|
Button->SetDefault();
|
|
|
|
Button = new wxButton(this, ID_CLOSE_TEXTE_PCB_PROPERTIES, _("Cancel"));
|
|
Button->SetForegroundColour(*wxBLUE);
|
|
RightBoxSizer->Add(Button, 0, wxGROW|wxALL, 5);
|
|
|
|
m_Name = new WinEDA_EnterText(this, _("Text:"),
|
|
TextPCB->m_Text,
|
|
LeftBoxSizer, wxSize( 200, -1) );
|
|
m_Name->SetFocus();
|
|
m_Name->SetSelection(-1,-1);
|
|
|
|
m_TxtSizeCtrl = new WinEDA_SizeCtrl(this, _("Size"),
|
|
TextPCB->m_Size,
|
|
g_UnitMetric, LeftBoxSizer, m_Parent->m_InternalUnits);
|
|
|
|
m_TxtWidthCtlr = new WinEDA_ValueCtrl(this, _("Width"),
|
|
TextPCB->m_Width,
|
|
g_UnitMetric, LeftBoxSizer, m_Parent->m_InternalUnits);
|
|
|
|
m_TxtPosCtrl = new WinEDA_PositionCtrl(this, _("Position"),
|
|
TextPCB->m_Pos,
|
|
g_UnitMetric, LeftBoxSizer, m_Parent->m_InternalUnits);
|
|
|
|
m_SelLayerBox = new WinEDAChoiceBox(this, ID_TEXTPCB_SELECT_LAYER,
|
|
wxDefaultPosition, wxDefaultSize);
|
|
MiddleBoxSizer->Add(m_SelLayerBox, 0, wxGROW|wxALL, 5);
|
|
|
|
int ii;
|
|
for ( ii = 0; ii < 29 ; ii ++ )
|
|
{
|
|
m_SelLayerBox->Append(ReturnPcbLayerName(ii));
|
|
}
|
|
m_SelLayerBox->SetSelection( TextPCB->m_Layer );
|
|
|
|
|
|
wxString orient_msg[4] = { wxT("0"), wxT("90"), wxT("180"), wxT("-90") };
|
|
m_Orient = new wxRadioBox(this, -1, _("Orientation"),
|
|
wxDefaultPosition, wxSize(-1,-1), 4, orient_msg,
|
|
1, wxRA_SPECIFY_COLS );
|
|
MiddleBoxSizer->Add(m_Orient, 0, wxGROW|wxALL, 5);
|
|
switch(TextPCB->m_Orient )
|
|
{
|
|
default:
|
|
m_Orient->SetSelection(0);
|
|
break;
|
|
|
|
case 900:
|
|
m_Orient->SetSelection(1);
|
|
break;
|
|
|
|
case 1800:
|
|
m_Orient->SetSelection(2);
|
|
break;
|
|
|
|
case 2700:
|
|
m_Orient->SetSelection(3);
|
|
break;
|
|
|
|
}
|
|
|
|
wxString display_msg[2] = { _("Normal"), _("Mirror") };
|
|
m_Mirror = new wxRadioBox(this, -1, _("Display"),
|
|
wxDefaultPosition, wxSize(-1,-1), 2, display_msg,
|
|
1, wxRA_SPECIFY_COLS );
|
|
if ( ! TextPCB->m_Miroir ) m_Mirror->SetSelection(1);;
|
|
MiddleBoxSizer->Add(m_Mirror, 0, wxGROW|wxALL, 5);
|
|
|
|
GetSizer()->Fit(this);
|
|
GetSizer()->SetSizeHints(this);
|
|
}
|
|
|
|
|
|
/**********************************************************************/
|
|
void WinEDA_TextPCBPropertiesFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
|
/**********************************************************************/
|
|
{
|
|
// true is to force the frame to close
|
|
Close(true);
|
|
}
|
|
|
|
|
|
/**************************************************************************************/
|
|
void WinEDA_TextPCBPropertiesFrame::TextPCBPropertiesAccept(wxCommandEvent& event)
|
|
/**************************************************************************************/
|
|
{
|
|
if ( m_DC ) // Effacement ancien texte
|
|
{
|
|
CurrentTextPCB->Draw(m_Parent->DrawPanel, m_DC, wxPoint(0, 0), GR_XOR);
|
|
}
|
|
|
|
if ( ! m_Name->GetValue().IsEmpty() )
|
|
{
|
|
CurrentTextPCB->m_Text = m_Name->GetValue();
|
|
}
|
|
CurrentTextPCB->m_Pos = m_TxtPosCtrl->GetValue();
|
|
CurrentTextPCB->m_Size = m_TxtSizeCtrl->GetValue();
|
|
CurrentTextPCB->m_Width = m_TxtWidthCtlr->GetValue();
|
|
CurrentTextPCB->m_Miroir = (m_Mirror->GetSelection() == 0) ? 1 : 0;
|
|
CurrentTextPCB->m_Orient = m_Orient->GetSelection() * 900;
|
|
CurrentTextPCB->m_Layer = m_SelLayerBox->GetChoice();
|
|
CurrentTextPCB->CreateDrawData();
|
|
if ( m_DC ) // Affichage nouveau texte
|
|
{
|
|
/* Redessin du Texte */
|
|
CurrentTextPCB->Draw(m_Parent->DrawPanel, m_DC, wxPoint(0, 0), GR_OR);
|
|
}
|
|
m_Parent->m_CurrentScreen->SetModify();
|
|
Close(TRUE);
|
|
}
|
|
|
|
|
|
/******************************************************/
|
|
void Exit_Texte_Pcb(WinEDA_DrawPanel * Panel, wxDC * DC)
|
|
/*******************************************************/
|
|
/*
|
|
Routine de sortie du menu edit texte Pcb
|
|
Si un texte est selectionne, ses coord initiales sont regenerees
|
|
*/
|
|
{
|
|
TEXTE_PCB * TextePcb;
|
|
|
|
TextePcb = (TEXTE_PCB *) Panel->GetScreen()->m_CurrentItem;
|
|
|
|
if ( TextePcb )
|
|
{
|
|
TextePcb->Draw(Panel, DC, wxPoint(0, 0), GR_XOR) ;
|
|
TextePcb->m_Pos = old_pos;
|
|
TextePcb->Draw(Panel, DC, wxPoint(0, 0), GR_OR) ;
|
|
TextePcb->m_Flags = 0;
|
|
}
|
|
|
|
Panel->ManageCurseur = NULL;
|
|
Panel->ForceCloseManageCurseur = NULL;
|
|
Panel->GetScreen()->m_CurrentItem = NULL;
|
|
}
|
|
|
|
/*********************************************************************/
|
|
void WinEDA_PcbFrame::Place_Texte_Pcb(TEXTE_PCB * TextePcb, wxDC * DC)
|
|
/*********************************************************************/
|
|
/*
|
|
Routine de placement du texte en cours de deplacement
|
|
*/
|
|
{
|
|
if( TextePcb == NULL ) return;
|
|
|
|
TextePcb->CreateDrawData();
|
|
TextePcb->Draw(DrawPanel, DC, wxPoint(0, 0), GR_OR) ;
|
|
DrawPanel->ManageCurseur = NULL;
|
|
DrawPanel->ForceCloseManageCurseur = NULL;
|
|
m_CurrentScreen->m_CurrentItem = NULL;
|
|
m_CurrentScreen->SetModify();
|
|
TextePcb->m_Flags = 0;
|
|
}
|
|
|
|
/***********************************************************************/
|
|
void WinEDA_PcbFrame::StartMoveTextePcb(TEXTE_PCB * TextePcb, wxDC * DC)
|
|
/***********************************************************************/
|
|
/* Routine de preparation du deplacement d'un texte
|
|
*/
|
|
{
|
|
if( TextePcb == NULL ) return;
|
|
old_pos = TextePcb->m_Pos;
|
|
TextePcb->Draw(DrawPanel, DC, wxPoint(0, 0), GR_XOR) ;
|
|
TextePcb->m_Flags |= IS_MOVED;
|
|
Affiche_Infos_PCB_Texte(this, TextePcb);
|
|
DrawPanel->ManageCurseur = Move_Texte_Pcb;
|
|
DrawPanel->ForceCloseManageCurseur = Exit_Texte_Pcb;
|
|
m_CurrentScreen->m_CurrentItem = TextePcb;
|
|
DrawPanel->ManageCurseur( DrawPanel, DC, FALSE);
|
|
}
|
|
|
|
/*************************************************************************/
|
|
static void Move_Texte_Pcb(WinEDA_DrawPanel * panel, wxDC *DC, bool erase )
|
|
/*************************************************************************/
|
|
/* Routine deplacant le texte PCB suivant le curseur de la souris */
|
|
{
|
|
TEXTE_PCB * TextePcb = (TEXTE_PCB *)
|
|
panel->m_Parent->m_CurrentScreen->m_CurrentItem;
|
|
|
|
if (TextePcb == NULL ) return ;
|
|
|
|
/* effacement du texte : */
|
|
|
|
if ( erase )
|
|
TextePcb->Draw(panel, DC, wxPoint(0, 0), GR_XOR) ;
|
|
|
|
TextePcb->m_Pos = panel->m_Parent->m_CurrentScreen->m_Curseur;
|
|
|
|
/* Redessin du Texte */
|
|
TextePcb->Draw(panel, DC, wxPoint(0, 0), GR_XOR) ;
|
|
}
|
|
|
|
|
|
/**********************************************************************/
|
|
void WinEDA_PcbFrame::Delete_Texte_Pcb(TEXTE_PCB * TextePcb, wxDC * DC)
|
|
/**********************************************************************/
|
|
{
|
|
|
|
if( TextePcb == NULL ) return;
|
|
|
|
TextePcb->Draw(DrawPanel, DC, wxPoint(0, 0), GR_XOR);
|
|
|
|
/* Suppression du texte en Memoire*/
|
|
DeleteStructure(TextePcb);
|
|
DrawPanel->ManageCurseur = NULL;
|
|
DrawPanel->ForceCloseManageCurseur = NULL;
|
|
m_CurrentScreen->m_CurrentItem = NULL;
|
|
}
|
|
|
|
|
|
/*******************************************************/
|
|
TEXTE_PCB * WinEDA_PcbFrame::Create_Texte_Pcb( wxDC * DC)
|
|
/*******************************************************/
|
|
{
|
|
TEXTE_PCB * TextePcb;
|
|
|
|
TextePcb = new TEXTE_PCB(m_Pcb);
|
|
|
|
/* Chainage de la nouvelle structure en debut de liste */
|
|
TextePcb->Pnext = m_Pcb->m_Drawings;
|
|
TextePcb->Pback = (EDA_BaseStruct * )m_Pcb;
|
|
if( m_Pcb->m_Drawings)
|
|
m_Pcb->m_Drawings->Pback = (EDA_BaseStruct*) TextePcb;
|
|
m_Pcb->m_Drawings = (EDA_BaseStruct*) TextePcb;
|
|
|
|
/* Mise a jour des caracteristiques */
|
|
TextePcb->m_Flags = IS_NEW;
|
|
TextePcb->m_Layer = GetScreen()->m_Active_Layer;
|
|
TextePcb->m_Miroir = 1;
|
|
if(TextePcb->m_Layer == CUIVRE_N) TextePcb->m_Miroir = 0;
|
|
|
|
TextePcb->m_Size = g_DesignSettings.m_PcbTextSize;
|
|
TextePcb->m_Pos = m_CurrentScreen->m_Curseur;
|
|
TextePcb->m_Width = g_DesignSettings.m_PcbTextWidth;
|
|
|
|
InstallTextPCBOptionsFrame(TextePcb, DC, TextePcb->m_Pos);
|
|
if ( TextePcb->m_Text.IsEmpty() )
|
|
{
|
|
DeleteStructure(TextePcb);
|
|
TextePcb = NULL;
|
|
}
|
|
|
|
else StartMoveTextePcb(TextePcb, DC);
|
|
|
|
return TextePcb;
|
|
}
|
|
|
|
/***********************************************************************/
|
|
void WinEDA_PcbFrame::Rotate_Texte_Pcb(TEXTE_PCB * TextePcb, wxDC * DC)
|
|
/***********************************************************************/
|
|
{
|
|
int angle = 900;
|
|
int drawmode = GR_XOR;
|
|
|
|
if( TextePcb == NULL ) return;
|
|
|
|
/* effacement du texte : */
|
|
TextePcb->Draw(DrawPanel, DC, wxPoint(0, 0), GR_XOR) ;
|
|
|
|
|
|
TextePcb->m_Orient += angle;
|
|
if(TextePcb->m_Orient >= 3600) TextePcb->m_Orient -= 3600 ;
|
|
if(TextePcb->m_Orient < 0) TextePcb->m_Orient += 3600 ;
|
|
|
|
TextePcb->CreateDrawData();
|
|
|
|
/* Redessin du Texte */
|
|
TextePcb->Draw(DrawPanel, DC, wxPoint(0, 0), drawmode);
|
|
Affiche_Infos_PCB_Texte(this, TextePcb);
|
|
|
|
m_CurrentScreen->SetModify();
|
|
}
|
|
|