/**************************************************/ /* 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(); }