Exemplo n.º 1
0
        //============================================================================*
        // OnPrintPage()
        //============================================================================*

        private void OnPrintPage(object sender, PrintPageEventArgs e)
        {
            //----------------------------------------------------------------------------*
            // Create the fonts
            //----------------------------------------------------------------------------*

            Font FirearmNameFont  = new Font("Trebuchet MS", 14, FontStyle.Bold);
            Font SerialNumberFont = new Font("Trebuchet MS", 10, FontStyle.Regular);
            Font HeaderFont       = new Font("Trebuchet MS", 10, FontStyle.Bold);
            Font DataFont         = new Font("Trebuchet MS", 9, FontStyle.Regular);
            Font SpecsFont        = new Font("Trebuchet MS", 8, FontStyle.Regular);

            //----------------------------------------------------------------------------*
            // Set Rectangle Size Info
            //----------------------------------------------------------------------------*

            Rectangle PageRect = e.PageBounds;

            Rectangle PageAreaRect = e.PageBounds;

            PageAreaRect.Width  = e.MarginBounds.Width;
            PageAreaRect.Height = e.MarginBounds.Height;

            int nLeftMargin = e.MarginBounds.Left;

            int nXDPI = (int)((double)PageRect.Width / 8.5);
            int nYDPI = (int)((double)PageRect.Height / 11);

            PageRect.X     += (int)((double)nXDPI * 0.5);
            PageRect.Width -= ((int)((double)nXDPI * 0.5) * 2);

            PageRect.Y      += (int)((double)nYDPI * 0.5);
            PageRect.Height -= ((int)((double)nYDPI * 0.5) * 2);

            float nY = PageRect.Top;
            float nX = PageRect.Left;

            //----------------------------------------------------------------------------*
            // Loop through the firearms
            //----------------------------------------------------------------------------*

            foreach (cFirearm Firearm in m_FirearmList)
            {
                if (Firearm.Printed)
                {
                    bool fAllPrinted = true;

                    if (cFirearmAccessoryListPreviewDialog.GearList != null)
                    {
                        foreach (cGear Gear in cFirearmAccessoryListPreviewDialog.GearList)
                        {
                            if (!Gear.Printed)
                            {
                                fAllPrinted = false;

                                break;
                            }
                        }
                    }

                    if (fAllPrinted)
                    {
                        continue;
                    }
                }

                cCaliber.CurrentFirearmType = Firearm.FirearmType;

                //----------------------------------------------------------------------------*
                // Draw the page header
                //----------------------------------------------------------------------------*

                nY = cPrintObject.PrintReportTitle("Firearm Detail Report", e, PageRect);

                string strText = "";
                SizeF  TextSize;

                if (Firearm.Printed)
                {
                    strText = "(Continued)";

                    TextSize = e.Graphics.MeasureString(strText, FirearmNameFont);

                    e.Graphics.DrawString(strText, FirearmNameFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                    nY += TextSize.Height;
                }

                //----------------------------------------------------------------------------*
                // Firearm Name
                //----------------------------------------------------------------------------*

                strText = Firearm.ToShortString();

                TextSize = e.Graphics.MeasureString(strText, FirearmNameFont);

                nY += TextSize.Height;

                e.Graphics.DrawString(strText, FirearmNameFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                nY += TextSize.Height;

                //----------------------------------------------------------------------------*
                // Serial Number
                //----------------------------------------------------------------------------*

                strText  = "Serial Number: ";
                strText += Firearm.SerialNumber;

                TextSize = e.Graphics.MeasureString(strText, SerialNumberFont);

                e.Graphics.DrawString(strText, SerialNumberFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                nY += (TextSize.Height * 2);

                if (!Firearm.Printed)
                {
                    //----------------------------------------------------------------------------*
                    // Firearm Image
                    //----------------------------------------------------------------------------*

                    Bitmap FirearmImage = null;

                    try
                    {
                        if (!String.IsNullOrEmpty(Firearm.ImageFile))
                        {
                            FirearmImage = new Bitmap(Firearm.ImageFile);
                        }
                        else
                        {
                            FirearmImage = Properties.Resources.No_Photo_Available;
                        }
                    }
                    catch
                    {
                        FirearmImage = Properties.Resources.No_Photo_Available;
                    }


                    if (FirearmImage != null)
                    {
                        double dWidth  = FirearmImage.Width;
                        double dHeight = FirearmImage.Height;

                        if (FirearmImage.Width > PageRect.Width)
                        {
                            dHeight  = dHeight / dWidth;
                            dWidth   = PageRect.Width;
                            dHeight *= dWidth;
                        }

                        e.Graphics.DrawImage(FirearmImage, new Rectangle((int)(nX + (PageRect.Width / 2.0) - (dWidth / 2.0)), (int)nY, (int)dWidth, (int)dHeight));

                        nY += (int)dHeight + TextSize.Height;
                    }

                    //----------------------------------------------------------------------------*
                    // Purchase Info
                    //----------------------------------------------------------------------------*

                    if (!String.IsNullOrEmpty(Firearm.Source))
                    {
                        strText  = "Acquired from ";
                        strText += Firearm.Source;
                        strText += " on ";
                        strText += Firearm.PurchaseDate.ToLongDateString();

                        if (Firearm.PurchasePrice > 0.0)
                        {
                            strText += " for ";
                            strText += String.Format("{0}{1:F2}.", m_DataFiles.Preferences.Currency, Firearm.PurchasePrice);
                        }
                        else
                        {
                            strText += " at no cost.";
                        }

                        TextSize = e.Graphics.MeasureString(strText, DataFont);

                        e.Graphics.DrawString(strText, DataFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                        nY += (TextSize.Height * 2);
                    }

                    //----------------------------------------------------------------------------*
                    // Description
                    //----------------------------------------------------------------------------*

                    strText = "";

                    switch (Firearm.Type)
                    {
                    case "Rifle":
                        strText = String.Format("{0} {1} Chambered for {2}", Firearm.Action, Firearm.Type, Firearm.PrimaryCaliber.ToString());

                        break;

                    case "Shotgun":
                        strText = String.Format("{0} {1} {2}", Firearm.PrimaryCaliber.ToString(), Firearm.Action, Firearm.Type);

                        break;

                    case "Revolver":
                        strText = String.Format("{1} {2} in {0} with a {3:G0} Round Cylinder.", Firearm.PrimaryCaliber.ToString(), Firearm.Action, Firearm.Type, Firearm.Capacity);

                        break;

                    case "Derringer":
                        strText = String.Format("{1} {2} in {0} with a {3:G0} Round Capacity.", Firearm.PrimaryCaliber.ToString(), Firearm.Action, Firearm.Type, Firearm.Capacity);

                        break;

                    case "Pistol":
                        if (Firearm.Hammer == "Striker Fired")
                        {
                            strText = String.Format("{0} {1} {2} in {3}", Firearm.Hammer, Firearm.Action, Firearm.Type, Firearm.PrimaryCaliber.ToString());
                        }
                        else
                        {
                            strText = String.Format("{1} {2} in {0}", Firearm.PrimaryCaliber.ToString(), Firearm.Action, Firearm.Type);
                        }

                        if (!String.IsNullOrEmpty(Firearm.Magazine))
                        {
                            strText += String.Format(" with a{0} {1:G0} Round {2} Magazine.", Firearm.Capacity == 8 || Firearm.Capacity == 18 ? "n" : "", Firearm.Capacity, Firearm.Magazine);
                        }
                        break;
                    }

                    if (strText.Length > 0)
                    {
                        TextSize = e.Graphics.MeasureString(strText, DataFont);

                        e.Graphics.DrawString(strText, DataFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                        nY += TextSize.Height;
                    }

                    //----------------------------------------------------------------------------*
                    // Finish
                    //----------------------------------------------------------------------------*

                    strText = "";

                    if (!String.IsNullOrEmpty(Firearm.ReceiverFinish))
                    {
                        strText = Firearm.ReceiverFinish;

                        switch (Firearm.Type)
                        {
                        case "Rifle":
                        case "Shotgun":
                            strText += " Receiver";
                            break;

                        default:
                            strText += " Frame";
                            break;
                        }
                    }

                    if (!String.IsNullOrEmpty(Firearm.BarrelFinish))
                    {
                        if (strText.Length > 0)
                        {
                            if (Firearm.ReceiverFinish == Firearm.BarrelFinish)
                            {
                                strText += " and";
                            }
                            else
                            {
                                strText += " with a ";
                                strText += Firearm.BarrelFinish;
                            }
                        }

                        else
                        {
                            strText = Firearm.BarrelFinish;
                        }

                        switch (Firearm.Type)
                        {
                        case "Pistol":
                            strText += " Slide";
                            break;

                        case "Revolver":
                            strText += " Cylinder";
                            break;

                        default:
                            strText += " Barrel";
                            break;
                        }
                    }

                    TextSize = e.Graphics.MeasureString(strText, DataFont);

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                    nY += (TextSize.Height * 2);

                    //----------------------------------------------------------------------------*
                    // Magazine
                    //----------------------------------------------------------------------------*

                    strText = "";

                    if (Firearm.Magazine != "None")
                    {
                        if (Firearm.Magazine == "Cylinder")
                        {
                            strText = String.Format("{0:G0} Round Cylinder", Firearm.Capacity);
                        }
                        else
                        {
                            strText = String.Format("{0:G0} Round {1} Magazine", Firearm.Capacity, Firearm.Magazine);
                        }

                        TextSize = e.Graphics.MeasureString(strText, DataFont);

                        e.Graphics.DrawString(strText, DataFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                        nY += (TextSize.Height * 2);
                    }

                    //----------------------------------------------------------------------------*
                    // Notes
                    //----------------------------------------------------------------------------*

                    if (!String.IsNullOrEmpty(Firearm.Notes))
                    {
                        strText = "Notes:";

                        TextSize = e.Graphics.MeasureString(strText, HeaderFont);

                        e.Graphics.DrawString(strText, HeaderFont, Brushes.Black, nX, nY);

                        float nOriginalX = nX;

                        nX += TextSize.Width / 2;

                        nY += (TextSize.Height * (float)1.5);

                        int    nPrevIndex = 0;
                        string strNotes   = Firearm.Notes;
                        strText  = "";
                        TextSize = e.Graphics.MeasureString(strNotes, DataFont);
                        int nCharCount = 0;

                        while (true)
                        {
                            bool fLinePrinted = false;

                            for (int nIndex = 0; nIndex < strNotes.Length; nIndex++)
                            {
                                nCharCount++;

                                if (strNotes[nIndex] == '\n')
                                {
                                    continue;
                                }

                                if (strNotes[nIndex] == '\r')
                                {
                                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX, nY);

                                    strText    = "";
                                    nPrevIndex = 0;
                                    nY        += TextSize.Height;

                                    nCharCount++;

                                    strNotes = Firearm.Notes.Substring(nCharCount);

                                    fLinePrinted = true;

                                    break;
                                }

                                strText = strNotes.Substring(0, nIndex + 1);

                                if (strNotes[nIndex] == ' ')
                                {
                                    TextSize = e.Graphics.MeasureString(strText, DataFont);

                                    if (TextSize.Width > PageRect.Width - nX)
                                    {
                                        strText = strNotes.Substring(0, nPrevIndex);

                                        e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX, nY);

                                        strText    = "";
                                        nPrevIndex = 0;
                                        nY        += TextSize.Height;

                                        strNotes = Firearm.Notes.Substring(nCharCount);

                                        fLinePrinted = true;

                                        break;
                                    }

                                    nPrevIndex = nIndex;
                                }
                            }

                            if (!fLinePrinted)
                            {
                                break;
                            }
                        }

                        if (strText.Length > 0)
                        {
                            e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX, nY);
                            nY += TextSize.Height;
                        }

                        nX = nOriginalX;
                    }

                    //----------------------------------------------------------------------------*
                    // Specs
                    //----------------------------------------------------------------------------*

                    if (m_DataFiles.Preferences.FirearmPrintSpecs)
                    {
                        strText = "Additional Specifications:";

                        TextSize = e.Graphics.MeasureString(strText, HeaderFont);

                        nY += (TextSize.Height / (float)2.0);

                        e.Graphics.DrawString(strText, HeaderFont, Brushes.Black, nX, nY);

                        float nOriginalX = nX;

                        nX += TextSize.Width / 2;

                        nY += (TextSize.Height * (float)1.5);

                        int nData1X = (int)e.Graphics.MeasureString("Barrel Length: ", SpecsFont).Width;
                        int nData2X = (int)e.Graphics.MeasureString("Zero Range: ", SpecsFont).Width;
                        int nData3X = (int)e.Graphics.MeasureString("Turret Click: ", SpecsFont).Width;

                        int nColumn1 = (int)nX;
                        int nColumn2 = nColumn1 + (int)e.Graphics.MeasureString("Barrel Length: 00.00", SpecsFont).Width + 20;
                        int nColumn3 = nColumn2 + (int)e.Graphics.MeasureString("Zero Range: ", SpecsFont).Width + (int)e.Graphics.MeasureString("1:00.00", SpecsFont).Width + 20;

                        // Barrel Length

                        nX = nColumn1;

                        strText = String.Format("Barrel Length: {0:F2}", Firearm.BarrelLength);

                        e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                        // Twist

                        if (Firearm.Twist > 0.0)
                        {
                            strText = "Twist: ";

                            nX = nColumn2 + nData2X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                            e.Graphics.DrawString("Twist: ", SpecsFont, Brushes.Black, nX, nY);

                            nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                            strText = String.Format("1:{0:F2}", Firearm.Twist);

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                        }

                        nY += SpecsFont.Height;

                        //----------------------------------------------------------------------------*
                        // Draw zero range and scope click MOA
                        //----------------------------------------------------------------------------*

                        // Sight Height

                        strText = "Sight Height: ";

                        nX = nColumn1 + nData1X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                        e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                        nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                        strText = String.Format("{0:F1}", Firearm.SightHeight);

                        e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                        // Zero Range

                        if (Firearm.ZeroRange != 0)
                        {
                            strText = "Zero Range: ";

                            nX = nColumn2 + nData2X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                            nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                            strText = String.Format("{0:N0}", Firearm.ZeroRange);

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                        }

                        // Scope Click MOA

                        if (Firearm.Scoped)
                        {
                            strText = "Turret Click: ";

                            nX = nColumn3 + nData3X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                            nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                            strText = String.Format("{0:F3} {1}", Firearm.ScopeClick, cFirearm.TurretTypeString(Firearm.TurretType));

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                        }

                        nY += SpecsFont.Height;

                        //----------------------------------------------------------------------------*
                        // Draw headspace and neck size for rifles
                        //----------------------------------------------------------------------------*

                        if (Firearm.FirearmType == cFirearm.eFireArmType.Rifle)
                        {
                            // Headspace

                            if (Firearm.HeadSpace != 0.0)
                            {
                                strText = "Headspace: ";

                                nX = nColumn1 + nData1X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                                nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                                strText = String.Format("{0:F3}", Firearm.HeadSpace);

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                            }

                            // Neck

                            if (Firearm.Neck != 0.0)
                            {
                                strText = "Neck Size: ";

                                nX = nColumn2 + nData2X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                                nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                                strText = String.Format("{0:F3}", Firearm.Neck);

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                            }

                            if (Firearm.HeadSpace != 0.0 || Firearm.Neck != 0.0)
                            {
                                nY += SpecsFont.Height;
                            }
                        }
                    }

                    nX = PageRect.Left;
                }

                //----------------------------------------------------------------------------*
                // Draw Parts & Accessory List
                //----------------------------------------------------------------------------*

                if (m_DataFiles.FirearmAccessoryCount(Firearm) > 0)
                {
                    strText = "Parts, Accessories, & Other Costs";

                    TextSize = e.Graphics.MeasureString(strText, HeaderFont);

                    e.Graphics.DrawString(strText, HeaderFont, Brushes.Black, nLeftMargin + (PageAreaRect.Width / 2) - (TextSize.Width / 2), nY);

                    nY += HeaderFont.Height;

                    cFirearmAccessoryListPreviewDialog.DrawHeader = false;
                    cFirearmAccessoryListPreviewDialog.GearList   = null;
                    cFirearmAccessoryListPreviewDialog.Firearm    = Firearm;

                    nY = cFirearmAccessoryListPreviewDialog.DrawAccessoryList(m_DataFiles, ref e, nY);
                }

                //----------------------------------------------------------------------------*
                // Set Flag and Exit
                //----------------------------------------------------------------------------*

                Firearm.Printed = true;

                break;
            }

            //----------------------------------------------------------------------------*
            // Check for more firearms to print
            //----------------------------------------------------------------------------*

            if (!e.HasMorePages)
            {
                foreach (cFirearm Firearm in m_FirearmList)
                {
                    if (!Firearm.Printed)
                    {
                        e.HasMorePages = true;

                        break;
                    }
                }
            }

            //----------------------------------------------------------------------------*
            // If not, reset the printed flag
            //----------------------------------------------------------------------------*

            if (!e.HasMorePages)
            {
                ResetPrintedFlag();
            }
        }
        //============================================================================*
        // OnPrintPage()
        //============================================================================*

        private void OnPrintPage(object sender, PrintPageEventArgs e)
        {
            //----------------------------------------------------------------------------*
            // Create the fonts
            //----------------------------------------------------------------------------*

            Font FirearmTypeFont = new Font("Trebuchet MS", 10, FontStyle.Bold);
            Font HeaderFont      = new Font("Trebuchet MS", 8, FontStyle.Bold);
            Font DataFont        = new Font("Trebuchet MS", 8, FontStyle.Regular);
            Font SpecsFont       = new Font("Trebuchet MS", 8, FontStyle.Regular);

            //----------------------------------------------------------------------------*
            // Calculate Column Header Name Widths
            //----------------------------------------------------------------------------*

            string strText;
            SizeF  TextSize;

            foreach (cPrintColumn PrintColumn in m_Columns)
            {
                TextSize = e.Graphics.MeasureString(PrintColumn.Name, HeaderFont);

                if (TextSize.Width > PrintColumn.Width)
                {
                    PrintColumn.Width = TextSize.Width;
                }
            }

            //----------------------------------------------------------------------------*
            // Calculate Header Widths
            //----------------------------------------------------------------------------*

            foreach (cFirearm Firearm in m_FirearmList)
            {
                // Name

                TextSize = e.Graphics.MeasureString(Firearm.ToShortString(), DataFont);

                if (TextSize.Width > m_Columns[0].Width)
                {
                    m_Columns[0].Width = TextSize.Width;
                }

                // Caliber

                cCaliber.CurrentFirearmType = Firearm.PrimaryCaliber.FirearmType;

                TextSize = e.Graphics.MeasureString(Firearm.PrimaryCaliber.ToString(), DataFont);

                if (TextSize.Width > m_Columns[1].Width)
                {
                    m_Columns[1].Width = TextSize.Width;
                }

                // Serial #

                TextSize = e.Graphics.MeasureString(Firearm.SerialNumber, DataFont);

                if (TextSize.Width > m_Columns[2].Width)
                {
                    m_Columns[2].Width = TextSize.Width;
                }

                // Purchase Date

                TextSize = e.Graphics.MeasureString(Firearm.PurchaseDate.ToShortDateString(), DataFont);

                if (TextSize.Width > m_Columns[3].Width)
                {
                    m_Columns[3].Width = TextSize.Width;
                }

                // Purchase Price

                TextSize = e.Graphics.MeasureString(String.Format("{0:F2}", Firearm.PurchasePrice), DataFont);

                if (TextSize.Width > m_Columns[4].Width)
                {
                    m_Columns[4].Width = TextSize.Width;
                }

                // Tax

                TextSize = e.Graphics.MeasureString(String.Format("{0:F2}", Firearm.Tax), DataFont);

                if (TextSize.Width > m_Columns[5].Width)
                {
                    m_Columns[5].Width = TextSize.Width;
                }

                // Shipping

                TextSize = e.Graphics.MeasureString(String.Format("{0:F2}", Firearm.Shipping), DataFont);

                if (TextSize.Width > m_Columns[6].Width)
                {
                    m_Columns[6].Width = TextSize.Width;
                }

                // Total Price

                TextSize = e.Graphics.MeasureString(String.Format("{0:F2}", Firearm.PurchasePrice + Firearm.Tax + Firearm.Shipping), DataFont);

                if (TextSize.Width > m_Columns[7].Width)
                {
                    m_Columns[7].Width = TextSize.Width;
                }
            }

            float nLineWidth = 0;

            foreach (cPrintColumn PrintColumn in m_Columns)
            {
                nLineWidth += PrintColumn.Width;
            }

            nLineWidth += ((m_Columns.Length - 1) * 10.0f);

            float nLeftMargin = (e.PageBounds.Width / 2) - (nLineWidth / 2.0f);

            //----------------------------------------------------------------------------*
            // Set Rectangle Size Info
            //----------------------------------------------------------------------------*

            Rectangle PageRect = e.PageBounds;

            int nXDPI = (int)((double)PageRect.Width / 8.5);
            int nYDPI = (int)((double)PageRect.Height / 11);

            PageRect.X     += (int)((double)nXDPI * 0.5);
            PageRect.Width -= ((int)((double)nXDPI * 0.5) * 2);

            PageRect.Y      += (int)((double)nYDPI * 0.5);
            PageRect.Height -= ((int)((double)nYDPI * 0.5) * 2);

            float nY = PageRect.Top;
            float nX = nLeftMargin;

            bool fPageHeader = false;
            bool fTypeHeader = false;
            bool fHeader     = false;

            //----------------------------------------------------------------------------*
            // Loop through the firearm types
            //----------------------------------------------------------------------------*

            for (int nFirearmType = 0; nFirearmType < 3; nFirearmType++)
            {
                fTypeHeader = false;

                //----------------------------------------------------------------------------*
                // Loop through the firearms
                //----------------------------------------------------------------------------*

                foreach (cFirearm Firearm in m_FirearmList)
                {
                    if (Firearm.Printed || Firearm.FirearmType != (cFirearm.eFireArmType)nFirearmType)
                    {
                        continue;
                    }

                    //----------------------------------------------------------------------------*
                    // Make sure we have room on the page to print this firearm
                    //----------------------------------------------------------------------------*

                    int nLines = DataFont.Height;

                    if (m_DataFiles.Preferences.FirearmPrintSpecs)
                    {
                        nLines += (4 * DataFont.Height);
                    }

                    if (nY + nLines > PageRect.Bottom)
                    {
                        e.HasMorePages = true;

                        return;
                    }

                    //----------------------------------------------------------------------------*
                    // Draw the page header if needed
                    //----------------------------------------------------------------------------*

                    if (!fPageHeader)
                    {
                        //----------------------------------------------------------------------------*
                        // Draw the Title
                        //----------------------------------------------------------------------------*

                        nY = cPrintObject.PrintReportTitle("Firearm List", e, PageRect);

                        fPageHeader = true;
                        fTypeHeader = false;
                    }

                    //----------------------------------------------------------------------------*
                    // Draw the type header if needed
                    //----------------------------------------------------------------------------*

                    if (!fTypeHeader)
                    {
                        nY += FirearmTypeFont.Height;

                        strText = "Unknown!!!";

                        switch ((cFirearm.eFireArmType)nFirearmType)
                        {
                        case cFirearm.eFireArmType.Handgun:
                            strText = "Handguns";
                            cCaliber.CurrentFirearmType = cFirearm.eFireArmType.Handgun;
                            break;

                        case cFirearm.eFireArmType.Rifle:
                            strText = "Rifles";
                            cCaliber.CurrentFirearmType = cFirearm.eFireArmType.Rifle;
                            break;

                        case cFirearm.eFireArmType.Shotgun:
                            strText = "Shotguns";
                            cCaliber.CurrentFirearmType = cFirearm.eFireArmType.Shotgun;
                            break;
                        }

                        TextSize = e.Graphics.MeasureString(strText, FirearmTypeFont);

                        e.Graphics.DrawString(strText, FirearmTypeFont, Brushes.Black, nLeftMargin, nY);

                        nY += TextSize.Height;

                        fTypeHeader = true;
                        fHeader     = false;
                    }

                    //----------------------------------------------------------------------------*
                    // Draw the headers if needed
                    //----------------------------------------------------------------------------*

                    if (!fHeader)
                    {
                        nX = nLeftMargin;

                        foreach (cPrintColumn PrintColumn in m_Columns)
                        {
                            e.Graphics.DrawString(PrintColumn.Name, HeaderFont, Brushes.Black, nX, nY);

                            nX += (PrintColumn.Width + 10);
                        }

                        nY += HeaderFont.Height;

                        e.Graphics.DrawLine(Pens.Black, nLeftMargin, nY, nX - 10, nY);

                        nX  = nLeftMargin;
                        nY += 4;

                        fHeader = true;
                    }

                    //----------------------------------------------------------------------------*
                    // Draw the firearm info
                    //----------------------------------------------------------------------------*

                    // Name

                    strText = Firearm.ToShortString();

                    nX = nLeftMargin;

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX, nY);

                    nX += (m_Columns[0].Width + 10);

                    // Caliber

                    strText = Firearm.PrimaryCaliber.ToString();

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX, nY);

                    nX += (m_Columns[1].Width + 10);

                    // Serial #

                    strText = Firearm.SerialNumber;

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX, nY);

                    nX += (m_Columns[2].Width + 10);

                    // Purchase Date

                    if (Firearm.PurchaseDate.Year < 1900)
                    {
                        strText = "-";
                    }
                    else
                    {
                        strText = Firearm.PurchaseDate.ToShortDateString();
                    }

                    TextSize = e.Graphics.MeasureString(strText, DataFont);

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX + (m_Columns[3].Width / 2) - (TextSize.Width / 2), nY);

                    nX += (m_Columns[3].Width + 10);

                    // Purchase Price

                    strText = Firearm.PurchasePrice > 0.0 ? String.Format("{0:N2}", Firearm.PurchasePrice) : "-";

                    TextSize = e.Graphics.MeasureString(strText, DataFont);

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX + m_Columns[4].Width - TextSize.Width, nY);

                    nX += (m_Columns[4].Width + 10);

                    // Tax

                    strText = Firearm.Tax > 0.0 ? String.Format("{0:N2}", Firearm.Tax) : "-";

                    TextSize = e.Graphics.MeasureString(strText, DataFont);

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX + m_Columns[5].Width - TextSize.Width, nY);

                    nX += (m_Columns[5].Width + 10);

                    // Shipping

                    strText = Firearm.Shipping > 0.0 ? String.Format("{0:N2}", Firearm.Shipping) : "-";

                    TextSize = e.Graphics.MeasureString(strText, DataFont);

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX + m_Columns[6].Width - TextSize.Width, nY);

                    nX += (m_Columns[6].Width + 10);

                    // Total Price

                    double dTotal = Firearm.PurchasePrice + Firearm.Tax + Firearm.Shipping;

                    strText = dTotal > 0.0 ? String.Format("{0:N2}", dTotal) : "-";

                    TextSize = e.Graphics.MeasureString(strText, DataFont);

                    e.Graphics.DrawString(strText, DataFont, Brushes.Black, nX + m_Columns[7].Width - TextSize.Width, nY);

                    nX  = nLeftMargin;
                    nY += DataFont.Height;

                    //----------------------------------------------------------------------------*
                    // Draw the specs if needed
                    //----------------------------------------------------------------------------*

                    if (m_DataFiles.Preferences.FirearmPrintSpecs)
                    {
                        int nData1X = (int)e.Graphics.MeasureString("Barrel Length: ", SpecsFont).Width;
                        int nData2X = (int)e.Graphics.MeasureString("Zero Range: ", SpecsFont).Width;
                        int nData3X = (int)e.Graphics.MeasureString("Turret Click: ", SpecsFont).Width;

                        int nColumn1 = (int)nLeftMargin + (int)(m_Columns[0].Width / 2);
                        int nColumn2 = nColumn1 + (int)e.Graphics.MeasureString("Barrel Length: 00.00", SpecsFont).Width + 20;
                        int nColumn3 = nColumn2 + (int)e.Graphics.MeasureString("Zero Range: ", SpecsFont).Width + (int)e.Graphics.MeasureString("1:00.00", SpecsFont).Width + 20;

                        nY += (SpecsFont.Height / 2);

                        // Barrel Length

                        nX = nColumn1;

                        strText = String.Format("Barrel Length: {0:F2}", Firearm.BarrelLength);

                        e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                        // Twist

                        if (Firearm.Twist > 0.0)
                        {
                            strText = "Twist: ";

                            nX = nColumn2 + nData2X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                            e.Graphics.DrawString("Twist: ", SpecsFont, Brushes.Black, nX, nY);

                            nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                            strText = String.Format("1:{0:F2}", Firearm.Twist);

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                        }

                        nY += SpecsFont.Height;

                        //----------------------------------------------------------------------------*
                        // Draw zero range and scope click MOA
                        //----------------------------------------------------------------------------*

                        // Sight Height

                        strText = "Sight Height: ";

                        nX = nColumn1 + nData1X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                        e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                        nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                        strText = String.Format("{0:F1}", Firearm.SightHeight);

                        e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                        // Zero Range

                        if (Firearm.ZeroRange != 0)
                        {
                            strText = "Zero Range: ";

                            nX = nColumn2 + nData2X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                            nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                            strText = String.Format("{0:N0}", Firearm.ZeroRange);

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                        }

                        // Scope Click MOA

                        if (Firearm.Scoped)
                        {
                            strText = "Turret Click: ";

                            nX = nColumn3 + nData3X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                            nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                            strText = String.Format("{0:F3} {1}", Firearm.ScopeClick, cFirearm.TurretTypeString(Firearm.TurretType));

                            e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                        }

                        nY += SpecsFont.Height;

                        //----------------------------------------------------------------------------*
                        // Draw headspace and neck size for rifles
                        //----------------------------------------------------------------------------*

                        if (Firearm.FirearmType == cFirearm.eFireArmType.Rifle)
                        {
                            // Headspace

                            if (Firearm.HeadSpace != 0.0)
                            {
                                strText = "Headspace: ";

                                nX = nColumn1 + nData1X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                                nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                                strText = String.Format("{0:F3}", Firearm.HeadSpace);

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                            }

                            // Neck

                            if (Firearm.Neck != 0.0)
                            {
                                strText = "Neck Size: ";

                                nX = nColumn2 + nData2X - e.Graphics.MeasureString(strText, SpecsFont).Width;

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);

                                nX += e.Graphics.MeasureString(strText, SpecsFont).Width;

                                strText = String.Format("{0:F3}", Firearm.Neck);

                                e.Graphics.DrawString(strText, SpecsFont, Brushes.Black, nX, nY);
                            }

                            if (Firearm.HeadSpace != 0.0 || Firearm.Neck != 0.0)
                            {
                                nY += SpecsFont.Height;
                            }
                        }

                        nY += (SpecsFont.Height / 2);

                        e.Graphics.DrawLine(Pens.Black, nLeftMargin, nY, nLeftMargin + nColumn3 + nData3X, nY);

                        nY += (SpecsFont.Height / 2);
                    }

                    Firearm.Printed = true;
                }
            }

            e.HasMorePages = false;

            ResetPrintedFlag();
        }