public void EraseImage(WebRequestsPool pool) { Debug.Assert(pool != null, "It is needed RequestPool to complete image detetion!"); pool.RemoveRequest(this); EraseImage(); }
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); } }
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(); } }
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(); }
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); } } }
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); } }
public virtual void EraseImagesInTree(WebRequestsPool pool) { EraseImage(pool); }