/// <summary>
        /// Create a book from files selected by the user
        /// </summary>
        public void CreateBookFromFiles()
        {
            OpenFileDialog          openDlg;
            SaveFileDialog          saveDlg;
            PgnParser               parser;
            Stream                  stream;
            TextReader              reader;
            Book                    book;
            string                  strText;
            List<int[]>             arrMoveList;
            int                     iSkip;
            int                     iTruncated;
            int                     iTotalSkip = 0;
            int                     iTotalTruncated = 0;
            int                     iTotalFiles = 0;
            int                     iBookEntries;
            bool                    bAbort = false;

            arrMoveList = new List<int[]>(8192);
            book        = new Book();
            openDlg = new OpenFileDialog();
            openDlg.AddExtension        = true;
            openDlg.CheckFileExists     = true;
            openDlg.CheckPathExists     = true;
            openDlg.DefaultExt          = "pgn";
            openDlg.Filter              = "Chess PGN Files (*.pgn)|*.pgn";
            openDlg.Multiselect         = true;
            if (openDlg.ShowDialog() == true) {
                foreach (string strFileName in openDlg.FileNames) {
                    try {
                        stream = File.OpenRead(strFileName);
                    } catch(System.Exception) {
                        MessageBox.Show("Unable to open the file - " + strFileName);
                        stream = null;
                    }
                    if (stream != null) {
                        reader  = new StreamReader(stream);
                        strText = reader.ReadToEnd();
                        parser  = new PgnParser(false);
                        try {
                            parser.Parse(strText, arrMoveList, out iSkip, out iTruncated);
                            iTotalSkip      += iSkip;
                            iTotalTruncated += iTruncated;
                            iTotalFiles++;
                        } catch(PgnParserException exc) {
                            MessageBox.Show("Error processing file '" + strFileName + "'\r\n" + exc.Message + "\r\n" + exc.CodeInError);
                            bAbort =  true;
                        }
                        stream.Close();
                    }
                    if (bAbort) {
                        break;
                    }
                }
                if (!bAbort) {
                    iBookEntries = book.CreateBookList(arrMoveList, 30, 10);
                    MessageBox.Show(iTotalFiles.ToString() + " PNG file(s) read. " + arrMoveList.Count.ToString() + " games processed. " + iTotalTruncated.ToString() + " truncated. " + iTotalSkip.ToString() + " skipped. " + iBookEntries.ToString() + " book entries defined.");
                    saveDlg = new SaveFileDialog();
                    saveDlg.AddExtension        = true;
                    saveDlg.CheckPathExists     = true;
                    saveDlg.DefaultExt          = "bin";
                    saveDlg.Filter              = "Chess Opening Book (*.bin)|*.bin";
                    saveDlg.OverwritePrompt     = true;
                    if (saveDlg.ShowDialog() == true) {
                        try {
                            book.SaveBookToFile(saveDlg.FileName);
                        } catch (System.Exception ex) {
                            MessageBox.Show(ex.Message);
                        }
                    }
                }
            }
        }