bool WinEDA_DrawFrame::HandleBlockBegin(wxDC * DC, int key,
                                        const wxPoint & startpos)
/*************************************************************************/
/* 	First command block function:
	Init the Block infos: command type, initial position, and other variables..
*/
{
    DrawBlockStruct * Block = & GetScreen()->BlockLocate;

    if ( (Block->m_Command != BLOCK_IDLE) ||
            ( Block->m_State != STATE_NO_BLOCK) )
        return FALSE;

    Block->m_Flags = 0;
    Block->m_Command = (CmdBlockType) ReturnBlockCommand(key);
    if ( Block->m_Command == 0 )
        return FALSE;

    switch(Block->m_Command)
    {
    case BLOCK_IDLE:
        break;

    case BLOCK_MOVE: /* Move */
    case BLOCK_DRAG: /* Drag */
    case BLOCK_COPY: /* Copy */
    case BLOCK_DELETE: /* Delete */
    case BLOCK_SAVE: /* Save */
    case BLOCK_ROTATE: /* Rotate 90 deg */
    case BLOCK_INVERT: /* Flip */
    case BLOCK_ZOOM: /* Window Zoom */
    case BLOCK_MIRROR_X:
    case BLOCK_MIRROR_Y: /* mirror */
    case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/
        InitBlockLocateDatas(GetScreen(),startpos);
        break;

    case BLOCK_PASTE:
        InitBlockLocateDatas(GetScreen(),startpos);
        Block->m_BlockLastCursorPosition.x = 0;
        Block->m_BlockLastCursorPosition.y = 0;
        InitBlockPasteInfos();
        if( Block->m_BlockDrawStruct == NULL )	/* No data to paste */
        {
            DisplayError(this, wxT("No Block to paste"), 20);
            GetScreen()->BlockLocate.m_Command =  BLOCK_IDLE;
            GetScreen()->ManageCurseur = NULL;
            return TRUE;
        }
        if ( GetScreen()->ManageCurseur == NULL )
        {
            Block->m_BlockDrawStruct = NULL;
            DisplayError(this,
                         wxT("WinEDA_DrawFrame::HandleBlockBegin() Err: ManageCurseur NULL"));
            return TRUE;
        }
        Block->m_State = STATE_BLOCK_MOVE;
        GetScreen()->ManageCurseur(DrawPanel, DC, FALSE);
        break;

    default:
        DisplayError(this,
                     wxT("WinEDA_DrawFrame::HandleBlockBegin() error: Unknown command"));
        break;
    }

    Block->SetMessageBlock(this);
    return TRUE;
}
bool EDA_DRAW_FRAME::HandleBlockBegin( wxDC* aDC, int aKey, const wxPoint& aPosition )
{
    BLOCK_SELECTOR* Block = &GetScreen()->m_BlockLocate;

    if( ( Block->GetCommand() != BLOCK_IDLE ) || ( Block->GetState() != STATE_NO_BLOCK ) )
        return false;

    Block->SetCommand( (BLOCK_COMMAND_T) BlockCommand( aKey ) );

    if( Block->GetCommand() == 0 )
        return false;

    switch( Block->GetCommand() )
    {
    case BLOCK_IDLE:
        break;

    case BLOCK_MOVE:                // Move
    case BLOCK_DRAG:                // Drag (block defined)
    case BLOCK_DRAG_ITEM:           // Drag from a drag item command
    case BLOCK_COPY:                // Copy
    case BLOCK_DELETE:              // Delete
    case BLOCK_SAVE:                // Save
    case BLOCK_ROTATE:              // Rotate 90 deg
    case BLOCK_FLIP:                // Flip
    case BLOCK_ZOOM:                // Window Zoom
    case BLOCK_MIRROR_X:
    case BLOCK_MIRROR_Y:            // mirror
    case BLOCK_PRESELECT_MOVE:      // Move with preselection list
        Block->InitData( m_canvas, aPosition );
        break;

    case BLOCK_PASTE:
        Block->InitData( m_canvas, aPosition );
        Block->SetLastCursorPosition( wxPoint( 0, 0 ) );
        InitBlockPasteInfos();

        if( Block->GetCount() == 0 )      // No data to paste
        {
            DisplayError( this, wxT( "No Block to paste" ), 20 );
            GetScreen()->m_BlockLocate.SetCommand( BLOCK_IDLE );
            m_canvas->SetMouseCaptureCallback( NULL );
            return true;
        }

        if( !m_canvas->IsMouseCaptured() )
        {
            Block->ClearItemsList();
            DisplayError( this,
                          wxT( "EDA_DRAW_FRAME::HandleBlockBegin() Err: m_mouseCaptureCallback NULL" ) );
            return true;
        }

        Block->SetState( STATE_BLOCK_MOVE );
        m_canvas->CallMouseCapture( aDC, aPosition, false );
        break;

    default:
        {
            wxString msg;
            msg << wxT( "EDA_DRAW_FRAME::HandleBlockBegin() error: Unknown command " ) <<
            Block->GetCommand();
            DisplayError( this, msg );
        }
        break;
    }

    Block->SetMessageBlock( this );
    return true;
}