Alain Portal c6cc76c
diff -ru kicad-2010.05.27-5.rev2363/include/wxBasePcbFrame.h kicad-2010.05.27-6.rev2363/include/wxBasePcbFrame.h
Alain Portal c6cc76c
--- kicad-2010.05.27-5.rev2363/include/wxBasePcbFrame.h	2010-05-28 21:47:34.000000000 +0200
Alain Portal c6cc76c
+++ kicad-2010.05.27-6.rev2363/include/wxBasePcbFrame.h	2010-06-15 22:57:22.000000000 +0200
Alain Portal c6cc76c
@@ -213,7 +213,6 @@
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     void    Archive_Modules( const wxString& LibName,
Alain Portal c6cc76c
                              bool            NewModulesOnly );
Alain Portal c6cc76c
-    MODULE* Select_1_Module_From_BOARD( BOARD* Pcb );
Alain Portal c6cc76c
     MODULE* GetModuleByName();
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     /** Function OnModify()
Alain Portal c6cc76c
diff -ru kicad-2010.05.27-5.rev2363/include/wxPcbStruct.h kicad-2010.05.27-6.rev2363/include/wxPcbStruct.h
Alain Portal c6cc76c
--- kicad-2010.05.27-5.rev2363/include/wxPcbStruct.h	2010-05-28 21:47:34.000000000 +0200
Alain Portal c6cc76c
+++ kicad-2010.05.27-6.rev2363/include/wxPcbStruct.h	2010-06-15 22:59:39.000000000 +0200
Alain Portal c6cc76c
@@ -1088,6 +1088,11 @@
Alain Portal c6cc76c
     void         OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawStruct );
Alain Portal c6cc76c
     void         Show3D_Frame( wxCommandEvent& event );
Alain Portal c6cc76c
     void         GeneralControle( wxDC* DC, wxPoint Mouse );
Alain Portal c6cc76c
+
Alain Portal c6cc76c
+    /** function LoadModuleFromBoard
Alain Portal c6cc76c
+     * called from the main toolbar
Alain Portal c6cc76c
+     * to load a footprint from board mainly to edit it
Alain Portal c6cc76c
+     */
Alain Portal c6cc76c
     void         LoadModuleFromBoard( wxCommandEvent& event );
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     /** Virtual Function OnModify()
Alain Portal c6cc76c
@@ -1172,10 +1177,23 @@
Alain Portal c6cc76c
     void         RemoveStruct( EDA_BaseStruct* Item );
Alain Portal c6cc76c
     void         Transform( MODULE* module, int transform );
Alain Portal c6cc76c
 
Alain Portal c6cc76c
-    // loading Footprint
Alain Portal c6cc76c
+    // loading/exporting Footprint
Alain Portal c6cc76c
     MODULE*      Import_Module( wxDC* DC );
Alain Portal c6cc76c
     void         Export_Module( MODULE* ptmod, bool createlib );
Alain Portal c6cc76c
-    void         Load_Module_From_BOARD( MODULE* Module );
Alain Portal c6cc76c
+
Alain Portal c6cc76c
+    /** function Load_Module_From_BOARD
Alain Portal c6cc76c
+     * load in Modedit a footfrint from the main board
Alain Portal c6cc76c
+     * @param Module = the module to load. If NULL, a module reference will we asked to user
Alain Portal c6cc76c
+     * @return true if a module isloaded, false otherwise.
Alain Portal c6cc76c
+     */
Alain Portal c6cc76c
+    bool         Load_Module_From_BOARD( MODULE* Module );
Alain Portal c6cc76c
+
Alain Portal c6cc76c
+    /** Function Select_1_Module_From_BOARD
Alain Portal c6cc76c
+     * Display the list of modules currently existing on the BOARD
Alain Portal c6cc76c
+     * @return a pointer to a module if this module is selected or NULL otherwise
Alain Portal c6cc76c
+     * @param aPcb = the board from modules can be loaded
Alain Portal c6cc76c
+     */
Alain Portal c6cc76c
+    MODULE*      Select_1_Module_From_BOARD( BOARD* aPcb );
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     // functions to edit footprint edges
Alain Portal c6cc76c
 
