Common Add graphics
Common_AddGraphics_CSharp\App_Code\GraphicPointTools.cs
// Copyright 2010 ESRI
// 
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
// 
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
// 
// See the use restrictions.
// 


namespace AddPoint
{
    public class ElementGraphicTool : ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction
    {
        #region IMapServerToolAction Members

        void ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction.ServerAction(
            ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs toolEventArgs)
        {
            // Get a reference to the map control by casting the event aarguments object to a Map
            ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap =
                (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolEventArgs.Control;

            try
            {
                // Get a reference to the point clicked on the map as a Web ADF point object by 
                // (1) casting the event arguments to a MapPointEventArgs object and (2) accessing
                // the MapPoint property on MapPointEventArgs
                ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs mapPointEventArgs =
                    (ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs)toolEventArgs;
                ESRI.ArcGIS.ADF.Web.Geometry.Point adfPoint = mapPointEventArgs.MapPoint;

                // Retrieve the map functionality for the graphics resource
                ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality graphicsMapFunctionality =
                    adfMap.GetFunctionality("ADFGraphicsResource") as
                    ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality;

                // Make sure the graphics resource was found
                if (graphicsMapFunctionality == null)
                {
                    // If the graphics resource was not found, use the ProcessError utility function
                    // to notify the user.  This function creates a Web ADF callback result that
                    // specifies displaying a JavaScript alert with the passed-in text.  We copy
                    // this callback result to the Map Control's callback results collection, because
                    // Web ADF Tools and Commands (and the classes that inherit from them) process
                    // callback results from the map after execution.
                    adfMap.CallbackResults.CopyFrom
                        (Utility.CreateErrorCallback("ADF graphics functionality not found"));
                    return;
                }

                // Attempt to retrieve the element graphics layer that will hold the graphic point 
                ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer elementGraphicsLayer = null;
                if (graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Element Graphics"))
                    elementGraphicsLayer = graphicsMapFunctionality.GraphicsDataSet.Tables["Element Graphics"]
                        as ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer;

                // Check whether the element graphics layer was found.  If not, create it.
                if (elementGraphicsLayer == null)
                {
                    // Create a new instance of ElementGraphicsLayer and assign it to our 
                    // ElementGraphicsLayer object variable.
                    elementGraphicsLayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();

                    // Name the layer via the inherited System.Data.DataTable.TableName property
                    elementGraphicsLayer.TableName = "Element Graphics";

                    // Add the layer to the graphics resource's tables collection.  Note that the
                    // resource's GraphicsDataSet property inherits from System.Data.DataSet, so we
                    // add the table the same way as we would if this were a "regular" DataSet object
                    graphicsMapFunctionality.GraphicsDataSet.Tables.Add(elementGraphicsLayer);

                    // Get a reference to the Toc control on the same page as the map.  Note this code
                    // assumes that a Toc control named "Toc1" exists and will throw an exception if
                    // one does not.
                    ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc adfToc =
                        (ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc)Utility.FindControl("Toc1", adfMap.Page);

                    // Refreshing the Toc control will add the new graphics layer to the Toc via
                    // the MapResourceManager --> Map --> Toc buddy relationship
                    adfToc.Refresh();

                    // Copy the callback results from the Toc (which has callback results because of the
                    // above call to Refresh) to the Map because Web ADF Tools and Commands only process
                    // the callback results of the Map.
                    adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults);
                }

                // Uncomment to make the tool remove the previous point when adding a new one
                //elementGraphicsLayer.Clear();

                // Initialize a simple marker symbol that will be used specify the default symbology 
                // of the graphics in the element graphics layer
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol defaultSimpleMarkerSymbol =
                    new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();
                defaultSimpleMarkerSymbol.Color = System.Drawing.Color.Black;
                defaultSimpleMarkerSymbol.Width = 20;
                defaultSimpleMarkerSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Triangle;

                // Initialize a simple marker symbol that will be used to specify the appearance of
                // selected graphics in the element graphics layer
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol selectedSimpleMarkerSymbol =
                    new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();
                selectedSimpleMarkerSymbol.Color = System.Drawing.Color.Yellow;
                selectedSimpleMarkerSymbol.Width = 12;

                // Create a graphic element located at the point clicked on the map, and with the symbology
                // specified by the renderers initialized above
                ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement graphicElement =
                    new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(adfPoint,
                    defaultSimpleMarkerSymbol, selectedSimpleMarkerSymbol);

                // Add the element to the graphics layer
                elementGraphicsLayer.Add(graphicElement);

                // Refresh the graphics resource so the new graphics element is displayed
                adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name); 
            }
            catch (System.Exception exception)
            {
                ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult errorCallbackResult =
                    Utility.GetErrorCallback(exception);
                adfMap.CallbackResults.Add(errorCallbackResult);
            }
       }

