public override void OnClick(SourceGrid.CellContext sender, EventArgs e)
        {
            base.OnClick(sender, e);

            // 顯示目前焦點所在的儲存格屬於第幾頁。
            SourceGrid.Grid grid = (SourceGrid.Grid)sender.Grid;
            int             row  = sender.Position.Row;

            if (row < 1)
            {
                return;
            }

            int  lineIdx      = m_Form.GetBrailleLineIndex(row);
            int  linesPerPage = AppGlobals.Config.Braille.LinesPerPage;
            bool needPageFoot = AppGlobals.Config.Printing.PrintPageFoot;
            int  currPage     = AppGlobals.CalcCurrentPage(lineIdx, linesPerPage, needPageFoot) + 1;
            int  totalPages   = AppGlobals.CalcTotalPages(m_Form.BrailleDoc.Lines.Count, linesPerPage, needPageFoot);

            m_Form.PageNumberText = currPage.ToString() + "/" + totalPages.ToString();


            //if (m_Form.DebugMode)
            //{
            //    SourceGrid.Grid grid = (SourceGrid.Grid)sender.Grid;
            //    int row = sender.Position.Row;
            //    int col = sender.Position.Column;

            //    BrailleWord brWord = (BrailleWord)grid[row, col].Tag;
            //    string brScreenText = brWord.CellList.ToString();
            //    string brPrinterText = BrailleGlobals.FontConvert.ToString(brWord);

            //    m_Form.StatusBar.Items[0].Text = brWord.Text +
            //        "(" + brScreenText + ") " + // 顯示時的點字 16 進位字串
            //        "[" + brPrinterText + "]";  // 列印時的點字 16 進位字串
            //}
        }
        /// <summary>
        /// 在執行列印前必須進行的初始化參數工作。明眼字及點字於列印之前都必須呼叫此方法。
        /// </summary>
        private void InitializePrintParameters()
        {
            m_TotalPages = AppGlobals.CalcTotalPages(m_BrDoc.Lines.Count, m_PrintOptions.LinesPerPage, m_PrintOptions.PrintPageFoot);

            if (m_PrintOptions.AllPages)    // 列印全部?
            {
                m_PrintOptions.FromPage = 1;
                m_PrintOptions.ToPage   = m_TotalPages;
                m_PageNum = 0;
            }
            else
            {
                // 只列印特定頁次範圍
                m_PageNum = m_PrintOptions.FromPage - 1;

                // 修正終止頁次
                if (m_PrintOptions.ToPage > m_TotalPages)
                {
                    m_PrintOptions.ToPage = m_TotalPages;
                }
            }

            // 起始頁碼
            if (m_PrintOptions.ReassignStartPageNumber)
            {
                m_DisplayedPageNum = m_PrintOptions.StartPageNumber;
            }
            else
            {
                m_DisplayedPageNum = m_PageNum + 1;
            }

            m_BeginOrgPageNumber = -1; // -1 表示沒有指定原書頁碼。
            m_EndOrgPageNumber   = -1; // -1 表示沒有指定原書頁碼。

            m_PrintedPageCount = 0;
        }
        /// <summary>
        /// 將目前的列印參數蒐集並集中存入 PrintOptions 物件。
        /// </summary>
        /// <returns></returns>
        private PrintOptions GetPrintOptions()
        {
            PrintOptions prnOpt = new PrintOptions
            {
                LinesPerPage  = AppGlobals.Config.Braille.LinesPerPage,
                PrintPageFoot = chkPrintPageFoot.Checked,

                // 列印範圍
                AllPages = rdoPrintAll.Checked
            };

            if (!prnOpt.AllPages)
            {
                string[] pageRange = txtPageRange.Text.Split(new char[] { '-' });
                if (pageRange.Length != 2)
                {
                    MsgBoxHelper.ShowInfo("列印範圍無效: " + txtPageRange.Text);
                    txtPageRange.Focus();
                    return(null);
                }

                prnOpt.FromPage = Convert.ToInt32(pageRange[0]);
                prnOpt.ToPage   = Convert.ToInt32(pageRange[1]);

                if (prnOpt.FromPage <= 0 || prnOpt.ToPage <= 0 || prnOpt.FromPage > prnOpt.ToPage)
                {
                    MsgBoxHelper.ShowInfo("列印範圍無效: " + txtPageRange.Text);
                    txtPageRange.Focus();
                    return(null);
                }
                int totalPages = AppGlobals.CalcTotalPages(m_BrDoc.Lines.Count, prnOpt.LinesPerPage, prnOpt.PrintPageFoot);
                if (prnOpt.FromPage > totalPages || prnOpt.ToPage > totalPages)
                {
                    MsgBoxHelper.ShowInfo("列印範圍無效! 起始頁或終止頁超出總頁數。");
                    txtPageRange.Focus();
                    return(null);
                }
            }

            // 起始頁碼
            prnOpt.ReassignStartPageNumber = chkChangeStartPageNum.Checked;
            if (prnOpt.ReassignStartPageNumber)
            {
                try
                {
                    prnOpt.StartPageNumber = Convert.ToInt32(txtStartPageNumber.Text);
                    if (prnOpt.StartPageNumber < 1)
                    {
                        MsgBoxHelper.ShowInfo("無效的起始頁碼: " + txtStartPageNumber.Text);
                        return(null);
                    }
                }
                catch
                {
                    MsgBoxHelper.ShowInfo("無效的起始頁碼: " + txtStartPageNumber.Text);
                    return(null);
                }
            }

            // 手動雙面列印
            switch (cboPrintTextManualDoubleSide.SelectedIndex)
            {
            case 1:
                prnOpt.DoubleSideEffect = DoubleSideEffect.OddPages;
                break;

            case 2:
                prnOpt.DoubleSideEffect = DoubleSideEffect.EvenPages;
                break;

            default:
                prnOpt.DoubleSideEffect = DoubleSideEffect.None;
                break;
            }

            prnOpt.PrinterName           = cboPrinters.Text;
            prnOpt.PrinterNameForBraille = cboPrintersForBraille.Text;
            prnOpt.PaperSourceName       = m_PaperSourceName;
            prnOpt.PaperName             = m_PaperName;
            prnOpt.OddPageMargins        = m_OddPageMargins;
            prnOpt.EvenPageMargins       = m_EvenPageMargins;

            prnOpt.BrSendPageBreakAtEndOfDoc = chkSendPageBreakAtEof.Checked;

            return(prnOpt);
        }