/// <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));
                        }
                    }
                }
            }
        }