Пример #1
0
        public void EraseImage(WebRequestsPool pool)
        {
            Debug.Assert(pool != null, "It is needed RequestPool to complete image detetion!");

            pool.RemoveRequest(this);
            EraseImage();
        }
Пример #2
0
 public override void EraseImagesInTree(WebRequestsPool pool)
 {
     base.EraseImagesInTree(pool);
     for (int i = Nodes.Count; i > 0; --i)
     {
         var layer = NodeToLayer(Nodes[i - 1]);
         layer.EraseImagesInTree(pool);
     }
 }
Пример #3
0
        public void Erase(WebRequestsPool pool)
        {
            if (pool != null)
            {
                EraseImage(pool);
            }
            else
            {
                EraseImage();
            }

            var parent = Parent;

            // TODO: The root will never be erased, even if there are no leafs
            if (parent != null)
            {
                // Layer is root
                // At first, SubLayer must be removed from list of layers and then can be disposed.
                parent.Nodes.Remove(node);
                parent.EraseIfEmpty();
            }
        }
Пример #4
0
        private void ViewerWindowClosing(object sender, EventArgs e)
        {
            Debug.Assert(sender == this, "Only window can invoke closing event handler!");

            layers.BeginUpdate();
            try
            {
                foreach (TreeNode node in layers.Nodes)
                {
                    var layer = Layer.NodeToLayer(node);
                    using (layer)
                    {
                        layers.Nodes.Remove(node);
                    }
                }
            }
            finally
            {
                layers.EndUpdate();
            }

            WebRequestsPool.ResetPool();
        }
Пример #5
0
        public override void Draw(IViewport view, Graphics canvas, WebRequestsPool pool)
        {
            // Viewport is readonly.
            if (DownloadOneImage)
            {
                foreach (TreeNode node in Nodes)
                {
                    var layer = NodeToLayer(node);
                    layer.EraseImagesInTree(pool);
                }

                base.Draw(view, canvas, pool);
            }
            else
            {
                EraseImage(pool);
                foreach (TreeNode node in Nodes)
                {
                    var layer = NodeToLayer(node);
                    layer.Draw(view, canvas, pool);
                }
            }
        }
Пример #6
0
        public virtual void Draw(IViewport view, Graphics canvas, WebRequestsPool pool)
        {
            // Viewport is readonly.
            Debug.Assert(view != null, "Viewport is missing!");
            Debug.Assert(canvas != null, "Canvas is missing!");
            Debug.Assert(pool != null, "WebRequestsPool is necessary for image downloading!");

            var builder = new StringBuilder();

            GetVisibleLayerNames(builder, IsCrsSupportedByParents());

            if (builder.Length > 0)
            {
                var newView = view.Copy();
                newView.ReduceViewBox(Wms.MaxWidth, Wms.MaxHeight);
                var newImage = new MapImage(builder.ToString(), Wms.CRSId, newView, ImageFormat,
                                            IsTransparent, BgColor);

                try
                {
                    // We cannot work with variable directly,
                    // because another thread could rewrite it during the work.
                    var oldImage = ReleaseImage();
                    try
                    {
                        if (IsVisible)
                        {
                            // Are we downloading?
                            if (AutoUpdate && Wms.IsDownloadingEnabled)
                            {
                                if ((oldImage == null) || (!newImage.Equals(oldImage)))
                                {
                                    var requested = newImage;
                                    newImage = null;        // Do not dispose the object
                                    pool.PutRequest(this, requested, requested.GetImageAddress(Wms));
                                    if (oldImage != null)
                                    {
                                        oldImage.Draw(view, canvas);
                                    }
                                }
                                else
                                {
                                    // If the situation changes and there is requested the same image
                                    // that already exists in the layer, outdated downloading is running
                                    // at this moment and it must be interrupted.
                                    pool.RemoveRequest(this);
                                    oldImage.Draw(view, canvas);
                                }
                            }
                            else
                            {
                                // Downloading must be interrupted.
                                pool.RemoveRequest(this);
                                if (oldImage != null)
                                {
                                    // Use an image with different CRS is nonsense.
                                    if (oldImage.CRSEquals(newImage))
                                    {
                                        oldImage.Draw(view, canvas);
                                    }
                                    else
                                    {
                                        oldImage.Dispose();
                                        oldImage = null;        // Erase old image
                                    }
                                }
                            }
                        }
                        else
                        {
                            if ((oldImage != null) && (!newImage.Equals(oldImage)))
                            {
                                oldImage.Dispose();
                                oldImage = null;        // Erase old image
                            }
                        }
                    }
                    finally
                    {
                        // If another thread save new image, we prefer it.
                        SetOrErase(oldImage);
                    }
                }
                finally
                {
                    if (newImage != null)
                    {
                        newImage.Dispose();
                    }
                }
            }
            else
            {
                EraseImage(pool);
            }
        }
Пример #7
0
 public virtual void EraseImagesInTree(WebRequestsPool pool)
 {
     EraseImage(pool);
 }