ThinkGeo.com    |     Documentation    |     Premium Support

Add Tag property to InteractiveResult-Class

Hello ThinkGeo-Team,


I am using your Interactive-Overlay (Track, Edit, Extent) concept as overwriting the needed Core functions to implement my own logic to handle mouse events.


It would be very helpfull if you could implement a Tag property (Type object)  to your InteractiveResult-Class to share my own information between the Interactive-Overlays.


Thanks Thomas


 



 Thomas,


 
  Microsoft frowns on the use of the Tag property these days.  I'm not saying we will not add it but I have an alternative for you.  If you need to pass data between the overload and the rest of the world then I suggest you inherit from InteractiveResult and add the properties you need.  When you get the object on the other side you check to see if it is your new class and then use the properties.
 

    public class CustomInteractiveResult : InteractiveResult
    {
        object tag;

        public CustomInteractiveResult()
            : base()
        { }

        public object Tag
        {
            get
            {
                return tag;
            }
            set
            {
                tag = value;
            }
        }
    }

    public class CustomInteractiveOverlay : InteractiveOverlay
    {

        public CustomInteractiveOverlay()
            : base()
        { }

        protected override InteractiveResult MouseClickCore(InteractionArguments interactionArguments)
        {
            CustomInteractiveResult customInteractiveResult = new CustomInteractiveResult();

            // You may need to copy the properties from the base's InteractiveResult into 
            // the new one.  I am not sure about your case.
            customInteractiveResult.Tag = "Some important message...";

            return customInteractiveResult;
        }

    }


David,


thanks for reply. I had implemented your suggested solution before I posted my question to ThinkGeo-Forum. But it did not work.

I thought if I return my customInteractiveResult in  MouseMoveCore() of CustomInteractiveOverlayA, I can get my customInteractiveResult by calling the base method in MouseMoveCore() of CustomInteractiveOverlayB.


e.g.  



  Protected Overrides Function MouseMoveCore(ByVal interactionArguments As ThinkGeo.MapSuite.DesktopEdition.InteractionArguments) As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult

    Dim oInteractiveResult As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult

    oInteractiveResult = MyBase.MouseMoveCore(interactionArguments)

    If TypeOf oInteractiveResult Is myInteractiveResult Then
      'Check myInteractiveResult parameters and do something........
    End If

    Return oInteractiveResult

  End Function
It seems calling MyBase.MouseMoveCore() creates a new object.


 Any idea?


Thomas



Thomas, 
  
   I am a bit confused over what CustomInteractiveOverlayA and B are.  Are these two seperate InteractiveOverlays?  What did they inherit from?  Where did you override the base method to return your new InteractiveResult?  Can you send me a more complete sample?  Maybe just the InteractiveOverlay classes you are creating? 
  
 David

Hello David,


I will try to give you more information.


What I want to do is to transport my own information between the Overlays in the InteractiveOverlay-Collection using your concept with you transport InteractiveResult or InteractionArgument Objects.


As I understand your concept it is working the following way -> if MapControl raise an event e.g. MouseMove-Event you forward this information to the first overlay in InteractiveOverlay collection where its MapMouseEvents is raised. Afterward you forward this to the next overlay in collection and so on. All those overlays get the same InteractiveResult or InteractionArgument parameters if it is not modified in one of the overlays. So you transport information between the overlays.


In my application I have replaced Track-/-Edit and Extent-Overlay with my own Classes inherited from the according base classes. By overwriting the MouseMoveCore in Edit-Overlay I add my own interactiveResult object.


Protected Overrides Function MouseMoveCore(ByVal interactionArguments As ThinkGeo.MapSuite.DesktopEdition.InteractionArguments) As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult

    Dim oMyInteractiveResult As myInteractiveResult
    Dim oInteractiveResult As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult

    oInteractiveResult = MyBase.MouseMoveCore(interactionArguments)

    oMyInteractiveResult = New myInteractiveResult
    oMyInteractiveResult.tag = "Dies ist ein Test"
    oMyInteractiveResult.DrawThisOverlay = oInteractiveResult.DrawThisOverlay
    oMyInteractiveResult.NewCurrentExtent = oInteractiveResult.NewCurrentExtent
    oMyInteractiveResult.ProcessOtherOverlaysMode = oInteractiveResult.ProcessOtherOverlaysMode

    Return oMyInteractiveResult

  End Function

