/// <summary> /// Splits one word over several lines if it is to long to fit in one line. /// </summary> /// <param name="dots">The dot patterns of the word. /// (List of characters) List [ /// (List of raised pins in one Braille cell) List [dot pattern] /// ] /// </param> /// <param name="width">The width.</param> /// <returns> /// A list of lines for the split word. /// (List of lines) List [ /// (List of characters) List [ /// (List of raised pins in one Braille cell) List [dot pattern] /// ] /// ] /// </returns> private static List <List <List <int> > > splitWordOverLines(List <List <int> > dots, int width, ref RenderElement parentElement) { List <List <List <int> > > lines = new List <List <List <int> > >(); if (dots != null && width > BRAILLE_CHAR_WIDTH) { //Split the word char list in peaces width max length of 'width' int count = getMaxCountOfChars(width); if (count > 0) { string parVal = parentElement.GetValue() != null?parentElement.GetValue().ToString() : String.Empty; int i = 0; while (i < dots.Count) { int l = (i + count) < dots.Count ? count : (dots.Count - i); List <List <int> > subList = dots.GetRange(i, l); // create sub value string val = !String.IsNullOrEmpty(parVal) && parVal.Length > i? parVal.Substring(i, (parVal.Length > (i + l) ? l : parVal.Length - i) ) : String.Empty; // create sub element for each part RenderElement se = new RenderElement( parentElement.X, parentElement.Y + (lines.Count * (BRAILLE_CHAR_HEIGHT + INTER_LINE_HEIGHT)), getMinWidthOfString(subList), (BRAILLE_CHAR_HEIGHT + INTER_LINE_HEIGHT), val, parentElement ); parentElement.AddSubPart(se); se.Type = BrailleRendererPartType.WORD_PART; lines.Add(subList); i += count; } } } return(lines); }
static void getImageOfRenderingElement(RenderElement e, ref Graphics g, int xOffset, int yOffset, int left, int right, int top, int bottom, Pen p = null, int xShrink = 0, int yShrink = 0) { if (p == null) p = dashedPen != null ? dashedPen : Pens.DarkMagenta; if (e.Height > 0 && e.Width > 0 && g != null) { g.DrawRectangle(p , (e.X + xOffset) * PIN_2_PIXEL_FACTOR + xShrink , (e.Y + yOffset) * PIN_2_PIXEL_FACTOR + yShrink , e.Width * PIN_2_PIXEL_FACTOR - (2 * xShrink) , e.Height * PIN_2_PIXEL_FACTOR - (2 * yShrink) ); if (e.HasSubParts()) { foreach (var item in e.GetSubParts()) { if (item.IsCompletelyInArea(left, right, top, bottom)) { getImageOfRenderingElement(item, ref g, xOffset, yOffset, left, right, top, bottom, Pens.DarkTurquoise, xShrink + 1, yShrink + 1); } } } else { if (e.GetValue() != null) { String value = String.IsNullOrEmpty(e.DisplayName) ? e.GetValue().ToString() : e.DisplayName; if (!String.IsNullOrWhiteSpace(value)) { int x = (e.X + xOffset) * PIN_2_PIXEL_FACTOR + (2 * xShrink); int y = (e.Y + yOffset) * PIN_2_PIXEL_FACTOR + (2 * yShrink); int width = e.Width * PIN_2_PIXEL_FACTOR - (4 * xShrink); int height = e.Height * PIN_2_PIXEL_FACTOR - (4 * yShrink); g.FillRectangle(backgroundBrush, new Rectangle(x, y, width, height)); g.DrawString(value, textFont, textBrush, new Rectangle(x, y, width, height)); } } } } }
/// <summary> /// Makes the entry visible in the given view. /// If an entry is outside the visible area and the view is <see cref="BrailleIO.Interface.IPannable" />, /// the offsets are adapted to make the entry visible. /// </summary> /// <param name="renderedEntry">The rendered entry.</param> /// <param name="view">The view.</param> /// <param name="vertical">if set to <c>true</c> adapt view in vertical direction.</param> /// <param name="horizontal">if set to <c>true</c> adapt view in horizontal direction.</param> /// <returns> /// <c>true</c> if the entry would be visible; otherwise, <c>false</c>. /// </returns> /// <remarks> /// After a returning <c>true</c> you have to force an rerendering. /// </remarks> public virtual bool MakeEntryVisible(RenderElement renderedEntry, IViewBoxModel view = null, bool vertical = true, bool horizontal = false) { bool success = false; if (!renderedEntry.IsEmpty() && (vertical || horizontal)) { if (view == null) { view = _lastView; } if (view != null && view.ContentBox.Width * view.ContentBox.Height > 0) { int visibility = IsEntryVisible(renderedEntry, view); if (visibility > 0) { return(true); } else { if (view is IPannable) { // entry position Rectangle bbox = new Rectangle( renderedEntry.X, renderedEntry.Y, renderedEntry.Width, renderedEntry.Height); // visible view port Rectangle viewPort = new Rectangle( -((IPannable)view).GetXOffset(), -((IPannable)view).GetYOffset(), view.ContentBox.Width, view.ContentBox.Height); // check if item is selected --> add one more line for marking var entry = renderedEntry.GetValue() as DialogEntry; if (entry != null && entry.Status.HasFlag(DialogEntryStatus.Selected)) { bbox.Height += 1; } // check for scrolling directions /************** vertical ***********/ if (vertical) { if (bbox.Top < viewPort.Top) //entry starts over the view port // move upwards { viewPort.Y = bbox.Y; } else if (bbox.Bottom > viewPort.Bottom) // entry ends after the view port // move downwards? { int newY = viewPort.Top + (bbox.Bottom - viewPort.Bottom); viewPort.Y = Math.Min(bbox.Top, newY); } ((IPannable)view).SetYOffset(-viewPort.Y); success = ((IPannable)view).GetYOffset() == -viewPort.Y; } /************ horizontal ***********/ if (horizontal) { if (bbox.Left < viewPort.Left) // move right { viewPort.X = bbox.X; } else if (bbox.Right > viewPort.Right) // move left? { int newX = viewPort.Left + (bbox.Right - viewPort.Right); viewPort.X = Math.Min(bbox.Left, newX); } ((IPannable)view).SetXOffset(-viewPort.X); success = true; } } } } } return(success); }
static void getImageOfRenderingElement(RenderElement e, ref Graphics g, int xOffset, int yOffset, int left, int right, int top, int bottom, Pen p = null, int xShrink = 0, int yShrink = 0) { if (p == null) p = dashedPen != null ? dashedPen : Pens.DarkMagenta; if (e.Height > 0 && e.Width > 0 && g != null) { g.DrawRectangle(p , (e.X + xOffset) * PIN_2_PIXEL_FACTOR + xShrink , (e.Y + yOffset) * PIN_2_PIXEL_FACTOR + yShrink , e.Width * PIN_2_PIXEL_FACTOR - (2 * xShrink) , e.Height * PIN_2_PIXEL_FACTOR - (2 * yShrink) ); if (e.HasSubParts()) { foreach (var item in e.GetSubParts()) { if (item.IsCompletelyInArea(left, right, top, bottom)) { getImageOfRenderingElement(item, ref g, xOffset, yOffset, left, right, top, bottom, Pens.DarkTurquoise, xShrink + 1, yShrink + 1); } } } else { if (e.GetValue() != null) { String value = e.GetValue().ToString(); if (!String.IsNullOrWhiteSpace(value)) { int x = (e.X + xOffset) * PIN_2_PIXEL_FACTOR + (2 * xShrink); int y = (e.Y + yOffset) * PIN_2_PIXEL_FACTOR + (2 * yShrink); int width = e.Width * PIN_2_PIXEL_FACTOR - (4 * xShrink); int height = e.Height * PIN_2_PIXEL_FACTOR - (4 * yShrink); g.FillRectangle(backgroundBrush, new Rectangle(x, y, width, height)); g.DrawString(value, textFont, textBrush, new Rectangle(x, y, width, height)); } } } } }