Commit bfb03b8f authored by CHARRAS's avatar CHARRAS
Browse files

pcbnew: onleftclick.cpp added. move onleftclick() and OnLeftDClick() from edit.cpp to it

parent f066aa18
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,14 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with 
Please add newer entries at the top, list the date and your name with 
email address.
email address.



2007-Sep-29 UPDATE   Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+ pcbnew
	create new file onleftclick.cpp
	move onleftcligk() and onleftDcligk() from edit.cpp to onleftclick.cpp
	

2007-Sep-27 UPDATE   Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
2007-Sep-27 UPDATE   Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
================================================================================
+ all
+ all
+11 −9
Original line number Original line Diff line number Diff line
@@ -92,6 +92,13 @@ void WinEDA_SchematicFrame::OnRightClick( const wxPoint& MousePos,


    DrawPanel->m_CanStartBlock = -1;    // Ne pas engager un debut de bloc sur validation menu
    DrawPanel->m_CanStartBlock = -1;    // Ne pas engager un debut de bloc sur validation menu


    if( BlockActive )
	{
		AddMenusForBlock( PopMenu, this );
        PopMenu->AppendSeparator();
		return;
	}

		// Simple localisation des elements si possible
		// Simple localisation des elements si possible
    if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
    if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
    {
    {
@@ -121,18 +128,13 @@ void WinEDA_SchematicFrame::OnRightClick( const wxPoint& MousePos,
    }
    }
    else
    else
    {
    {
        if( (DrawStruct && DrawStruct->m_Flags) || BlockActive )
        if( DrawStruct && DrawStruct->m_Flags )
        {
        {
            if( BlockActive )
                AddMenusForBlock( PopMenu, this );
            else
			ADD_MENUITEM( PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND, _( "Cancel" ), cancel_xpm );
			ADD_MENUITEM( PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND, _( "Cancel" ), cancel_xpm );
			PopMenu->AppendSeparator();
			PopMenu->AppendSeparator();
        }
        }
    }
    }


    if(  BlockActive )
        return;
    if( DrawStruct == NULL )
    if( DrawStruct == NULL )
    {
    {
        if( m_CurrentScreen != ScreenSch )
        if( m_CurrentScreen != ScreenSch )
+4 −424
Original line number Original line Diff line number Diff line
@@ -19,306 +19,6 @@
static void Process_Move_Item( WinEDA_PcbFrame* frame,
static void Process_Move_Item( WinEDA_PcbFrame* frame,
                               EDA_BaseStruct* DrawStruct, wxDC* DC );
                               EDA_BaseStruct* DrawStruct, wxDC* DC );


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


// see wxstruct.h
// see wxstruct.h
void WinEDA_PcbFrame::SendMessageToEESCHEMA( EDA_BaseStruct* objectToSync )
void WinEDA_PcbFrame::SendMessageToEESCHEMA( EDA_BaseStruct* objectToSync )
{
{
@@ -363,7 +63,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )


    pos.y += 20;
    pos.y += 20;


    switch( id )   // Arret eventuel de la commande de d�placement en cours
    switch( id )   // Some (not all ) edit commands must be finished or aborted
    {
    {
    case wxID_CUT:
    case wxID_CUT:
    case wxID_COPY:
    case wxID_COPY:
@@ -456,7 +156,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
        {
        {
            DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc );
            DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc );
        }
        }
        /* ne devrait pas etre execute, sauf bug */
        /* Should not be executed, just in case */
        if( m_CurrentScreen->BlockLocate.m_Command != BLOCK_IDLE )
        if( m_CurrentScreen->BlockLocate.m_Command != BLOCK_IDLE )
        {
        {
            m_CurrentScreen->BlockLocate.m_Command = BLOCK_IDLE;
            m_CurrentScreen->BlockLocate.m_Command = BLOCK_IDLE;
@@ -469,7 +169,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
            SetCursor( DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor );
            SetCursor( DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor );
        break;
        break;


    default:        // Arret de la commande de d�placement en cours
    default:        // Finish (abort ) the command
        if( DrawPanel->ManageCurseur
        if( DrawPanel->ManageCurseur
            && DrawPanel->ForceCloseManageCurseur )
            && DrawPanel->ForceCloseManageCurseur )
        {
        {
@@ -479,7 +179,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
        break;
        break;
    }
    }


    switch( id )   // Traitement des commandes
    switch( id )   // Execute command
    {
    {
    case ID_EXIT:
    case ID_EXIT:
        Close( TRUE );
        Close( TRUE );
@@ -1230,126 +930,6 @@ static void Process_Move_Item( WinEDA_PcbFrame* frame,
    }
    }
}
}



/********************************************************************************/
void WinEDA_PcbFrame::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
 */
{
    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 );

        // Element localis�
        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;
    }
}


/***************************************************************/
/***************************************************************/
void WinEDA_PcbFrame::RemoveStruct( EDA_BaseStruct* Item, wxDC* DC )
void WinEDA_PcbFrame::RemoveStruct( EDA_BaseStruct* Item, wxDC* DC )
/***************************************************************/
/***************************************************************/
Loading