kicad/eeschema/onleftclick.cpp

351 lines
9.0 KiB
C++

/******************************************************/
/* schedit.cpp: fonctions generales de la schematique */
/******************************************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"
#include "id.h"
#include "protos.h"
static wxArrayString s_CmpNameList;
static wxArrayString s_PowerNameList;
/**********************************************************************************/
void WinEDA_SchematicFrame::OnLeftClick(wxDC * DC, const wxPoint& MousePos)
/**********************************************************************************/
/* Traite les commandes declenchée par le bouton gauche de la souris,
quand un outil est deja selectionné
*/
{
EDA_BaseStruct * DrawStruct = m_CurrentScreen->m_CurrentItem;
if ( (m_ID_current_state == 0) || ( DrawStruct && DrawStruct->m_Flags ) )
{
DrawPanel->m_AutoPAN_Request = FALSE;
g_ItemToRepeat = NULL;
if ( DrawStruct && DrawStruct->m_Flags ) // Commande "POPUP" en cours
{
switch (DrawStruct->m_StructType )
{
case DRAW_LABEL_STRUCT_TYPE:
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
case DRAW_TEXT_STRUCT_TYPE:
case DRAW_SHEETLABEL_STRUCT_TYPE:
case DRAW_SHEET_STRUCT_TYPE:
case DRAW_BUSENTRY_STRUCT_TYPE:
case DRAW_JUNCTION_STRUCT_TYPE:
case DRAW_LIB_ITEM_STRUCT_TYPE:
case DRAW_PART_TEXT_STRUCT_TYPE:
DrawStruct->Place( this, DC);
m_CurrentScreen->m_CurrentItem = NULL;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
return;
case SCREEN_STRUCT_TYPE:
case DRAW_PICK_ITEM_STRUCT_TYPE:
DisplayError(this,
wxT("OnLeftClick err: unexpected type for Place"));
DrawStruct->m_Flags = 0;
break;
case DRAW_SEGMENT_STRUCT_TYPE: // Segment peut-etre en cours de trace
break;
default:
DisplayError(this,
wxT("WinEDA_SchematicFrame::OnLeftClick err: m_Flags != 0"));
DrawStruct->m_Flags = 0;
break;
}
}
else
{
DrawStruct = SchematicGeneralLocateAndDisplay();
}
}
switch ( m_ID_current_state )
{
case 0:
break;
case ID_NO_SELECT_BUTT:
break;
case ID_HIERARCHY_PUSH_POP_BUTT:
if ( DrawStruct && DrawStruct->m_Flags ) break;
DrawStruct = SchematicGeneralLocateAndDisplay();
if ( DrawStruct && (DrawStruct->m_StructType == DRAW_SHEET_STRUCT_TYPE) )
{
InstallNextScreen((DrawSheetStruct *) DrawStruct);
}
else InstallPreviousScreen();
break;
case ID_NOCONN_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem =
g_ItemToRepeat = CreateNewNoConnectStruct(DC);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place(this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
}
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
break;
case ID_JUNCTION_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem = g_ItemToRepeat
= CreateNewJunctionStruct(DC, m_CurrentScreen->m_Curseur, TRUE);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place(this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
}
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
break;
case ID_WIRETOBUS_ENTRY_BUTT:
case ID_BUSTOBUS_ENTRY_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem = DrawStruct =
CreateBusEntry(DC,
(m_ID_current_state == ID_WIRETOBUS_ENTRY_BUTT) ?
WIRE_TO_BUS : BUS_TO_BUS);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place(this, DC);
m_CurrentScreen->m_CurrentItem = NULL;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
}
break;
case ID_SCHEMATIC_DELETE_ITEM_BUTT:
LocateAndDeleteItem(this, DC);
m_CurrentScreen->SetModify();
m_CurrentScreen->m_CurrentItem = NULL;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
break;
case ID_WIRE_BUTT:
BeginSegment(DC, LAYER_WIRE);
DrawPanel->m_AutoPAN_Request = TRUE;
break;
case ID_BUS_BUTT:
BeginSegment(DC, LAYER_BUS);
DrawPanel->m_AutoPAN_Request = TRUE;
break;
case ID_LINE_COMMENT_BUTT:
BeginSegment(DC, LAYER_NOTES);
DrawPanel->m_AutoPAN_Request = TRUE;
break;
case ID_TEXT_COMMENT_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem =
CreateNewText(DC, LAYER_NOTES);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place(this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
}
break;
case ID_LABEL_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem =
CreateNewText(DC, LAYER_LOCLABEL);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place( this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
}
break;
case ID_GLABEL_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem =
CreateNewText(DC, LAYER_GLOBLABEL);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place(this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
}
break;
case ID_SHEET_SYMBOL_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem = CreateSheet(DC);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place( this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
}
break;
case ID_IMPORT_GLABEL_BUTT:
case ID_SHEET_LABEL_BUTT:
if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
DrawStruct = SchematicGeneralLocateAndDisplay();
if ( DrawStruct == NULL) break;
if( (DrawStruct->m_StructType == DRAW_SHEET_STRUCT_TYPE) &&
(DrawStruct->m_Flags == 0) )
{
if ( m_ID_current_state == ID_IMPORT_GLABEL_BUTT )
m_CurrentScreen->m_CurrentItem =
Import_PinSheet( (DrawSheetStruct *) DrawStruct, DC);
else
m_CurrentScreen->m_CurrentItem =
Create_PinSheet( (DrawSheetStruct *) DrawStruct, DC);
}
else if( (DrawStruct->m_StructType == DRAW_SHEETLABEL_STRUCT_TYPE) &&
(DrawStruct->m_Flags != 0) )
{
DrawStruct->Place(this, DC);
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
}
break;
case ID_COMPONENT_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem = Load_Component(DC, wxEmptyString,
s_CmpNameList, TRUE);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place( this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
}
break;
case ID_PLACE_POWER_BUTT:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
m_CurrentScreen->m_CurrentItem =
Load_Component(DC, wxT("power"),s_PowerNameList, FALSE);
DrawPanel->m_AutoPAN_Request = TRUE;
}
else
{
DrawStruct->Place( this, DC);
DrawPanel->m_AutoPAN_Request = FALSE;
TestDanglingEnds(m_CurrentScreen->EEDrawList, DC);
}
break;
default :
{
SetToolID( 0, wxCURSOR_ARROW, wxEmptyString);
wxString msg( wxT("WinEDA_SchematicFrame::OnLeftClick error state "));
msg << m_ID_current_state;
DisplayError(this, msg);
break;
}
}
}
/***************************************************************************/
void WinEDA_SchematicFrame::OnLeftDClick(wxDC * DC, const wxPoint& MousePos)
/***************************************************************************/
/* Appelé sur un double click:
pour un élément editable (textes, composant):
appel de l'editeur correspondant.
pour une connexion en cours:
termine la connexion
*/
{
EDA_BaseStruct * DrawStruct = m_CurrentScreen->m_CurrentItem;
wxPoint pos = GetPosition();
switch ( m_ID_current_state )
{
case 0:
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
{
DrawStruct = SchematicGeneralLocateAndDisplay();
}
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags != 0) )
break;
// Element localisé
switch ( DrawStruct->m_StructType )
{
case DRAW_SHEET_STRUCT_TYPE:
InstallNextScreen((DrawSheetStruct *) DrawStruct);
break;
case DRAW_LIB_ITEM_STRUCT_TYPE:
InstallCmpeditFrame(this, pos, (EDA_SchComponentStruct *) DrawStruct);
DrawPanel->MouseToCursorSchema();
break;
case DRAW_TEXT_STRUCT_TYPE:
case DRAW_LABEL_STRUCT_TYPE:
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
EditSchematicText( (DrawTextStruct*)DrawStruct, DC);
break;
case DRAW_PART_TEXT_STRUCT_TYPE:
EditCmpFieldText( (PartTextStruct *)DrawStruct, DC);
DrawPanel->MouseToCursorSchema();
break;
default:
break;
}
break; // end case 0
case ID_BUS_BUTT:
case ID_WIRE_BUTT:
case ID_LINE_COMMENT_BUTT:
if ( DrawStruct && (DrawStruct->m_Flags & IS_NEW) )
EndSegment(DC);
break;
}
}