ThinkGeo.com    |     Documentation    |     Premium Support

Adding Custom Controls

Hello.


I'm having a bad time adding OpenLayers Controls to the API. Whitch is the rigth way to do it?


 


My first try was to Inherits ThinkGeo.MapSuite.WebEdition.Map and MapTools.



  <  Browsable(False), JsonMember(MemberName:="controls")  > _
    Public Overloads ReadOnly Property MapTools() As MapTools
        Get
            If Me.ViewState("MapTools") Is Nothing Then
                Me.ViewState("MapTools") = New MapTools()
            End If
            Return DirectCast(Me.ViewState("MapTools"), MapTools)
        End Get
    End Property 

It didn't work very well, 'cause raises an exception at :    Return DirectCast(Me.ViewState("MapTools"), MapTools)


 


Now i'm trying another approach.


   < Thinkgeo:Map  ID="Map1" runat="server" Height="100%" Width="100%" MapUnit="Meter" IsDefaultJavascriptLibraryDisabled="true"  >< /Thinkgeo:Map >


But then how can i override the


var jsonMap1={"zoom":0, .....

var parserMap1=new mapParser(jsonMap1);

Sys.Application.add_load(keepsession);

Sys.Application.add_load(CreateAllMaps);

var Map1 = new ThinkGeo('Map1');


Since it's on the parser that you guys create the OpenLayers Controls.


 


Are there any extension points in the client-API?


How it's the easiest and right way to do this?



Rui,



Yes, we parse all json data related with map in the mapParser class; we integrated it into our WebEdtion. We create the OpenLayers controls,  layers or other something in that class. Also users could inherit ThinkGeo.MapSuite.WebEdition.Map or what they want, but they should implement client api to parse the property or something else they have defined. For example, the code likes below:


      public class Map1 : Map {
        public Map1()
            : base() { }
        [JsonMember(MemberName = "StringExample")]
        public string StringExample {
            get;
            set;
        }
    }


and on the client, you could get the json data through the code below:




 var OnMapCreated = function(map) {
            var parser = Map1.GetMapParser();
            var json = parser.json;
        }


Or you could add OpenLayers Control on the client api directly, the code likes below:



 var OnMapCreated = function(map) {
 //map is just the instances of OpenLayers.Map, you could add controls or other things on map object
        }




Any more question, please let me know.


Thanks,


Johnny



I’m just trying to put a button to activate the zoom by rectangle, without the need to use the shift key. 
 The users don’t know about shift key. 
  
 I can’t figure out the best way to do this :(

Rui,


Sorry that we misunderstood your meanings yesterday, and you can define the custom behavior for TrackZoom using the javascript as following in the page:



var OnMapCreated = function(map) {
            var control = map.getControlsByClass("OpenLayers.Control.Navigation")[0];
            // Below line is for defining the key code, which has to be pressed when track zoom in on the screen.
            // There are four values that can be set: 
            // OpenLayers.Handler.MOD_NONE       If set as the keyMask, use any key is down. 
            // OpenLayers.Handler.MOD_SHIFT      If set as the keyMask, use Shift is down. 
            // OpenLayers.Handler.MOD_CTRL       If set as the keyMask, use Ctrl is down. 
            // OpenLayers.Handler.MOD_ALT        If set as the keyMask, use Alt is down. 
            control.zoomBoxKeyMask = OpenLayers.Handler.NONE;
            control.handleRightClicks = false;
            control.draw();
        }


Please refer the comments for details, and one thing should be noted is that you should set the handleRightClicks to true if you use “MOD_CTRL”


Thanks,


Johnny,