ImageZoom.cs

// Copyright � 2007 Jeffrey Bazinet, http://www.vwd-cms.com/
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Text;

namespace VwdCms
{
    public class ImageZoom : Panel, INamingContainer, IToolbarProvider
    {
        protected HtmlImage imgMain;
        protected HtmlGenericControl divImage;

        private bool _controlsBuilt;

        protected Toolbar tbrImageZoom;
        private bool _toolbarCreated = false;
        private string _toolbarContainerID = null;
        private string _toolbarCssClass = null;
        private string _toolbarButtonCssClass = null;
        private string _toolbarLinkCssClass = null;
        private string _toolbarSpacerCssClass = null;
        private string _toolbarSeparatorCssClass = null;
        private string _imageUrl = VwdCms.Configuration.Utilities.ImageUrl;
        private string _imageSrc = null;

        private bool _useIconMatrix = false;

        public bool UseIconMatrix
        {
            get { return _useIconMatrix; }
            set { _useIconMatrix = value; }
        }
        
        protected override void OnPreRender(EventArgs e)
        {
            BuildCompositeControls(); 
            CreateToolbar();
            RegisterControlClientScript();
            base.OnPreRender(e);
        }

        public string ImageUrl
        {
            get { return _imageUrl; }
            set { _imageUrl = value; }
        }

        public string ImageSrc
        {
            get { return _imageSrc; }
            set 
            { 
                _imageSrc = value;
                if (this.Image != null)
                {
                    this.Image.Src = value;
                }
            }
        }

        public HtmlImage Image
        {
            get { return this.imgMain; }
        }

        private void BuildCompositeControls()
        {
            if (!_controlsBuilt)
            {
                _controlsBuilt = true;

                this.divImage = new HtmlGenericControl("div");
                this.divImage.ID = "divImage";
                this.divImage.Style.Add("width", "100%");
                this.divImage.Style.Add("height", "100%");
                this.divImage.Style.Add("overflow", "auto");

                this.imgMain = new HtmlImage();
                this.imgMain.ID = "imgMain";
                this.imgMain.Src = this.ImageSrc;
                this.imgMain.Style.Add("border", "solid 1px #333333");
                this.imgMain.Style.Add("margin", "5px");
                this.divImage.Controls.Add(this.imgMain);

                this.Controls.Add(this.divImage);
            }
        }

        private void RegisterControlClientScript()
        {
            StringBuilder sb = new StringBuilder();
            const string newline = "\r\n";

            sb.Append("<script type=\"text/javascript\"> <!-- ");
            sb.Append(newline);

            sb.Append("function ");
            sb.Append(this.ClientID);
            sb.Append("_setImage(src){");
            sb.Append("try{");
            sb.Append("var img=document.getElementById('");
            sb.Append(this.imgMain.ClientID);
            sb.Append("');");
            sb.Append("img.removeAttribute('width');");
            sb.Append("img.src=src;");
            sb.Append("}catch(e){alert('setImage error: ' + e.message);}");
            sb.Append("}");
            sb.Append(newline);

            sb.Append("function ");
            sb.Append(this.ClientID);
            sb.Append("_zoomIn(){");
            sb.Append("try{");
            sb.Append("var img=document.getElementById('");
            sb.Append(this.imgMain.ClientID);
            sb.Append("');img.width=img.width*1.25;");
            sb.Append("}catch(e){alert('zoomIn error: ' + e.message);}");
            sb.Append("}");
            sb.Append(newline);

            sb.Append("function ");
            sb.Append(this.ClientID);
            sb.Append("_zoomOut(){");
            sb.Append("try{");
            sb.Append("var img=document.getElementById('");
            sb.Append(this.imgMain.ClientID);
            sb.Append("');img.width=img.width*0.75;");
            sb.Append("}catch(e){alert('zoomOut error: ' + e.message);}");
            sb.Append("}");
            sb.Append(newline);

            sb.Append("function ");
            sb.Append(this.ClientID);
            sb.Append("_actualSize(){");
            sb.Append("try{");
            sb.Append("var img=document.getElementById('");
            sb.Append(this.imgMain.ClientID);
            sb.Append("');");
            sb.Append("img.removeAttribute('width');");
            sb.Append("}catch(e){alert('actualSize error: ' + e.message);}");
            sb.Append("}");
            sb.Append(newline);

            sb.Append("function ");
            sb.Append(this.ClientID);
            sb.Append("_bestFit(){");
            sb.Append("try{");
            sb.Append("var iz=document.getElementById('");
            sb.Append(this.ClientID);
            sb.Append("');var img=document.getElementById('");
            sb.Append(this.imgMain.ClientID);
            sb.Append("');");
            sb.Append("var cw=iz.clientWidth;while(cw==0){iz=iz.parentElement;cw=iz.clientWidth;}");
            sb.Append("var ch=iz.clientHeight;");
            sb.Append("img.removeAttribute('width');");
            sb.Append("var ar=img.width/img.height;");
            sb.Append("if (ar>=1.0) {img.width=cw-12;}");
            sb.Append("else {img.width=Math.floor(ch*ar)-12;}");
            sb.Append("}catch(e){alert('bestFit error: ' + e.message);}");
            sb.Append("}");
            sb.Append(newline);

            sb.Append("// -->");
            sb.Append(newline);
            sb.Append("</script>");
            sb.Append(newline);

            this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
                this.ClientID + "_ClientScript", sb.ToString());
        }

