The Undo/Redo and Cut/Copy/Paste Capabilities

Start with the project you created in Tutorial 4: Setting Vector Automation Properties.

Take the following steps to add Undo/Redo capabilites to your project.:

1.

Open VecAutDoc.cpp and add the following lines after #include "VecAutDoc.h":

extern CVecAutApp theApp;

2.

Click on the "Resource View" tab of the project workspace.

 

Click to open the "VecAut resources" branch.

 

Click to open the "Menu" branch.

 

Double click "IDR_MAINFRAME".

3.

Click on Edit menu to expand it, then right click on the Copy and choose "Add Event Handler…"

4.

For the "Class Name" drop down box, select "CVecAutDoc".

5.

For "Messages" select "COMMAND".

6.

Click the "Add And Edit" button.

7.

Return to the menu window, then right click again on the Copy and choose "Add Event Handler…"

8.

For "Messages" select "UPDATE_COMMAND_UI".

8.

Click the "Add Function" button.

9.

Repeat the previous five steps for ID_EDIT_CUT, ID_EDIT_PASTE, ID_EDIT_UNDO

10.

Add the code to the following eight functions:

void CVecAutDoc::OnEditCopy() 
{
   theApp.m_Automation.Copy ();
}

void CVecAutDoc::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
   L_BOOL bSelected = FALSE;
   m_VectorWindow.IsObjectSelected (&bSelected);
   pCmdUI->Enable(bSelected);
}

void CVecAutDoc::OnEditCut() 
{
   theApp.m_Automation.Cut ();
}

void CVecAutDoc::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
   L_BOOL bSelected = FALSE;
   m_VectorWindow.IsObjectSelected (&bSelected);
   pCmdUI->Enable(bSelected);
}

void CVecAutDoc::OnEditPaste() 
{
   theApp.m_Automation.Paste ();
}

void CVecAutDoc::OnUpdateEditPaste(CCmdUI* pCmdUI) 
{
   pCmdUI->Enable(theApp.m_Automation.ClipboardDataReady () == TRUE);
}

void CVecAutDoc::OnEditUndo() 
{
   theApp.m_Automation.Undo ();
}

void CVecAutDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) 
{
   pCmdUI->Enable((theApp.m_Automation.CanUndo () == TRUE));
}

11.

The OnNewDocument() and OnOpenDocument() functions make calls to vector functions that get added to the "Undo" stack. For this tutorial, opening and document and creating a new document will not be "undoable". To accomplish this, any code that should not be added to the "undo" stack needs to be wrapped in the following calls:

theApp.m_Automation.SetUndoEnabled (FALSE);
//...code not added to undo stack
theApp.m_Automation.SetUndoEnabled (TRUE);

12.

In the Class View branch, click to open the CVecAutDoc branch.

13.

Double click to edit the OnNewDocument() member function. Add the SetUndoEnabled(FALSE) and SetUndoEnabled(TRUE) calls as follows:

 

BOOL CVecAutDoc::OnNewDocument()
{
   if (!CDocument::OnNewDocument())
      return FALSE;
   
   //Empty the vector of all objects and layers
   m_VectorWindow.Empty ();
   
   //Create an empty vector layer 
   VECTORLAYERDESC VectorLayerDesc; 
   
   VectorLayerDesc.nSize = sizeof(VECTORLAYERDESC); 
   lstrcpy(VectorLayerDesc.szName, TEXT("First Layer"));
   VectorLayerDesc.bVisible= TRUE; 
   VectorLayerDesc.bLocked = FALSE; 
   VectorLayerDesc.dwTag = 0; 
   
   LVectorLayer MyLayer(&VectorLayerDesc); 
   m_VectorWindow.AddLayer (&MyLayer); 
   m_VectorWindow.SetActiveLayer (&MyLayer); 

   m_VectorWindow.EnableAutoScroll (TRUE); 

   VECTORPOINT min, max; 
   min.x = min.y = min.z = max.z = 0.0; 
   max.x = max.y = 100.0; 
   m_VectorWindow.SetParallelogram (&min,&max); 
   m_VectorWindow.Reset ();
   theApp.m_Automation.SetUndoEnabled (TRUE); 

   return TRUE; 
}

14.

Do the same for OnOpenDocument(). The function should look like this:

BOOL CVecAutDoc::OnOpenDocument(LPCTSTR lpszPathName)

{
   L_TCHAR szTemp[_MAX_PATH]; 
   L_BOOL bRet; 
   L_INT  nRet; 

   if (!CDocument::OnOpenDocument(lpszPathName)) 
      return FALSE; 

   theApp.m_Automation.SetUndoEnabled (FALSE);
   lstrcpy(szTemp, lpszPathName); 
   nRet = m_VectorWindow.Load (szTemp); 

   if (nRet == SUCCESS) 
   {
      m_VectorWindow.EnableAutoScroll (TRUE); 
      m_VectorWindow.Reset ();
   }
   else
   {
      CString strTmp; 

      strTmp.Format(TEXT("Error Loading File[%d]"), nRet); 
      AfxMessageBox(strTmp); 
      bRet = FALSE; 
   }
   theApp.m_Automation.SetUndoEnabled (TRUE); 
   return bRet; 
}

15.

Compile and run the demo.

16.

From the program menu, choose View->Vector Toolbar.

17.

Select the line tool and draw three lines.

18.

Choose the select tool, and select one of the lines.

19.

Choose Edit->Cut to remove the line.

20.

Choose Edit-Paste to paste the line.

21.

Using the select tool, select all of the lines.

22.

Hit the "Del" key to delete the lines.

23.

Choose Edit->Undo to bring back the lines.