class_DisplayFootprintsFrame.cpp 16.7 KB
Newer Older
1 2 3
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
4 5 6
 * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
 * Copyright (C) 2015 Wayne Stambaugh <stambaughw@verizon.net>
 * Copyright (C) 2007-2015 KiCad Developers, see AUTHORS.txt for contributors.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you may find one here:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */

/**
 * @file class_DisplayFootprintsFrame.cpp
 */
plyatov's avatar
plyatov committed
29

30
#include <fctsys.h>
31
#include <pgm_base.h>
32 33
#include <common.h>
#include <class_drawpanel.h>
34
#include <class_draw_panel_gal.h>
35 36 37
#include <confirm.h>
#include <macros.h>
#include <bitmaps.h>
38
#include <msgpanel.h>
39
#include <wildcards_and_files_ext.h>
40 41 42
#include <fpid.h>
#include <fp_lib_table.h>
#include <pcbcommon.h>
43

44 45
#include <io_mgr.h>
#include <class_module.h>
46
#include <class_board.h>
47

48 49 50
#include <cvpcb_mainframe.h>
#include <class_DisplayFootprintsFrame.h>
#include <cvpcb_id.h>
51
#include <cvstruct.h>
plyatov's avatar
plyatov committed
52

53
#include <3d_viewer.h>
54 55


56
BEGIN_EVENT_TABLE( DISPLAY_FOOTPRINTS_FRAME, PCB_BASE_FRAME )
charras's avatar
charras committed
57 58 59 60
    EVT_CLOSE( DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow )
    EVT_SIZE( DISPLAY_FOOTPRINTS_FRAME::OnSize )
    EVT_TOOL( ID_OPTIONS_SETUP, DISPLAY_FOOTPRINTS_FRAME::InstallOptionsDisplay )
    EVT_TOOL( ID_CVPCB_SHOW3D_FRAME, DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame )
61

62 63 64 65 66 67 68 69 70
    EVT_TOOL( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH,
              DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar)
    EVT_TOOL( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH,
              DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar)

    EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH,
                   DISPLAY_FOOTPRINTS_FRAME::OnUpdateTextDrawMode )
    EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH,
                   DISPLAY_FOOTPRINTS_FRAME::OnUpdateLineDrawMode )
71
END_EVENT_TABLE()
plyatov's avatar
plyatov committed
72 73


74
DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, CVPCB_MAINFRAME* aParent ) :
75
    PCB_BASE_FRAME( aKiway, aParent, FRAME_CVPCB_DISPLAY, _( "Footprint Viewer" ),
76
        wxDefaultPosition, wxDefaultSize,
77
        KICAD_DEFAULT_DRAWFRAME_STYLE, FOOTPRINTVIEWER_FRAME_NAME )
78
{
79
    m_FrameName = FOOTPRINTVIEWER_FRAME_NAME;
80
    m_showAxis = true;         // true to draw axis.
81 82

    // Give an icon
83
    wxIcon  icon;
84

85 86
    icon.CopyFromBitmap( KiBitmap( icon_cvpcb_xpm ) );
    SetIcon( icon );
plyatov's avatar
plyatov committed
87

Dick Hollenbeck's avatar
Dick Hollenbeck committed
88
    SetBoard( new BOARD() );
89
    SetScreen( new PCB_SCREEN( GetPageSizeIU() ) );
plyatov's avatar
plyatov committed
90

91
    LoadSettings( config() );
92

93
    // Initialize grid id to a default value if not found in config or bad:
charras's avatar
charras committed
94
    if( (m_LastGridSizeId <= 0) ||
95
        (m_LastGridSizeId > (ID_POPUP_GRID_USER - ID_POPUP_GRID_LEVEL_1000)) )
charras's avatar
charras committed
96
        m_LastGridSizeId = ID_POPUP_GRID_LEVEL_500 - ID_POPUP_GRID_LEVEL_1000;
97

98
    GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
99 100

    // Initialize some display options
101 102
    DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions();
    displ_opts->m_DisplayPadIsol = false;      // Pad clearance has no meaning here
103 104

    // Track and via clearance has no meaning here.
105
    displ_opts->m_ShowTrackClearanceMode = DO_NOT_SHOW_CLEARANCE;
106

107 108 109
    SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
    ReCreateHToolbar();
    ReCreateVToolbar();
110
    ReCreateOptToolbar();
111 112 113

    m_auimgr.SetManagedWindow( this );

114 115 116 117 118 119 120 121 122
    EDA_PANEINFO horiz;
    horiz.HorizontalToolbarPane();

    EDA_PANEINFO vert;
    vert.VerticalToolbarPane();

    EDA_PANEINFO mesg;
    mesg.MessageToolbarPane();

123 124
    m_auimgr.AddPane( m_mainToolBar,
                      wxAuiPaneInfo( horiz ).Name( wxT( "m_mainToolBar" ) ).Top(). Row( 0 ) );
125

126 127 128
    if( m_drawToolBar )    // Currently, no vertical right toolbar.
        m_auimgr.AddPane( m_drawToolBar,
                          wxAuiPaneInfo( vert ).Name( wxT( "m_drawToolBar" ) ).Right() );
129

130
    m_auimgr.AddPane( m_canvas,
131
                      wxAuiPaneInfo().Name( wxT( "DisplayFrame" ) ).CentrePane() );
132

133
    m_auimgr.AddPane( m_messagePanel,
134
                      wxAuiPaneInfo( mesg ).Name( wxT( "MsgPanel" ) ).Bottom().Layer(10) );
135

136 137
    m_auimgr.AddPane( m_optionsToolBar,
                      wxAuiPaneInfo( vert ).Name( wxT( "m_optionsToolBar" ) ).Left() );
138

139
    m_auimgr.Update();
140

141
    Show( true );
plyatov's avatar
plyatov committed
142 143 144
}