        #endregion
    }

    public class FeatureGraphicTool : ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction
    {
        #region IMapServerToolAction Members

        void ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction.ServerAction(
            ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs toolEventArgs)
        {
            // Get a reference to the map control by casting the event aarguments object to a Map
            ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap =
                (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolEventArgs.Control;

            try
            {
                // Get a reference to the point clicked on the map as a Web ADF point object by 
                // (1) casting the event arguments to a MapPointEventArgs object and (2) accessing
                // the MapPoint property on MapPointEventArgs
                ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs mapPointEventArgs =
                    (ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs)toolEventArgs;
                ESRI.ArcGIS.ADF.Web.Geometry.Point adfPoint = mapPointEventArgs.MapPoint;

                // Retrieve the map functionality for the graphics resource
                ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality graphicsMapFunctionality =
                    adfMap.GetFunctionality("ADFGraphicsResource") as
                    ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality;

                // Make sure the graphics resource was found
                if (graphicsMapFunctionality == null)
                {
                    // If the graphics resource was not found, use the ProcessError utility function
                    // to notify the user.  This function creates a Web ADF callback result that
                    // specifies displaying a JavaScript alert with the passed-in text.  We copy
                    // this callback result to the Map Control's callback results collection, because
                    // Web ADF Tools and Commands (and the classes that inherit from them) process
                    // callback results from the map after execution.
                    adfMap.CallbackResults.CopyFrom
                        (Utility.CreateErrorCallback("ADF graphics functionality not found"));
                    return;
                }

                // Attempt to retrieve the feature graphics layer that will hold the feature point 
                ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer featureGraphicsLayer = null;
                if (graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Feature Graphics"))
                    featureGraphicsLayer = graphicsMapFunctionality.GraphicsDataSet.Tables["Feature Graphics"]
                        as ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer;

                // Check whether the feature graphics layer was found.  If not, create it.
                if (featureGraphicsLayer == null)
                {
                    // Create a new instance of ElementGraphicsLayer and assign it to our 
                    // ElementGraphicsLayer object variable.
                    featureGraphicsLayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer();

                    // Name the layer via the inherited System.Data.DataTable.TableName property
                    featureGraphicsLayer.TableName = "Feature Graphics";

                    // Add the layer to the graphics resource's tables collection.  Note that the
                    // resource's GraphicsDataSet property inherits from System.Data.DataSet, so we
                    // add the table the same way as we would if this were a "regular" DataSet object
                    graphicsMapFunctionality.GraphicsDataSet.Tables.Add(featureGraphicsLayer);

                    // Configure and add columns to the feature graphics layer.  Since the 
                    // FeatureGraphicsLayer type inherits from System.Data.DataTable, we instantiate
                    // and initialize the columns in the same way as System.Data.DataColumns, and
                    // add them to the FeatureGraphicsLayer in the same way as we would with a
                    // DataTable.

                    // Create an X column
                    System.Data.DataColumn xDataColumn =
                        new System.Data.DataColumn("X", System.Type.GetType("System.Double"));
                    featureGraphicsLayer.Columns.Add(xDataColumn);

                    // Create a Y column
                    System.Data.DataColumn yDataColumn =
                        new System.Data.DataColumn("Y", System.Type.GetType("System.Double"));
                    featureGraphicsLayer.Columns.Add(yDataColumn);

                    // Create a "CustomDataColumn" column
                    System.Data.DataColumn customDataColumn =
                        new System.Data.DataColumn("CustomDataColumn",
                        System.Type.GetType("System.Int32"));
                    featureGraphicsLayer.Columns.Add(customDataColumn);

                    // Define the symbology for the feature graphics layer.  In this case, we
                    // demonstrate creation of unique value symbology - a different symbol for
                    // different values of a given field.  To do this, we need to not only define
                    // marker symbols (we use SimpleMarkerSymbols here), but we also need to
                    // define objects that specify which symbol to use for which values.  To
                    // associate particular symbols with particular values, we use the Web ADF 
                    // UniqueValue object.  Then to associate symbol-value pairings with a
                    // feature graphics layer, including which field to take values from for
                    // symbolization, we use a Web ADF ValueMapRenderer object.

                    // Instantiate a UniqueValue object and initialize it to be associated with
                    // an integer value of 0.  This is done by specifying int as the type in the
                    // angle brackets, and 0 as the parameter to the constructor
                    ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> zeroUniqueValue =
                        new ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>(0);

                    // Create and initialize a SimpleMarkerSymbol to specify the appearance of
                    // graphics with a value of 0
                    ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol zeroSymbol =
                        new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();
                    zeroSymbol.Color = System.Drawing.Color.Red;
                    zeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle;
                    zeroSymbol.Width = 12;

                    // Associate the SimpleMarkerSymbol initialized above with the UniqueValue object 
                    zeroUniqueValue.Symbol = zeroSymbol;

                    // The SymbolLabel will be shown in the table of contents
                    zeroUniqueValue.SymbolLabel = "0";

                    // Instantiate another UniqueValue object, this time initializing it to be
                    // associated with an integer value of 1.
                    ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> oneUniqueValue =
                        new ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>(1);

                    // Create and initialize a SimpleMarkerSymbol to specify the appearance of
                    // graphics with a value of 1
                    ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol oneSymbol =
                        new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();
                    oneSymbol.Color = System.Drawing.Color.Blue;
                    oneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle;
                    oneSymbol.Width = 12;

                    // Associate this new SimpleMarkerSymbol with the UniqueValue object associated
                    // with an integer value of 1
                    oneUniqueValue.Symbol = oneSymbol;

                    // The SymbolLabel will be shown in the table of contents
                    oneUniqueValue.SymbolLabel = "1";

                    // Create and initialize a SimpleMarkerSymbol to specify default symbology for the
                    // feature graphics layer - this will be used in the event the value being used for
                    // symbolization was not specified by a value-symbol pairing
                    ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol defaultSimpleMarkerSymbol =
                        new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();
                    defaultSimpleMarkerSymbol.Color = System.Drawing.Color.DarkGoldenrod;
                    defaultSimpleMarkerSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Cross;
                    defaultSimpleMarkerSymbol.Width = 12;

                    // Instantiate a ValueMapRenderer to use in associating the symbol-value pairings 
                    // with a feature graphics layer and specifying which column to symbolize
                    ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int> valueMapRenderer =
                        new ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int>();

                    // Specify which column to draw values from for symbolization
                    valueMapRenderer.ValueColumnName = "CustomDataColumn";

                    // Initialize the default label and symbol.  This will be used if the value
                    // being symbolized does not have an explicit symbology specification.
                    valueMapRenderer.DefaultLabel = "Default Value";
                    valueMapRenderer.DefaultSymbol = defaultSimpleMarkerSymbol;

                    // Get a reference to the collection of values with explicit symbol-value pairings
                    // in the ValueMapRenderer
                    ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection<int> valueCollection =
                        valueMapRenderer.Values;
                    // Add the symbol-value pairings specified above and encapsulated in UniqueValue
                    // objects to the ValueMapRenderer
                    valueCollection.Add(zeroUniqueValue);
                    valueCollection.Add(oneUniqueValue);

                    // Associate the default and selected symbology of the feature graphics layer
                    // with the symbol-value definitions contained in the ValueMapRenderer
                    featureGraphicsLayer.Renderer = valueMapRenderer;
                    featureGraphicsLayer.SelectedRenderer = valueMapRenderer;

                    // Get a reference to the Toc control on the same page as the map.  Note this code
                    // assumes the existence of a Toc control named "Toc1" and will throw an exception if
                    // there is no such control.
                    ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc adfToc =
                        (ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc)Utility.FindControl("Toc1", adfMap.Page);

                    // Refreshing the Toc control will add the new graphics layer to the Toc via
                    // the MapResourceManager --> Map --> Toc buddy relationship
                    adfToc.Refresh();

                    // Copy the callback results from the Toc (which has callback results because of the
                    // above call to Refresh) to the Map because Web ADF Tools and Commands only process
                    // the callback results of the Map.
                    adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults);

                    // Create a callback result containing the JavaScript needed to enable the "Enable
                    // Map Tips on Feature Points" checkbox.  The checkbox can now be enabled because
                    // the code triggered by checking the checkbox assumes the existence of the feature
                    // graphics layer that was just created.
                    //System.Web.UI.WebControls.CheckBox maptipscheckbox = adfMap.Page.FindControl("maptipsCheckBox") as System.Web.UI.WebControls.CheckBox;
                    string jsEnableCheckbox = string.Format("document.getElementById('{0}').disabled = false",
                        "maptipsCheckbox");//.ClientID);
                    ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult enableCheckboxCallbackResult =
                        ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateJavaScript(jsEnableCheckbox);

                     // Add the checkbox enabling callback result to the map so the JavaScript is executed
                    adfMap.CallbackResults.Add(enableCheckboxCallbackResult);
                }

                // Add the clicked map point to the feature graphics layer and get a reference to
                // the row created in the underlying DataTable
                System.Data.DataRow newDataRow = featureGraphicsLayer.Add(adfPoint);

                // Populate the CustomDataColumn field with a random number between 0 and 2 (inclusive).
                // We use these values to demonstrate the feature graphics layer's defined symbol-value 
                // pairings (for 0 and 1) as well as the default symbology (for 2)
                System.Random randomizer = new System.Random();
                // Note the parameters passed to Next are actually 0 and 3 because the lower bound is
                // inclusive, but the upper bound is exclusive.
                int randomValue = randomizer.Next(0, 3);
                newDataRow["CustomDataColumn"] = randomValue;

                // Populate the X and Y fields with the location of the clicked map point.  The first format
                // parameter specifies to only include two decimal places.
                newDataRow["X"] = string.Format("{0:#.##}", adfPoint.X);
                newDataRow["Y"] = string.Format("{0:#.##}", adfPoint.Y);

                // Set the new feature graphic to be selected by setting the field storing the corresponding
                // boolean to true
                System.Data.DataColumn selectedColumn = featureGraphicsLayer.IsSelectedColumn;
                newDataRow[selectedColumn] = true;

                // Refresh the graphics resource so the new feature graphic is displayed on the map
                adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name);  
                
            }
            catch (System.Exception exception)
            {
                ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult errorCallbackResult =
                    Utility.GetErrorCallback(exception);
                adfMap.CallbackResults.Add(errorCallbackResult);
            }                           
        }

