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