ThinkGeo.com    |     Documentation    |     Premium Support

Track zoom in broken?

Hi


The behaviour of track zoom in seems to have changed between 6.0.0 and the latest version I tried (6.0.174)


In v6.0 I could configure the map so that when I clicked and dragged a box allowed me to zoom. In v6.0.174 the same settings pan the map and I have to hold the shift key to zoom.


Here is the code I use to configure the map. I set MapMode to MapMode.TrackZoomIn.


 



public MapMode MapMode
{
get { return _mode; }
set
{
_mode = value;
switch (_mode)
{
case MapMode.TrackZoomIn:
{
UpdateMode(KernPanMode.Off, KernZoomMode.On, KernTrackMode.Off, KernEditMode.Off, Cursors.Cross);
break;
}
case MapMode.Pan:
{
UpdateMode(KernPanMode.On, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.SizeAll);
break;
}
case MapMode.SelectJob:
case MapMode.SelectAsset:
{
UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.Hand);
break;
}
case MapMode.AddAsset:
{
UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.On, KernEditMode.Off, Cursors.Pen);
break;
}
case MapMode.EditAsset:
{
UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.On, Cursors.Pen);
break;
}
   }
}
}


private void UpdateMode(KernPanMode panMode, KernZoomMode zoomMode, KernTrackMode trackMode, KernEditMode editMode,
System.Windows.Input.Cursor cursor)
{

PanMode = panMode == KernPanMode.On ? MapPanMode.StandardPanning : MapPanMode.Disabled;

LeftClickDragKey = zoomMode == KernZoomMode.On ? Keys.None : Keys.Shift;

LeftClickDragMode = zoomMode == KernZoomMode.On ? MapLeftClickDragMode.Default : MapLeftClickDragMode.Disabled;
DoubleLeftClickMode = zoomMode == KernZoomMode.On ? MapDoubleLeftClickMode.Default : MapDoubleLeftClickMode.Disabled;

if (trackMode == KernTrackMode.Off)
{
_gisMap.TrackOverlay.TrackMode = TrackMode.None;
}

if (editMode == KernEditMode.Off)
{
EndEdit();
}

_gisMap.Cursor = cursor;
}



Hi Steve, 
  
 I remember that I’ve worked on this before, at that time, you created a class which inherit the InteractiveOverlay right? Could you please provide your sample to us to have a test? 
  
 Thanks, 
 Edgar

Hi Edgar


Here is my class that inherits from ExtentInteractiveOverlay. When I first show my map I set the mode to TrackZoomIn. This sets PanMode to Disabled. In v6.0 all works as expected. In v6.0.157 pan mode is not disabled.


 



using System.Windows.Forms;
using Kern.Client.Windows.Data;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WpfDesktopEdition;
using Cursors = System.Windows.Input.Cursors;

namespace Kern.Client.Windows.Controls.MapOverlays
{
    public class ModeInteractiveOverlay : ExtentInteractiveOverlay
    {
        private MapMode _mode;
        private readonly WpfMap _gisMap;

        public ModeInteractiveOverlay(WpfMap gisMap)
        {
            _gisMap = gisMap;

            LeftClickDragMode = MapLeftClickDragMode.Default;
            DoubleLeftClickMode = MapDoubleLeftClickMode.Default;
        }

        public MapMode MapMode
        {
            get { return _mode; }
            set
            {
                _mode = value;
                switch (_mode)
                {
                    case MapMode.TrackZoomIn:
                        {
                            UpdateMode(KernPanMode.Off, KernZoomMode.On, KernTrackMode.Off, KernEditMode.Off, Cursors.Cross);
                            break;
                        }
                    case MapMode.Pan:
                        {
                            UpdateMode(KernPanMode.On, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.SizeAll);
                            break;
                        }
                    case MapMode.SelectJob:
                    case MapMode.SelectAsset:
                        {
                            UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.Hand);
                            break;
                        }
                    case MapMode.AddAsset:
                        {
                            UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.On, KernEditMode.Off, Cursors.Pen);
                            break;
                        }
                    case MapMode.EditAsset:
                        {
                            UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.On, Cursors.Pen);
                            break;
                        }

                }
            }
        }

        private void UpdateMode(KernPanMode panMode, KernZoomMode zoomMode, KernTrackMode trackMode, KernEditMode editMode,
            System.Windows.Input.Cursor cursor)
        {

            PanMode = panMode == KernPanMode.On ? MapPanMode.StandardPanning : MapPanMode.Disabled;

            LeftClickDragKey = zoomMode == KernZoomMode.On ? Keys.None : Keys.Shift;

            LeftClickDragMode = zoomMode == KernZoomMode.On ? MapLeftClickDragMode.Default : MapLeftClickDragMode.Disabled;
            DoubleLeftClickMode = zoomMode == KernZoomMode.On ? MapDoubleLeftClickMode.Default : MapDoubleLeftClickMode.Disabled;
            
            if (trackMode == KernTrackMode.Off)
            {
                _gisMap.TrackOverlay.TrackMode = TrackMode.None;
            }

            if (editMode == KernEditMode.Off)
            {
                EndEdit();
            }

            _gisMap.Cursor = cursor;
        }

        private void EndEdit()
        {
            if (_gisMap.EditOverlay.EditShapesLayer.InternalFeatures.Count > 0)
            {
                Feature feature = _gisMap.EditOverlay.EditShapesLayer.InternalFeatures[0];
                _gisMap.EditOverlay.EditShapesLayer.InternalFeatures.Clear();
                _gisMap.EditOverlay.CalculateAllControlPoints();
                _gisMap.EditOverlay.EditShapesLayer.InternalFeatures.Add(feature);
                _gisMap.Refresh(new Overlay[] { _gisMap.EditOverlay });
            }
        }

    }

    enum KernPanMode
    {
        Off,
        On
    }

    enum KernZoomMode
    {
        Off,
        On
    }

    enum KernTrackMode
    {
        Off,
        On
    }

    enum KernEditMode
    {
        Off,
        On
    }
}


