﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=StaticCode
Version=7.3
@EndOfDesignText@
	
Public  Sub Process_Globals
#if B4A	
			Type  TRelativeLT(Left As Int, Top As Int)
#else if B4I
			Type  TRelativeLT(Left As Float, Top As Float)
#end if			
	
    		Public  IsInitialized    As Boolean = False
End Sub

Public  Sub Initialize
    		IsInitialized = True
End Sub

#Region GetRelativeTop / GetRelativeLeft / GetRelativeLT
'-----------------------------------------------------------------------------------------------------------------
'  If user Only wants the Top
'-----------------------------------------------------------------------------------------------------------------
#if B4A
Public  Sub Top(V As JavaObject) As Int
			Dim RelativeLT As TRelativeLT = GetRelativeLT(V)
			
			Return RelativeLT.Top
End Sub
#else if B4I
Public  Sub Top(V As View) As Float
			Dim RelativeLT As TRelativeLT = GetRelativeLT(V)
			
			Return RelativeLT.Top
End Sub
#end if

'-----------------------------------------------------------------------------------------------------------------
'  If user Only wants the Left
'-----------------------------------------------------------------------------------------------------------------
#if B4A
Public  Sub Left(V As JavaObject) As Int
			Dim RelativeLT As TRelativeLT = GetRelativeLT(V)
			
			Return RelativeLT.Left
End Sub
#else if B4I
Public  Sub Left(V As View) As Float
			Dim RelativeLT As TRelativeLT = GetRelativeLT(V)
			
			Return RelativeLT.Left
End Sub
#end if

'-----------------------------------------------------------------------------------------------------------------
'  Get this Views relative posntion on the screen
'-----------------------------------------------------------------------------------------------------------------
#if B4A
Public  Sub GetRelativeLT(V As JavaObject) As TRelativeLT
			Dim RelativeLT As TRelativeLT 
			
			RelativeLT.Initialize
			
'			Log("GetRelativeLT - Start")
			
			Return GetRelative_LT(RelativeLT, V)	
End Sub
#else if B4I
Public  Sub GetRelativeLT(V As View) As TRelativeLT
			Dim RelativeLT As TRelativeLT 
			
			RelativeLT.Initialize
			
			Return GetRelative_LT(RelativeLT, V)	
End Sub
#end if

#if B4A
Private Sub GetRelative_LT(RelativeLT As TRelativeLT, V As JavaObject) As TRelativeLT
			
			Try
				'-----------------------------------------------------------------------------------------------------------------
				'  Just in case the Passed Structure has not been Initialized 
				'-----------------------------------------------------------------------------------------------------------------
				If  RelativeLT.IsInitialized = False Then 
					RelativeLT.Initialize
				End If
				
				'-----------------------------------------------------------------------------------------------------------------
				'  Get the Parent to this View
				'-----------------------------------------------------------------------------------------------------------------
	   			Dim parent 	  As Object = V.RunMethod("getParent", Null)

				
				'-----------------------------------------------------------------------------------------------------------------
				'  If Parent is Null then Done
				'-----------------------------------------------------------------------------------------------------------------
	   			If  parent = Null 																			Then 
					Return RelativeLT
				End If

				'-----------------------------------------------------------------------------------------------------------------
				'  If Parent Type is ANY of these we are Done
				'-----------------------------------------------------------------------------------------------------------------
	   			Dim parentType As String = GetType(parent)