Alain Portal c6cc76c
diff -ru kicad-2010.05.27-5.rev2363/pcbnew/class_module.cpp kicad-2010.05.27-6.rev2363/pcbnew/class_module.cpp
Alain Portal c6cc76c
--- kicad-2010.05.27-5.rev2363/pcbnew/class_module.cpp	2010-05-28 21:47:32.000000000 +0200
Alain Portal c6cc76c
+++ kicad-2010.05.27-6.rev2363/pcbnew/class_module.cpp	2010-06-15 23:00:21.000000000 +0200
Alain Portal c6cc76c
@@ -101,6 +101,7 @@
Alain Portal c6cc76c
     m_CntRot90      = aModule->m_CntRot90;
Alain Portal c6cc76c
     m_CntRot180     = aModule->m_CntRot180;
Alain Portal c6cc76c
     m_LastEdit_Time = aModule->m_LastEdit_Time;
Alain Portal c6cc76c
+    m_Link          = aModule->m_Link;
Alain Portal c6cc76c
     m_Path          = aModule->m_Path; //is this correct behavior?
Alain Portal c6cc76c
     m_TimeStamp     = GetTimeStamp();
Alain Portal c6cc76c
     m_LocalSolderMaskMargin  = aModule->m_LocalSolderMaskMargin;
Alain Portal c6cc76c
diff -ru kicad-2010.05.27-5.rev2363/pcbnew/loadcmp.cpp kicad-2010.05.27-6.rev2363/pcbnew/loadcmp.cpp
Alain Portal c6cc76c
--- kicad-2010.05.27-5.rev2363/pcbnew/loadcmp.cpp	2010-05-28 21:47:32.000000000 +0200
Alain Portal c6cc76c
+++ kicad-2010.05.27-6.rev2363/pcbnew/loadcmp.cpp	2010-06-15 23:05:34.000000000 +0200
Alain Portal c6cc76c
@@ -41,27 +41,30 @@
Alain Portal c6cc76c
 
Alain Portal c6cc76c
 static ModList* MList;
Alain Portal c6cc76c
 
Alain Portal c6cc76c
-
Alain Portal c6cc76c
-void WinEDA_ModuleEditFrame::Load_Module_From_BOARD( MODULE* Module )
Alain Portal c6cc76c
+/** function Load_Module_From_BOARD
Alain Portal c6cc76c
+ * load in Modedit a footfrint from the main board
Alain Portal c6cc76c
+ * @param Module = the module to load. If NULL, a module reference will we asked to user
Alain Portal c6cc76c
+ * @return true if a module isloaded, false otherwise.
Alain Portal c6cc76c
+ */
Alain Portal c6cc76c
+bool WinEDA_ModuleEditFrame::Load_Module_From_BOARD( MODULE* Module )
Alain Portal c6cc76c
 {
Alain Portal c6cc76c
     MODULE* NewModule;
Alain Portal c6cc76c
     WinEDA_BasePcbFrame* parent = (WinEDA_BasePcbFrame*) GetParent();
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     if( Module == NULL )
Alain Portal c6cc76c
     {
Alain Portal c6cc76c
-        if( parent->GetBoard() == NULL
Alain Portal c6cc76c
-            || parent->GetBoard()->m_Modules == NULL )
Alain Portal c6cc76c
-            return;
Alain Portal c6cc76c
+        if( ! parent->GetBoard() || ! parent->GetBoard()->m_Modules )
Alain Portal c6cc76c
+            return false;
Alain Portal c6cc76c
 
Alain Portal c6cc76c
         Module = Select_1_Module_From_BOARD( parent->GetBoard() );
Alain Portal c6cc76c
     }
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     if( Module == NULL )
Alain Portal c6cc76c
-        return;
Alain Portal c6cc76c
+        return false;
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     SetCurItem( NULL );
Alain Portal c6cc76c
 
Alain Portal c6cc76c
-    Clear_Pcb( TRUE );
Alain Portal c6cc76c
+    Clear_Pcb( false );
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     GetBoard()->m_Status_Pcb = 0;
Alain Portal c6cc76c
     NewModule = new MODULE( GetBoard() );
Alain Portal c6cc76c
@@ -80,9 +83,11 @@
Alain Portal c6cc76c
     Place_Module( Module, NULL );
Alain Portal c6cc76c
     if( Module->GetLayer() != LAYER_N_FRONT )
Alain Portal c6cc76c
         Module->Flip( Module->m_Pos );
Alain Portal c6cc76c
-    Rotate_Module( NULL, Module, 0, FALSE );
Alain Portal c6cc76c
+    Rotate_Module( NULL, Module, 0, false );
Alain Portal c6cc76c
     GetScreen()->ClrModify();
Alain Portal c6cc76c
     Zoom_Automatique( TRUE );
Alain Portal c6cc76c
+
Alain Portal c6cc76c
+    return true;
Alain Portal c6cc76c
 }