Steve,


I test your code with 6.0.157.0 without pressing the shift key, it works as expected, here is the screencast screencast.com/t/57HZYUJEln , is there any difference between your code and mine?


Regards,


Edgar



Thanks Edgar 
  
 Your code showed me that I had configured ModeInteractiveOverlay incorrectly. 
  
 I did this: 
  
   gisMap.InteractiveOverlays.Add(modeInteractiveOverlay); 
  
  
 Rather than this: 
  
   gisMap.ExtentOverlay = modeInteractiveOverlay; 
  
 I’m surprised it ever worked! 
  
 Cheers 
  
 Steve

You’re welcome Steve, it the old way I think it’s a bug to make more than one extentOverlay to work. Glad to hear that your problem has been solved. 
  
 Regards, 
 Edgar

 Thanks guys, this was very helpful!


 
For us poor VB programmers out there, here is the code that I used to get this working, following what is above, and also in the Track Zoom In Without Shift example:
 
First, I created the following class
 
[code] #Region " Map Pan Mode Code "
 
Public Enum MapMoveMode
    TrackZoomIn
    Pan
    'SelectJob
    'SelectAsset
    'AddAsset
    'EditAsset
End Enum
 
Namespace TrackZoomInWithoutShiftKey
 
    Class ModeInteractiveOverlay
        Inherits ExtentInteractiveOverlay
 
        Private _mode As MapMoveMode
 
        Public Sub New()
            'Sets default mode to TrackZoomIn.
            MyBase.PanMode = MapPanMode.Disabled
            MyBase.LeftClickDragMode = MapLeftClickDragMode.ZoomInWithKey
            MyBase.LeftClickDragKey = Keys.None
            _mode = MapMoveMode.TrackZoomIn
        End Sub
 
        Public Property MapMode() As MapMoveMode
            Get
                Return _mode
            End Get
            Set(value As MapMoveMode)
                _mode = value
                Select Case _mode
                    Case MapMoveMode.TrackZoomIn
                        If True Then
                            UpdateMode(KernPanMode.Off, KernZoomMode.[On], KernTrackMode.Off, KernEditMode.Off, Cursors.Cross)
                            Exit Select
                        End If
                    Case MapMoveMode.Pan
                        If True Then
                            UpdateMode(KernPanMode.[On], KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.SizeAll)
                            Exit Select
                        End If
                        'Case MapMoveMode.SelectJob, MapMoveMode.SelectAsset
                        '    If True Then
                        '        UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.Hand)
                        '        Exit Select
                        '    End If
                        'Case MapMoveMode.AddAsset
                        '    If True Then
                        '        UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.[On], KernEditMode.Off, Cursors.Arrow)
                        '        Exit Select
                        '    End If
                        'Case MapMoveMode.EditAsset
                        '    If True Then
                        '        UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.[On], Cursors.Arrow)
                        '        Exit Select
                        '    End If
                End Select
            End Set
        End Property
 
        Private Sub UpdateMode(panMode__1 As KernPanMode, zoomMode As KernZoomMode, trackMode__2 As KernTrackMode, editMode As KernEditMode, cursor As Windows.Forms.Cursor)
 
            PanMode = If(panMode__1 = KernPanMode.[On], MapPanMode.StandardPanning, MapPanMode.Disabled)
 
            LeftClickDragKey = If(zoomMode = KernZoomMode.[On], Keys.None, Keys.Shift)
 
            LeftClickDragMode = If(zoomMode = KernZoomMode.[On], MapLeftClickDragMode.[Default], MapLeftClickDragMode.Disabled)
            DoubleLeftClickMode = If(zoomMode = KernZoomMode.[On], MapDoubleLeftClickMode.[Default], MapDoubleLeftClickMode.Disabled)
 
            'If trackMode__2 = KernTrackMode.Off Then
            '    _gisMap.TrackOverlay.TrackMode = TrackMode.None
            'End If
 
            'If editMode = KernEditMode.Off Then
            '    EndEdit()
            'End If
 
            '_gisMap.Cursor = cursor
 
        End Sub
 
        Protected Overrides Function MouseDownCore(interactionArguments As InteractionArguments) As InteractiveResult
            Dim result As InteractiveResult = Nothing
            result = MyBase.MouseDownCore(interactionArguments)
            MyBase.PanAndTrackZoomState.IsLeftClickDragKeyPressed = True
            Return result
        End Function
    End Class
 
