Open most recent file (2)

The article Open most recent file by Adam Solesby discussed how to open the most recently used file using the MRU list. This article develops the idea to starting a MDI application with many recent files opened.

With MDI application it is sometimes useful to start a session with more documents opened or perhaps only documents that were active at the end of our last session. MRU list treats all recent files equally and doesn't check whether they were opened or closed when we left. There is a way around if we manage the MRU list by ourselves. First, we should declare some variables and constants:

int nStartMode;             // remember the starting mode 
int nMaxFiles;              // number of recent active files to remember
BOOL bCleanMRU;             // shall we manage the MRU list ourselves?
CRecentFileList* pMRU;      // global pointer to MRU list. 
#define NO_DOCUMENT   1     // don't open new document at all
#define LAST_DOCUMENT 2     // open one or more last documents
#define MAX_MRUFILES 10     // Number of most recent documents 

We can allow the user to select various starting modes: to open application with an empty document, with documents that were active when we left our last session, or without any document window. The user could also define maximal number of recent active files to be opened.
nStartMode = LAST_DOCUMENT;		 
nMaxFiles = MAX_MRUFILES;			 	
bCleanMRU = TRUE;

Now add the following code to your application's InitInstance(), after the call to ParseCommandLine():
CMyApp::InitInstance()
{
    .
    .
    .
    // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);

    //===START OF MODIFICATION BLOCK=========================
    if (cmdInfo.m_strFileName.IsEmpty())
    {
        // If a file is not specified on the command line
        // and we don't want to start with an empty document
        // we will not use shell command to open a document
        if(nStartMode==NO_DOCUMENT || nStartMode==LAST_DOCUMENT)
            cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
    }

    // Dispatch commands specified on the command line
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;

    // The main window has been initialized, so show and update it.
    pMainFrame->ShowWindow(m_nCmdShow);
    pMainFrame->UpdateWindow();
     
    pMRU=m_pRecentFileList;  // remember the pointer to MRU. 

    // Open documents with our new function
    if(cmdInfo.m_strFileName.IsEmpty() && (nStartMode == LAST_DOCUMENT))
        OpenRecentFiles(nMaxFiles);
    //===END OF MODIFICATION BLOCK =========================
	
    return TRUE;
}

And here is the procedure (called from the InitInstance() above) that will open all the documents from the MRU list. Put it into the main application class. With the parameter you can limit the number of documents.
void CMyApp::OpenRecentFiles(int n)
{
    for(int i=0;(i < m_pRecentFileList->GetSize() && i < n);i++)  
    {
        CString strFileName(m_pRecentFileList->m_arrNames[i]);
        if(strFileName.IsEmpty())
            return;
        OpenDocumentFile(strFileName);
    }
} 

To close the session leaving only the active documents on the MRU list we need to modify it. Put this code at the end of CMainFrame::OnClose().
void CMainFrame::OnClose() 
{
    .
    .
    //===START OF MODIFICATION BLOCK=========================
    if(bCleanMRU)  // option to save only the active files
    {
        // clear list
        for(int i=0;i < pMRU->m_nSize;i++)
        pMRU->Remove(0); 

        // fill list with active files paths
        POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
        if(pos!=NULL)
        {
            CDocTemplate* pTempl = AfxGetApp()->GetNextDocTemplate(pos); 
            POSITION pos=pTempl->GetFirstDocPosition();
            while(pos!=NULL)
            {
                CDocument* pDoc = pTempl->GetNextDoc(pos);
                if(pDoc)
                    pMRU->Add((LPCTSTR)pDoc->GetPathName());
            }
        }
    }
    //===END OF MODIFICATION BLOCK=========================
    CMDIFrameWnd::OnClose(); 
}



Comments

  • MRU file list not saved.

    Posted by Legacy on 02/06/2003 12:00am

    Originally posted by: Tushar

    Hello ,
    I am developing a MDI application. My MRU file list is not get saved when i close my apllication. can any one help me out and tell what might have gone wrong.

    Please...

    Thanks..

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: July 8, 2015 @ 2:00 p.m. ET / 11:00 a.m. PT With business driving the increasing adoption of agile methodologies such as Continuous Integration and Continuous Deployment, the need for agile database tooling has become even more important. In many companies, the database development lifecycle has become the bottleneck in an otherwise agile delivery process. As such, database professionals are under increasing pressure to shorten delivery timelines even further, only increasing the stakes …

  • On-demand Event Event Date: June 23, 2015 Business transformation is not just important, it is vital to the success of all organizations in the 21st century marketplace. How IT approaches and executes the move from cost center to revenue contributor will not only transform the IT organization, it will change how companies retain competitive advantage and meet the requirements of internal and external customers. This shift in thinking is not new, but actualizing it is. Check out this eSeminar to learn the …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date