By overwriting the MouseMoveCore in Extent-Overlay I want to get my own interactiveResult object and work with my additional information.



 Protected Overrides Function MouseMoveCore(ByVal interactionArguments As ThinkGeo.MapSuite.DesktopEdition.InteractionArguments) As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult

    Dim oInteractiveResult As ThinkGeo.MapSuite.DesktopEdition.InteractiveResult

    oInteractiveResult = MyBase.MouseMoveCore(interactionArguments)

    If TypeOf oInteractiveResult Is myInteractiveResult Then
      'Check myInteractiveResult parameters and do something........
    End If

    Return oInteractiveResult

  End Function

But the interactiveResult-Object type I get in Extent-Overlay is not my custom one so this did not work! 



Thomas, 
  
   i understand now what you are trying to do.  I think I have a way to do it but I need to test it.  I can’t get to this for about a day but i can tell you what I am going to try.  First I would try to override the InteractiveArguments and add the tag.  Then in the first overlay copy the one passed in to your new one and then set the parameter to your new class.  I am not sure if this will work but it might.  Second you can add an extender method to the InteractiveOverlay.  The extender methods are static so it will keep its value between all of the overlays.  If you get a chance to try them out before I do let me know the results. 
  
 David

Hello David, 
  
 I have allready tried passing my information by implementing my own InteractiveArguments-Class but it did not work. In my second overlay I don’t get my custom one. Also I can’t use extension methods because our application is working with .NET Framework 2.0. 
  
 Thomas

Thomas,


Sorry for my jumping into this.


I think when you call the MyBase.MouseMoveCore, it will not return the customized InterativeResult, you probably need to try call the Me.MouseMoveCore. I tried the following code, it works fine:



winformsMap1.ExtentOverlay = new CustomExtententInterativeOverlay();

public class CustomExtententInterativeOverlay : ExtentInteractiveOverlay
    {
        protected override InteractiveResult MouseMoveCore(InteractionArguments interactionArguments)
        {
            InteractiveResult result = base.MouseMoveCore(interactionArguments);

            MyInterativeResult myResult = new MyInterativeResult(result);
            myResult.Tag = "Change Tag here";

            return myResult;
        }
    }

    public class MyInterativeResult : InteractiveResult
    {
        private object tag;

        public MyInterativeResult()
            : this(new InteractiveResult())
        { }


        public MyInterativeResult(InteractiveResult result)
            :base(result.DrawThisOverlay,result.ProcessOtherOverlaysMode)
        {
            tag = "Yang";
        }

        public object Tag
        {
            get
            {
                return tag;
            }
            set
            {
                tag = value;
            }
        }
    }

Sorry if I am misuderstanding anything.


Thanks.


Yale

 



Sorry Yale, 
  
 but I did not understand what you mean. If I call Me.MouseMoveCore in MouseMoveCore I will get an endless loop. 
  
 Thomas

Thomas,


After more discussion with David, we decided to add a property in the InteractionArguments class to solve this problem. In next package, we may add information like this to share among InterativeOverlays. Hope it can fix our problem very easily.
 

interactionArguments.ExtendedProperties.Add("Yale", "HelloTest");

 
Any more questions just feel free to let me know.
 
Thanks.
 
Yale

Thanks Yale and David, 
  
 this will fix my problem. 
  
 Good job 
 Thomas

Thomas, 
  
   One thing to note is that the daily builds , may not be functioning properly since the refresh release a few days ago.  I expect them to be back running soon so watch for the updates.  I will also arrange with Yale to notify you when they are ready. 
  
 David