        // *************************************************************************
        // ****  Toolbar Methods and Properties                                 ****
        // *************************************************************************

        public string ToolbarContainerID
        {
            get { return _toolbarContainerID; }
            set { _toolbarContainerID = value; }
        }

        public string ToolbarCssClass
        {
            get { return _toolbarCssClass; }
            set { _toolbarCssClass = value; }
        }

        public string ToolbarButtonCssClass
        {
            get { return _toolbarButtonCssClass; }
            set { _toolbarButtonCssClass = value; }
        }

        public string ToolbarLinkCssClass
        {
            get { return _toolbarLinkCssClass; }
            set { _toolbarLinkCssClass = value; }
        }

        public string ToolbarSpacerCssClass
        {
            get { return _toolbarSpacerCssClass; }
            set { _toolbarSpacerCssClass = value; }
        }

        public string ToolbarSeparatorCssClass
        {
            get { return _toolbarSeparatorCssClass; }
            set { _toolbarSeparatorCssClass = value; }
        }

        // IToolbarProvider Members

        Toolbar IToolbarProvider.GetToolbar()
        {
            Toolbar tbr = null;
            if (this.Visible)
            {
                tbr = this.CreateToolbar();
            }
            return tbr;
        }

        string IToolbarProvider.ToolbarContainerID
        {
            get
            {
                return this.ToolbarContainerID;
            }
        }

        // Toolbar implementation
        private Toolbar CreateToolbar()
        {
            if (!_toolbarCreated)
            {
                _toolbarCreated = true;

                VwdCms.Configuration.CmsConfig cfg = VwdCms.Configuration.CmsConfig.Current;
                this.tbrImageZoom = new Toolbar();
                this.tbrImageZoom.ID = "tbrImageZoom";

                if (!string.IsNullOrEmpty(this.ToolbarCssClass))
                {
                    this.tbrImageZoom.CssClass = this.ToolbarCssClass;
                }
                if (!string.IsNullOrEmpty(this.ToolbarButtonCssClass))
                {
                    this.tbrImageZoom.ButtonCssClass = this.ToolbarButtonCssClass;
                }
                if (!string.IsNullOrEmpty(this.ToolbarLinkCssClass))
                {
                    this.tbrImageZoom.LinkCssClass = this.ToolbarLinkCssClass;
                }
                if (!string.IsNullOrEmpty(this.ToolbarSpacerCssClass))
                {
                    this.tbrImageZoom.SpacerCssClass = this.ToolbarSpacerCssClass;
                }
                if (!string.IsNullOrEmpty(this.ToolbarSeparatorCssClass))
                {
                    this.tbrImageZoom.SeparatorCssClass = this.ToolbarSeparatorCssClass;
                }
                
                this.tbrImageZoom.AttachResources = true;
                this.tbrImageZoom.JavaScriptFolder = "../../scripts/";
                this.tbrImageZoom.CssFolder = "../../css/";

                ToolbarItem ti = null;

                ti = ToolbarItem.Spacer();
                this.tbrImageZoom.Items.Add(ti.Name, ti);

                ti = new ToolbarItem("ZoomIn", _imageUrl + "zoomin.gif", "Zoom In", "ZI", this.ClientID + "_zoomIn();", this.UseIconMatrix);
                this.tbrImageZoom.Items.Add(ti.Name, ti);

                ti = new ToolbarItem("ZoomOut", _imageUrl + "zoomout.gif", "Zoom Out", "ZO", this.ClientID + "_zoomOut();", this.UseIconMatrix);
                this.tbrImageZoom.Items.Add(ti.Name, ti);

                ti = ToolbarItem.Separator();
                this.tbrImageZoom.Items.Add(ti.Name, ti);

                ti = new ToolbarItem("ActualSize", _imageUrl + "actualsize.gif", "Actual Size", "AS", this.ClientID + "_actualSize();", this.UseIconMatrix);
                this.tbrImageZoom.Items.Add(ti.Name, ti);

                ti = new ToolbarItem("BestFit", _imageUrl + "bestfit.gif", "Best Fit", "BF", this.ClientID + "_bestFit();", this.UseIconMatrix);
                this.tbrImageZoom.Items.Add(ti.Name, ti);

                ti = ToolbarItem.Spacer();
                this.tbrImageZoom.Items.Add(ti.Name, ti);
                
            }
            return this.tbrImageZoom;
        }
    }
}