charras's avatar
charras committed
145
DISPLAY_FOOTPRINTS_FRAME::~DISPLAY_FOOTPRINTS_FRAME()
plyatov's avatar
plyatov committed
146
{
147
    delete GetScreen();
148
    SetScreen( NULL );      // Be sure there is no double deletion
plyatov's avatar
plyatov committed
149 150
}

Dick Hollenbeck's avatar
Dick Hollenbeck committed
151

charras's avatar
charras committed
152
void DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow( wxCloseEvent& event )
plyatov's avatar
plyatov committed
153
{
154
    if( m_Draw3DFrame )
155 156
        m_Draw3DFrame->Close( true );

157
    Destroy();
plyatov's avatar
plyatov committed
158 159 160
}


charras's avatar
charras committed
161
void DISPLAY_FOOTPRINTS_FRAME::ReCreateVToolbar()
plyatov's avatar
plyatov committed
162
{
163 164
    // Currently, no vertical right toolbar.
    // So do nothing
plyatov's avatar
plyatov committed
165 166 167
}


168 169
void DISPLAY_FOOTPRINTS_FRAME::ReCreateOptToolbar()
{
170
    if( m_optionsToolBar )
171 172 173
        return;

    // Create options tool bar.
174 175
    m_optionsToolBar = new wxAuiToolBar( this, ID_OPT_TOOLBAR, wxDefaultPosition, wxDefaultSize,
                                         wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_VERTICAL );
176

177
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_GRID, wxEmptyString, KiBitmap( grid_xpm ),
178 179
                               _( "Hide grid" ), wxITEM_CHECK );

180
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_POLAR_COORD, wxEmptyString,
181
                               KiBitmap( polar_coord_xpm ),
182
                               _( "Display polar coordinates" ), wxITEM_CHECK );
183

184
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString,
185
                               KiBitmap( unit_inch_xpm ),
186 187
                               _( "Units in inches" ), wxITEM_CHECK );

188
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString,
189
                               KiBitmap( unit_mm_xpm ),
190 191
                               _( "Units in millimeters" ), wxITEM_CHECK );

192
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_CURSOR, wxEmptyString,
193
                               KiBitmap( cursor_shape_xpm ),
194
                               _( "Change cursor shape" ), wxITEM_CHECK  );
195

196 197
    m_optionsToolBar->AddSeparator();
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_PADS_SKETCH, wxEmptyString,
198
                               KiBitmap( pad_sketch_xpm ),
199
                               _( "Show pads in outline mode" ), wxITEM_CHECK  );
200

201
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, wxEmptyString,
202
                               KiBitmap( text_sketch_xpm ),
203
                               _( "Show texts in line mode" ), wxITEM_CHECK  );
204

205
    m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, wxEmptyString,
206
                               KiBitmap( show_mod_edge_xpm ),
207
                               _( "Show outlines in line mode" ), wxITEM_CHECK  );
208

209
    m_optionsToolBar->Realize();
210 211 212
}