Alain Portal c6cc76c
 
Alain Portal c6cc76c
 
Alain Portal c6cc76c
@@ -117,7 +122,7 @@
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     if( ModuleName[0] == '=' )   // Selection by keywords
Alain Portal c6cc76c
     {
Alain Portal c6cc76c
-        AllowWildSeach = FALSE;
Alain Portal c6cc76c
+        AllowWildSeach = false;
Alain Portal c6cc76c
         keys = ModuleName.AfterFirst( '=' );
Alain Portal c6cc76c
         ModuleName = Select_1_Module_From_List( this, library, wxEmptyString,
Alain Portal c6cc76c
                                                 keys );
Alain Portal c6cc76c
@@ -130,7 +135,7 @@
Alain Portal c6cc76c
     else if( ( ModuleName.Contains( wxT( "?" ) ) )
Alain Portal c6cc76c
             || ( ModuleName.Contains( wxT( "*" ) ) ) )  // Selection wild card
Alain Portal c6cc76c
     {
Alain Portal c6cc76c
-        AllowWildSeach = FALSE;
Alain Portal c6cc76c
+        AllowWildSeach = false;
Alain Portal c6cc76c
         ModuleName     = Select_1_Module_From_List( this, library, ModuleName,
Alain Portal c6cc76c
                                                     wxEmptyString );
Alain Portal c6cc76c
         if( ModuleName.IsEmpty() )
Alain Portal c6cc76c
@@ -140,11 +145,11 @@
Alain Portal c6cc76c
         }
Alain Portal c6cc76c
     }
Alain Portal c6cc76c
 
