/// <summary> /// Moves the content of the view in horizontal direction. /// </summary> /// <param name="vr">The view to move the content of.</param> /// <param name="pins">The pins to move in horizontal direction. Negative values will move the content to the right; positive values to the left.</param> /// <param name="render">if set to <c>true</c> a new rendering is forced.</param> /// <returns> /// <c>true</c> if the content was moved successfully. /// </returns> /// <remarks> /// Views will change their presentation only after calling <see cref="BrailleIOMediator.Instance.RenderDisplay()" />. /// Call the <c>RenderDisplay()</c> function after you have done all your changes to see the results. /// </remarks> public static bool MoveHorizontal(BrailleIOViewRange vr, int pins, bool render = false) { if (vr != null) { int oldO = vr.GetXOffset(); vr.MoveHorizontal(pins); if (render && BrailleIOMediator.Instance != null) { BrailleIOMediator.Instance.RenderDisplay(); } return(oldO != vr.GetXOffset()); } return(false); }
/// <summary> /// If Braille text is at the requested position in the given view range that this function tries to get the corresponding text. /// </summary> /// <param name="vr">The viewrange to check.</param> /// <param name="e">the gesture event</param> private String checkForTouchedBrailleText(BrailleIOViewRange vr, GestureEventArgs e) { if (vr.ContentRender is ITouchableRenderer && e != null && e.Gesture != null) { var touchRendeer = (ITouchableRenderer)vr.ContentRender; // calculate the position in the content int x = (int)e.Gesture.NodeParameters[0].X; int y = (int)e.Gesture.NodeParameters[0].Y; x = x - vr.ViewBox.X - vr.ContentBox.X - vr.GetXOffset(); y = y - vr.ViewBox.Y - vr.ContentBox.Y - vr.GetYOffset(); var touchedElement = touchRendeer.GetContentAtPosition(x, y); if (touchedElement != null && touchedElement is RenderElement) { var touchedValue = ((RenderElement)touchedElement).GetValue(); if (((RenderElement)touchedElement).HasSubParts()) { List <RenderElement> touchedSubparts = ((RenderElement)touchedElement).GetSubPartsAtPoint(x, y); if (touchedSubparts != null && touchedSubparts.Count > 0) { touchedValue = touchedSubparts[0].GetValue(); } } System.Diagnostics.Debug.WriteLine("----- [BRAILLE TEXT TOUCHED] : '" + touchedValue.ToString() + "'"); return(touchedValue.ToString()); } } return(String.Empty); }
/// <summary> /// Move the content of the given view range in horizontal direction. /// </summary> /// <param name="viewName">name of the view</param> /// <param name="viewRangeName">name of the view range</param> /// <param name="steps">count of pins to move</param> protected bool moveHorizontal(string viewName, string viewRangeName, int steps) { if (io == null && io.GetView(viewName) as BrailleIOScreen != null) { return(false); } BrailleIOViewRange vr = ((BrailleIOScreen)io.GetView(viewName)).GetViewRange(viewRangeName); if (GetVisibleScreen().Name.Equals(BS_MINIMAP_NAME)) { vr = screenBeforeMinimap.GetViewRange(viewRangeName); // offset has to be the offset of mainscreen view range instead of minimap view range, because minimap offset is always 0/0 } if (vr != null) { if ((steps > 0 && vr.GetXOffset() >= 0) || (new Point(vr.GetXOffset(), vr.GetYOffset()).Equals(vr.MoveHorizontal(steps)))) { audioRenderer.PlayWaveImmediately(StandardSounds.End); return(false); } } io.RefreshDisplay(true); return(true); }
/// <summary> /// Gets the view port of a given view. The viewPort is the /// presented part of the content. /// /// ┌────────────────────┐ -- content /// │ │ /// │ ╔════════╗╌╌ viewPort /// │ ║ ║ │ /// │ ╚════════╝ │ /// │ │ /// └────────────────────┘ /// </summary> /// <param name="view">The view.</param> /// <returns></returns> static Rectangle GetViewPort(BrailleIOViewRange view) { Rectangle viewPort = new Rectangle(); if (view != null) { viewPort.Width = view.ContentBox.Width; viewPort.Height = view.ContentBox.Height; viewPort.X = -view.GetXOffset(); viewPort.Y = -view.GetYOffset(); } return(viewPort); }
void zoom(string viewName, string viewRangeName, double factor) { if (IO == null && IO.GetView(viewName) as BrailleIOScreen != null) { return; } // zoom in BrailleIOViewRange vr = ((BrailleIOScreen)IO.GetView(viewName)).GetViewRange(viewRangeName); if (vr != null) { if (vr.GetZoom() > 0) { //TODO: make zoom to center var oldZoom = vr.GetZoom(); var newZoom = oldZoom * factor; var oldvrdin = vr.ViewBox; Point oldcenter = new Point( (int)Math.Round(((double)oldvrdin.Width / 2) + (vr.GetXOffset() * -1)), (int)Math.Round(((double)oldvrdin.Height / 2) + (vr.GetYOffset() * -1)) ); Point newCenter = new Point( (int)Math.Round(oldcenter.X * newZoom / oldZoom), (int)Math.Round(oldcenter.Y * newZoom / oldZoom) ); Point newOffset = new Point( (int)Math.Round((newCenter.X - ((double)oldvrdin.Width / 2)) * -1), (int)Math.Round((newCenter.Y - ((double)oldvrdin.Height / 2)) * -1) ); vr.SetZoom(newZoom); vr.SetXOffset(newOffset.X); vr.SetYOffset(newOffset.Y); } } this. IO.RenderDisplay(); }
/// <summary> /// Set the Zooms factor of the view to the given factor. /// </summary> /// <param name="vr">The view to change the zoom factor.</param> /// <param name="factor">The new zoom-factor.</param> /// <param name="render">if set to <c>true</c> a new rendering is forced.</param> /// <returns> /// <c>true</c> if the zoom factor of the view was changed successfully. /// </returns> /// <exception cref="System.ArgumentException">Zoom-factor must be not 0! - factor</exception> /// <remarks> /// Views will change their presentation only after calling <see cref="BrailleIOMediator.Instance.RenderDisplay()" />. /// Call the <c>RenderDisplay()</c> function after you have done all your changes to see the results. /// </remarks> public static bool ZoomTo(BrailleIOViewRange vr, double factor, bool render = false) { if (factor == 0.0) { throw new ArgumentException("Zoom-factor must be not 0!", "factor"); } if (vr != null) { var oldZoom = vr.GetZoom(); var newZoom = factor; var oldvrdin = vr.ViewBox; Point oldcenter = new Point( (int)Math.Round(((double)oldvrdin.Width / 2) + (vr.GetXOffset() * -1)), (int)Math.Round(((double)oldvrdin.Height / 2) + (vr.GetYOffset() * -1)) ); Point newCenter = new Point( (int)Math.Round(oldcenter.X * newZoom / oldZoom), (int)Math.Round(oldcenter.Y * newZoom / oldZoom) ); Point newOffset = new Point( (int)Math.Round((newCenter.X - ((double)oldvrdin.Width / 2)) * -1), (int)Math.Round((newCenter.Y - ((double)oldvrdin.Height / 2)) * -1) ); vr.SetZoom(newZoom); vr.SetXOffset(newOffset.X); vr.SetYOffset(newOffset.Y); if (render && BrailleIOMediator.Instance != null) { BrailleIOMediator.Instance.RenderDisplay(); } return(oldZoom != vr.GetZoom()); } return(false); }
/// <summary> /// Synchronize the zoom and x/y offset of the given view range with that of the center view range of the visible screen. /// </summary> /// <param name="vr">view range that should be syncronized with visible center</param> private void syncViewRangeWithVisibleCenterViewRange(BrailleIOViewRange vr) { BrailleIOScreen vs = GetVisibleScreen(); if (!vs.Name.Equals(BS_MINIMAP_NAME)) { BrailleIOViewRange visibleCenterVR = vs.GetViewRange(VR_CENTER_NAME); double zoom = visibleCenterVR.GetZoom(); int x = visibleCenterVR.GetXOffset(); int y = visibleCenterVR.GetYOffset(); if (visibleCenterVR.ContentHeight <= vr.ContentBox.Height && visibleCenterVR.ContentWidth <= vr.ContentBox.Width) { vr.SetZoom(-1); // für Anpassung bei kleinster Zoomstufe } else { vr.SetZoom(zoom); } vr.SetXOffset(x); vr.SetYOffset(y); } }
/// <summary> /// Zooms the given view range to the new zoom level and calculates the new offset out of the old center position. /// </summary> /// <param name="vr">view range that should be zoomed</param> /// <param name="oldZoom">old zoom of the view range</param> /// <param name="newZoom">new zoom</param> /// <returns>true, if zoom was successful</returns> private bool zoom(BrailleIOViewRange vr, double oldZoom, double newZoom) { if (vr != null) { Point oldCenter = new Point(); var oldvrdin = vr.ContentBox; bool zoomToShape = false; Point oldOffset = new Point(vr.GetXOffset(), vr.GetYOffset()); // Prüfung auf größte Zoomstufe if (newZoom > vr.MAX_ZOOM_LEVEL) { if (oldZoom == vr.MAX_ZOOM_LEVEL) { return(false); } newZoom = vr.MAX_ZOOM_LEVEL; } // Prüfung auf kleinste Zoomstufe if (vr.ContentBox.Height >= vr.ContentHeight && vr.ContentBox.Width >= vr.ContentWidth) { if (oldZoom >= newZoom) { return(false); } oldCenter = Point.Empty; // central point of focused element as center for zooming if (OoConnector.Instance != null && OoConnector.Instance.Observer != null) { OoShapeObserver shape = OoConnector.Instance.Observer.GetLastSelectedShape(); if (shape != null) { Rectangle shapeBoundingbox = shape.GetRelativeScreenBoundsByDom(); if (shapeBoundingbox != null) { // calculate shape position and size in pins (relative to document boundings on pin device) Point shapePosition = new Point((int)Math.Round(shapeBoundingbox.X * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Y * vr.GetZoom())); Size shapeSize = new Size((int)Math.Round(shapeBoundingbox.Width * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Height * vr.GetZoom())); Point shapeCenter = new Point(shapePosition.X + shapeSize.Width / 2, shapePosition.Y + shapeSize.Height / 2); oldCenter = new Point(shapeCenter.X, shapeCenter.Y); } } } if (oldCenter != Point.Empty) { zoomToShape = true; } else { oldCenter = new Point( (int)Math.Round(((double)vr.ContentWidth / 2) + (vr.GetXOffset() * -1)), (int)Math.Round(((double)vr.ContentHeight / 2) + (vr.GetYOffset() * -1)) ); } } else { oldCenter = Point.Empty; // central point of focused element as center for zooming if (OoConnector.Instance != null && OoConnector.Instance.Observer != null) { OoShapeObserver shape = OoConnector.Instance.Observer.GetLastSelectedShape(); if (shape != null) { Rectangle shapeBoundingbox = shape.GetRelativeScreenBoundsByDom(); if (shapeBoundingbox != null) { // calculate shape position and size in pins (relative to document boundings on pin device) Point shapePosition = new Point((int)Math.Round(shapeBoundingbox.X * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Y * vr.GetZoom())); Size shapeSize = new Size((int)Math.Round(shapeBoundingbox.Width * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Height * vr.GetZoom())); Point shapeCenter = new Point(shapePosition.X + shapeSize.Width / 2, shapePosition.Y + shapeSize.Height / 2); oldCenter = new Point(shapeCenter.X, shapeCenter.Y); } } } if (oldCenter != Point.Empty) { zoomToShape = true; } else { // central point of center region as center for zooming oldCenter = new Point( (int)Math.Round(((double)oldvrdin.Width / 2) + (vr.GetXOffset() * -1)), (int)Math.Round(((double)oldvrdin.Height / 2) + (vr.GetYOffset() * -1)) ); } } double zoomDivRatio = newZoom / oldZoom; if (newZoom > 0 && (vr.ContentBox.Height <= vr.ContentHeight * zoomDivRatio || vr.ContentBox.Width <= vr.ContentWidth * zoomDivRatio)) { Point newCenter = new Point( (int)Math.Round(oldCenter.X * zoomDivRatio), (int)Math.Round(oldCenter.Y * zoomDivRatio) ); Point newOffset = new Point(); if (zoomToShape) { newOffset = new Point(oldOffset.X + (oldCenter.X - newCenter.X), oldOffset.Y + (oldCenter.Y - newCenter.Y)); } else { newOffset = new Point( (int)Math.Round((newCenter.X - ((double)oldvrdin.Width / 2)) * -1), (int)Math.Round((newCenter.Y - ((double)oldvrdin.Height / 2)) * -1) ); } vr.SetZoom(newZoom); vr.MoveTo(new Point(Math.Min(newOffset.X, 0), Math.Min(newOffset.Y, 0))); } else // set to smallest zoom level { vr.SetZoom(-1); vr.SetXOffset(0); vr.SetYOffset(0); } // check for correct panning if (vr.GetXOffset() > 0) { vr.SetXOffset(0); } if (vr.GetYOffset() > 0) { vr.SetYOffset(0); } if ((vr.ContentWidth + vr.GetXOffset()) < vr.ContentBox.Width) { int maxOffset = Math.Min(0, vr.ContentBox.Width - vr.ContentWidth); vr.SetXOffset(maxOffset); } if ((vr.ContentHeight + vr.GetYOffset()) < vr.ContentBox.Height) { int maxOffset = Math.Min(0, vr.ContentBox.Height - vr.ContentHeight); vr.SetYOffset(maxOffset); } return(true); } return(false); }
/// <summary> /// Set the content in minimap mode. Thereby the screen capturing bitmap is shown with blinking frame. /// </summary> /// <param name="vr">ViewRange in which minimap content should be shown.</param> /// <param name="e">EventArgs of the screen capturing event.</param> void setMinimapContent(BrailleIOViewRange vr, CaptureChangedEventArgs e) { int width = vr.ContentBox.Width; int height = vr.ContentBox.Height; Bitmap bmp = new Bitmap(width, height); Graphics graph = Graphics.FromImage(bmp); if (screenBeforeMinimap != null) { BrailleIOViewRange imgvr = screenBeforeMinimap.GetViewRange(VR_CENTER_NAME); if (imgvr == null) { return; } int xoffset = imgvr.GetXOffset(); int yoffset = imgvr.GetYOffset(); int imgWidth = imgvr.ContentWidth; int imgHeight = imgvr.ContentHeight; if (imgWidth > 0 && imgHeight > 0) { // calculate image size for minimap (complete image has to fit into view range) int imgScaledWidth = imgWidth; int imgScaledHeight = imgHeight; double scaleFactorX = 1; double scaleFactorY = 1; if (width != 0 && imgScaledWidth > width) { scaleFactorX = (double)imgWidth / (double)width; if (scaleFactorX != 0) { imgScaledWidth = width; imgScaledHeight = (int)(imgHeight / scaleFactorX); } } if (height != 0 && imgScaledHeight > height) { scaleFactorY = (double)imgScaledHeight / (double)height; if (scaleFactorY != 0) { imgScaledHeight = height; imgScaledWidth = (int)(imgScaledWidth / scaleFactorY); } } // calculate scaling factor from original image to minimap image size MinimapScalingFactor = 1 / (scaleFactorX * scaleFactorY); double zoom = imgvr.GetZoom(); if (zoom > 0) { MinimapScalingFactor = MinimapScalingFactor * zoom; } // calculate position and size of the blinking frame int x = Math.Abs(xoffset) * imgScaledWidth / imgWidth; int y = Math.Abs(yoffset) * imgScaledHeight / imgHeight; int frameWidth = width * imgScaledWidth / imgWidth; int frameHeigth = height * imgScaledHeight / imgHeight; // draw scaled image and blinking frame graph.DrawImage(e.Img, 0, 0, imgScaledWidth, imgScaledHeight); Color frameColor = Color.Black; if (!blinkPinsUp) { frameColor = Color.White; } graph.DrawRectangle(new Pen(frameColor, 2), x, y, frameWidth, frameHeigth); vr.SetBitmap(bmp); } } }
/// <summary> /// Gets the view port of a given view. The viewPort is the /// presented part of the content. /// /// ┌────────────────────┐ -- content /// │ │ /// │ ╔════════╗╌╌ viewPort /// │ ║ ║ │ /// │ ╚════════╝ │ /// │ │ /// └────────────────────┘ /// </summary> /// <param name="view">The view.</param> /// <returns></returns> static Rectangle GetViewPort(BrailleIOViewRange view) { Rectangle viewPort = new Rectangle(); if (view != null) { viewPort.Width = view.ContentBox.Width; viewPort.Height = view.ContentBox.Height; viewPort.X = -view.GetXOffset(); viewPort.Y = -view.GetYOffset(); } return viewPort; }
/// <summary> /// If Braille text is at the requested position in the given view range that this function tries to get the corresponding text. /// </summary> /// <param name="vr">The viewrange to check.</param> /// <param name="e">the gestrure evnet</param> private String CheckForTouchedBrailleText(BrailleIOViewRange vr, GestureEventArgs e) { if (vr.ContentRender is ITouchableRenderer) { var touchRendeer = (ITouchableRenderer)vr.ContentRender; // calculate the position in the content int x = (int)e.Gesture.NodeParameters[0].X; int y = (int)e.Gesture.NodeParameters[0].Y; x = x - vr.ViewBox.X - vr.ContentBox.X - vr.GetXOffset(); y = y - vr.ViewBox.Y - vr.ContentBox.Y - vr.GetYOffset(); var touchedElement = touchRendeer.GetContentAtPosition(x, y); if (touchedElement != null && touchedElement is RenderElement) { var touchedValue = ((RenderElement)touchedElement).GetValue(); if (((RenderElement)touchedElement).HasSubParts()) { List<RenderElement> touchedSubparts = ((RenderElement)touchedElement).GetSubPartsAtPoint(x, y); if (touchedSubparts != null && touchedSubparts.Count > 0) { touchedValue = touchedSubparts[0].GetValue(); } } System.Diagnostics.Debug.WriteLine("----- [BRAILLE TEXT TOUCHED] : '" + touchedValue.ToString() + "'"); return touchedValue.ToString(); } } return String.Empty; }
/// <summary> /// Zooms the given view range to the new zoom level and calculates the new offset out of the old center position. /// </summary> /// <param name="vr">view range that should be zoomed</param> /// <param name="oldZoom">old zoom of the view range</param> /// <param name="newZoom">new zoom</param> /// <returns>true, if zoom was successful</returns> private bool zoom(BrailleIOViewRange vr, double oldZoom, double newZoom) { if (vr != null) { Point oldCenter = new Point(); var oldvrdin = vr.ContentBox; bool zoomToShape = false; Point oldOffset = new Point(vr.GetXOffset(), vr.GetYOffset()); // Prüfung auf größte Zoomstufe if (newZoom > vr.MAX_ZOOM_LEVEL) { if (oldZoom == vr.MAX_ZOOM_LEVEL) return false; newZoom = vr.MAX_ZOOM_LEVEL; } // Prüfung auf kleinste Zoomstufe if (vr.ContentBox.Height >= vr.ContentHeight && vr.ContentBox.Width >= vr.ContentWidth) { if (oldZoom >= newZoom) return false; oldCenter = Point.Empty; // central point of focused element as center for zooming if (OoConnector.Instance != null && OoConnector.Instance.Observer != null) { OoShapeObserver shape = OoConnector.Instance.Observer.GetLastSelectedShape(); if (shape != null) { Rectangle shapeBoundingbox = shape.GetRelativeScreenBoundsByDom(); if (shapeBoundingbox != null) { // calculate shape position and size in pins (relative to document boundings on pin device) Point shapePosition = new Point((int)Math.Round(shapeBoundingbox.X * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Y * vr.GetZoom())); Size shapeSize = new Size((int)Math.Round(shapeBoundingbox.Width * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Height * vr.GetZoom())); Point shapeCenter = new Point(shapePosition.X + shapeSize.Width / 2, shapePosition.Y + shapeSize.Height / 2); oldCenter = new Point(shapeCenter.X, shapeCenter.Y); } } } if (oldCenter != Point.Empty) zoomToShape = true; else { oldCenter = new Point( (int)Math.Round(((double)vr.ContentWidth / 2) + (vr.GetXOffset() * -1)), (int)Math.Round(((double)vr.ContentHeight / 2) + (vr.GetYOffset() * -1)) ); } } else { oldCenter = Point.Empty; // central point of focused element as center for zooming if (OoConnector.Instance != null && OoConnector.Instance.Observer != null) { OoShapeObserver shape = OoConnector.Instance.Observer.GetLastSelectedShape(); if (shape != null) { Rectangle shapeBoundingbox = shape.GetRelativeScreenBoundsByDom(); if (shapeBoundingbox != null) { // calculate shape position and size in pins (relative to document boundings on pin device) Point shapePosition = new Point((int)Math.Round(shapeBoundingbox.X * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Y * vr.GetZoom())); Size shapeSize = new Size((int)Math.Round(shapeBoundingbox.Width * vr.GetZoom()), (int)Math.Round(shapeBoundingbox.Height * vr.GetZoom())); Point shapeCenter = new Point(shapePosition.X + shapeSize.Width / 2, shapePosition.Y + shapeSize.Height / 2); oldCenter = new Point(shapeCenter.X, shapeCenter.Y); } } } if (oldCenter != Point.Empty) zoomToShape = true; else { // central point of center region as center for zooming oldCenter = new Point( (int)Math.Round(((double)oldvrdin.Width / 2) + (vr.GetXOffset() * -1)), (int)Math.Round(((double)oldvrdin.Height / 2) + (vr.GetYOffset() * -1)) ); } } if (newZoom > 0) { double zoomRatio = newZoom / oldZoom; Point newCenter = new Point( (int)Math.Round(oldCenter.X * zoomRatio), (int)Math.Round(oldCenter.Y * zoomRatio) ); Point newOffset = new Point(); if (zoomToShape) { newOffset = new Point(oldOffset.X + (oldCenter.X - newCenter.X), oldOffset.Y + (oldCenter.Y - newCenter.Y)); } else { newOffset = new Point( (int)Math.Round((newCenter.X - ((double)oldvrdin.Width / 2)) * -1), (int)Math.Round((newCenter.Y - ((double)oldvrdin.Height / 2)) * -1) ); } vr.SetZoom(newZoom); vr.MoveTo(new Point(Math.Min(newOffset.X, 0), Math.Min(newOffset.Y, 0))); } else // set to smallest zoom level { vr.SetZoom(-1); vr.SetXOffset(0); vr.SetYOffset(0); } // check for correct panning if (vr.GetXOffset() > 0) { vr.SetXOffset(0); } if (vr.GetYOffset() > 0) { vr.SetYOffset(0); } if ((vr.ContentWidth + vr.GetXOffset()) < vr.ContentBox.Width) { int maxOffset = Math.Min(0, vr.ContentBox.Width - vr.ContentWidth); vr.SetXOffset(maxOffset); } if ((vr.ContentHeight + vr.GetYOffset()) < vr.ContentBox.Height) { int maxOffset = Math.Min(0, vr.ContentBox.Height - vr.ContentHeight); vr.SetYOffset(maxOffset); } return true; } return false; }