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; }
void SCH_EDIT_FRAME::HandleBlockEndByPopUp( int Command, wxDC* DC ) { bool blockCmdFinished = true; /* set to false for block command which * have a next step * and true if the block command is finished here */ BLOCK_SELECTOR* block = &GetScreen()->m_BlockLocate; // can convert only a block move command to an other command if( block->m_Command != BLOCK_MOVE ) return; // Useless if the new command is block move because we are already in block move. if( Command == BLOCK_MOVE ) return; block->m_Command = (CmdBlockType) Command; block->SetMessageBlock( this ); switch( block->m_Command ) { case BLOCK_COPY: /* move to copy */ block->m_State = STATE_BLOCK_MOVE; blockCmdFinished = false; break; case BLOCK_DRAG: /* move to Drag */ if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); // Clear list of items to move, and rebuild it with items to drag: block->ClearItemsList(); GetScreen()->BreakSegmentsOnJunctions(); GetScreen()->UpdatePickList(); if( block->GetCount() ) { blockCmdFinished = false; GetScreen()->SelectBlockItems(); if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); block->m_State = STATE_BLOCK_MOVE; } break; case BLOCK_DELETE: /* move to Delete */ if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { DeleteItemsInList( m_canvas, block->m_ItemsSelection ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; case BLOCK_SAVE: /* Save list in paste buffer*/ if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { wxPoint move_vector = -GetScreen()->m_BlockLocate.m_BlockLastCursorPosition; copyBlockItems( block->m_ItemsSelection ); MoveItemsInList( m_blockItems.m_ItemsSelection, move_vector ); } break; case BLOCK_ZOOM: /* Window Zoom */ m_canvas->CallEndMouseCapture( DC ); m_canvas->SetCursor( (wxStockCursor) m_canvas->GetDefaultCursor() ); Window_Zoom( GetScreen()->m_BlockLocate ); break; case BLOCK_ROTATE: if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { /* Compute the rotation center and put it on grid */ wxPoint rotationPoint = block->Centre(); rotationPoint = GetScreen()->GetNearestGridPosition( rotationPoint ); GetScreen()->SetCrossHairPosition( rotationPoint ); SaveCopyInUndoList( block->m_ItemsSelection, UR_ROTATED, rotationPoint ); RotateListOfItems( block->m_ItemsSelection, rotationPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; case BLOCK_MIRROR_X: if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { /* Compute the mirror center and put it on grid */ wxPoint mirrorPoint = block->Centre(); mirrorPoint = GetScreen()->GetNearestGridPosition( mirrorPoint ); GetScreen()->SetCrossHairPosition( mirrorPoint ); SaveCopyInUndoList( block->m_ItemsSelection, UR_MIRRORED_X, mirrorPoint ); MirrorX( block->m_ItemsSelection, mirrorPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; case BLOCK_MIRROR_Y: if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { /* Compute the mirror center and put it on grid */ wxPoint mirrorPoint = block->Centre(); mirrorPoint = GetScreen()->GetNearestGridPosition( mirrorPoint ); GetScreen()->SetCrossHairPosition( mirrorPoint ); SaveCopyInUndoList( block->m_ItemsSelection, UR_MIRRORED_Y, mirrorPoint ); MirrorY( block->m_ItemsSelection, mirrorPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; default: break; } if( blockCmdFinished ) { block->Clear(); GetScreen()->SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); } }