        #endregion
    }

    public class FeatureDropDownColor : ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerDropDownBoxAction
    {
        #region IServerAction Members

        void ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IServerAction.ServerAction(
            ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.ToolbarItemInfo toolbarItemInfo)
        {
            // Get a reference to the Map control via the BuddyControls array of the passed-in
            // ToolbarItemInfo.  Note this code assumes the desired map is at the first index
            // of the array.
            ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap =
                (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolbarItemInfo.BuddyControls[0];

            try
            {
                // Get a reference to the color selection Web ADF drop down box
                ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox adfDropDownBox =
                    (ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox)toolbarItemInfo.Toolbar.ToolbarItems.Find(
                    toolbarItemInfo.Name);

                // Retrieve the selected color from the drop down box
                string selectedColor = adfDropDownBox.SelectedValue;

                // Retrieve the map functionality for the graphics resource
                ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality graphicsMapFunctionality =
                    adfMap.GetFunctionality("ADFGraphicsResource") as
                    ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality;

                // Make sure the graphics resource was found
                if (graphicsMapFunctionality == null)
                {
                    // If the graphics resource was not found, use the ProcessError utility function
                    // to notify the user.  This function creates a Web ADF callback result that
                    // specifies displaying a JavaScript alert with the passed-in text.  We copy
                    // this callback result to the Map Control's callback results collection, because
                    // Web ADF Tools and Commands (and the classes that inherit from them) process
                    // callback results from the map after execution.
                    adfMap.CallbackResults.CopyFrom
                        (Utility.CreateErrorCallback("ADF graphics functionality not found"));
                    return;
                }

                // Attempt to retrieve the feature graphics layer for which symbology will be modified
                ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer featureGraphicsLayer = null;
                if (graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Feature Graphics"))
                    featureGraphicsLayer = graphicsMapFunctionality.GraphicsDataSet.Tables["Feature Graphics"]
                        as ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer;


                // Make sure the feature graphics layer was found
                if (featureGraphicsLayer == null)
                {
                    // Initialize a string containing the JavaScript necessary to reset the drop down box's
                    // value to "Red_Blue"
                    string jsResetDropDownList =
                        string.Format("document.getElementById('{0}{1}{2}').value = 'Red_Blue'",
                        toolbarItemInfo.Toolbar.ClientID, adfDropDownBox.Name, adfDropDownBox.Type);

                    // Create a new ADF callback result containing the JavaScript
                    ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult resetDropDownListCallbackResult =
                        ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateJavaScript(jsResetDropDownList);

                    // Add the JavaScript callback result to the map so it is executed
                    adfMap.CallbackResults.Add(resetDropDownListCallbackResult);

                    // Use the ProcessError utility method to add a callback to the map that will inform
                    // the user of the error
                    adfMap.CallbackResults.CopyFrom
                        (Utility.CreateErrorCallback("ADF feature graphics layer not found"));
                    return;
                }

                // Get the ValueMapRenderer and ValueCollection from the feature graphics layer.  This is where
                // the symbol-value pairings are specified
                ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int> currentValueMapRenderer =
                    (ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int>)featureGraphicsLayer.Renderer;
                ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection<int> currentValueCollection =
                    currentValueMapRenderer.Values;

                // Get the symbol-value pairings for values 0 and 1 from the ValueCollection.  Each pairing
                // is encapsulated in a UniqueValue object.
                ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> currentZeroUniqueValue =
                    (ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>)currentValueCollection[0];
                ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> currentOneUniqueValue =
                    (ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>)currentValueCollection[1];

                // Get the symbol for each of the pairings
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol currentZeroSymbol =
                    (ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentZeroUniqueValue.Symbol;
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol currentOneSymbol =
                    (ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentOneUniqueValue.Symbol;

                // Check which color combination was selected from the drop down box and reassign the colors
                // on the SimpleMarkerSymbols accordingly
                switch (selectedColor)
                {
                    case "Red_Blue":
                        currentZeroSymbol.Color = System.Drawing.Color.Red;
                        currentOneSymbol.Color = System.Drawing.Color.Blue;
                        break;
                    case "Yellow_Green":
                        currentZeroSymbol.Color = System.Drawing.Color.Yellow;
                        currentOneSymbol.Color = System.Drawing.Color.Green;
                        break;
                    case "Orange_Purple":
                        currentZeroSymbol.Color = System.Drawing.Color.Orange;
                        currentOneSymbol.Color = System.Drawing.Color.Purple;
                        break;
                    default:
                        break;
                }

                // Get a reference to the Toc control on the same page as the map.  Note this code
                // assumes the existence of a Toc control named "Toc1" and will throw an exception if
                // there is no such control.
                ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc adfToc =
                    (ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc)Utility.FindControl("Toc1", adfMap.Page);

                // Refreshing the Toc control will add the new graphics layer to the Toc via
                // the MapResourceManager --> Map --> Toc buddy relationship
                adfToc.Refresh();

                // The Toc has callback results because of (a) the change in feature graphic symbology, 
                // and (b) the above call to Refresh.  To update the Toc to reflect the new symbology of
                // the feature graphics layer, we must copy these callback results to the Map because 
                // Web ADF DropDownBoxes only process the callback results of the Map.
                adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults);

                // Refresh the graphics resource so the feature graphic modifications are displayed
                adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name);
            }
            catch (System.Exception exception)
            {
                ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult errorCallbackResult =
                    Utility.GetErrorCallback(exception);
                adfMap.CallbackResults.Add(errorCallbackResult);
            }
        }

        #endregion
    }

    public class FeatureDropDownSymbol : ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerDropDownBoxAction
    {
        #region IServerAction Members

        void ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IServerAction.ServerAction(
            ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.ToolbarItemInfo toolbarItemInfo)
        {
            // Get a reference to the Map control via the BuddyControls array of the passed-in
            // ToolbarItemInfo.  Note this code assumes the desired map is at the first index
            // of the array.
            ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap =
                (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)toolbarItemInfo.BuddyControls[0];

            try
            {
                // Get a reference to the color selection Web ADF drop down box
                ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox adfDropDownBox =
                    (ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox)toolbarItemInfo.Toolbar.ToolbarItems.Find(
                    toolbarItemInfo.Name);

                // Retrieve the selected shape from the drop down box
                string selectedShape = adfDropDownBox.SelectedValue;

                // Retrieve the map functionality for the graphics resource
                ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality graphicsMapFunctionality =
                    adfMap.GetFunctionality("ADFGraphicsResource") as
                    ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality;

                // Make sure the graphics resource was found
                if (graphicsMapFunctionality == null)
                {
                    // If the graphics resource was not found, use the ProcessError utility function
                    // to notify the user.  This function creates a Web ADF callback result that
                    // specifies displaying a JavaScript alert with the passed-in text.  We copy
                    // this callback result to the Map Control's callback results collection, because
                    // Web ADF Tools and Commands (and the classes that inherit from them) process
                    // callback results from the map after execution.
                    adfMap.CallbackResults.CopyFrom
                        (Utility.CreateErrorCallback("ADF graphics functionality not found"));
                    return;
                }

                // Attempt to retrieve the feature graphics layer that will hold the feature point 
                ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer featureGraphicsLayer = null;
                if (graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Feature Graphics"))
                    featureGraphicsLayer = graphicsMapFunctionality.GraphicsDataSet.Tables["Feature Graphics"]
                        as ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer;

                // Make sure the feature graphics layer was found
                if (featureGraphicsLayer == null)
                {
                    // Initialize a string containing the JavaScript necessary to reset the drop down box's
                    // value to "Red_Blue"
                    string jsResetDropDownList =
                        string.Format("document.getElementById('{0}{1}{2}').value = 'Circle'",
                        toolbarItemInfo.Toolbar.ClientID, adfDropDownBox.Name, adfDropDownBox.Type);

                    // Create a new ADF callback result containing the JavaScript
                    ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult resetDropDownListCallbackResult =
                        ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateJavaScript(jsResetDropDownList);

                    // Add the JavaScript callback result to the map so it is executed
                    adfMap.CallbackResults.Add(resetDropDownListCallbackResult);

                    // Use the ProcessError utility method to add a callback to the map that will inform
                    // the user of the error
                    adfMap.CallbackResults.CopyFrom
                        (Utility.CreateErrorCallback("ADF feature graphics layer not found"));
                    return;
                }

                // Get the ValueMapRenderer and ValueCollection from the feature graphics layer.  This is where
                // the symbol-value pairings are specified
                ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int> currentValueMapRenderer =
                    (ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer<int>)featureGraphicsLayer.Renderer;
                ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection<int> currentValueCollection =
                    currentValueMapRenderer.Values;

                // Get the symbol-value pairings for values 0 and 1 from the ValueCollection.  Each pairing
                // is encapsulated in a UniqueValue object.
                ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> currentZeroUniqueValue =
                    (ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>)currentValueCollection[0];
                ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int> currentOneUniqueValue =
                    (ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue<int>)currentValueCollection[1];

                // Get the symbol for each of the pairings
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol currentZeroSymbol =
                    (ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentZeroUniqueValue.Symbol;
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol currentOneSymbol =
                    (ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol)currentOneUniqueValue.Symbol;

                // Check which shape was selected from the drop down box and reassign the shapes of the
                // SimpleMarkerSymbols accordingly
                switch (selectedShape)
                {
                    case "Circle":
                        currentZeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle;
                        currentOneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle;
                        break;
                    case "Star":
                        currentZeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star;
                        currentOneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star;
                        break;
                    case "Square":
                        currentZeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Square;
                        currentOneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Square;
                        break;
                    default:
                        break;
                }

                // Get a reference to the Toc control on the same page as the map.  Note this code
                // assumes the existence of a Toc control named "Toc1" and will throw an exception if
                // there is no such control.
                ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc adfToc =
                    (ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc)Utility.FindControl("Toc1", adfMap.Page);

                // Refreshing the Toc control will add the new graphics layer to the Toc via
                // the MapResourceManager --> Map --> Toc buddy relationship
                adfToc.Refresh();

                // The Toc has callback results because of (a) the change in feature graphic symbology, 
                // and (b) the above call to Refresh.  To update the Toc to reflect the new symbology of
                // the feature graphics layer, we must copy these callback results to the Map because 
                // Web ADF DropDownBoxes only process the callback results of the Map.
                adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults);

                // Refresh the graphics resource so the feature graphic modifications are displayed
                adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name); 
            }
            catch (System.Exception exception)
            {
                ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult errorCallbackResult =
                    Utility.GetErrorCallback(exception);
                adfMap.CallbackResults.Add(errorCallbackResult);
            }
        }

        #endregion
    }
        
}