'				Log("parentType:" &parentType)
				
				'-----------------------------------------------------------------------------------------------------------------
				'  It turns out that if we get the Parent of the ScrollView we can work our way right down the children				
				'-----------------------------------------------------------------------------------------------------------------
				If  parentType = "anywheresoftware.b4a.objects.ScrollViewWrapper$MyScrollView"				Then 
				    V 		= parent
					parent 	= V.RunMethod("getParent", Null)
					
					If  parent = Null Then 
						Return RelativeLT
					End If
				End If

               	'-----------------------------------------------------------------------------------------------------------------
               	'  If it is a ViewPager - we just need to keep going  - SEEMS to handle TabStrip
               	'-----------------------------------------------------------------------------------------------------------------               
               	If  parentType = "androidx.viewpager.widget.ViewPager"                                      Then
                   	Return GetRelative_LT(RelativeLT, parent)               
               	End If
               				
				
                If  parentType = "android.view.ViewRoot"                                                    Then Return RelativeLT
                If  parentType = "android.view.ViewRootImpl"                                                Then Return RelativeLT
                If  parentType = "android.widget.FrameLayout"                                               Then Return RelativeLT
                If  parentType = "android.widget.FrameLayout$LayoutParams"                                  Then Return RelativeLT
                If  parentType = "anywheresoftware.b4a.BALayout$LayoutParams"                               Then Return RelativeLT
                If  parentType = "anywheresoftware.b4a.objects.HorizontalScrollViewWrapper$MyHScrollView"   Then Return RelativeLT
                If  parentType = "anywheresoftware.b4a.objects.IME$ExtendedBALayout"                        Then Return RelativeLT
                If  parentType = "flm.b4a.scrollview2d.ScrollView2DWrapper$MyScrollView"                    Then Return RelativeLT


				'-----------------------------------------------------------------------------------------------------------------
				'  OK - ADD on this Views Left and Top variables
				'-----------------------------------------------------------------------------------------------------------------
       			Dim VW As View = V

				RelativeLT.Left = RelativeLT.Left + VW.Left
				RelativeLT.Top  = RelativeLT.Top  + VW.Top
				
#if debug
				Log("RelativeLT (l/t):" &RelativeLT.Left &" / " &RelativeLT.Top &"   View (l/t):" &VW.Left &" / " &VW.Top &"  (w/h):" &VW.Width &" / " &VW.Height)								
#end If
				'-----------------------------------------------------------------------------------------------------------------
				'  Get the settings for our Parent
				'-----------------------------------------------------------------------------------------------------------------				
				Return GetRelative_LT(RelativeLT, parent)				
			Catch
				'-----------------------------------------------------------------------------------------------------------------
				'  I DO NOT like just catching errors 
				'	 But if we are here then I have missed some new type Log a then Exception msg
				'-----------------------------------------------------------------------------------------------------------------
				Log("GetRelative_LT - Error" &LastException.Message)
				
				Return RelativeLT
			End Try				
End Sub
#else if B4I
Private Sub GetRelative_LT(RelativeLT As TRelativeLT, v As View) As TRelativeLT
			'-----------------------------------------------------------------------------------------------------------------
			'  Just in case the Passed Structure has not been Initialized 
			'-----------------------------------------------------------------------------------------------------------------
			If  RelativeLT.IsInitialized = False Then 
				RelativeLT.Initialize
			End If
	
		   	Do 	While GetType(v) <> "B4IMainView"
     			Dim no As NativeObject = v
				
				RelativeLT.Left = RelativeLT.Left + v.Left
				RelativeLT.Top	= RelativeLT.Top  + v.Top
				
			    v = no.GetField("superview")
   			Loop
			
   			Return RelativeLT
End Sub
#end if


'Private Sub GetRelative(V As JavaObject, TopOrLeft As Boolean) As Int
'			Try
'	   			Dim parent 	  As Object = V.RunMethod("getParent", Null)
'
'	   			If  parent = Null 																			Then Return 0
'
'	   			Dim parentType As String = GetType(parent)
'				'Log("parentType:" &parentType)	   
'				If  parentType = "anywheresoftware.b4a.objects.ScrollViewWrapper$MyScrollView"				Then Return 0	   
'	   			If  parentType = "android.widget.FrameLayout"				 								Then Return 0
'				If  parentType = "anywheresoftware.b4a.objects.HorizontalScrollViewWrapper$MyHScrollView"	Then Return 0
'				If  parentType = "flm.b4a.scrollview2d.ScrollView2DWrapper$MyScrollView"					Then Return 0				
'	   			If  parentType = "android.widget.FrameLayout$LayoutParams"									Then Return 0				
'	   			If  parentType = "anywheresoftware.b4a.objects.IME$ExtendedBALayout"						Then Return 0
'	   			If  parentType = "anywheresoftware.b4a.BALayout$LayoutParams"								Then Return 0
'
'       			Dim VW As View = V
'
'				If  TopOrLeft Then					
'					Return VW.Top  + GetRelative(parent, TopOrLeft)
'				Else
'       				Return VW.Left + GetRelative(parent, TopOrLeft)
'				End If
'
'			Catch
'				Log(LastException.Message)
'				
''          		Msgbox(LastException.Message, "cRelativePosition(Top:" &TopOrLeft &")")				
'				
'				Return 0
'			End Try				
'End Sub
#End Region