End Namespace
 
Namespace Kern.Client.Windows.Controls.MapOverlays
 
    Public Class ModeInteractiveOverlay
        Inherits ExtentInteractiveOverlay
        Private _mode As MapPanMode
        Private ReadOnly _gisMap As DesktopEdition.WinformsMap
 
        Public Sub New(gisMap As WinformsMap)
            _gisMap = gisMap
 
            LeftClickDragMode = MapLeftClickDragMode.[Default]
            DoubleLeftClickMode = MapDoubleLeftClickMode.[Default]
        End Sub
 
        Public Property MapMode() As MapMoveMode
            Get
                Return _mode
            End Get
            Set(value As MapMoveMode)
                _mode = value
                Select Case _mode
                    Case MapMoveMode.TrackZoomIn
                        If True Then
                            UpdateMode(KernPanMode.Off, KernZoomMode.[On], KernTrackMode.Off, KernEditMode.Off, Cursors.Cross)
                            Exit Select
                        End If
                    Case MapMoveMode.Pan
                        If True Then
                            UpdateMode(KernPanMode.[On], KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.SizeAll)
                            Exit Select
                        End If
                        'Case MapMoveMode.SelectJob, MapMoveMode.SelectAsset
                        '    If True Then
                        '        UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.Off, Cursors.Hand)
                        '        Exit Select
                        '    End If
                        'Case MapMoveMode.AddAsset
                        '    If True Then
                        '        UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.[On], KernEditMode.Off, Cursors.Default)
                        '        Exit Select
                        '    End If
                        'Case MapMoveMode.EditAsset
                        '    If True Then
                        '        UpdateMode(KernPanMode.Off, KernZoomMode.Off, KernTrackMode.Off, KernEditMode.[On], Cursors.Default)
                        '        Exit Select
                        '    End If
 
                End Select
            End Set
        End Property
 
        Private Sub UpdateMode(panMode__1 As KernPanMode, zoomMode As KernZoomMode, trackMode__2 As KernTrackMode, editMode As KernEditMode, cursor As System.Windows.Forms.Cursor)
 
            PanMode = If(panMode__1 = KernPanMode.[On], MapPanMode.StandardPanning, MapPanMode.Disabled)
 
            LeftClickDragKey = If(zoomMode = KernZoomMode.[On], Keys.None, Keys.Shift)
 
            LeftClickDragMode = If(zoomMode = KernZoomMode.[On], MapLeftClickDragMode.[Default], MapLeftClickDragMode.Disabled)
            DoubleLeftClickMode = If(zoomMode = KernZoomMode.[On], MapDoubleLeftClickMode.[Default], MapDoubleLeftClickMode.Disabled)
 
            If trackMode__2 = KernTrackMode.Off Then
                _gisMap.TrackOverlay.TrackMode = TrackMode.None
            End If
 
            If editMode = KernEditMode.Off Then
                EndEdit()
            End If
 
            _gisMap.Cursor = cursor
        End Sub
 
        Private Sub EndEdit()
            If _gisMap.EditOverlay.EditShapesLayer.InternalFeatures.Count > 0 Then
                Dim feature As Feature = _gisMap.EditOverlay.EditShapesLayer.InternalFeatures(0)
                _gisMap.EditOverlay.EditShapesLayer.InternalFeatures.Clear()
                _gisMap.EditOverlay.CalculateAllControlPoints()
                _gisMap.EditOverlay.EditShapesLayer.InternalFeatures.Add(feature)
                _gisMap.Refresh(New Overlay() {_gisMap.EditOverlay})
            End If
        End Sub
 
    End Class
 
    Enum KernPanMode
        Off
        [On]
    End Enum
 
    Enum KernZoomMode
        Off
        [On]
    End Enum
 
    Enum KernTrackMode
        Off
        [On]
    End Enum
 
    Enum KernEditMode
        Off
        [On]
    End Enum
 
End Namespace
 
#End Region
 
 
Then, in the form with the map, a private instance of it
 
[code]
Private _modeInterOver As TrackZoomInWithoutShiftKey.ModeInteractiveOverlay
 
 
 Linking the object to the map instance:
 
[code]
Me._modeInterOver = New TrackZoomInWithoutShiftKey.ModeInteractiveOverlay
Me._modeInterOver.MapMode = MapMoveMode.Pan
Me.StormMap.ExtentOverlay = Me._modeInterOver
 
 
Finally, changing the modes based on what the user wants:
 
[code]
Me._modeInterOver.MapMode = MapMoveMode.Pan
Me._modeInterOver.MapMode = MapMoveMode.TrackZoomIn
 
 
Hope this helps

Well that didn’t end up looking like I thought it would…

Hi Dib, 
  
 Thanks for sharing this! 
  
 Regards, 
 Edgar