///<summary></summary> public static Point DrawElement(Graphics g, int elementI, Point drawLoc, ApptViewStackBehavior stackBehavior, ApptViewAlignment align, Brush backBrush, DataRow dataRoww, List <ApptViewItem> apptRows, DataTable tableApptFields, DataTable tablePatFields, float totalWidth, float totalHeight, int fontSize, bool isPrinting) { Font baseFont = new Font("Arial", fontSize); string text = ""; bool isNote = false; #region FillText if (PIn.Long(dataRoww["AptStatus"].ToString()) == (int)ApptStatus.PtNote || PIn.Long(dataRoww["AptStatus"].ToString()) == (int)ApptStatus.PtNoteCompleted) { isNote = true; } bool isGraphic = false; if (apptRows[elementI].ElementDesc == "ConfirmedColor") { isGraphic = true; } if (apptRows[elementI].ApptFieldDefNum > 0) { string fieldName = ApptFieldDefs.GetFieldName(apptRows[elementI].ApptFieldDefNum); for (int i = 0; i < tableApptFields.Rows.Count; i++) { if (tableApptFields.Rows[i]["AptNum"].ToString() != dataRoww["AptNum"].ToString()) { continue; } if (tableApptFields.Rows[i]["FieldName"].ToString() != fieldName) { continue; } text = tableApptFields.Rows[i]["FieldValue"].ToString(); } } else if (apptRows[elementI].PatFieldDefNum > 0) { string fieldName = PatFieldDefs.GetFieldName(apptRows[elementI].PatFieldDefNum); for (int i = 0; i < tablePatFields.Rows.Count; i++) { if (tablePatFields.Rows[i]["PatNum"].ToString() != dataRoww["PatNum"].ToString()) { continue; } if (tablePatFields.Rows[i]["FieldName"].ToString() != fieldName) { continue; } text = tablePatFields.Rows[i]["FieldValue"].ToString(); } } else { switch (apptRows[elementI].ElementDesc) { case "Address": if (isNote) { text = ""; } else { text = dataRoww["address"].ToString(); } break; case "AddrNote": if (isNote) { text = ""; } else { text = dataRoww["addrNote"].ToString(); } break; case "Age": if (isNote) { text = ""; } else { text = dataRoww["age"].ToString(); } break; case "ASAP": if (isNote) { text = ""; } else { if (dataRoww["AptStatus"].ToString() == ((int)ApptStatus.ASAP).ToString()) { text = Lans.g("enumApptStatus", "ASAP"); } } break; case "ASAP[A]": if (dataRoww["AptStatus"].ToString() == ((int)ApptStatus.ASAP).ToString()) { text = "A"; } break; case "AssistantAbbr": if (isNote) { text = ""; } else { text = dataRoww["assistantAbbr"].ToString(); } break; case "ChartNumAndName": text = dataRoww["chartNumAndName"].ToString(); break; case "ChartNumber": text = dataRoww["chartNumber"].ToString(); break; case "CreditType": text = dataRoww["CreditType"].ToString(); break; case "Guardians": if (isNote) { text = ""; } else { text = dataRoww["guardians"].ToString(); } break; case "HasIns[I]": text = dataRoww["hasIns[I]"].ToString(); break; case "HmPhone": if (isNote) { text = ""; } else { text = dataRoww["hmPhone"].ToString(); } break; case "InsToSend[!]": text = dataRoww["insToSend[!]"].ToString(); break; case "Lab": if (isNote) { text = ""; } else { text = dataRoww["lab"].ToString(); } break; case "MedOrPremed[+]": if (isNote) { text = ""; } else { text = dataRoww["medOrPremed[+]"].ToString(); } break; case "MedUrgNote": if (isNote) { text = ""; } else { text = dataRoww["MedUrgNote"].ToString(); } break; case "Note": text = dataRoww["Note"].ToString(); break; case "PatientName": text = dataRoww["patientName"].ToString(); break; case "PatientNameF": text = dataRoww["patientNameF"].ToString(); break; case "PatNum": text = dataRoww["patNum"].ToString(); break; case "PatNumAndName": text = dataRoww["patNumAndName"].ToString(); break; case "PremedFlag": if (isNote) { text = ""; } else { text = dataRoww["preMedFlag"].ToString(); } break; case "Procs": if (isNote) { text = ""; } else { text = dataRoww["procs"].ToString(); } break; case "ProcsColored": string value = dataRoww["procsColored"].ToString(); string[] lines = value.Split(new string[] { "</span>" }, StringSplitOptions.RemoveEmptyEntries); Point tempPt = new Point(); tempPt = drawLoc; int lastH = 0; int count = 1; for (int i = 0; i < lines.Length; i++) { Match m = Regex.Match(lines[i], "^<span color=\"(-?[0-9]*)\">(.*)$"); string rgbInt = m.Result("$1"); string proc = m.Result("$2"); if (lines[i] != lines[lines.Length - 1]) { proc += ","; } if (rgbInt == "") { rgbInt = apptRows[elementI].ElementColorXml.ToString(); } Color c = Color.FromArgb(Convert.ToInt32(rgbInt)); StringFormat procFormat = new StringFormat(); RectangleF procRect = new RectangleF(0, 0, 1000, 1000); CharacterRange[] ranges = { new CharacterRange(0, proc.Length) }; Region[] regions = new Region[1]; procFormat.SetMeasurableCharacterRanges(ranges); regions = g.MeasureCharacterRanges(proc, baseFont, procRect, procFormat); if (regions.Length == 0) { procRect = new RectangleF(0, 0, 0, 0); } else { procRect = regions[0].GetBounds(g); } if (tempPt.X + procRect.Width > totalWidth) { tempPt.X = drawLoc.X; tempPt.Y += lastH; count++; } SolidBrush sb = new SolidBrush(c); g.DrawString(proc, baseFont, sb, tempPt); DisposeObjects(procFormat, sb); tempPt.X += (int)procRect.Width + 3; //+3 is room for spaces if ((int)procRect.Height > lastH) { lastH = (int)procRect.Height; } } drawLoc.Y += lastH * count; return(drawLoc); case "Production": if (isNote) { text = ""; } else { text = dataRoww["production"].ToString(); } break; case "Provider": if (isNote) { text = ""; } else { text = dataRoww["provider"].ToString(); } break; case "TimeAskedToArrive": if (isNote) { text = ""; } else { text = dataRoww["timeAskedToArrive"].ToString(); //could be blank } break; case "WirelessPhone": if (isNote) { text = ""; } else { text = dataRoww["wirelessPhone"].ToString(); } break; case "WkPhone": if (isNote) { text = ""; } else { text = dataRoww["wkPhone"].ToString(); } break; } } #endregion if (text == "" && !isGraphic) { return(drawLoc); //next element will draw at the same position as this one would have. } SolidBrush brush = new SolidBrush(apptRows[elementI].ElementColor); SolidBrush brushWhite = new SolidBrush(Color.White); //SolidBrush noteTitlebrush = new SolidBrush(DefC.Long[(int)DefCat.AppointmentColors][8].ItemColor); StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Near; int charactersFitted; //not used, but required as 'out' param for measureString. int linesFilled; SizeF noteSize; RectangleF rect; RectangleF rectBack; #region Main if (align == ApptViewAlignment.Main) //always stacks vertical { if (isGraphic) { Bitmap bitmap = new Bitmap(12, 12); noteSize = new SizeF(bitmap.Width, bitmap.Height); rect = new RectangleF(drawLoc, noteSize); using (Graphics gfx = Graphics.FromImage(bitmap)) { gfx.SmoothingMode = SmoothingMode.HighQuality; Color confirmColor = DefC.GetColor(DefCat.ApptConfirmed, PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush = new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush, 0, 0, 11, 11); gfx.DrawEllipse(Pens.Black, 0, 0, 11, 11); confirmBrush.Dispose(); } g.DrawImage(bitmap, drawLoc.X, drawLoc.Y); DisposeObjects(brush, brushWhite, format, bitmap); return(new Point(drawLoc.X, drawLoc.Y + (int)noteSize.Height)); } else { noteSize = g.MeasureString(text, baseFont, (int)totalWidth - 9); //Problem: "limited-tooth bothering him ", the trailing space causes measuring error, resulting in m getting partially chopped off. //Tried TextRenderer, but it caused premature wrapping //Size noteSizeInt=TextRenderer.MeasureText(text,baseFont,new Size(totalWidth-9,1000)); //noteSize=new SizeF(noteSizeInt.totalWidth,noteSizeInt.totalHeight); noteSize.Width = (float)Math.Ceiling((double)noteSize.Width); //round up to nearest int solves specific problem discussed above. if (drawLoc.Y + noteSize.Height > totalHeight && isPrinting) { //This keeps text from drawing off the appointment when font is large. Only if isPrinting cause not sure if this will cause bugs. //No need to do this check when drawing to the appt screen cause its just an image on a control which clips itself. noteSize.Height = totalHeight - drawLoc.Y; } g.MeasureString(text, baseFont, noteSize, format, out charactersFitted, out linesFilled); rect = new RectangleF(drawLoc, noteSize); g.DrawString(text, baseFont, brush, rect, format); DisposeObjects(brush, brushWhite, format); return(new Point(drawLoc.X, drawLoc.Y + linesFilled * ApptDrawing.LineH)); } } #endregion #region UR else if (align == ApptViewAlignment.UR) { if (stackBehavior == ApptViewStackBehavior.Vertical) { float w = totalWidth - 9; if (isGraphic) { Bitmap bitmap = new Bitmap(12, 12); noteSize = new SizeF(bitmap.Width, bitmap.Height); Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width, drawLoc.Y + 1); //upper left corner of this element rect = new RectangleF(drawLoc, noteSize); using (Graphics gfx = Graphics.FromImage(bitmap)) { gfx.SmoothingMode = SmoothingMode.HighQuality; Color confirmColor = DefC.GetColor(DefCat.ApptConfirmed, PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush = new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush, 0, 0, 11, 11); gfx.DrawEllipse(Pens.Black, 0, 0, 11, 11); confirmBrush.Dispose(); } g.DrawImage(bitmap, drawLocThis.X, drawLocThis.Y); DisposeObjects(brush, brushWhite, format, bitmap); return(new Point(drawLoc.X, drawLoc.Y + (int)noteSize.Height)); } else { noteSize = g.MeasureString(text, baseFont, (int)w); noteSize = new SizeF(noteSize.Width, ApptDrawing.LineH + 1); //only allowed to be one line high. if (noteSize.Width < 5) { noteSize = new SizeF(5, noteSize.Height); } //g.MeasureString(text,baseFont,noteSize,format,out charactersFitted,out linesFilled); Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width, drawLoc.Y); //upper left corner of this element rect = new RectangleF(drawLocThis, noteSize); rectBack = new RectangleF(drawLocThis.X, drawLocThis.Y + 1, noteSize.Width, ApptDrawing.LineH); if (apptRows[elementI].ElementDesc == "MedOrPremed[+]" || apptRows[elementI].ElementDesc == "HasIns[I]" || apptRows[elementI].ElementDesc == "InsToSend[!]") { g.FillRectangle(brush, rectBack); g.DrawString(text, baseFont, Brushes.Black, rect, format); } else { g.FillRectangle(brushWhite, rectBack); g.DrawString(text, baseFont, brush, rect, format); } g.DrawRectangle(Pens.Black, rectBack.X, rectBack.Y, rectBack.Width, rectBack.Height); DisposeObjects(brush, brushWhite, format); return(new Point(drawLoc.X, drawLoc.Y + ApptDrawing.LineH)); //move down a certain number of lines for next element. } } else //horizontal { int w = drawLoc.X - 9; //drawLoc is upper right of each element. The first element draws at (totalWidth-1,0). if (isGraphic) { Bitmap bitmap = new Bitmap(12, 12); noteSize = new SizeF(bitmap.Width, bitmap.Height); Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width, drawLoc.Y + 1); //upper left corner of this element rect = new RectangleF(drawLoc, noteSize); using (Graphics gfx = Graphics.FromImage(bitmap)) { gfx.SmoothingMode = SmoothingMode.HighQuality; Color confirmColor = DefC.GetColor(DefCat.ApptConfirmed, PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush = new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush, 0, 0, 11, 11); gfx.DrawEllipse(Pens.Black, 0, 0, 11, 11); confirmBrush.Dispose(); } g.DrawImage(bitmap, drawLocThis.X, drawLocThis.Y); DisposeObjects(brush, brushWhite, format, bitmap); return(new Point(drawLoc.X - (int)noteSize.Width - 2, drawLoc.Y)); } else { noteSize = g.MeasureString(text, baseFont, w); noteSize = new SizeF(noteSize.Width, ApptDrawing.LineH + 1); //only allowed to be one line high. Needs an extra pixel. if (noteSize.Width < 5) { noteSize = new SizeF(5, noteSize.Height); } Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width, drawLoc.Y); //upper left corner of this element rect = new RectangleF(drawLocThis, noteSize); rectBack = new RectangleF(drawLocThis.X, drawLocThis.Y + 1, noteSize.Width, ApptDrawing.LineH); if (apptRows[elementI].ElementDesc == "MedOrPremed[+]" || apptRows[elementI].ElementDesc == "HasIns[I]" || apptRows[elementI].ElementDesc == "InsToSend[!]") { g.FillRectangle(brush, rectBack); g.DrawString(text, baseFont, Brushes.Black, rect, format); } else { g.FillRectangle(brushWhite, rectBack); g.DrawString(text, baseFont, brush, rect, format); } g.DrawRectangle(Pens.Black, rectBack.X, rectBack.Y, rectBack.Width, rectBack.Height); DisposeObjects(brush, brushWhite, format); return(new Point(drawLoc.X - (int)noteSize.Width - 1, drawLoc.Y)); //Move to left. Might also have to subtract a little from x to space out elements. } } } #endregion #region LR else //LR { if (stackBehavior == ApptViewStackBehavior.Vertical) { float w = totalWidth - 9; if (isGraphic) { Bitmap bitmap = new Bitmap(12, 12); noteSize = new SizeF(bitmap.Width, bitmap.Height); Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width, drawLoc.Y + 1 - ApptDrawing.LineH); //upper left corner of this element rect = new RectangleF(drawLoc, noteSize); using (Graphics gfx = Graphics.FromImage(bitmap)) { gfx.SmoothingMode = SmoothingMode.HighQuality; Color confirmColor = DefC.GetColor(DefCat.ApptConfirmed, PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush = new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush, 0, 0, 11, 11); gfx.DrawEllipse(Pens.Black, 0, 0, 11, 11); confirmBrush.Dispose(); } g.DrawImage(bitmap, drawLocThis.X, drawLocThis.Y); DisposeObjects(brush, brushWhite, format, bitmap); return(new Point(drawLoc.X, drawLoc.Y - (int)noteSize.Height)); } else { noteSize = g.MeasureString(text, baseFont, (int)w); noteSize = new SizeF(noteSize.Width, ApptDrawing.LineH + 1); //only allowed to be one line high. Needs an extra pixel. if (noteSize.Width < 5) { noteSize = new SizeF(5, noteSize.Height); } //g.MeasureString(text,baseFont,noteSize,format,out charactersFitted,out linesFilled); Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width, drawLoc.Y - ApptDrawing.LineH); //upper left corner of this element rect = new RectangleF(drawLocThis, noteSize); rectBack = new RectangleF(drawLocThis.X, drawLocThis.Y + 1, noteSize.Width, ApptDrawing.LineH); if (apptRows[elementI].ElementDesc == "MedOrPremed[+]" || apptRows[elementI].ElementDesc == "HasIns[I]" || apptRows[elementI].ElementDesc == "InsToSend[!]") { g.FillRectangle(brush, rectBack); g.DrawString(text, baseFont, Brushes.Black, rect, format); } else { g.FillRectangle(brushWhite, rectBack); g.DrawString(text, baseFont, brush, rect, format); } g.DrawRectangle(Pens.Black, rectBack.X, rectBack.Y, rectBack.Width, rectBack.Height); DisposeObjects(brush, brushWhite, format); return(new Point(drawLoc.X, drawLoc.Y - ApptDrawing.LineH)); //move up a certain number of lines for next element. } } else //horizontal { int w = drawLoc.X - 9; //drawLoc is upper right of each element. The first element draws at (totalWidth-1,0). if (isGraphic) { Bitmap bitmap = new Bitmap(12, 12); noteSize = new SizeF(bitmap.Width, bitmap.Height); Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width + 1, drawLoc.Y + 1 - ApptDrawing.LineH); //upper left corner of this element rect = new RectangleF(drawLoc, noteSize); using (Graphics gfx = Graphics.FromImage(bitmap)) { gfx.SmoothingMode = SmoothingMode.HighQuality; Color confirmColor = DefC.GetColor(DefCat.ApptConfirmed, PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush = new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush, 0, 0, 11, 11); gfx.DrawEllipse(Pens.Black, 0, 0, 11, 11); confirmBrush.Dispose(); } g.DrawImage(bitmap, drawLocThis.X, drawLocThis.Y); DisposeObjects(brush, brushWhite, format, bitmap); return(new Point(drawLoc.X - (int)noteSize.Width - 1, drawLoc.Y)); } else { noteSize = g.MeasureString(text, baseFont, w); noteSize = new SizeF(noteSize.Width, ApptDrawing.LineH + 1); //only allowed to be one line high. Needs an extra pixel. if (noteSize.Width < 5) { noteSize = new SizeF(5, noteSize.Height); } Point drawLocThis = new Point(drawLoc.X - (int)noteSize.Width, drawLoc.Y - ApptDrawing.LineH); //upper left corner of this element rect = new RectangleF(drawLocThis, noteSize); rectBack = new RectangleF(drawLocThis.X, drawLocThis.Y + 1, noteSize.Width, ApptDrawing.LineH); if (apptRows[elementI].ElementDesc == "MedOrPremed[+]" || apptRows[elementI].ElementDesc == "HasIns[I]" || apptRows[elementI].ElementDesc == "InsToSend[!]") { g.FillRectangle(brush, rectBack); g.DrawString(text, baseFont, Brushes.Black, rect, format); } else { g.FillRectangle(brushWhite, rectBack); g.DrawString(text, baseFont, brush, rect, format); } g.DrawRectangle(Pens.Black, rectBack.X, rectBack.Y, rectBack.Width, rectBack.Height); DisposeObjects(brush, brushWhite, format); return(new Point(drawLoc.X - (int)noteSize.Width - 1, drawLoc.Y)); //Move to left. Subtract a little from x to space out elements. } } } #endregion }
///<summary></summary> public static Point DrawElement(Graphics g,int elementI,Point drawLoc,ApptViewStackBehavior stackBehavior,ApptViewAlignment align,Brush backBrush,DataRow dataRoww,List<ApptViewItem> apptRows,DataTable tableApptFields,DataTable tablePatFields,float totalWidth,float totalHeight,int fontSize,bool isPrinting) { Font baseFont=new Font("Arial",fontSize); string text=""; bool isNote=false; #region FillText if(PIn.Long(dataRoww["AptStatus"].ToString()) == (int)ApptStatus.PtNote || PIn.Long(dataRoww["AptStatus"].ToString()) == (int)ApptStatus.PtNoteCompleted) { isNote=true; } bool isGraphic=false; if(apptRows[elementI].ElementDesc=="ConfirmedColor") { isGraphic=true; } if(apptRows[elementI].ApptFieldDefNum>0) { string fieldName=ApptFieldDefs.GetFieldName(apptRows[elementI].ApptFieldDefNum); for(int i=0;i<tableApptFields.Rows.Count;i++) { if(tableApptFields.Rows[i]["AptNum"].ToString()!=dataRoww["AptNum"].ToString()) { continue; } if(tableApptFields.Rows[i]["FieldName"].ToString()!=fieldName) { continue; } text=tableApptFields.Rows[i]["FieldValue"].ToString(); } } else if(apptRows[elementI].PatFieldDefNum>0) { string fieldName=PatFieldDefs.GetFieldName(apptRows[elementI].PatFieldDefNum); for(int i=0;i<tablePatFields.Rows.Count;i++) { if(tablePatFields.Rows[i]["PatNum"].ToString()!=dataRoww["PatNum"].ToString()) { continue; } if(tablePatFields.Rows[i]["FieldName"].ToString()!=fieldName) { continue; } text=tablePatFields.Rows[i]["FieldValue"].ToString(); } } else switch(apptRows[elementI].ElementDesc) { case "Address": if(isNote) { text=""; } else { text=dataRoww["address"].ToString(); } break; case "AddrNote": if(isNote) { text=""; } else { text=dataRoww["addrNote"].ToString(); } break; case "Age": if(isNote) { text=""; } else { text=dataRoww["age"].ToString(); } break; case "ASAP": if(isNote) { text=""; } else { if(dataRoww["AptStatus"].ToString()==((int)ApptStatus.ASAP).ToString()) { text=Lans.g("enumApptStatus","ASAP"); } } break; case "ASAP[A]": if(dataRoww["AptStatus"].ToString()==((int)ApptStatus.ASAP).ToString()) { text="A"; } break; case "AssistantAbbr": if(isNote) { text=""; } else { text=dataRoww["assistantAbbr"].ToString(); } break; case "ChartNumAndName": text=dataRoww["chartNumAndName"].ToString(); break; case "ChartNumber": text=dataRoww["chartNumber"].ToString(); break; case "CreditType": text=dataRoww["CreditType"].ToString(); break; case "Guardians": if(isNote) { text=""; } else { text=dataRoww["guardians"].ToString(); } break; case "HasIns[I]": text=dataRoww["hasIns[I]"].ToString(); break; case "HmPhone": if(isNote) { text=""; } else { text=dataRoww["hmPhone"].ToString(); } break; case "InsToSend[!]": text=dataRoww["insToSend[!]"].ToString(); break; case "Lab": if(isNote) { text=""; } else { text=dataRoww["lab"].ToString(); } break; case "MedOrPremed[+]": if(isNote) { text=""; } else { text=dataRoww["medOrPremed[+]"].ToString(); } break; case "MedUrgNote": if(isNote) { text=""; } else { text=dataRoww["MedUrgNote"].ToString(); } break; case "Note": text=dataRoww["Note"].ToString(); break; case "PatientName": text=dataRoww["patientName"].ToString(); break; case "PatientNameF": text=dataRoww["patientNameF"].ToString(); break; case "PatNum": text=dataRoww["patNum"].ToString(); break; case "PatNumAndName": text=dataRoww["patNumAndName"].ToString(); break; case "PremedFlag": if(isNote) { text=""; } else { text=dataRoww["preMedFlag"].ToString(); } break; case "Procs": if(isNote) { text=""; } else { text=dataRoww["procs"].ToString(); } break; case "ProcsColored": string value=dataRoww["procsColored"].ToString(); string[] lines=value.Split(new string[] { "</span>" },StringSplitOptions.RemoveEmptyEntries); Point tempPt=new Point(); tempPt=drawLoc; int lastH=0; int count=1; for(int i=0;i<lines.Length;i++) { Match m=Regex.Match(lines[i],"^<span color=\"(-?[0-9]*)\">(.*)$"); string rgbInt=m.Result("$1"); string proc=m.Result("$2"); if(lines[i]!=lines[lines.Length-1]) { proc+=","; } if(rgbInt=="") { rgbInt=apptRows[elementI].ElementColorXml.ToString(); } Color c=Color.FromArgb(Convert.ToInt32(rgbInt)); StringFormat procFormat=new StringFormat(); RectangleF procRect=new RectangleF(0,0,1000,1000); CharacterRange[] ranges= { new CharacterRange(0,proc.Length) }; Region[] regions=new Region[1]; procFormat.SetMeasurableCharacterRanges(ranges); regions=g.MeasureCharacterRanges(proc,baseFont,procRect,procFormat); if(regions.Length==0) { procRect=new RectangleF(0,0,0,0); } else { procRect=regions[0].GetBounds(g); } if(tempPt.X+procRect.Width>totalWidth) { tempPt.X=drawLoc.X; tempPt.Y+=lastH; count++; } SolidBrush sb=new SolidBrush(c); g.DrawString(proc,baseFont,sb,tempPt); DisposeObjects(procFormat,sb); tempPt.X+=(int)procRect.Width+3;//+3 is room for spaces if((int)procRect.Height>lastH) { lastH=(int)procRect.Height; } } drawLoc.Y+=lastH*count; return drawLoc; case "Production": if(isNote) { text=""; } else { text=dataRoww["production"].ToString(); } break; case "Provider": if(isNote) { text=""; } else { text=dataRoww["provider"].ToString(); } break; case "TimeAskedToArrive": if(isNote) { text=""; } else { text=dataRoww["timeAskedToArrive"].ToString();//could be blank } break; case "WirelessPhone": if(isNote) { text=""; } else { text=dataRoww["wirelessPhone"].ToString(); } break; case "WkPhone": if(isNote) { text=""; } else { text=dataRoww["wkPhone"].ToString(); } break; } #endregion if(text=="" && !isGraphic) { return drawLoc;//next element will draw at the same position as this one would have. } SolidBrush brush=new SolidBrush(apptRows[elementI].ElementColor); SolidBrush brushWhite=new SolidBrush(Color.White); SolidBrush noteTitlebrush = new SolidBrush(DefC.Long[(int)DefCat.AppointmentColors][8].ItemColor); StringFormat format=new StringFormat(); format.Alignment=StringAlignment.Near; int charactersFitted;//not used, but required as 'out' param for measureString. int linesFilled; SizeF noteSize; RectangleF rect; RectangleF rectBack; #region Main if(align==ApptViewAlignment.Main) {//always stacks vertical if(isGraphic) { Bitmap bitmap=new Bitmap(12,12); noteSize=new SizeF(bitmap.Width,bitmap.Height); rect=new RectangleF(drawLoc,noteSize); using(Graphics gfx=Graphics.FromImage(bitmap)) { gfx.SmoothingMode=SmoothingMode.HighQuality; Color confirmColor=DefC.GetColor(DefCat.ApptConfirmed,PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush=new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush,0,0,11,11); gfx.DrawEllipse(Pens.Black,0,0,11,11); confirmBrush.Dispose(); } g.DrawImage(bitmap,drawLoc.X,drawLoc.Y); DisposeObjects(brush,brushWhite,noteTitlebrush,format,bitmap); return new Point(drawLoc.X,drawLoc.Y+(int)noteSize.Height); } else { noteSize=g.MeasureString(text,baseFont,(int)totalWidth-9); //Problem: "limited-tooth bothering him ", the trailing space causes measuring error, resulting in m getting partially chopped off. //Tried TextRenderer, but it caused premature wrapping //Size noteSizeInt=TextRenderer.MeasureText(text,baseFont,new Size(totalWidth-9,1000)); //noteSize=new SizeF(noteSizeInt.totalWidth,noteSizeInt.totalHeight); noteSize.Width=(float)Math.Ceiling((double)noteSize.Width);//round up to nearest int solves specific problem discussed above. if(drawLoc.Y+noteSize.Height>totalHeight && isPrinting) { //This keeps text from drawing off the appointment when font is large. Only if isPrinting cause not sure if this will cause bugs. //No need to do this check when drawing to the appt screen cause its just an image on a control which clips itself. noteSize.Height=totalHeight-drawLoc.Y; } g.MeasureString(text,baseFont,noteSize,format,out charactersFitted,out linesFilled); rect=new RectangleF(drawLoc,noteSize); g.DrawString(text,baseFont,brush,rect,format); DisposeObjects(brush,brushWhite,noteTitlebrush,format); return new Point(drawLoc.X,drawLoc.Y+linesFilled*ApptDrawing.LineH); } } #endregion #region UR else if(align==ApptViewAlignment.UR) { if(stackBehavior==ApptViewStackBehavior.Vertical) { float w=totalWidth-9; if(isGraphic) { Bitmap bitmap=new Bitmap(12,12); noteSize=new SizeF(bitmap.Width,bitmap.Height); Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width,drawLoc.Y+1);//upper left corner of this element rect=new RectangleF(drawLoc,noteSize); using(Graphics gfx=Graphics.FromImage(bitmap)) { gfx.SmoothingMode=SmoothingMode.HighQuality; Color confirmColor=DefC.GetColor(DefCat.ApptConfirmed,PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush=new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush,0,0,11,11); gfx.DrawEllipse(Pens.Black,0,0,11,11); confirmBrush.Dispose(); } g.DrawImage(bitmap,drawLocThis.X,drawLocThis.Y); DisposeObjects(brush,brushWhite,noteTitlebrush,format,bitmap); return new Point(drawLoc.X,drawLoc.Y+(int)noteSize.Height); } else { noteSize=g.MeasureString(text,baseFont,(int)w); noteSize=new SizeF(noteSize.Width,ApptDrawing.LineH+1);//only allowed to be one line high. if(noteSize.Width<5) { noteSize=new SizeF(5,noteSize.Height); } //g.MeasureString(text,baseFont,noteSize,format,out charactersFitted,out linesFilled); Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width,drawLoc.Y);//upper left corner of this element rect=new RectangleF(drawLocThis,noteSize); rectBack=new RectangleF(drawLocThis.X,drawLocThis.Y+1,noteSize.Width,ApptDrawing.LineH); if(apptRows[elementI].ElementDesc=="MedOrPremed[+]" || apptRows[elementI].ElementDesc=="HasIns[I]" || apptRows[elementI].ElementDesc=="InsToSend[!]") { g.FillRectangle(brush,rectBack); g.DrawString(text,baseFont,Brushes.Black,rect,format); } else { g.FillRectangle(brushWhite,rectBack); g.DrawString(text,baseFont,brush,rect,format); } g.DrawRectangle(Pens.Black,rectBack.X,rectBack.Y,rectBack.Width,rectBack.Height); DisposeObjects(brush,brushWhite,noteTitlebrush,format); return new Point(drawLoc.X,drawLoc.Y+ApptDrawing.LineH);//move down a certain number of lines for next element. } } else {//horizontal int w=drawLoc.X-9;//drawLoc is upper right of each element. The first element draws at (totalWidth-1,0). if(isGraphic) { Bitmap bitmap=new Bitmap(12,12); noteSize=new SizeF(bitmap.Width,bitmap.Height); Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width,drawLoc.Y+1);//upper left corner of this element rect=new RectangleF(drawLoc,noteSize); using(Graphics gfx=Graphics.FromImage(bitmap)) { gfx.SmoothingMode=SmoothingMode.HighQuality; Color confirmColor=DefC.GetColor(DefCat.ApptConfirmed,PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush=new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush,0,0,11,11); gfx.DrawEllipse(Pens.Black,0,0,11,11); confirmBrush.Dispose(); } g.DrawImage(bitmap,drawLocThis.X,drawLocThis.Y); DisposeObjects(brush,brushWhite,noteTitlebrush,format,bitmap); return new Point(drawLoc.X-(int)noteSize.Width-2,drawLoc.Y); } else { noteSize=g.MeasureString(text,baseFont,w); noteSize=new SizeF(noteSize.Width,ApptDrawing.LineH+1);//only allowed to be one line high. Needs an extra pixel. if(noteSize.Width<5) { noteSize=new SizeF(5,noteSize.Height); } Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width,drawLoc.Y);//upper left corner of this element rect=new RectangleF(drawLocThis,noteSize); rectBack=new RectangleF(drawLocThis.X,drawLocThis.Y+1,noteSize.Width,ApptDrawing.LineH); if(apptRows[elementI].ElementDesc=="MedOrPremed[+]" || apptRows[elementI].ElementDesc=="HasIns[I]" || apptRows[elementI].ElementDesc=="InsToSend[!]") { g.FillRectangle(brush,rectBack); g.DrawString(text,baseFont,Brushes.Black,rect,format); } else { g.FillRectangle(brushWhite,rectBack); g.DrawString(text,baseFont,brush,rect,format); } g.DrawRectangle(Pens.Black,rectBack.X,rectBack.Y,rectBack.Width,rectBack.Height); DisposeObjects(brush,brushWhite,noteTitlebrush,format); return new Point(drawLoc.X-(int)noteSize.Width-1,drawLoc.Y);//Move to left. Might also have to subtract a little from x to space out elements. } } } #endregion #region LR else {//LR if(stackBehavior==ApptViewStackBehavior.Vertical) { float w=totalWidth-9; if(isGraphic) { Bitmap bitmap=new Bitmap(12,12); noteSize=new SizeF(bitmap.Width,bitmap.Height); Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width,drawLoc.Y+1-ApptDrawing.LineH);//upper left corner of this element rect=new RectangleF(drawLoc,noteSize); using(Graphics gfx=Graphics.FromImage(bitmap)) { gfx.SmoothingMode=SmoothingMode.HighQuality; Color confirmColor=DefC.GetColor(DefCat.ApptConfirmed,PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush=new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush,0,0,11,11); gfx.DrawEllipse(Pens.Black,0,0,11,11); confirmBrush.Dispose(); } g.DrawImage(bitmap,drawLocThis.X,drawLocThis.Y); DisposeObjects(brush,brushWhite,noteTitlebrush,format,bitmap); return new Point(drawLoc.X,drawLoc.Y-(int)noteSize.Height); } else { noteSize=g.MeasureString(text,baseFont,(int)w); noteSize=new SizeF(noteSize.Width,ApptDrawing.LineH+1);//only allowed to be one line high. Needs an extra pixel. if(noteSize.Width<5) { noteSize=new SizeF(5,noteSize.Height); } //g.MeasureString(text,baseFont,noteSize,format,out charactersFitted,out linesFilled); Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width,drawLoc.Y-ApptDrawing.LineH);//upper left corner of this element rect=new RectangleF(drawLocThis,noteSize); rectBack=new RectangleF(drawLocThis.X,drawLocThis.Y+1,noteSize.Width,ApptDrawing.LineH); if(apptRows[elementI].ElementDesc=="MedOrPremed[+]" || apptRows[elementI].ElementDesc=="HasIns[I]" || apptRows[elementI].ElementDesc=="InsToSend[!]") { g.FillRectangle(brush,rectBack); g.DrawString(text,baseFont,Brushes.Black,rect,format); } else { g.FillRectangle(brushWhite,rectBack); g.DrawString(text,baseFont,brush,rect,format); } g.DrawRectangle(Pens.Black,rectBack.X,rectBack.Y,rectBack.Width,rectBack.Height); DisposeObjects(brush,brushWhite,noteTitlebrush,format); return new Point(drawLoc.X,drawLoc.Y-ApptDrawing.LineH);//move up a certain number of lines for next element. } } else {//horizontal int w=drawLoc.X-9;//drawLoc is upper right of each element. The first element draws at (totalWidth-1,0). if(isGraphic) { Bitmap bitmap=new Bitmap(12,12); noteSize=new SizeF(bitmap.Width,bitmap.Height); Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width+1,drawLoc.Y+1-ApptDrawing.LineH);//upper left corner of this element rect=new RectangleF(drawLoc,noteSize); using(Graphics gfx=Graphics.FromImage(bitmap)) { gfx.SmoothingMode=SmoothingMode.HighQuality; Color confirmColor=DefC.GetColor(DefCat.ApptConfirmed,PIn.Long(dataRoww["Confirmed"].ToString())); SolidBrush confirmBrush=new SolidBrush(confirmColor); gfx.FillEllipse(confirmBrush,0,0,11,11); gfx.DrawEllipse(Pens.Black,0,0,11,11); confirmBrush.Dispose(); } g.DrawImage(bitmap,drawLocThis.X,drawLocThis.Y); DisposeObjects(brush,brushWhite,noteTitlebrush,format,bitmap); return new Point(drawLoc.X-(int)noteSize.Width-1,drawLoc.Y); } else { noteSize=g.MeasureString(text,baseFont,w); noteSize=new SizeF(noteSize.Width,ApptDrawing.LineH+1);//only allowed to be one line high. Needs an extra pixel. if(noteSize.Width<5) { noteSize=new SizeF(5,noteSize.Height); } Point drawLocThis=new Point(drawLoc.X-(int)noteSize.Width,drawLoc.Y-ApptDrawing.LineH);//upper left corner of this element rect=new RectangleF(drawLocThis,noteSize); rectBack=new RectangleF(drawLocThis.X,drawLocThis.Y+1,noteSize.Width,ApptDrawing.LineH); if(apptRows[elementI].ElementDesc=="MedOrPremed[+]" || apptRows[elementI].ElementDesc=="HasIns[I]" || apptRows[elementI].ElementDesc=="InsToSend[!]") { g.FillRectangle(brush,rectBack); g.DrawString(text,baseFont,Brushes.Black,rect,format); } else { g.FillRectangle(brushWhite,rectBack); g.DrawString(text,baseFont,brush,rect,format); } g.DrawRectangle(Pens.Black,rectBack.X,rectBack.Y,rectBack.Width,rectBack.Height); DisposeObjects(brush,brushWhite,noteTitlebrush,format); return new Point(drawLoc.X-(int)noteSize.Width-1,drawLoc.Y);//Move to left. Subtract a little from x to space out elements. } } } #endregion }