charras's avatar
charras committed
213
void DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar()
plyatov's avatar
plyatov committed
214
{
215
    if( m_mainToolBar != NULL )
216 217
        return;

218 219
    m_mainToolBar = new wxAuiToolBar( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize,
                                      wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_HORZ_LAYOUT );
plyatov's avatar
plyatov committed
220

221 222
    m_mainToolBar->AddTool( ID_OPTIONS_SETUP, wxEmptyString, KiBitmap( display_options_xpm ),
                            _( "Display options" ) );
plyatov's avatar
plyatov committed
223

224
    m_mainToolBar->AddSeparator();
plyatov's avatar
plyatov committed
225

226 227
    m_mainToolBar->AddTool( ID_ZOOM_IN, wxEmptyString, KiBitmap( zoom_in_xpm ),
                            _( "Zoom in (F1)" ) );
plyatov's avatar
plyatov committed
228

229 230
    m_mainToolBar->AddTool( ID_ZOOM_OUT, wxEmptyString, KiBitmap( zoom_out_xpm ),
                            _( "Zoom out (F2)" ) );
plyatov's avatar
plyatov committed
231

232 233
    m_mainToolBar->AddTool( ID_ZOOM_REDRAW, wxEmptyString, KiBitmap( zoom_redraw_xpm ),
                            _( "Redraw view (F3)" ) );
plyatov's avatar
plyatov committed
234

235 236
    m_mainToolBar->AddTool( ID_ZOOM_PAGE, wxEmptyString, KiBitmap( zoom_fit_in_page_xpm ),
                            _( "Zoom auto (Home)" ) );
plyatov's avatar
plyatov committed
237

238 239 240
    m_mainToolBar->AddSeparator();
    m_mainToolBar->AddTool( ID_CVPCB_SHOW3D_FRAME, wxEmptyString, KiBitmap( three_d_xpm ),
                            _( "3D Display" ) );
plyatov's avatar
plyatov committed
241

242 243
    // after adding the buttons to the toolbar, must call Realize() to reflect
    // the changes
244
    m_mainToolBar->Realize();
plyatov's avatar
plyatov committed
245 246 247
}


248
void DISPLAY_FOOTPRINTS_FRAME::OnUpdateTextDrawMode( wxUpdateUIEvent& aEvent )
plyatov's avatar
plyatov committed
249
{
250 251 252
    DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions();

    wxString msgTextsFill[2] = { _( "Show texts in filled mode" ),
253 254
                                 _( "Show texts in sketch mode" ) };

255
    unsigned i = displ_opts->m_DisplayModTextFill == SKETCH ? 0 : 1;
256

257
    aEvent.Check( displ_opts->m_DisplayModTextFill == SKETCH );
258
    m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, msgTextsFill[i] );
259 260 261 262 263 264

}


void DISPLAY_FOOTPRINTS_FRAME::OnUpdateLineDrawMode( wxUpdateUIEvent& aEvent )
{
265 266
    DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions();

267
    wxString msgEdgesFill[2] = { _( "Show outlines in filled mode" ),
268 269
                                 _( "Show outlines in sketch mode" ) };

270
    int i = displ_opts->m_DisplayModEdgeFill == SKETCH ? 0 : 1;
271

272
    aEvent.Check( displ_opts->m_DisplayModEdgeFill == SKETCH );
273
    m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, msgEdgesFill[i] );
plyatov's avatar
plyatov committed
274 275 276
}


charras's avatar
charras committed
277
void DISPLAY_FOOTPRINTS_FRAME::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
plyatov's avatar
plyatov committed
278 279 280
{
}

281

charras's avatar
charras committed
282
void DISPLAY_FOOTPRINTS_FRAME::OnLeftDClick( wxDC* DC, const wxPoint& MousePos )
plyatov's avatar
plyatov committed
283 284 285
{
}

286

287
bool DISPLAY_FOOTPRINTS_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu )
plyatov's avatar
plyatov committed
288
{
289
    return true;
plyatov's avatar
plyatov committed
290 291
}

292

