/// <summary> /// Registers a new shape. /// </summary> /// <param name="shape">The dom shape.</param> /// <returns>a registered <see cref="OoShapeObserver"/> for this shape</returns> internal OoShapeObserver RegisterNewShape(XShape shape, OoDrawPageObserver pObs = null) { OoShapeObserver sobs = null; if (shape != null) { // get the page to this shape var page = OoDrawUtils.GetPageForShape(shape); if (page != null) { if (pObs == null || !page.Equals(pObs.DrawPage)) { pObs = GetRegisteredPageObserver(page); } if (pObs != null) { sobs = OoShapeObserverFactory.BuildShapeObserver(shape, pObs); // new OoShapeObserver(shape, pObs); RegisterUniqueShape(sobs); } } } return(sobs); }
/// <summary> /// Creats a group object /// </summary> /// <returns>The Shape observer for the newly created group or <c>null</c>.</returns> private OoShapeObserver createGroup() { OoShapeObserver group = null; OoAccessibleDocWnd draw = null; OoDrawPagesObserver doc = null; OoDrawPageObserver page = null; if (IsShapeSelected && LastSelectedShape != null) { page = LastSelectedShape.Page; doc = page.PagesObserver; draw = doc.DocWnd; } else { // TODO: how to get those things } if (doc != null && draw != null && draw.DrawPageSupplier != null) { Logger.Instance.Log(LogPriority.DEBUG, this, "[NOTICE]\t[DRAWING]\t[CREATE]\t" + "build group shape"); var grpShape = OoDrawUtils.CreateGroupShape_anonymous(draw.DrawPageSupplier); OoUtils.SetStringProperty(grpShape, "Name", LL.GetTrans("tangram.oomanipulation.shape.group")); if (page != null && page.DrawPage_anonymouse != null) { var pageObj = page.DrawPage_anonymouse; OoDrawUtils.AddShapeToDrawPageUndoable(grpShape, pageObj, draw.DrawPageSupplier); group = doc.RegisterNewShape(grpShape); } } return(group); }
private void Update(XDrawPagesSupplier dps) { var shapeList = new List <OoShapeObserver>(this.domshapes.Values); if (shapeList != null && shapeList.Count > 0) { foreach (var shapeObs in shapeList) { if (shapeObs != null) { shapeObs.Update(); } } } List <XDrawPage> dpL = OoDrawUtils.DrawDocGetXDrawPageList(dps); Parallel.ForEach(dpL, (drawPage) => { if (DrawPageobservers.ContainsKey(drawPage)) { System.Diagnostics.Debug.WriteLine("[UPDATE] Draw page known"); var obs = DrawPageobservers[drawPage]; obs.Update(); } else { System.Diagnostics.Debug.WriteLine("[UPDATE] Draw page NOT known !!!"); OoDrawPageObserver dpobs = new OoDrawPageObserver(drawPage, this); RegisterDrawPage(dpobs); } }); }
/// <summary> /// Initializes a new instance of the <see cref="OoDrawPagesObserver"/> class. /// </summary> /// <param name="dp">The Draw document.</param> /// <param name="doc">The document related accessibility component.</param> /// <param name="docWnd">The related document accessible window component.</param> public OoDrawPagesObserver(XDrawPagesSupplier dp, OoAccComponent doc, OoAccessibleDocWnd docWnd = null) { this.PagesSupplier = dp; Document = doc; DocWnd = docWnd; // get Zoom and ViewOffset first time if (Controller != null) { if (Controller is XPropertySet) { refreshDrawViewProperties((XPropertySet)(Controller)); } // try to get dpi settings from openoffice XWindow componentWindow = Controller.ComponentWindow; if (componentWindow != null && componentWindow is XDevice) { DeviceInfo deviceInfo = (DeviceInfo)((XDevice)componentWindow).getInfo(); if (deviceInfo != null) { PixelPerMeterX = deviceInfo.PixelPerMeterX; PixelPerMeterY = deviceInfo.PixelPerMeterY; } } } // register for Zoom and ViewOffset updates addVisibleAreaPropertyChangeListener(); if (this.PagesSupplier != null) { List <XDrawPage> dpL = OoDrawUtils.DrawDocGetXDrawPageList(dp); if (PagesSupplier is unoidl.com.sun.star.frame.XTitle) { Title = ((unoidl.com.sun.star.frame.XTitle)PagesSupplier).getTitle(); } Logger.Instance.Log(LogPriority.DEBUG, this, "create DrawPagesObserver for supplier " + dp.GetHashCode() + " width title '" + Title + "' - having " + dpL.Count + " pages"); //FIXME: Do this if the api enable parallel access //Parallel.ForEach(dpL, (drawPage) => //{ // OoDrawPageObserver dpobs = new OoDrawPageObserver(drawPage, this); // DrawPageobservers[drawPage] = dpobs; // DrawPages.Add(dpobs); //}); foreach (var drawPage in dpL) { OoDrawPageObserver dpobs = new OoDrawPageObserver(drawPage, this); RegisterDrawPage(dpobs); } XModifyBroadcaster mdfBc = PagesSupplier as XModifyBroadcaster; if (mdfBc != null) { mdfBc.addModifyListener(eventForwarder); } } }
/// <summary> /// Groups the current selected obejct into a group /// </summary> /// <returns><c>true</c> if the shape was added to a group successfully; otherwise, <c>false</c>.</returns> private bool grouping() { if (IsShapeSelected && LastSelectedShape != null) { OoAccessibleDocWnd draw = null; OoDrawPagesObserver doc = null; OoDrawPageObserver page = null; page = LastSelectedShape.Page; if (page != null) { doc = page.PagesObserver; if (doc != null) { draw = doc.DocWnd; if (draw != null && draw.DrawPageSupplier != null) { var undoManager = draw.DrawPageSupplier; if (_group == null) // start grouping { _group = createGroup(); } if (_group != null && _group.IsGroup) { // set Title bar // size & position var size = LastSelectedShape.Size; var pos = LastSelectedShape.Position; // TODO: check if this is a group if (OoDrawUtils.AddShapeToGroupUndoable(_group.DomShape, LastSelectedShape.DomShape, undoManager, "Add shape to group")) { LastSelectedShape.Size = size; LastSelectedShape.Position = pos; var b = _group.Bounds; _group.Position = b.Location; play(LL.GetTrans("tangram.oomanipulation.group.added", OoElementSpeaker.GetElementAudioText(LastSelectedShape)), false); LastSelectedShape = _group; // sayLastSelectedShape(false); return(true); } return(false); } } } } } return(false); }
///// <summary> ///// Determine if the XShape child is already known as a child. ///// </summary> ///// <param name="shape">The shape.</param> ///// <returns> the releated ShapeObserver to the known child otherwise <c>null</c></returns> //OoShapeObserver childListContainsXShape(XShape shape) //{ // foreach (var child in Children) // { // if (child.Equals(shape)) return child; // } // return null; //} #endregion #region DOM Tree Handling /// <summary> /// gets an OoShapeObserver for the given shape. /// </summary> /// <param name="s">The s.</param> /// <returns>An already registered or a new observer for the shape</returns> private OoShapeObserver getShapeObserverFromXShape(XShape s) { if (s != null) { OoShapeObserver sObs = this.Page.PagesObserver.GetRegisteredShapeObserver(s, this.Page); if (sObs == null && this.Page != null && this.Page.PagesObserver != null) { sObs = OoShapeObserverFactory.BuildShapeObserver( //new OoShapeObserver( s, this.Page.PagesObserver.GetRegisteredPageObserver( OoDrawUtils.GetPageForShape(s))); this.Page.PagesObserver.RegisterUniqueShape(sObs); } return(sObs); } return(null); }
/// <summary> /// Get a registered shape observer. /// </summary> /// <param name="shape">The shape.</param> /// <returns>the already registered shape observer to the shape or <c>null</c></returns> internal OoShapeObserver GetRegisteredShapeObserver(XShape shape, OoDrawPageObserver page) { if (domshapes.ContainsKey(shape)) { OoShapeObserver sobs = domshapes[shape]; if (sobs != null && sobs.Shape == shape) { return(sobs); } } String name = OoUtils.GetStringProperty(shape, "Name"); OoShapeObserver sObs = getRegisteredShapeObserver(name); if (sObs == null) { if (page == null) { XDrawPage pageShape = OoDrawUtils.GetPageForShape(shape); if (pageShape == null) { Logger.Instance.Log(LogPriority.DEBUG, this, "[EROR] Can't get page to requested NEW shape"); page = this.DocWnd.GetActivePage(); } else { page = GetRegisteredPageObserver(pageShape as XDrawPage); } } if (page != null) { sObs = OoShapeObserverFactory.BuildShapeObserver(shape, page); //new OoShapeObserver(shape, page); RegisterUniqueShape(sObs); } } if (sObs != null && sObs.Shape != shape) { sObs = RegisterNewShape(shape, page); } return(sObs); }
/// <summary> /// Gets the page bounds and position on the screen in pixels. /// </summary> /// <param name="activePage">The active page to get the position on the screen of.</param> /// <returns>The bounds of the given page on the screen.</returns> public static Rectangle GetPageBoundsAndPosition(OoDrawPageObserver activePage) { Rectangle pos = new Rectangle(); if (activePage != null) { System.Drawing.Rectangle pageBoundsInPx = OoDrawUtils.convertToPixel( new System.Drawing.Rectangle( -activePage.PagesObserver.ViewOffset.X + activePage.BorderLeft, -activePage.PagesObserver.ViewOffset.Y + activePage.BorderTop, activePage.Width - activePage.BorderLeft - activePage.BorderRight, activePage.Height - activePage.BorderTop - activePage.BorderBottom), activePage.PagesObserver.ZoomValue, OoDrawPagesObserver.PixelPerMeterY, OoDrawPagesObserver.PixelPerMeterY); pos = new Rectangle(pageBoundsInPx.X, pageBoundsInPx.Y, pageBoundsInPx.Width, pageBoundsInPx.Height); } return(pos); }
/// <summary> /// Transforms a point, which is in document coordinates, into pixel coordinates on screen, /// taking into account the current zoom level of the drawing application. /// </summary> /// <param name="x">The x coordinate to transform.</param> /// <param name="y">The y coordinate to transform.</param> /// <returns>The estimated pixel position of the point on the screen.</returns> public Point TransformPointCoordinatesIntoScreenCoordinates(int x, int y) { Point p = new Point(x, y); try { if (IsValid() && Shape.Page != null && Shape.Page.PagesObserver != null) { Point offset = Shape.Page.PagesObserver.ViewOffset; int currentZoom = Shape.Page.PagesObserver.ZoomValue; p.X = OoDrawUtils.ConvertToPixel(x - offset.X, currentZoom, OoDrawPagesObserver.PixelPerMeterX); p.Y = OoDrawUtils.ConvertToPixel(y - offset.Y, currentZoom, OoDrawPagesObserver.PixelPerMeterY); } } catch (Exception ex) { Logger.Instance.Log(LogPriority.ALWAYS, this, "[ERROR] when transforming polygon points" + ex); } return(p); }