Changeset 1469 for Scheduling/trunk/cs


Ignore:
Timestamp:
Jul 6, 2012, 12:23:58 PM (12 years ago)
Author:
Sam Habiel
Message:

Updated printing code to use the one provided by EHS. Now prints on A6 paper. Works as well with Letter and A4.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Scheduling/trunk/cs/bsdx0200GUISourceCode/Printing.cs

    r1176 r1469  
    1010{
    1111    public partial class Printing
    12     { 
     12    {
    1313        /// <summary>
    1414        /// Print Appointments
     
    3333            Font f10 = new Font(FontFamily.GenericSerif, 10);
    3434            Font f14bold = new Font(FontFamily.GenericSerif, 14, FontStyle.Bold);
    35            
     35
    3636            //Center Alignment for some stuff
    3737            StringFormat sf = new StringFormat();
    3838            sf.Alignment = StringAlignment.Center;
    39            
     39
    4040            //Header
    4141            g.DrawString("Confidential Patient Information", f8, Brushes.Black, e.PageBounds, sf);
    42            
     42
    4343            //Footer
    4444            sf.Alignment = StringAlignment.Center;
     
    7272            //resource we want to print
    7373            dsPatientApptDisplay2.BSDXResourceRow r = ds.BSDXResource[resourceToPrint];
    74            
     74
    7575            //header
    7676            string toprint;
     
    7979                + end.ToShortDateString();
    8080            g.DrawString(toprint, f14bold, Brushes.Black, printArea);
    81            
     81
    8282            //Move print area down
    8383            int titleHeight = (int)g.MeasureString(toprint, f14bold, printArea.Size).Height;
     
    8787            //Draw Line
    8888            g.DrawLine(new Pen(Brushes.Black, 0), printArea.X, printArea.Y, printArea.X + printArea.Width, printArea.Y);
    89            
     89
    9090            //Move print area down
    91             printArea.Y += 5; 
     91            printArea.Y += 5;
    9292            printArea.Height -= 5;
    93            
     93
    9494            System.Data.DataRow[] appts = r.GetChildRows(ds.Relations[0]); //ds has only one relation
    9595
    9696            StringFormat sf2 = new StringFormat();                 //sf to hold tab stops
    97             sf2.SetTabStops(50, new float[] { 100, 250, 25 });     
     97            sf2.SetTabStops(50, new float[] { 100, 250, 25 });
    9898
    9999            //appt printed starts at zero
     
    101101            {
    102102                dsPatientApptDisplay2.PatientApptsRow a = (dsPatientApptDisplay2.PatientApptsRow)appts[apptPrinting];
    103                
    104                 StringBuilder apptPrintStr = new StringBuilder(200); 
     103
     104                StringBuilder apptPrintStr = new StringBuilder(200);
    105105                apptPrintStr.AppendLine(a.ApptDate.ToString() + "\t" + a.Name + " (" + a.Sex + ")" + "\t" + "DOB: " + a.DOB.ToShortDateString() + "\t" + "ID: " + a.HRN);
    106106                apptPrintStr.AppendLine("P: " + a.HOMEPHONE + "\t" + "Address: " + a.STREET + ", " + a.CITY + ", " + a.STATE + " " + a.ZIP);
     
    110110                int printedApptHeight = (int)g.MeasureString(apptPrintStr.ToString(), f10, printArea.Width).Height;
    111111                if (printedApptHeight > printArea.Height) // too much to print -- move to next page
    112                     // but don't increment the appointment to print since we haven't printed it yet.
    113                     // i.e. apptPrinting stays the same.
     112                // but don't increment the appointment to print since we haven't printed it yet.
     113                // i.e. apptPrinting stays the same.
    114114                {
    115115                    e.HasMorePages = true;
    116116                    break;
    117117                }
    118    
     118
    119119                //otherwise print it
    120120                g.DrawString(apptPrintStr.ToString(), f10, Brushes.Black, printArea, sf2);
    121                
     121
    122122                //Move print area down
    123123                printArea.Y += printedApptHeight + 3;
     
    148148        public virtual void PrintAppointmentSlip(CGAppointment appt, PrintPageEventArgs e)
    149149        {
    150             // Prep
     150            // setting the reference values for calculating the needed ratio of the coming page.
     151            //referrenceHeight and referrenceWidth for A6 size.
     152            double referrenceHeight = 383;
     153            double referrenceWidth = 213;
     154
     155            //check if the paper is landscape or portrait. if it is landscape then new ratio need to be calculated.
     156            if (e.MarginBounds.Width > e.MarginBounds.Height)
     157            {
     158                //landscape = true;
     159                referrenceHeight = 213;
     160                referrenceWidth = 383;
     161                //fontRatio = ((e.MarginBounds.Height) / referrenceHeight);
     162            }
     163           
     164            //setting the font,width and height ratios
     165            double fontRatio = (e.MarginBounds.Height / referrenceHeight);
     166            if (fontRatio > 1.0)
     167            {
     168                fontRatio = fontRatio * 0.75;
     169            }
     170            double widthRatio = ((e.MarginBounds.Width) / referrenceWidth);
     171            double heightRatio = ((e.MarginBounds.Height) / referrenceHeight);
     172
    151173            Graphics g = e.Graphics;
    152             Rectangle printArea = e.MarginBounds;
    153             Rectangle pageArea = e.PageBounds;
     174            //this is the string which is used to fill with the data and to be print on the screen.
     175            string stringData;
     176
     177            //in portrait we used fonts that fits with the A6 paper and changed depending on the page ratio,but in the land scape we used fonts fits with the A5 paper and counted the other pages depening on the ratios.
     178            Font fontTitle = new Font(FontFamily.GenericSerif, (int)(13 * fontRatio), FontStyle.Bold); //for title
     179            Font fontBody = new Font(FontFamily.GenericSerif, (int)(13 * fontRatio));
     180            Font fontGroupTitle = new Font(FontFamily.GenericSansSerif, (int)(13 * fontRatio), FontStyle.Bold);
     181            Font fFooter = new Font(FontFamily.GenericSerif, (int)(7 * fontRatio));
     182
     183            StringFormat sfCenterNear = new StringFormat()
     184            {
     185                Alignment = StringAlignment.Near,
     186                LineAlignment = StringAlignment.Near
     187            };
     188
     189            StringFormat sfCenterCenter = new StringFormat()
     190            {
     191                Alignment = StringAlignment.Center,
     192                LineAlignment = StringAlignment.Center
     193            };
     194
     195            StringFormat sfCenterFar = new StringFormat()
     196            {
     197                Alignment = StringAlignment.Far,
     198                LineAlignment = StringAlignment.Near
     199            };
     200
     201            StringFormat sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
     202            sf3.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentUICulture.LCID, StringDigitSubstitute.Traditional);
     203
     204
     205            //set the hard margin which different for each printer and multiplied with 2
     206            int HardMarginX = 0;
     207            if ((int)(e.PageSettings.HardMarginX) > 0)
     208            {
     209                HardMarginX=((int)(e.PageSettings.HardMarginX) *2);
     210            }
     211            int HardMarginY = 0;
     212            if ((int)(e.PageSettings.HardMarginY) > 0)
     213            {
     214                HardMarginY = ((int)(e.PageSettings.HardMarginY) * 2);
     215            }
     216
     217            // Draw Header
     218
     219            string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
     220            int divisionStringHeight = (int)g.MeasureString(division.ToString(), fontBody, e.PageBounds.Width - (int)(10 * widthRatio) - HardMarginX).Height;
     221           
    154222            Rectangle headerArea = new Rectangle()
    155223            {
    156                 X = e.MarginBounds.X,
    157                 Y = e.PageBounds.Y,
    158                 Height = e.MarginBounds.Y - e.PageBounds.Y - 50,
    159                 Width = e.MarginBounds.Width
    160             };
     224                X = (int)(5 * widthRatio),
     225                Y = (int)(5 * heightRatio),
     226                Height = divisionStringHeight + (int)(5 * heightRatio),
     227                Width = e.PageBounds.Width - (int)(10 * widthRatio) - HardMarginX
     228            };
     229            g.DrawString(division, fontBody, Brushes.Black, headerArea, sfCenterNear);
     230
     231            //use stringData to print the footer (center all the way)
     232            stringData = strings.Printed + ": " + DateTime.Now.ToString();
     233            int stringDataStringHeight = (int)g.MeasureString(stringData.ToString(), fFooter, e.MarginBounds.Width).Height;
    161234            Rectangle footerArea = new Rectangle()
    162235            {
    163                 X = e.MarginBounds.X,
    164                 Y = e.MarginBounds.Height + headerArea.Height,
    165                 Width = e.MarginBounds.Width,
    166                 Height = pageArea.Height - (e.MarginBounds.Height + headerArea.Height)
    167             };
    168 
    169             string s;
    170 
    171             // A few fonts
    172             Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
    173             Font fBody = new Font(FontFamily.GenericSerif, 12);
    174             Font fGroupTitle = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
    175 
    176             StringFormat sfCenterCenter = new StringFormat()
    177             {
    178                  Alignment = StringAlignment.Center,
    179                  LineAlignment = StringAlignment.Center
    180             };
    181            
    182             // Draw Header
    183             string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
    184             g.DrawString(division, fBody, Brushes.Black, headerArea, sfCenterCenter);
    185 
    186             const int watermarkLength = 75;
     236                X = headerArea.X,
     237                Y = e.PageBounds.Height - stringDataStringHeight - HardMarginY - (int)(5 * heightRatio),
     238                Width = headerArea.Width,
     239                Height = stringDataStringHeight
     240            };
     241            g.DrawString(stringData, fFooter, Brushes.Black, footerArea, sfCenterCenter);
     242           
     243            //setting the printing area bigger than the margin bounds to use more printing space on the paper.
     244            Rectangle printArea = new Rectangle()
     245            {
     246                X = headerArea.X,
     247                Y = headerArea.Y+headerArea.Height,
     248                Height = footerArea.Y-(headerArea.Y+headerArea.Height) - (int)(5 * heightRatio),
     249                Width = headerArea.Width
     250            };
     251           
     252            //  if there is a need for the watermark use the following code.
     253            //const int watermarkLength = 75*heightratio;
    187254
    188255            // Move down for optional form paper
    189             printArea.Y += watermarkLength;
    190             printArea.Height -= watermarkLength;
    191 
    192             // Draw Title
    193             StringFormat sfCenter = new StringFormat();
    194             sfCenter.Alignment = StringAlignment.Center; //for title & header
    195 
    196             s = strings.ApptReminderSlip;
    197             g.DrawString(s, fTitle, Brushes.Black, printArea, sfCenter); //title
    198 
    199             // move down
    200             int titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
     256            //printArea.Y += watermarkLength;
     257            //printArea.Height -= watermarkLength;
     258
     259            //// Draw Title
     260            //StringFormat sfCenter = new StringFormat();
     261            //sfCenter.Alignment = StringAlignment.Center; //for title & header
     262
     263            //string data for the appointment slip title
     264            stringData = strings.ApptReminderSlip;
     265            g.DrawString(stringData, fontTitle, Brushes.Black, printArea, sfCenterFar); //title
     266           
     267            //// move down
     268            int titleHeight = (int)g.MeasureString(stringData, fontTitle, printArea.Width).Height;
    201269            printArea.Y += titleHeight;
    202270            printArea.Height -= titleHeight;
     
    204272            // draw underline
    205273            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
    206             printArea.Y += 15;
    207             printArea.Height -= 15;
    208 
    209             // draw curved rectangle.
    210             Rectangle personalInfoRectangle = new Rectangle(e.MarginBounds.X, printArea.Y + 30, 280, 300);
    211             using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 10))
     274            printArea.Y += (int)(10 * heightRatio);
     275            printArea.Height -= (int)(10 * heightRatio);
     276
     277            // building the string of the person information to write
     278            StringBuilder personInformationString = new StringBuilder(500);
     279            personInformationString.AppendLine(strings.Name + ":" + "\t" + appt.Patient.Name);
     280            //personInformationString.AppendLine();
     281            stringData = appt.Patient.Sex == Sex.Male ? strings.Male : strings.Female;
     282            personInformationString.AppendLine(strings.ID + ":" + "\t" + appt.Patient.ID + "\t" + "( " + stringData + " )");
     283            //personInformationString.AppendLine();
     284            stringData = appt.Patient.DOB.ToString("dd") + " " + appt.Patient.DOB.ToString("MMM") + ", " + appt.Patient.DOB.Year;
     285            personInformationString.AppendLine(strings.DOB + ":" + "\t" + stringData);
     286            //personInformationString.AppendLine();
     287            //personInformationString.AppendLine(strings.Age + ":" + "\t" + appt.Patient.UserFriendlyAge);
     288
     289
     290            // building the string of the appointment information to write
     291            StringBuilder appointmentInformationString = new StringBuilder(500);
     292            appointmentInformationString = new StringBuilder();
     293            appointmentInformationString.AppendLine(strings.Clinic + ":" + "\t" + appt.Resource);
     294            //appointmentInformationString.AppendLine();
     295            stringData = appt.StartTime.ToString("dddd") + " " + appt.StartTime.ToString("dd") + " " + appt.StartTime.ToString("MMM") + ", " + appt.StartTime.Year;
     296            appointmentInformationString.AppendLine(strings.Date + ":" + "\t" + stringData);
     297            //sb.AppendLine();
     298            //appointmentInformationString.AppendLine(strings.Day + ":" + "\t" + appt.StartTime.ToString("dddd"));
     299            //sb.AppendLine();
     300            appointmentInformationString.AppendLine(strings.Time + ":" + "\t" + appt.StartTime.ToShortTimeString());
     301
     302
     303            //counting the width and hieght of the information inner aera for the person and appointment rectangels.
     304            int InfoInnerRectangleWidth = (printArea.Width / 2 - printArea.X / 2) - (int)(10 * widthRatio);
     305
     306            //Counting the height of the two strings (PersontInformationStringappointment & InformationStringto)to be allocated to the InfoInnerRectangleHeight later.
     307            int PersonInformationStringHeight = (int)g.MeasureString(personInformationString.ToString(), fontBody, InfoInnerRectangleWidth).Height;
     308            int appointmentInformationStringHeight = (int)g.MeasureString(appointmentInformationString.ToString(), fontBody, InfoInnerRectangleWidth).Height;
     309           
     310            int InfoInnerRectangleHeight = PersonInformationStringHeight;
     311            if (appointmentInformationStringHeight > PersonInformationStringHeight)
     312            {
     313                InfoInnerRectangleHeight = appointmentInformationStringHeight;
     314            }
     315
     316            // draw curved rectangle for the person informations.
     317            Rectangle personalInfoRectangle = new Rectangle(printArea.X, printArea.Y, InfoInnerRectangleWidth + (int)(10 * widthRatio), InfoInnerRectangleHeight + (int)(10 * heightRatio));
     318            using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 5))
    212319            {
    213320                g.DrawPath(Pens.Black, path);
    214321            }
    215 
    216             // group header
    217             s = strings.PtInfo;
    218             StringFormat sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
    219             g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(personalInfoRectangle.X, personalInfoRectangle.Y - 20,personalInfoRectangle.Width, 20),sf3);
    220322           
    221323            // inner rectangle for drawing strings:
    222             Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + 20, personalInfoRectangle.Y + 20, 280 - 40, 300 - 40);
    223            
    224             // Strings to write
    225             StringBuilder sb = new StringBuilder(500);
    226             sb.AppendLine(strings.Name + ":" + "\t" + appt.Patient.Name);
    227             sb.AppendLine();
    228             sb.AppendLine(strings.ID + ":" + "\t" + appt.Patient.ID);
    229             sb.AppendLine();
    230             s = appt.Patient.DOB.ToString("dd") + " " + appt.Patient.DOB.ToString("MMM") + ", " + appt.Patient.DOB.Year;
    231             sb.AppendLine(strings.DOB + ":" + "\t" + s);
    232             sb.AppendLine();
    233             sb.AppendLine(strings.Age + ":" + "\t" + appt.Patient.UserFriendlyAge);
    234             sb.AppendLine();
    235             s = appt.Patient.Sex == Sex.Male ? strings.Male : strings.Female;
    236             sb.AppendLine(strings.Sex + ":" + "\t" + s);
    237 
    238             // Draw them
    239             sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
    240             sf3.SetTabStops(0, new float[] {75} );
    241             sf3.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentUICulture.LCID, StringDigitSubstitute.Traditional);
    242             g.DrawString(sb.ToString(), fBody, Brushes.Black, personalInfoInnerRectangle, sf3);
    243 
    244             // draw curved rectangle
    245             Rectangle apptInfoRectangle = new Rectangle(e.MarginBounds.X + e.MarginBounds.Width - 280, printArea.Y + 30, 280, 300);
    246             using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 10))
     324            Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + (int)(5 * widthRatio), personalInfoRectangle.Y + (int)(5 * heightRatio), InfoInnerRectangleWidth, InfoInnerRectangleHeight);
     325
     326            // Draw the preson informations.
     327            //sf3.SetTabStops(0, new float[] {75} );
     328           
     329            g.DrawString(personInformationString.ToString(), fontBody, Brushes.Black, personalInfoInnerRectangle, sf3);
     330
     331            // draw curved rectangle for the appointment informations.
     332            Rectangle apptInfoRectangle = new Rectangle((int)(printArea.X + personalInfoRectangle.Width + printArea.X), personalInfoRectangle.Y, personalInfoRectangle.Width, personalInfoRectangle.Height);
     333            using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 5))
    247334            {
    248335                g.DrawPath(Pens.Black, path);
    249336            }
    250337
    251             s = strings.ApptInfo;
    252             // group header
    253             g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(apptInfoRectangle.X, apptInfoRectangle.Y - 20,apptInfoRectangle.Width, 20), sf3);
    254 
    255             // Strings to write
    256             sb = new StringBuilder();
    257             sb.AppendLine(strings.Clinic + ":" + "\t" + appt.Resource);
    258             sb.AppendLine();
    259             s = appt.StartTime.ToString("dd") + " " + appt.StartTime.ToString("MMM") + ", " + appt.StartTime.Year;
    260             sb.AppendLine(strings.Date + ":" + "\t" + s);
    261             sb.AppendLine();
    262             sb.AppendLine(strings.Day + ":" + "\t" + appt.StartTime.ToString("dddd"));
    263             sb.AppendLine();
    264             sb.AppendLine(strings.Time + ":" + "\t" + appt.StartTime.ToShortTimeString());
    265 
    266             // Draw them
    267             Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + 20, apptInfoRectangle.Y + 20, 280 - 40, 300 - 40);
    268 
    269             // Draw them
    270             g.DrawString(sb.ToString(), fBody, Brushes.Black, apptInfoInnerRectangle, sf3);
     338
     339            // Draw appointment informations in the inner rectangle.
     340            Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + (int)(5 * widthRatio), apptInfoRectangle.Y + (int)(5 * heightRatio), InfoInnerRectangleWidth, InfoInnerRectangleHeight);
     341            g.DrawString(appointmentInformationString.ToString(), fontBody, Brushes.Black, apptInfoInnerRectangle, sf3);
    271342
    272343            // Move Drawing Rectangle Down
    273             printArea.Y += 300 + 30 + 20;
    274             printArea.Height -= 300 + 30 + 20;
     344            printArea.Y += personalInfoRectangle.Height  + (int)(5 * heightRatio);
     345            printArea.Height -= personalInfoRectangle.Height +  (int)(5 * heightRatio);
    275346
    276347            // Draw New Line
    277348            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
    278             printArea.Y += 5;
    279             printArea.Height -= 5;
     349            printArea.Y += (int)(5 * heightRatio);
     350            printArea.Height -= (int)(5 * heightRatio);
    280351
    281352            // Draw new Title
    282             s = strings.ClinicInstructions;
    283             g.DrawString(s, fTitle, Brushes.Black, printArea, sfCenter); //title
    284 
     353            stringData = strings.ClinicInstructions;
     354            titleHeight = (int)g.MeasureString(stringData, fontTitle, printArea.Width).Height;
     355            g.DrawString(stringData, fontTitle, Brushes.Black, printArea, sf3); //title
    285356            // move down
    286             titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
    287357            printArea.Y += titleHeight;
    288358            printArea.Height -= titleHeight;
    289 
    290             // Draw New Line
    291             g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
    292             printArea.Y += 15;
    293             printArea.Height -= 15;
    294359
    295360            // Get Resource Clinic Appointment Letter Text
     
    301366
    302367            if (String.IsNullOrWhiteSpace(ltrTxt)) ltrTxt = strings.NoInstructionsProvided;
    303 
    304             g.DrawString(ltrTxt, fBody, Brushes.Black, printArea, sf3);
    305 
    306             int ltrTxtHeight = (int)g.MeasureString(ltrTxt, fBody).Height;
    307 
    308             printArea.Y += ltrTxtHeight + 15;
    309             printArea.Height -= ltrTxtHeight + 15;
    310 
    311             g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
    312             printArea.Y += 5;
    313             printArea.Height -= 5;
    314 
    315             s = strings.Notes;
    316             g.DrawString(s, fTitle, Brushes.Black, printArea, sfCenter); // Notes title
    317            
    318             // move down
    319             titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
    320             printArea.Y += titleHeight;
    321             printArea.Height -= titleHeight;
    322 
    323             // Draw New Line
    324             g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
    325             printArea.Y += 15;
    326             printArea.Height -= 15;
    327 
    328             // Draw Notes Area
    329             using (GraphicsPath path = GetRoundedRectPath(printArea, 15))
    330             {
    331                 g.DrawPath(Pens.Black, path);
    332             }
    333 
    334             //use sf0 to print the footer (center all the way)
    335             s = strings.Printed + ": " + DateTime.Now.ToString();
    336             Font fFooter = new Font(FontFamily.GenericSerif, 7);
    337             g.DrawString(s, fFooter, Brushes.Black, footerArea, sfCenterCenter);
    338 
     368            int ltrTxtHeight = (int)g.MeasureString(ltrTxt, fontBody,printArea.Width).Height;
     369            //setting the instructions area smaller than the printing area.
     370            int instructionsAreaHeight = ltrTxtHeight;
     371            //missingString true if there are no more printing area for the instructions and will use it to print a statement for it.
     372            bool missingString = false;
     373            string missingStringStatement = "";
     374            int missingStringStatementHeight = 0;
     375            if (ltrTxtHeight > printArea.Height)
     376            {
     377                missingStringStatement = "etc...";
     378                missingStringStatementHeight = (int)g.MeasureString(missingStringStatement, fFooter, printArea.Width).Height;
     379                instructionsAreaHeight = printArea.Height -missingStringStatementHeight- (int)(5 * heightRatio);
     380                missingString = true;
     381            }
     382            Rectangle instructionsArea = new Rectangle()
     383            {
     384                X = printArea.X,
     385                Y = printArea.Y,
     386                Height = instructionsAreaHeight,
     387                Width = printArea.Width
     388            };
     389            g.DrawString(ltrTxt, fontBody, Brushes.Black, instructionsArea, sf3);
     390           
     391            //moving down
     392            printArea.Y += instructionsAreaHeight + (int)(5 * heightRatio);
     393            printArea.Height -= instructionsAreaHeight + (int)(5 * heightRatio);
     394
     395            if (missingString)
     396            {
     397                g.DrawString(missingStringStatement, fFooter, Brushes.Black, printArea, sf3); //title
     398                printArea.Y += missingStringStatementHeight;
     399                printArea.Height -= missingStringStatementHeight;
     400            }
     401            //Draing new line
     402            if (printArea.Height > 0)
     403            {
     404                g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
     405                printArea.Y += (int)(5 * heightRatio);
     406                printArea.Height -= (int)(5 * heightRatio);
     407
     408                string noteStringData = strings.Notes;
     409                int noteTitleHeight = (int)g.MeasureString(noteStringData, fontTitle, printArea.Width).Height;
     410
     411                //check if the remaining area height enugh for the notes
     412                if (printArea.Height > ((int)(noteTitleHeight)))
     413                {
     414                    //draw the note title.
     415                    g.DrawString(noteStringData, fontTitle, Brushes.Black, printArea, sf3); // Notes title
     416                }
     417           
     418
     419            }
    339420            g.Dispose();
    340421        }
     
    344425        {
    345426            int diameter = 2 * radius;
    346            
     427
    347428            Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
    348429            GraphicsPath path = new GraphicsPath();
    349            
     430
    350431            path.AddArc(arcRect, 180, 90); //top left
    351432            arcRect.X = rect.Right - diameter;
     
    383464            printArea.Y += titleHeight;
    384465            printArea.Height -= titleHeight;
    385            
     466
    386467            // draw underline
    387468            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
     
    419500            g.Dispose();
    420501        }
    421        
     502
    422503        /// <summary>
    423504        /// Cancellation Letter to be given or mailed to the patient
     
    460541            if (System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.IsRightToLeft)
    461542                sf2.FormatFlags = StringFormatFlags.DirectionRightToLeft;
    462            
     543
    463544            // write missive
    464545            g.DrawString(letter, fBody, Brushes.Black, printArea, sf2);
     
    558639        public virtual void PrintRoutingSlip(CGAppointment appt, int apptOrder, PrintPageEventArgs e)
    559640        {
    560             // Prep
     641            // setting the reference values for calculating the needed ratio of the coming page.
     642            //referrenceHeight and referrenceWidth for A6 size.
     643            double referrenceHeight = 383;
     644            double referrenceWidth = 213;
     645
     646            //check if the paper is landscape or portrait. if it is landscape then new ratio need to be calculated.
     647            if (e.MarginBounds.Width > e.MarginBounds.Height)
     648            {
     649                //landscape = true;
     650                referrenceHeight = 213;
     651                referrenceWidth = 383;
     652                //fontRatio = ((e.MarginBounds.Height) / referrenceHeight);
     653            }
     654
     655            //setting the font,width and height ratios
     656            double fontRatio = (e.MarginBounds.Height / referrenceHeight);
     657            if (fontRatio > 1.0)
     658            {
     659                fontRatio = fontRatio * 0.75;
     660            }
     661            double widthRatio = ((e.MarginBounds.Width) / referrenceWidth);
     662            double heightRatio = ((e.MarginBounds.Height) / referrenceHeight);
     663
    561664            Graphics g = e.Graphics;
    562             Rectangle printArea = e.MarginBounds;
    563             Rectangle pageArea = e.PageBounds;
    564             Rectangle headerArea = new Rectangle()
    565             {
    566                 X = e.MarginBounds.X,
    567                 Y = e.PageBounds.Y,  //0
    568                 Height = e.MarginBounds.Y - e.PageBounds.Y - 50, //100px - 50px
    569                 Width = e.MarginBounds.Width
    570             };
    571             Rectangle footerArea = new Rectangle()
    572             {
    573                 X = e.MarginBounds.X,
    574                 Y = e.MarginBounds.Height + headerArea.Height,
    575                 Width = e.MarginBounds.Width,
    576                 Height = pageArea.Height - (e.MarginBounds.Height + headerArea.Height)
    577             };
    578 
    579             const int part1Height = 400;
    580             string s;
    581 
    582             // A few fonts
    583             Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
    584             Font fBody = new Font(FontFamily.GenericSerif, 12);
    585             Font fGroupTitle = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
    586 
    587             StringFormat sf0 = new StringFormat()
     665            //this is the string which is used to fill with the data and to be print on the screen.
     666            string stringData;
     667
     668            //in portrait we used fonts that fits with the A6 paper and changed depending on the page ratio,but in the land scape we used fonts fits with the A5 paper and counted the other pages depening on the ratios.
     669            Font fontTitle = new Font(FontFamily.GenericSerif, (int)(13 * fontRatio), FontStyle.Bold); //for title
     670            Font fontBody = new Font(FontFamily.GenericSerif, (int)(13 * fontRatio));
     671            Font fontGroupTitle = new Font(FontFamily.GenericSansSerif, (int)(13 * fontRatio), FontStyle.Bold);
     672            Font fFooter = new Font(FontFamily.GenericSerif, (int)(7 * fontRatio));
     673
     674            StringFormat sfCenterCenter = new StringFormat()
    588675            {
    589676                Alignment = StringAlignment.Center,
     
    591678            };
    592679
     680            //set the hard margin which different for each printer and multiplied with 2
     681            int HardMarginX = 0;
     682            if ((int)(e.PageSettings.HardMarginX) > 0)
     683            {
     684                HardMarginX = ((int)(e.PageSettings.HardMarginX) * 2);
     685            }
     686            int HardMarginY = 0;
     687            if ((int)(e.PageSettings.HardMarginY) > 0)
     688            {
     689                HardMarginY = ((int)(e.PageSettings.HardMarginY) * 2);
     690            }
     691
    593692            // Draw Header
    594693            string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
    595             g.DrawString(division, fBody, Brushes.Black, headerArea, sf0);
    596 
    597             const int watermarkLength = 75;
     694            int divisionStringHeight = (int)g.MeasureString(division.ToString(), fontBody, e.MarginBounds.Width).Height;
     695            Rectangle headerArea = new Rectangle()
     696            {
     697                X = (int)(5 * widthRatio),
     698                Y = (int)(5 * heightRatio),
     699                Height = divisionStringHeight + (int)(5 * heightRatio),
     700                Width = e.PageBounds.Width - (int)(10 * widthRatio) - HardMarginX
     701            };
     702            g.DrawString(division, fontBody, Brushes.Black, headerArea, sfCenterCenter);
     703
     704
     705            //use stringData to print the footer (center all the way)
     706            stringData = strings.Printed + ": " + DateTime.Now.ToString();
     707            int stringDataStringHeight = (int)g.MeasureString(stringData.ToString(), fFooter, e.MarginBounds.Width).Height;
     708            Rectangle footerArea = new Rectangle()
     709            {
     710                X = headerArea.X,
     711                Y = e.PageBounds.Height - stringDataStringHeight - HardMarginY - (int)(5 * heightRatio),
     712                Width = headerArea.Width,
     713                Height = stringDataStringHeight
     714            };
     715            g.DrawString(stringData, fFooter, Brushes.Black, footerArea, sfCenterCenter);
     716
     717
     718
     719            //setting the printing area bigger than the margin bounds to use more printing space on the paper.
     720            Rectangle printArea = new Rectangle()
     721            {
     722                X = headerArea.X,
     723                Y = headerArea.Y + headerArea.Height,
     724                Height = footerArea.Y - (headerArea.Y + headerArea.Height) - (int)(5 * heightRatio),
     725                Width = headerArea.Width
     726            };
     727
     728
     729            //  if there is a need for the watermark use the following code.
     730            //const int watermarkLength = 75*heightratio;
    598731
    599732            // Move down for optional form paper
    600             printArea.Y += watermarkLength;
    601             printArea.Height -= watermarkLength;
     733            //printArea.Y += watermarkLength;
     734            //printArea.Height -= watermarkLength;
    602735
    603736            // Draw Title
    604             StringFormat sf = new StringFormat();
    605             sf.Alignment = StringAlignment.Center; //for title & header
     737            StringFormat sfCenter = new StringFormat();
     738            sfCenter.Alignment = StringAlignment.Center; //for title & header
    606739            string title = strings.RoutingSlip;
    607             g.DrawString(title, fTitle, Brushes.Black, printArea, sf); //title
     740            g.DrawString(title, fontTitle, Brushes.Black, printArea, sfCenter); //title
    608741
    609742            // move down
    610             int titleHeight = (int)g.MeasureString(title, fTitle, printArea.Width).Height;
     743            int titleHeight = (int)g.MeasureString(title, fontTitle, printArea.Width).Height;
    611744            printArea.Y += titleHeight;
    612745            printArea.Height -= titleHeight;
     
    614747            // draw underline
    615748            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
    616             printArea.Y += 15;
    617             printArea.Height -= 15;
    618 
    619             // draw curved rectangle.
    620             Rectangle personalInfoRectangle = new Rectangle(e.MarginBounds.X, printArea.Y + 30, 280, part1Height);
    621             using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 10))
     749            printArea.Y += (int)(5 * heightRatio);
     750            printArea.Height -= (int)(5 * heightRatio);
     751
     752            // Strings to write
     753
     754            StringBuilder personInformationString = new StringBuilder(500);
     755            personInformationString.AppendLine(strings.Name + ":" + "\t" + appt.Patient.Name);
     756            //personInformationString.AppendLine();
     757            personInformationString.AppendLine(strings.ID + ":" + "\t" + appt.Patient.ID);
     758            //personInformationString.AppendLine();
     759            stringData = appt.Patient.DOB.ToString("dd") + " " + appt.Patient.DOB.ToString("MMM") + ", " + appt.Patient.DOB.Year;
     760            personInformationString.AppendLine(strings.DOB + ":" + "\t" + stringData);
     761            //personInformationString.AppendLine();
     762            personInformationString.AppendLine(strings.Age + ":" + "\t" + appt.Patient.UserFriendlyAge);
     763            //personInformationString.AppendLine();
     764            //personInformationString.AppendLine("Sex:" + "\t" + appt.Patient.Sex.ToString());
     765
     766            // Strings to write
     767            StringBuilder appointmentInformationString = new StringBuilder();
     768            appointmentInformationString.AppendLine(strings.Clinic + ":");
     769            appointmentInformationString.AppendLine(appt.Resource);
     770            //appointmentInformationString.AppendLine();
     771            appointmentInformationString.AppendLine(strings.AppointmentProvider + ":");
     772            appointmentInformationString.AppendLine((appt.Provider == null) ? strings.none : appt.Provider.ToString());  //Appt Provider or (none) if null
     773            //appointmentInformationString.AppendLine();
     774            appointmentInformationString.AppendLine(strings.PatientOrder + ":" + "\t" + apptOrder);
     775            appointmentInformationString.AppendLine(strings.Date + ":" + "\t" + appt.StartTime.ToShortDateString() + " " + appt.StartTime.ToShortTimeString());
     776            //appointmentInformationString.AppendLine();
     777            appointmentInformationString.AppendLine(strings.AppointmentNote + ":");
     778            appointmentInformationString.AppendLine(String.IsNullOrWhiteSpace(appt.Note) ? strings.none : appt.Note);
     779           
     780            //counting the width and hieght of the information inner aera for the person and appointment rectangels.
     781            int InfoInnerRectangleWidth = (printArea.Width / 2 - printArea.X / 2) - (int)(10 * widthRatio);
     782
     783            //Counting the height of the two strings (PersontInformationStringappointment & InformationStringto)to be allocated to the InfoInnerRectangleHeight later.
     784            int PersonInformationStringHeight = (int)g.MeasureString(personInformationString.ToString(), fontBody, InfoInnerRectangleWidth).Height;
     785            int appointmentInformationStringHeight = (int)g.MeasureString(appointmentInformationString.ToString(), fontBody, InfoInnerRectangleWidth).Height;
     786
     787            int InfoInnerRectangleHeight = PersonInformationStringHeight;
     788            if (appointmentInformationStringHeight > PersonInformationStringHeight)
     789            {
     790                InfoInnerRectangleHeight = appointmentInformationStringHeight;
     791            }
     792
     793            // group header for the person informations.
     794            stringData = strings.PtInfo;
     795            StringFormat sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
     796            stringDataStringHeight = (int)g.MeasureString(stringData.ToString(), fontGroupTitle, InfoInnerRectangleWidth).Height;
     797            g.DrawString(stringData, fontGroupTitle, Brushes.Black, new Rectangle(printArea.X, printArea.Y, InfoInnerRectangleWidth, stringDataStringHeight), sf3);
     798
     799            // group header for the appointment information
     800            stringData = strings.ApptInfo;
     801            g.DrawString(stringData, fontGroupTitle, Brushes.Black, new Rectangle((int)(printArea.X + (InfoInnerRectangleWidth + (int)(10 * widthRatio)) + printArea.X), printArea.Y, InfoInnerRectangleWidth, stringDataStringHeight), sf3);
     802
     803            //moving down
     804            printArea.Y += stringDataStringHeight + (int)(5 * heightRatio);
     805            printArea.Height -= stringDataStringHeight + (int)(5 * heightRatio);
     806
     807            // draw curved rectangle for the person informations.
     808            Rectangle personalInfoRectangle = new Rectangle(printArea.X, printArea.Y, InfoInnerRectangleWidth + (int)(10 * widthRatio), InfoInnerRectangleHeight + (int)(10 * heightRatio));
     809            using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 5))
    622810            {
    623811                g.DrawPath(Pens.Black, path);
    624812            }
    625813
    626             // group header
    627             s = strings.PtInfo;
    628             StringFormat sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
    629             g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(personalInfoRectangle.X, personalInfoRectangle.Y - 20, personalInfoRectangle.Width, 20), sf3);
    630 
    631             StringFormat sf4 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
    632             sf4.SetTabStops(0, new float[] { 75 });
    633             sf4.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentUICulture.LCID, StringDigitSubstitute.Traditional);
    634 
    635814            // inner rectangle for drawing strings:
    636             Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + 20, personalInfoRectangle.Y + 20, personalInfoRectangle.Width - 40, personalInfoRectangle.Height - 40);
    637 
    638             // Strings to write
    639             StringBuilder sb = new StringBuilder(500);
    640             sb.AppendLine(strings.Name + ":" + "\t" + appt.Patient.Name);
    641             sb.AppendLine();
    642             sb.AppendLine(strings.ID + ":" + "\t" + appt.Patient.ID);
    643             sb.AppendLine();
    644             s = appt.Patient.DOB.ToString("dd") + " " + appt.Patient.DOB.ToString("MMM") + ", " + appt.Patient.DOB.Year;
    645             sb.AppendLine(strings.DOB + ":" + "\t" + s);
    646             sb.AppendLine();
    647             sb.AppendLine(strings.Age + ":" + "\t" + appt.Patient.UserFriendlyAge);
    648             //sb.AppendLine();
    649             //sb.AppendLine("Sex:" + "\t" + appt.Patient.Sex.ToString());
    650 
    651             // Draw them
    652             g.DrawString(sb.ToString(), fBody, Brushes.Black, personalInfoInnerRectangle, sf4);
    653 
    654             // draw curved rectangle
    655             Rectangle apptInfoRectangle = new Rectangle(e.MarginBounds.X + e.MarginBounds.Width - 280, printArea.Y + 30, 280, part1Height);
    656             using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 10))
     815            Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + (int)(5 * widthRatio), personalInfoRectangle.Y + (int)(5 * heightRatio), InfoInnerRectangleWidth, InfoInnerRectangleHeight);
     816
     817            // Draw the preson informations.
     818            sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
     819            //sf3.SetTabStops(0, new float[] {75} );
     820            sf3.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentUICulture.LCID, StringDigitSubstitute.Traditional);
     821            g.DrawString(personInformationString.ToString(), fontBody, Brushes.Black, personalInfoInnerRectangle, sf3);
     822
     823            // draw curved rectangle for the appointment informations.
     824            Rectangle apptInfoRectangle = new Rectangle((int)(printArea.X + personalInfoRectangle.Width + printArea.X), personalInfoRectangle.Y, personalInfoRectangle.Width, personalInfoRectangle.Height);
     825            using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 5))
    657826            {
    658827                g.DrawPath(Pens.Black, path);
    659828            }
    660829
    661             // group header
    662             s = strings.ApptInfo;
    663             g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(apptInfoRectangle.X, apptInfoRectangle.Y - 20, apptInfoRectangle.Width, 20), sf3);
    664 
    665             // Strings to write
    666             sb = new StringBuilder();
    667             sb.AppendLine(strings.Clinic + ":");
    668             sb.AppendLine(appt.Resource);
    669             sb.AppendLine();
    670             sb.AppendLine(strings.AppointmentProvider + ":");
    671             sb.AppendLine((appt.Provider == null) ? strings.none : appt.Provider.ToString());  //Appt Provider or (none) if null
    672             sb.AppendLine();
    673             sb.AppendLine(strings.PatientOrder + ":" + "\t" + apptOrder);
    674             sb.AppendLine(strings.Date + ":" + "\t" + appt.StartTime.ToShortDateString() + " " + appt.StartTime.ToShortTimeString());
    675             sb.AppendLine();
    676             sb.AppendLine(strings.AppointmentNote + ":");
    677             sb.AppendLine(String.IsNullOrWhiteSpace(appt.Note)? strings.none : appt.Note);
    678 
    679             // Draw them
    680             Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + 20, apptInfoRectangle.Y + 20, apptInfoRectangle.Width - 40, apptInfoRectangle.Height - 40);
    681 
    682             // Draw them
    683             g.DrawString(sb.ToString(), fBody, Brushes.Black, apptInfoInnerRectangle, sf4);
    684 
     830            // Draw appointment informations in the inner rectangle.
     831            Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + (int)(5 * widthRatio), apptInfoRectangle.Y + (int)(5 * heightRatio), InfoInnerRectangleWidth, InfoInnerRectangleHeight);
     832            g.DrawString(appointmentInformationString.ToString(), fontBody, Brushes.Black, apptInfoInnerRectangle, sf3);
     833           
    685834            // Move Drawing Rectangle Down
    686             printArea.Y += apptInfoRectangle.Height + 30 + 20;
    687             printArea.Height -= apptInfoRectangle.Height + 30 + 20;
     835            printArea.Y += personalInfoRectangle.Height +  (int)(5 * heightRatio);
     836            printArea.Height -= personalInfoRectangle.Height + (int)(5 * heightRatio);
    688837
    689838            // Draw New Line
     
    694843            }
    695844
    696             printArea.Y += 5;
    697             printArea.Height -= 5;
    698 
    699             s = strings.ScratchArea;
    700             g.DrawString(s, fGroupTitle, Brushes.Black, printArea, sf3);
    701            
     845            printArea.Y += (int)(5 * heightRatio);
     846            printArea.Height -= (int)(5 * heightRatio);
     847
     848            stringData = strings.ScratchArea;
     849            g.DrawString(stringData, fontGroupTitle, Brushes.Black, printArea, sf3);
     850
    702851            /* Per Al-Najjar, we don't want the next appointment instructions section
    703852            // move down
     
    714863            printArea.Height -= 5;
    715864
    716             s = strings.NextAppointmentInstructions;
    717             g.DrawString(s, fGroupTitle, Brushes.Black, printArea, sf3);
     865            stringData = strings.NextAppointmentInstructions;
     866            g.DrawString(stringData, fontGroupTitle, Brushes.Black, printArea, sf3);
    718867            */
    719 
    720             // Draw Footer
    721             //use sf0 to print the footer (center all the way)
    722             s = strings.Printed + ": " + DateTime.Now.ToString();
    723             Font fFooter = new Font(FontFamily.GenericSerif, 7);
    724             g.DrawString(s, fFooter, Brushes.Black, footerArea, sf0);
    725868
    726869            g.Dispose();
Note: See TracChangeset for help on using the changeset viewer.