293 294 295
void DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
{
    int        id = event.GetId();
296
    DISPLAY_OPTIONS* displ_opts = (DISPLAY_OPTIONS*)GetDisplayOptions();
297 298 299 300

    switch( id )
    {
    case ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH:
301
        displ_opts->m_DisplayModTextFill = displ_opts->m_DisplayModTextFill == FILLED ? SKETCH : FILLED;
302
        m_canvas->Refresh( );
303 304 305
        break;

    case ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH:
306
        displ_opts->m_DisplayModEdgeFill = displ_opts->m_DisplayModEdgeFill == FILLED ? SKETCH : FILLED;
307
        m_canvas->Refresh();
308 309 310 311 312 313 314 315
        break;

    default:
        DisplayError( this,
                      wxT( "DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar error" ) );
        break;
    }
}
plyatov's avatar
plyatov committed
316

317

318
bool DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey )
plyatov's avatar
plyatov committed
319
{
320 321
    bool eventHandled = true;

Lorenzo Marcantonio's avatar
Lorenzo Marcantonio committed
322 323 324 325
    // Filter out the 'fake' mouse motion after a keyboard movement
    if( !aHotKey && m_movingCursorWithKeyboard )
    {
        m_movingCursorWithKeyboard = false;
326
        return false;
Lorenzo Marcantonio's avatar
Lorenzo Marcantonio committed
327
    }
328

329 330
    wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
    cmd.SetEventObject( this );
331

Lorenzo Marcantonio's avatar
Lorenzo Marcantonio committed
332 333 334
    wxPoint pos = aPosition;
    wxPoint oldpos = GetCrossHairPosition();
    GeneralControlKeyMovement( aHotKey, &pos, true );
335

336
    switch( aHotKey )
337
    {
338 339 340 341
    case WXK_F1:
        cmd.SetId( ID_POPUP_ZOOM_IN );
        GetEventHandler()->ProcessEvent( cmd );
        break;
342

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
    case WXK_F2:
        cmd.SetId( ID_POPUP_ZOOM_OUT );
        GetEventHandler()->ProcessEvent( cmd );
        break;

    case WXK_F3:
        cmd.SetId( ID_ZOOM_REDRAW );
        GetEventHandler()->ProcessEvent( cmd );
        break;

    case WXK_F4:
        cmd.SetId( ID_POPUP_ZOOM_CENTER );
        GetEventHandler()->ProcessEvent( cmd );
        break;

dickelbeck's avatar
dickelbeck committed
358 359 360 361 362
    case WXK_HOME:
        cmd.SetId( ID_ZOOM_PAGE );
        GetEventHandler()->ProcessEvent( cmd );
        break;

363
    case ' ':
Lorenzo Marcantonio's avatar
Lorenzo Marcantonio committed
364
        GetScreen()->m_O_Curseur = GetCrossHairPosition();
365
        break;
366 367 368

    default:
        eventHandled = false;
369 370
    }

371
    SetCrossHairPosition( pos );
Lorenzo Marcantonio's avatar
Lorenzo Marcantonio committed
372
    RefreshCrossHair( oldpos, aPosition, aDC );
373

374
    UpdateStatusBar();    /* Display new cursor coordinates */
375 376

    return eventHandled;
plyatov's avatar
plyatov committed
377 378
}

379

charras's avatar
charras committed
380
void DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame( wxCommandEvent& event )
381 382 383
{
    if( m_Draw3DFrame )
    {
384 385 386 387
        // Raising the window does not show the window on Windows if iconized.
        // This should work on any platform.
        if( m_Draw3DFrame->IsIconized() )
             m_Draw3DFrame->Iconize( false );
388

389 390 391 392 393 394
        m_Draw3DFrame->Raise();

        // Raising the window does not set the focus on Linux.  This should work on any platform.
        if( wxWindow::FindFocus() != m_Draw3DFrame )
            m_Draw3DFrame->SetFocus();

395 396 397
        return;
    }

398
    m_Draw3DFrame = new EDA_3D_FRAME( &Kiway(), this, _( "3D Viewer" ), KICAD_DEFAULT_3D_DRAWFRAME_STYLE );
399
    m_Draw3DFrame->Show( true );
400
}
401

402

403 404 405 406 407 408
/**
 * Virtual function needed by the PCB_SCREEN class derived from BASE_SCREEN
 * this is a virtual pure function in BASE_SCREEN
 * do nothing in Cvpcb
 * could be removed later
 */
409
void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER&, int )
410 411
{
}
charras's avatar
charras committed
412

413

414
bool DISPLAY_FOOTPRINTS_FRAME::IsGridVisible() const
charras's avatar
charras committed
415
{
416
    return m_drawGrid;
charras's avatar
charras committed
417 418
}

419