Alain Portal c6cc76c
-    module = Get_Librairie_Module( library, ModuleName, FALSE );
Alain Portal c6cc76c
+    module = Get_Librairie_Module( library, ModuleName, false );
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     if( ( module == NULL ) && AllowWildSeach )    /* Search with wildcard */
Alain Portal c6cc76c
     {
Alain Portal c6cc76c
-        AllowWildSeach = FALSE;
Alain Portal c6cc76c
+        AllowWildSeach = false;
Alain Portal c6cc76c
         wxString wildname = wxChar( '*' ) + ModuleName + wxChar( '*' );
Alain Portal c6cc76c
         ModuleName = wildname;
Alain Portal c6cc76c
         ModuleName = Select_1_Module_From_List( this, library, ModuleName,
Alain Portal c6cc76c
@@ -445,7 +450,7 @@
Alain Portal c6cc76c
                         ListBox->Append( msg );
Alain Portal c6cc76c
                         NbModules++;
Alain Portal c6cc76c
                     }
Alain Portal c6cc76c
-                    else if( WildCompareString( aMask, msg, FALSE ) )
Alain Portal c6cc76c
+                    else if( WildCompareString( aMask, msg, false ) )
Alain Portal c6cc76c
                     {
Alain Portal c6cc76c
                         ListBox->Append( msg );
Alain Portal c6cc76c
                         NbModules++;
Alain Portal c6cc76c
@@ -594,11 +599,12 @@
Alain Portal c6cc76c
 }
Alain Portal c6cc76c
 
Alain Portal c6cc76c
 
Alain Portal c6cc76c
-/* Display the list of modules currently PCB
Alain Portal c6cc76c
- * Returns a pointer if module selected
Alain Portal c6cc76c
- * Returns NULL otherwise
Alain Portal c6cc76c
+/** Function Select_1_Module_From_BOARD
Alain Portal c6cc76c
+ * Display the list of modules currently existing on the BOARD
Alain Portal c6cc76c
+ * @return a pointer to a module if this module is selected or NULL otherwise
Alain Portal c6cc76c
+ * @param aPcb = the board from modules can be loaded
Alain Portal c6cc76c
  */
Alain Portal c6cc76c
-MODULE* WinEDA_BasePcbFrame::Select_1_Module_From_BOARD( BOARD* Pcb )
Alain Portal c6cc76c
+MODULE* WinEDA_ModuleEditFrame::Select_1_Module_From_BOARD( BOARD* aPcb )
Alain Portal c6cc76c
 {
Alain Portal c6cc76c
     int             ii;
Alain Portal c6cc76c
     MODULE*         Module;
Alain Portal c6cc76c
@@ -610,7 +616,7 @@
Alain Portal c6cc76c
                                                  wxColour( 200, 200, 255 ) );
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     ii     = 0;
Alain Portal c6cc76c
-    Module = Pcb->m_Modules;
Alain Portal c6cc76c
+    Module = aPcb->m_Modules;
Alain Portal c6cc76c
     for( ; Module != NULL; Module = (MODULE*) Module->Next() )
Alain Portal c6cc76c
     {
Alain Portal c6cc76c
         ii++;
Alain Portal c6cc76c
@@ -635,7 +641,7 @@
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     OldName = CmpName;
Alain Portal c6cc76c
 
Alain Portal c6cc76c
-    Module = Pcb->m_Modules;
Alain Portal c6cc76c
+    Module = aPcb->m_Modules;
Alain Portal c6cc76c
     for( ; Module != NULL; Module = (MODULE*) Module->Next() )
Alain Portal c6cc76c
     {
Alain Portal c6cc76c
         if( CmpName.CmpNoCase( Module->m_Reference->m_Text ) == 0 )
Alain Portal c6cc76c
diff -ru kicad-2010.05.27-5.rev2363/pcbnew/modedit.cpp kicad-2010.05.27-6.rev2363/pcbnew/modedit.cpp
Alain Portal c6cc76c
--- kicad-2010.05.27-5.rev2363/pcbnew/modedit.cpp	2010-05-28 21:47:32.000000000 +0200
Alain Portal c6cc76c
+++ kicad-2010.05.27-6.rev2363/pcbnew/modedit.cpp	2010-06-15 23:08:06.000000000 +0200
Alain Portal c6cc76c
@@ -131,11 +131,23 @@
Alain Portal c6cc76c
     return item;
Alain Portal c6cc76c
 }
Alain Portal c6cc76c
 
Alain Portal c6cc76c
-
Alain Portal c6cc76c
+/** function LoadModuleFromBoard
Alain Portal c6cc76c
+ * called from the main toolbar
Alain Portal c6cc76c
+ * to load a footprint from board mainly to edit it
Alain Portal c6cc76c
+ */
Alain Portal c6cc76c
 void WinEDA_ModuleEditFrame::LoadModuleFromBoard( wxCommandEvent& event )
Alain Portal c6cc76c
 {
Alain Portal c6cc76c
+    if(  GetScreen()->IsModify() )
Alain Portal c6cc76c
+    {
Alain Portal c6cc76c
+        if( !IsOK( this,
Alain Portal c6cc76c
+            _( "Current footprint changes will be lost and this operation cannot be undone. Continue ?" ) ) )
Alain Portal c6cc76c
+            return;
Alain Portal c6cc76c
+    }
Alain Portal c6cc76c
+
Alain Portal c6cc76c
+    if( ! Load_Module_From_BOARD( NULL ) )
Alain Portal c6cc76c
+        return;
Alain Portal c6cc76c
+
Alain Portal c6cc76c
     GetScreen()->ClearUndoRedoList();
Alain Portal c6cc76c
-    Load_Module_From_BOARD( NULL );
Alain Portal c6cc76c
     GetScreen()->ClrModify();
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     if( m_Draw3DFrame )
Alain Portal c6cc76c
@@ -333,9 +345,10 @@
Alain Portal c6cc76c
     break;
Alain Portal c6cc76c
 
Alain Portal c6cc76c
     case ID_MODEDIT_IMPORT_PART:
Alain Portal c6cc76c
+        if( ! Clear_Pcb( true ) )
Alain Portal c6cc76c
+            break;                  // //this command is aborted
Alain Portal c6cc76c
         GetScreen()->ClearUndoRedoList();
Alain Portal c6cc76c
         SetCurItem( NULL );
Alain Portal c6cc76c
-        Clear_Pcb( true );
Alain Portal c6cc76c
         GetScreen()->m_Curseur = wxPoint( 0, 0 );
Alain Portal c6cc76c
         Import_Module( NULL );
Alain Portal c6cc76c
         redraw = true;