diff --git a/pcbnew/onleftclick.cpp b/pcbnew/onleftclick.cpp index 5fbc7168b8..e400a46ef2 100644 --- a/pcbnew/onleftclick.cpp +++ b/pcbnew/onleftclick.cpp @@ -1,434 +1,434 @@ -/**************************************************************/ -/* onleftclick.cpp: */ -/* function called when the left button is clicked (released) */ -/* function called when the left button is double clicked */ -/**************************************************************/ - -#include "fctsys.h" - -#include "gr_basic.h" - -#include "common.h" -#include "pcbnew.h" -#include "autorout.h" - -#include "id.h" -#include "protos.h" -#include "eda_dde.h" - - - -/********************************************************************/ -void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) -/********************************************************************/ - -/* Handle the left buttom mouse click, when a tool is active - */ -{ - BOARD_ITEM* DrawStruct = GetCurItem(); - bool exit = false; - - if( (m_ID_current_state == 0) || ( DrawStruct && DrawStruct->m_Flags ) ) - { - DrawPanel->m_AutoPAN_Request = FALSE; - if( DrawStruct && DrawStruct->m_Flags ) // "POPUP" in progress - { - DrawPanel->m_IgnoreMouseEvents = TRUE; - DrawPanel->CursorOff( DC ); - - switch( DrawStruct->Type() ) - { - case TYPETRACK: - case TYPEVIA: - if( DrawStruct->m_Flags & IS_DRAGGED ) - { - PlaceDraggedTrackSegment( (TRACK*) DrawStruct, DC ); - exit = true; - } - break; - - case TYPETEXTE: - Place_Texte_Pcb( (TEXTE_PCB*) DrawStruct, DC ); - exit = true; - break; - - case TYPETEXTEMODULE: - PlaceTexteModule( (TEXTE_MODULE*) DrawStruct, DC ); - exit = true; - break; - - case TYPEPAD: - PlacePad( (D_PAD*) DrawStruct, DC ); - exit = true; - break; - - case TYPEMODULE: - Place_Module( (MODULE*) DrawStruct, DC ); - exit = true; - break; - - case TYPEMIRE: - Place_Mire( (MIREPCB*) DrawStruct, DC ); - exit = true; - break; - - case TYPEDRAWSEGMENT: - if( m_ID_current_state == 0 ) - { - Place_DrawItem( (DRAWSEGMENT*) DrawStruct, DC ); - exit = true; - } - break; - - default: - if( m_ID_current_state == 0 ) - { - DisplayError( this, - wxT( "WinEDA_PcbFrame::OnLeftClick() err: m_Flags != 0" ) ); - exit = true; - } - break; - } - - DrawPanel->m_IgnoreMouseEvents = FALSE; - DrawPanel->CursorOn( DC ); - if ( exit ) return; - } - - else if( !wxGetKeyState(WXK_SHIFT) && !wxGetKeyState(WXK_ALT) && - !wxGetKeyState(WXK_CONTROL) ) - { - DrawStruct = PcbGeneralLocateAndDisplay(); - if( DrawStruct ) - SendMessageToEESCHEMA( DrawStruct ); - } - } - - switch( m_ID_current_state ) - { - case ID_MAIN_MENUBAR: - case 0: - break; - - case ID_NO_SELECT_BUTT: - break; - - case ID_PCB_MUWAVE_TOOL_SELF_CMD: - case ID_PCB_MUWAVE_TOOL_GAP_CMD: - case ID_PCB_MUWAVE_TOOL_STUB_CMD: - case ID_PCB_MUWAVE_TOOL_STUB_ARC_CMD: - case ID_PCB_MUWAVE_TOOL_FUNCTION_SHAPE_CMD: - MuWaveCommand( DC, MousePos ); - break; - - case ID_PCB_HIGHLIGHT_BUTT: - { - int netcode = Select_High_Light( DC ); - if( netcode < 0 ) - m_Pcb->Display_Infos( this ); - else - Affiche_Infos_Equipot( netcode, this ); - } - break; - - case ID_PCB_SHOW_1_RATSNEST_BUTT: -#if 0 - DrawStruct = m_Pcb->FindPadOrModule( GetScreen()->RefPos(true), - GetScreen()->m_Active_Layer ); -#else - DrawStruct = PcbGeneralLocateAndDisplay(); -#endif - Show_1_Ratsnest( DrawStruct, DC ); - - if( DrawStruct ) - SendMessageToEESCHEMA( DrawStruct ); - break; - - case ID_PCB_MIRE_BUTT: - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - SetCurItem( Create_Mire( DC ) ); - DrawPanel->MouseToCursorSchema(); - } - else if( DrawStruct->Type() == TYPEMIRE ) - { - Place_Mire( (MIREPCB*) DrawStruct, DC ); - } - else - DisplayError( this, wxT( "Internal err: Struct not TYPEMIRE" ) ); - break; - - case ID_PCB_CIRCLE_BUTT: - case ID_PCB_ARC_BUTT: - case ID_LINE_COMMENT_BUTT: - { - int shape = S_SEGMENT; - if( m_ID_current_state == ID_PCB_CIRCLE_BUTT ) - shape = S_CIRCLE; - if( m_ID_current_state == ID_PCB_ARC_BUTT ) - shape = S_ARC; - - if( GetScreen()->m_Active_Layer <= CMP_N ) - { - DisplayError( this, _( "Graphic not autorized on Copper layers" ) ); - break; - } - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - DrawStruct = Begin_DrawSegment( NULL, shape, DC ); - SetCurItem( DrawStruct ); - DrawPanel->m_AutoPAN_Request = TRUE; - } - else if( DrawStruct - && (DrawStruct->Type() == TYPEDRAWSEGMENT) - && (DrawStruct->m_Flags & IS_NEW) ) - { - DrawStruct = Begin_DrawSegment( (DRAWSEGMENT*) DrawStruct, shape, DC ); - SetCurItem( DrawStruct ); - DrawPanel->m_AutoPAN_Request = TRUE; - } - break; - } - - case ID_TRACK_BUTT: - if( GetScreen()->m_Active_Layer > CMP_N ) - { - DisplayError( this, _( "Tracks on Copper layers only " ) ); - break; - } - - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - DrawStruct = Begin_Route( NULL, DC ); - SetCurItem( DrawStruct ); - if( DrawStruct ) - DrawPanel->m_AutoPAN_Request = TRUE; - } - else if( DrawStruct && - -// (DrawStruct->Type() == TYPETRACK) && - (DrawStruct->m_Flags & IS_NEW) ) - { - TRACK* track = Begin_Route( (TRACK*) DrawStruct, DC ); - if( track ) // c'est a dire si OK - SetCurItem( DrawStruct = track ); - DrawPanel->m_AutoPAN_Request = TRUE; - } - break; - - - case ID_PCB_ZONES_BUTT: - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - SetCurItem( DrawStruct = Begin_Zone() ); - } - else if( DrawStruct - && (DrawStruct->Type() == TYPEEDGEZONE) - && (DrawStruct->m_Flags & IS_NEW) ) - { - SetCurItem( DrawStruct = Begin_Zone() ); - } - else - DisplayError( this, wxT( "Edit: zone internal error" ) ); - break; - - case ID_TEXT_COMMENT_BUTT: - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - SetCurItem( Create_Texte_Pcb( DC ) ); - DrawPanel->MouseToCursorSchema(); - DrawPanel->m_AutoPAN_Request = TRUE; - } - else if( DrawStruct->Type() == TYPETEXTE ) - { - Place_Texte_Pcb( (TEXTE_PCB*) DrawStruct, DC ); - DrawPanel->m_AutoPAN_Request = FALSE; - } - else - DisplayError( this, wxT( "Internal err: Struct not TYPETEXTE" ) ); - break; - - case ID_COMPONENT_BUTT: - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - DrawPanel->MouseToCursorSchema(); - DrawStruct = Load_Module_From_Library( wxEmptyString, DC ); - SetCurItem( DrawStruct ); - if( DrawStruct ) - StartMove_Module( (MODULE*) DrawStruct, DC ); - } - else if( DrawStruct->Type() == TYPEMODULE ) - { - Place_Module( (MODULE*) DrawStruct, DC ); - DrawPanel->m_AutoPAN_Request = FALSE; - } - else - DisplayError( this, wxT( "Internal err: Struct not TYPEMODULE" ) ); - break; - - case ID_PCB_COTATION_BUTT: - if( GetScreen()->m_Active_Layer <= CMP_N ) - { - DisplayError( this, _( "Cotation not autorized on Copper layers" ) ); - break; - } - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - DrawStruct = Begin_Cotation( NULL, DC ); - SetCurItem( DrawStruct ); - DrawPanel->m_AutoPAN_Request = TRUE; - } - else if( DrawStruct - && (DrawStruct->Type() == TYPECOTATION) - && (DrawStruct->m_Flags & IS_NEW) ) - { - DrawStruct = Begin_Cotation( (COTATION*) DrawStruct, DC ); - SetCurItem( DrawStruct ); - DrawPanel->m_AutoPAN_Request = TRUE; - } - else - DisplayError( this, wxT( "Internal err: Struct not COTATION" ) ); - break; - - case ID_PCB_DELETE_ITEM_BUTT: - if( !DrawStruct || (DrawStruct->m_Flags == 0) ) - { - DrawStruct = PcbGeneralLocateAndDisplay(); - if( DrawStruct && (DrawStruct->m_Flags == 0) ) - { - RemoveStruct( DrawStruct, DC ); - SetCurItem( DrawStruct = NULL ); - } - } - break; - - case ID_PCB_PLACE_OFFSET_COORD_BUTT: - DrawPanel->m_Draw_Auxiliary_Axis( DC, GR_XOR ); - m_Auxiliary_Axis_Position = GetScreen()->m_Curseur; - DrawPanel->m_Draw_Auxiliary_Axis( DC, GR_COPY ); - GetScreen()->SetModify(); - break; - - default: - DrawPanel->SetCursor( wxCURSOR_ARROW ); - DisplayError( this, wxT( "WinEDA_PcbFrame::OnLeftClick() id error" ) ); - SetToolID( 0, wxCURSOR_ARROW, wxEmptyString ); - break; - } -} - - -/********************************************************************************/ -void WinEDA_PcbFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) -/********************************************************************************/ - -/* handle the double click on the mouse left button - */ -{ - BOARD_ITEM* DrawStruct = GetCurItem(); - wxPoint pos = GetPosition(); - wxClientDC dc( DrawPanel ); - - DrawPanel->PrepareGraphicContext( &dc ); - - switch( m_ID_current_state ) - { - case 0: - if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) - { - DrawStruct = PcbGeneralLocateAndDisplay(); - } - - if( (DrawStruct == NULL) || (DrawStruct->m_Flags != 0) ) - break; - - SendMessageToEESCHEMA( DrawStruct ); - - // An item is found - SetCurItem( DrawStruct ); - - switch( DrawStruct->Type() ) - { - case TYPETRACK: - case TYPEVIA: - if( DrawStruct->m_Flags & IS_NEW ) - { - End_Route( (TRACK*) DrawStruct, DC ); - DrawPanel->m_AutoPAN_Request = FALSE; - } - else if( DrawStruct->m_Flags == 0 ) - { - Edit_TrackSegm_Width( DC, (TRACK*) DrawStruct ); - } - break; - - case TYPETEXTE: - InstallTextPCBOptionsFrame( (TEXTE_PCB*) DrawStruct, - DC, ( (TEXTE_PCB*) DrawStruct )->m_Pos ); - DrawPanel->MouseToCursorSchema(); - break; - - case TYPEPAD: - InstallPadOptionsFrame( (D_PAD*) DrawStruct, &dc, pos ); - DrawPanel->MouseToCursorSchema(); - break; - - case TYPEMODULE: - InstallModuleOptionsFrame( (MODULE*) DrawStruct, &dc, pos ); - DrawPanel->MouseToCursorSchema(); - break; - - case TYPEMIRE: - InstallMireOptionsFrame( (MIREPCB*) DrawStruct, &dc, pos ); - DrawPanel->MouseToCursorSchema(); - break; - - case TYPETEXTEMODULE: - InstallTextModOptionsFrame( (TEXTE_MODULE*) DrawStruct, &dc, pos ); - DrawPanel->MouseToCursorSchema(); - break; - - case TYPEDRAWSEGMENT: - break; - - default: - break; - } - - break; // end case 0 - - case ID_TRACK_BUTT: - if( DrawStruct && (DrawStruct->m_Flags & IS_NEW) ) - { - End_Route( (TRACK*) DrawStruct, DC ); - DrawPanel->m_AutoPAN_Request = FALSE; - } - break; - - case ID_PCB_ZONES_BUTT: - End_Zone( DC ); - DrawPanel->m_AutoPAN_Request = FALSE; - SetCurItem( NULL ); - break; - - case ID_LINE_COMMENT_BUTT: - case ID_PCB_ARC_BUTT: - case ID_PCB_CIRCLE_BUTT: - if( DrawStruct == NULL ) - break; - if( DrawStruct->Type() != TYPEDRAWSEGMENT ) - { - DisplayError( this, wxT( "DrawStruct Type error" ) ); - DrawPanel->m_AutoPAN_Request = FALSE; - break; - } - if( (DrawStruct->m_Flags & IS_NEW) ) - { - End_Edge( (DRAWSEGMENT*) DrawStruct, &dc ); - DrawPanel->m_AutoPAN_Request = FALSE; - SetCurItem( NULL ); - } - break; - } -} - +/**************************************************************/ +/* onleftclick.cpp: */ +/* function called when the left button is clicked (released) */ +/* function called when the left button is double clicked */ +/**************************************************************/ + +#include "fctsys.h" + +#include "gr_basic.h" + +#include "common.h" +#include "pcbnew.h" +#include "autorout.h" + +#include "id.h" +#include "protos.h" +#include "eda_dde.h" + + + +/********************************************************************/ +void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) +/********************************************************************/ + +/* Handle the left buttom mouse click, when a tool is active + */ +{ + BOARD_ITEM* DrawStruct = GetCurItem(); + bool exit = false; + + if( (m_ID_current_state == 0) || ( DrawStruct && DrawStruct->m_Flags ) ) + { + DrawPanel->m_AutoPAN_Request = FALSE; + if( DrawStruct && DrawStruct->m_Flags ) // "POPUP" in progress + { + DrawPanel->m_IgnoreMouseEvents = TRUE; + DrawPanel->CursorOff( DC ); + + switch( DrawStruct->Type() ) + { + case TYPETRACK: + case TYPEVIA: + if( DrawStruct->m_Flags & IS_DRAGGED ) + { + PlaceDraggedTrackSegment( (TRACK*) DrawStruct, DC ); + exit = true; + } + break; + + case TYPETEXTE: + Place_Texte_Pcb( (TEXTE_PCB*) DrawStruct, DC ); + exit = true; + break; + + case TYPETEXTEMODULE: + PlaceTexteModule( (TEXTE_MODULE*) DrawStruct, DC ); + exit = true; + break; + + case TYPEPAD: + PlacePad( (D_PAD*) DrawStruct, DC ); + exit = true; + break; + + case TYPEMODULE: + Place_Module( (MODULE*) DrawStruct, DC ); + exit = true; + break; + + case TYPEMIRE: + Place_Mire( (MIREPCB*) DrawStruct, DC ); + exit = true; + break; + + case TYPEDRAWSEGMENT: + if( m_ID_current_state == 0 ) + { + Place_DrawItem( (DRAWSEGMENT*) DrawStruct, DC ); + exit = true; + } + break; + + default: + if( m_ID_current_state == 0 ) + { + DisplayError( this, + wxT( "WinEDA_PcbFrame::OnLeftClick() err: m_Flags != 0" ) ); + exit = true; + } + break; + } + + DrawPanel->m_IgnoreMouseEvents = FALSE; + DrawPanel->CursorOn( DC ); + if ( exit ) return; + } + + else if( !wxGetKeyState(WXK_SHIFT) && !wxGetKeyState(WXK_ALT) && + !wxGetKeyState(WXK_CONTROL) ) + { + DrawStruct = PcbGeneralLocateAndDisplay(); + if( DrawStruct ) + SendMessageToEESCHEMA( DrawStruct ); + } + } + + switch( m_ID_current_state ) + { + case ID_MAIN_MENUBAR: + case 0: + break; + + case ID_NO_SELECT_BUTT: + break; + + case ID_PCB_MUWAVE_TOOL_SELF_CMD: + case ID_PCB_MUWAVE_TOOL_GAP_CMD: + case ID_PCB_MUWAVE_TOOL_STUB_CMD: + case ID_PCB_MUWAVE_TOOL_STUB_ARC_CMD: + case ID_PCB_MUWAVE_TOOL_FUNCTION_SHAPE_CMD: + MuWaveCommand( DC, MousePos ); + break; + + case ID_PCB_HIGHLIGHT_BUTT: + { + int netcode = Select_High_Light( DC ); + if( netcode < 0 ) + m_Pcb->Display_Infos( this ); + else + Affiche_Infos_Equipot( netcode, this ); + } + break; + + case ID_PCB_SHOW_1_RATSNEST_BUTT: +#if 0 + DrawStruct = m_Pcb->FindPadOrModule( GetScreen()->RefPos(true), + GetScreen()->m_Active_Layer ); +#else + DrawStruct = PcbGeneralLocateAndDisplay(); +#endif + Show_1_Ratsnest( DrawStruct, DC ); + + if( DrawStruct ) + SendMessageToEESCHEMA( DrawStruct ); + break; + + case ID_PCB_MIRE_BUTT: + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + SetCurItem( Create_Mire( DC ) ); + DrawPanel->MouseToCursorSchema(); + } + else if( DrawStruct->Type() == TYPEMIRE ) + { + Place_Mire( (MIREPCB*) DrawStruct, DC ); + } + else + DisplayError( this, wxT( "Internal err: Struct not TYPEMIRE" ) ); + break; + + case ID_PCB_CIRCLE_BUTT: + case ID_PCB_ARC_BUTT: + case ID_LINE_COMMENT_BUTT: + { + int shape = S_SEGMENT; + if( m_ID_current_state == ID_PCB_CIRCLE_BUTT ) + shape = S_CIRCLE; + if( m_ID_current_state == ID_PCB_ARC_BUTT ) + shape = S_ARC; + + if( GetScreen()->m_Active_Layer <= CMP_N ) + { + DisplayError( this, _( "Graphic not autorized on Copper layers" ) ); + break; + } + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + DrawStruct = Begin_DrawSegment( NULL, shape, DC ); + SetCurItem( DrawStruct ); + DrawPanel->m_AutoPAN_Request = TRUE; + } + else if( DrawStruct + && (DrawStruct->Type() == TYPEDRAWSEGMENT) + && (DrawStruct->m_Flags & IS_NEW) ) + { + DrawStruct = Begin_DrawSegment( (DRAWSEGMENT*) DrawStruct, shape, DC ); + SetCurItem( DrawStruct ); + DrawPanel->m_AutoPAN_Request = TRUE; + } + break; + } + + case ID_TRACK_BUTT: + if( GetScreen()->m_Active_Layer > CMP_N ) + { + DisplayError( this, _( "Tracks on Copper layers only " ) ); + break; + } + + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + DrawStruct = Begin_Route( NULL, DC ); + SetCurItem( DrawStruct ); + if( DrawStruct ) + DrawPanel->m_AutoPAN_Request = TRUE; + } + else if( DrawStruct && + +// (DrawStruct->Type() == TYPETRACK) && + (DrawStruct->m_Flags & IS_NEW) ) + { + TRACK* track = Begin_Route( (TRACK*) DrawStruct, DC ); + if( track ) // c'est a dire si OK + SetCurItem( DrawStruct = track ); + DrawPanel->m_AutoPAN_Request = TRUE; + } + break; + + + case ID_PCB_ZONES_BUTT: + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + SetCurItem( DrawStruct = Begin_Zone() ); + } + else if( DrawStruct + && (DrawStruct->Type() == TYPEEDGEZONE) + && (DrawStruct->m_Flags & IS_NEW) ) + { + SetCurItem( DrawStruct = Begin_Zone() ); + } + else + DisplayError( this, wxT( "Edit: zone internal error" ) ); + break; + + case ID_TEXT_COMMENT_BUTT: + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + SetCurItem( Create_Texte_Pcb( DC ) ); + DrawPanel->MouseToCursorSchema(); + DrawPanel->m_AutoPAN_Request = TRUE; + } + else if( DrawStruct->Type() == TYPETEXTE ) + { + Place_Texte_Pcb( (TEXTE_PCB*) DrawStruct, DC ); + DrawPanel->m_AutoPAN_Request = FALSE; + } + else + DisplayError( this, wxT( "Internal err: Struct not TYPETEXTE" ) ); + break; + + case ID_COMPONENT_BUTT: + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + DrawPanel->MouseToCursorSchema(); + DrawStruct = Load_Module_From_Library( wxEmptyString, DC ); + SetCurItem( DrawStruct ); + if( DrawStruct ) + StartMove_Module( (MODULE*) DrawStruct, DC ); + } + else if( DrawStruct->Type() == TYPEMODULE ) + { + Place_Module( (MODULE*) DrawStruct, DC ); + DrawPanel->m_AutoPAN_Request = FALSE; + } + else + DisplayError( this, wxT( "Internal err: Struct not TYPEMODULE" ) ); + break; + + case ID_PCB_COTATION_BUTT: + if( GetScreen()->m_Active_Layer <= CMP_N ) + { + DisplayError( this, _( "Cotation not autorized on Copper layers" ) ); + break; + } + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + DrawStruct = Begin_Cotation( NULL, DC ); + SetCurItem( DrawStruct ); + DrawPanel->m_AutoPAN_Request = TRUE; + } + else if( DrawStruct + && (DrawStruct->Type() == TYPECOTATION) + && (DrawStruct->m_Flags & IS_NEW) ) + { + DrawStruct = Begin_Cotation( (COTATION*) DrawStruct, DC ); + SetCurItem( DrawStruct ); + DrawPanel->m_AutoPAN_Request = TRUE; + } + else + DisplayError( this, wxT( "Internal err: Struct not COTATION" ) ); + break; + + case ID_PCB_DELETE_ITEM_BUTT: + if( !DrawStruct || (DrawStruct->m_Flags == 0) ) + { + DrawStruct = PcbGeneralLocateAndDisplay(); + if( DrawStruct && (DrawStruct->m_Flags == 0) ) + { + RemoveStruct( DrawStruct, DC ); + SetCurItem( DrawStruct = NULL ); + } + } + break; + + case ID_PCB_PLACE_OFFSET_COORD_BUTT: + DrawPanel->m_Draw_Auxiliary_Axis( DC, GR_XOR ); + m_Auxiliary_Axis_Position = GetScreen()->m_Curseur; + DrawPanel->m_Draw_Auxiliary_Axis( DC, GR_COPY ); + GetScreen()->SetModify(); + break; + + default: + DrawPanel->SetCursor( wxCURSOR_ARROW ); + DisplayError( this, wxT( "WinEDA_PcbFrame::OnLeftClick() id error" ) ); + SetToolID( 0, wxCURSOR_ARROW, wxEmptyString ); + break; + } +} + + +/********************************************************************************/ +void WinEDA_PcbFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) +/********************************************************************************/ + +/* handle the double click on the mouse left button + */ +{ + BOARD_ITEM* DrawStruct = GetCurItem(); + wxPoint pos = GetPosition(); + wxClientDC dc( DrawPanel ); + + DrawPanel->PrepareGraphicContext( &dc ); + + switch( m_ID_current_state ) + { + case 0: + if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) + { + DrawStruct = PcbGeneralLocateAndDisplay(); + } + + if( (DrawStruct == NULL) || (DrawStruct->m_Flags != 0) ) + break; + + SendMessageToEESCHEMA( DrawStruct ); + + // An item is found + SetCurItem( DrawStruct ); + + switch( DrawStruct->Type() ) + { + case TYPETRACK: + case TYPEVIA: + if( DrawStruct->m_Flags & IS_NEW ) + { + End_Route( (TRACK*) DrawStruct, DC ); + DrawPanel->m_AutoPAN_Request = FALSE; + } + else if( DrawStruct->m_Flags == 0 ) + { + Edit_TrackSegm_Width( DC, (TRACK*) DrawStruct ); + } + break; + + case TYPETEXTE: + InstallTextPCBOptionsFrame( (TEXTE_PCB*) DrawStruct, + DC, ( (TEXTE_PCB*) DrawStruct )->m_Pos ); + DrawPanel->MouseToCursorSchema(); + break; + + case TYPEPAD: + InstallPadOptionsFrame( (D_PAD*) DrawStruct, &dc, pos ); + DrawPanel->MouseToCursorSchema(); + break; + + case TYPEMODULE: + InstallModuleOptionsFrame( (MODULE*) DrawStruct, &dc, pos ); + DrawPanel->MouseToCursorSchema(); + break; + + case TYPEMIRE: + InstallMireOptionsFrame( (MIREPCB*) DrawStruct, &dc, pos ); + DrawPanel->MouseToCursorSchema(); + break; + + case TYPETEXTEMODULE: + InstallTextModOptionsFrame( (TEXTE_MODULE*) DrawStruct, &dc, pos ); + DrawPanel->MouseToCursorSchema(); + break; + + case TYPEDRAWSEGMENT: + break; + + default: + break; + } + + break; // end case 0 + + case ID_TRACK_BUTT: + if( DrawStruct && (DrawStruct->m_Flags & IS_NEW) ) + { + End_Route( (TRACK*) DrawStruct, DC ); + DrawPanel->m_AutoPAN_Request = FALSE; + } + break; + + case ID_PCB_ZONES_BUTT: + End_Zone( DC ); + DrawPanel->m_AutoPAN_Request = FALSE; + SetCurItem( NULL ); + break; + + case ID_LINE_COMMENT_BUTT: + case ID_PCB_ARC_BUTT: + case ID_PCB_CIRCLE_BUTT: + if( DrawStruct == NULL ) + break; + if( DrawStruct->Type() != TYPEDRAWSEGMENT ) + { + DisplayError( this, wxT( "DrawStruct Type error" ) ); + DrawPanel->m_AutoPAN_Request = FALSE; + break; + } + if( (DrawStruct->m_Flags & IS_NEW) ) + { + End_Edge( (DRAWSEGMENT*) DrawStruct, &dc ); + DrawPanel->m_AutoPAN_Request = FALSE; + SetCurItem( NULL ); + } + break; + } +} +