charras's avatar
charras committed
420 421
void DISPLAY_FOOTPRINTS_FRAME::SetGridVisibility(bool aVisible)
{
422
    m_drawGrid = aVisible;
charras's avatar
charras committed
423 424
}

425

426
EDA_COLOR_T DISPLAY_FOOTPRINTS_FRAME::GetGridColor() const
charras's avatar
charras committed
427 428 429
{
    return DARKGRAY;
}
430 431 432 433


MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName )
{
434
    MODULE* footprint = NULL;
435 436 437

    try
    {
438 439
        FPID fpid;

440
        if( fpid.Parse( aFootprintName ) >= 0 )
441 442 443 444 445 446
        {
            DisplayInfoMessage( this, wxString::Format( wxT( "Footprint ID <%s> is not valid." ),
                                                        GetChars( aFootprintName ) ) );
            return NULL;
        }

447 448
        std::string nickname = fpid.GetLibNickname();
        std::string fpname   = fpid.GetFootprintName();
449 450

        wxLogDebug( wxT( "Load footprint <%s> from library <%s>." ),
451
                    fpname.c_str(), nickname.c_str()  );
452

453 454
        footprint = Prj().PcbFootprintLibs()->FootprintLoad(
                FROM_UTF8( nickname.c_str() ), FROM_UTF8( fpname.c_str() ) );
455
    }
456
    catch( const IO_ERROR& ioe )
457 458 459 460 461
    {
        DisplayError( this, ioe.errorText );
        return NULL;
    }

462 463 464 465 466 467 468
    if( footprint )
    {
        footprint->SetParent( (EDA_ITEM*) GetBoard() );
        footprint->SetPosition( wxPoint( 0, 0 ) );
        return footprint;
    }

469 470 471 472 473 474 475 476 477
    wxString msg = wxString::Format( _( "Footprint '%s' not found" ), aFootprintName.GetData() );
    DisplayError( this, msg );
    return NULL;
}


void DISPLAY_FOOTPRINTS_FRAME::InitDisplay()
{
    wxString msg;
478 479 480

    CVPCB_MAINFRAME* parentframe = (CVPCB_MAINFRAME *) GetParent();

481
    wxString footprintName = parentframe->m_footprintListBox->GetSelectedFootprint();
482 483 484 485

    if( !footprintName.IsEmpty() )
    {
        msg.Printf( _( "Footprint: %s" ), GetChars( footprintName ) );
486

487
        SetTitle( msg );
488
        const FOOTPRINT_INFO* module_info = parentframe->m_footprints.GetModuleInfo( footprintName );
489

490
        const wxChar* libname;
491

492
        if( module_info )
493
            libname = GetChars( module_info->GetNickname() );
494 495
        else
            libname = GetChars( wxT( "???" ) );
496

497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
        msg.Printf( _( "Lib: %s" ), libname );

        SetStatusText( msg, 0 );

        if( GetBoard()->m_Modules.GetCount() )
        {
            // there is only one module in the list
            GetBoard()->m_Modules.DeleteAll();
        }

        MODULE* module = Get_Module( footprintName );

        if( module )
            GetBoard()->m_Modules.PushBack( module );

        Zoom_Automatique( false );
    }
    else   // No footprint to display. Erase old footprint, if any
    {
        if( GetBoard()->m_Modules.GetCount() )
        {
            GetBoard()->m_Modules.DeleteAll();
            Zoom_Automatique( false );
            SetStatusText( wxEmptyString, 0 );
        }
    }

    // Display new cursor coordinates and zoom value:
    UpdateStatusBar();

    GetCanvas()->Refresh();

    if( m_Draw3DFrame )
        m_Draw3DFrame->NewDisplay();
}


void DISPLAY_FOOTPRINTS_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg )
{
    if( !GetBoard() )
        return;

    m_canvas->DrawBackGround( DC );
    GetBoard()->Draw( m_canvas, DC, GR_COPY );

    MODULE* Module = GetBoard()->m_Modules;

    if ( Module )
    {
        MSG_PANEL_ITEMS items;
        Module->GetMsgPanelInfo( items );
        SetMsgPanel( items );
    }

    m_canvas->DrawCrossHair( DC );
}


/*
 * Redraw the BOARD items but not cursors, axis or grid.
 */
void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
                  GR_DRAWMODE aDrawMode, const wxPoint& aOffset )
{
    if( m_Modules )
    {
        m_Modules->Draw( aPanel, aDC, GR_COPY );
    }
}