﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=8.5
@EndOfDesignText@
' Update 1.0.3 (10/03/2020) update by : mahdi Atashjam
#Event: ItemClick (Position As Int, Value as String)
#DesignerProperty: Key: TextColor, DisplayName: TextColor, FieldType: Color, DefaultValue: 0xFF000000,Description: Text color
#DesignerProperty: Key: TextSize, DisplayName: TextSize, FieldType: int, DefaultValue: 14,Description: Label Text Size 
#DesignerProperty: Key: HintColor, DisplayName: HintColor, FieldType: Color, DefaultValue: 0xFF888888,Description: Hint color, noselected opstion
#DesignerProperty: Key: HintText, DisplayName: HintText, FieldType: String, DefaultValue: <none> ,Description: Hint Text, noselected opstion
#DesignerProperty: Key: BackgroundColor, DisplayName: Color background, FieldType: Color, DefaultValue: 0xFFFFFFFF, Description: You can use the built-in color picker to find the color values.
#DesignerProperty: Key: BackgroundColorList, DisplayName: ListColor background, FieldType: Color, DefaultValue: 0xFF000000, Description: You can use the built-in color picker to find the color values.
#DesignerProperty: Key: GrayDisplay, DisplayName: Gray Display, FieldType: boolean, DefaultValue: False, Description: Gray Display.
#DesignerProperty: Key: RoundCorner, DisplayName:RoundCorner, FieldType: boolean, DefaultValue: False, Description: RoundCorner.

Sub Class_Globals
	Public SelectedItem As String
	Public SelectedID As String
	Public SelectedIndex As Int
	Public GrayDisplay As Boolean
	Public BColor, TColor,HintColor, BColorList As Int
	Public HintText As String
	Public RoundCorner As Boolean
	Public ScrollViewParent As ScrollView = Null
	
	Private EventName As String 'ignore
	Private CallBack As Object 'ignore
	Private mBase As Panel
	Public MyAct As Panel
	Private Lab As Label
	Private AppPanel As Panel
	Public Top,Left,baseTop As Int
	Private ListPanel As ScrollView
	
	Private ListItem As List
	Private TextSize As Int
	Type Item (Text As String,TextHelp As String,ID As String, BackgroundColor As Int, TextColor As Int, Image As Bitmap, G As Int)
End Sub

Public Sub Initialize (vCallback As Object, vEventName As String)
	EventName = vEventName
	CallBack = vCallback
	ListItem.Initialize
	Lab.Initialize("Lab")
	SelectedItem=""
	SelectedID=""
	SelectedIndex=-1
	
	AppPanel.Initialize("AppPanel")
	ListPanel.Initialize(1000dip)
End Sub

Public Sub Invalidate
	mBase.Invalidate
End Sub

Public Sub DesignerCreateView (Base As Panel, Lbl As Label, Props As Map)
	mBase = Base
	mBase.Tag=Me
	
	Left=0
	Top=0
	Try
		Dim Obj As View = mBase
'		Log(GetType(Obj))
		Do While Not(GetType(Obj) = "android.widget.FrameLayout")
			Left=Left+Obj.Left
			Top=Top+Obj.Top
			Obj=Obj.Parent
		Loop
		MyAct=Obj
	Catch
		Dim r As Reflector
		r.Target = r.GetActivityBA
		MyAct=r.GetField("vg")
	End Try
	
	If Props.ContainsKey("BackgroundColor") Then BColor=Props.Get("BackgroundColor")
	If Props.ContainsKey("BackgroundColorList") Then BColorList=Props.Get("BackgroundColorList")
	If Props.ContainsKey("TextColor") Then TColor=Props.Get("TextColor")
	If Props.ContainsKey("TextSize") Then TextSize=Props.Get("TextSize")
	If Props.ContainsKey("HintColor") Then HintColor=Props.Get("HintColor")
	If Props.ContainsKey("HintText") Then HintText=Props.Get("HintText")
	If Props.ContainsKey("GrayDisplay") Then GrayDisplay=Props.Get("GrayDisplay")
	If Props.ContainsKey("RoundCorner") Then RoundCorner=Props.Get("RoundCorner")
	
	
	Lab.TextColor=TColor
	Lab.Color=BColor
	Lab.Gravity=Gravity.CENTER
	Lab.TextSize=TextSize
	Lab.BringToFront
	SetIndex(SelectedIndex)
	mBase.AddView(Lab,0,0,mBase.Width,mBase.Height)
	
	Dim Ima As Panel
	Ima.Initialize("")
	LoadDrawableByName(Ima,"dropdown_ic_arrow_normal_holo_light")
	mBase.AddView(Ima,mBase.Width-40dip,(mBase.Height/2)-20dip,40dip,40dip)

	If RoundCorner Then 
		Dim cd As ColorDrawable
		cd.Initialize(BColor,1000)
		mBase.Background=cd
		Lab.Background=cd
	End If
End Sub

Private Sub LoadDrawableByName(Control As View, ImageName As String) As Boolean
	Dim R As Reflector
	Try
		R.Target = R.GetContext
		R.Target = R.RunMethod("getResources")
		R.Target = R.RunMethod("getSystem")
		Dim ID_Drawable As Int
		ID_Drawable = R.RunMethod4("getIdentifier", Array As Object(ImageName, "drawable", "android"), _
		                                            Array As String("java.lang.String", "java.lang.String", "java.lang.String"))
		R.Target = R.GetContext
		R.Target = R.RunMethod("getResources")
		Control.Background = R.RunMethod2("getDrawable", ID_Drawable, "java.lang.int")
		Return True
		
	Catch
		LogColor("ERROR.LoadDrawableByName:" & LastException.Message, Colors.Red)
		Return False
		
	End Try
End Sub

Public Sub GetBase As Panel
	Return mBase
End Sub

#Region Private 

private Sub Lab_Click
	Dim I As IME
	I.Initialize("")
	I.HideKeyboard
	
	DesignerList
End Sub

Private Sub AppPanel_Touch (Action As Int, X As Float, Y As Float)
	'AppPanel.Visible=False
	AppPanel.RemoveView
End Sub

Sub Corner(Colore As Int) As ColorDrawable
	Dim cdb As ColorDrawable
	cdb.Initialize(Colore, 20dip)
	Return cdb
End Sub

Sub RoundBorders(B0 As Bitmap, radius As Int) As Bitmap

	Dim B1,B2 As Bitmap
	Dim cv As Canvas
	Dim Rect1 As Rect
    
	B2.InitializeMutable(40dip,40dip)
	cv.Initialize2(B2)
	Dim Drawable1 As ColorDrawable
	Drawable1.Initialize(Colors.White,radius)
	Rect1.Initialize(0,0,B2.Width-1,B2.Height-1)
	cv.DrawDrawable(Drawable1,Rect1)

	B1.InitializeMutable(40dip,40dip)
	cv.Initialize2(B1)
	cv.DrawBitmap(B0,Null,Rect1)
	
      
	For r=0 To B2.Height-1
		For c=0 To B2.Width-1
			If B2.GetPixel(c,r)=0 Then
				cv.DrawPoint(c,r,0)
			End If
		Next
	Next
	cv.DrawCircle(20dip,20dip,20dip,Colors.Black,False,1dip)
	'P.SetBackgroundImage(B1)
	Return B1
End Sub

private Sub DesignerList
	Dim HeightListView As Int = 0
	Dim Space As Int
	
	If ListItem.size>0 Then
		If AppPanel.IsInitialized Then AppPanel.RemoveView
		MyAct.addview(AppPanel,0,0,100%x,100%Y)
				
		If RoundCorner Then	ListPanel.Color=Colors.Transparent Else ListPanel.Color=BColorList
		ListPanel.RemoveView
		ListPanel.Panel.RemoveAllViews
		ListPanel.Panel.Height=0

		For i=0 To ListItem.Size-1
			Dim Item As Item
			Item.Initialize
			
			Item = ListItem.Get(i)
			Dim P As Panel
			P.Initialize("PanelClick")
			If RoundCorner Then P.Background=Corner(Item.BackgroundColor) Else P.Color=Item.BackgroundColor
			
			P.Tag=I
			Try
				Space=40dip
				Dim Ima As ImageView
				Ima.Initialize("")
				Ima.Gravity=Gravity.FILL
				If RoundCorner Then
					Ima.SetBackgroundImage(RoundBorders(Item.Image,20dip))
				Else
					Ima.SetBackgroundImage(Item.Image)
				End If
				
				P.AddView(Ima,0dip,5dip,40dip,40dip)
			Catch
				Space=0dip
			End Try
			
			Dim La As Label
			La.Initialize("")
			La.Text=Item.text
			La.TextSize=15
			La.Color=Colors.Transparent
			La.TextColor=Item.TextColor
			La.Typeface=Typeface.DEFAULT_BOLD
			La.Gravity=Item.G
			
			P.AddView(La,Space,0dip,mBase.Width-Space,30dip)
			If Item.texthelp.Trim<>"" Then
				Dim La As Label
				La.Initialize("")
				La.Text=Item.TextHelp
				La.TextSize=12
				La.Color=Colors.Transparent
				La.TextColor=Item.TextColor
				La.Gravity=Item.G
				P.AddView(La,Space,25dip,mBase.Width-Space,30dip)
			Else
				La.Height=50dip
			End If
			ListPanel.Panel.AddView(P,-mBase.Width,HeightListView,mBase.Width-2DIP,49dip)
			P.SetLayoutAnimated(10+(HeightListView/3),1dip,HeightListView,mBase.Width-2DIP,49dip)
			HeightListView=HeightListView+50dip
		Next
		ListPanel.Panel.Height=HeightListView
		
		Dim LeftSpinner,TopSpinner,HeightSpinner,Yafter As Int
		
		If GrayDisplay Then AppPanel.Color=Colors.aRGB(200,0,0,0) Else AppPanel.Color=Colors.Transparent
		If ScrollViewParent.IsInitialized Then
			If Left+mBase.Width+ScrollViewParent.Left>100%x Then LeftSpinner=100%x-mBase.Width Else LeftSpinner=Left
		Else
			If Left+mBase.Width>100%x Then LeftSpinner=100%x-mBase.Width Else LeftSpinner=Left
		End If
		
		Yafter=100%y-Top-mBase.Height
		If ScrollViewParent.IsInitialized Then
			baseTop=Top
			Yafter=Yafter+ScrollViewParent.ScrollPosition
			Top=Top-ScrollViewParent.ScrollPosition
		End If
		If (HeightListView>Top)And (HeightListView>Yafter) Then
			' Non va bene dappertutto
			If (Top>100%y-Top-mBase.Height) Then
				'sopra é più grande
				TopSpinner=0dip
				HeightSpinner=Top
			Else
				'sotto è più grande
				TopSpinner=Top+mBase.Height
				HeightSpinner=100%y-Top-mBase.Height
			End If
		Else if (HeightListView>Top) And (HeightListView<=Yafter) Then
			' Va bene di sotto
			TopSpinner=Top+mBase.Height
			HeightSpinner=HeightListView
		Else If (HeightListView<=Top)And (HeightListView>Yafter) Then
			' Va bene di sopra
			TopSpinner=Top+mBase.Height-HeightListView
			HeightSpinner=HeightListView
		Else
			' Haqspazio sopra e sotto
			TopSpinner=Top+mBase.Height
			HeightSpinner=HeightListView
		End If
		
		If ScrollViewParent.IsInitialized=False Then
			AppPanel.AddView(ListPanel,LeftSpinner,TopSpinner,mBase.Width,HeightSpinner)
		Else
			AppPanel.AddView(ListPanel,LeftSpinner,TopSpinner,mBase.Width,HeightSpinner)
		End If
		Top=baseTop
		'AppPanel.Visible=True
	End If
End Sub

Private Sub PanelClick_Click
	Dim P As Panel = Sender
	Dim Position As Int = P.Tag
	
	SelectedIndex=Position
	SelectedID=GetID(Position)
	SelectedItem=GetItem(Position)
	Lab.TextColor=TColor
	Lab.Text=SelectedItem
	Lab.BringToFront
	If SubExists(CallBack,EventName & "_ItemClick") Then CallSub3(CallBack,EventName & "_ItemClick",Position,GetItem(Position))
	
	'AppPanel.Visible=False
	AppPanel.RemoveView
End Sub
 
 #End Region
 
 #Region Method
  
Public Sub Add(Text As String, TextHelp As String,ID As String, BackgroundColor As Int, TextColor As Int, Gravities As Int,Image As Bitmap)
	Dim Item As Item
	
	Item.Initialize
	Item.Text=Text
	Item.TextHelp=TextHelp
	Item.ID=ID
	Item.BackgroundColor=BackgroundColor
	Item.TextColor=TextColor
	Item.G=Gravities
	'Log(Image)
	If Image.IsInitialized Then
		Item.Image=Image
	Else
		Dim Bmp As Bitmap
		Bmp=Null
		Item.Image=Bmp
	End If
	ListItem.Add(Item)
	
End Sub

Public Sub AddAll(L As List, TextHelp As String, BackgroundColor As Int, TextColor As Int, Gravities As Int)
	Dim Bmp As Bitmap = Null
	
	For i=0 To L.Size-1
		Dim Item As Item
		Item.Text=L.Get(i)
		Item.TextHelp=TextHelp
		Item.ID=i
		Item.BackgroundColor=BackgroundColor
		Item.TextColor=TextColor
		Item.G=Gravities
		Item.Image=Bmp
		ListItem.Add(Item)
	Next
End Sub
 
public Sub Size As Int
	Return ListItem.Size
End Sub

Public Sub Clear
	ListItem.Clear
	DesignerList
	SelectedIndex=-1
	SelectedID=""
	SelectedItem=""
	Lab.Textcolor=HintColor
	Lab.Text=HintText
	Lab.BringToFront
End Sub

Public Sub RemoveIndex(Position As Int)
	If Position>-1 And Position<ListItem.Size Then ListItem.RemoveAt(Position)
End Sub

Public Sub RemoveID(ID As String)
	Dim Position As Int = -1
	
	For i=0 To ListItem.Size-1
		Dim Item As Item = ListItem.Get(i)
		If Item.ID=ID Then Position=i
	Next
	If Position>-1 Then ListItem.RemoveAt(Position)
End Sub

Public Sub GetItem(Position As Int) As String
	Dim Ret As String = ""
	If Position>-1 And Position<ListItem.Size Then
		Dim Item As Item = ListItem.Get(Position)
		Ret=Item.text
	End If
	Return Ret
End Sub

Public Sub GetHelpText(Position As Int) As String
	Dim Ret As String = ""
	If Position>-1 And Position<ListItem.Size Then
		Dim Item As Item = ListItem.Get(Position)
		Ret=Item.TextHelp
	End If
	Return Ret
End Sub

Public Sub GetItemFromID(ID As String) As String
	Dim Ret As String = ""
	
	For i=0 To ListItem.Size-1
		Dim Item As Item = ListItem.Get(i)
		If Item.ID=ID Then Ret=Item.text
	Next
	Return Ret
End Sub

Public Sub GetID(Position As Int) As String
	Dim Ret As String = ""
	If Position>-1 And Position<ListItem.Size Then
		Dim Item As Item = ListItem.Get(Position)
		Ret=Item.ID
	End If
	Return Ret
End Sub

Public Sub SetLabelTextSize(TextSizeLabel As Int)
	TextSize=TextSizeLabel
	Lab.Textsize=TextSizeLabel
End Sub

Public Sub SetIndex(Position As Int)
	If Position>-1 And Position<ListItem.Size Then
		'Dim Item As Item = ListItem.Get(Position)
		SelectedIndex=Position
		SelectedID=GetID(Position)
		SelectedItem=GetItem(Position)
		Lab.TextColor=TColor
		Lab.Text=SelectedItem
		Lab.BringToFront
	else if Position=-1 Then
		SelectedIndex=Position
		SelectedID=""
		SelectedItem=""
		Lab.Textcolor=HintColor
		Lab.Text=HintText
		Lab.BringToFront
	End If
End Sub

Public Sub SetID(ID As String)
	For i=0 To ListItem.Size-1
		Dim Item As Item = ListItem.Get(i)
		If Item.ID=ID Then
			SelectedIndex=i
			SelectedID=Item.id
			SelectedItem=Item.text
			Lab.TextColor=TColor
			Lab.Text=SelectedItem
			Lab.BringToFront
		End If
	Next
End Sub

Public Sub setValue(Value As String)
	For i=0 To ListItem.Size-1
		Dim Item As Item = ListItem.Get(i)
		If Item.Text=Value Then
			SelectedIndex=i
			SelectedID=Item.id
			SelectedItem=Item.text
			Lab.TextColor=TColor
			Lab.Text=SelectedItem
			Lab.BringToFront
		End If
	Next
End Sub

Public Sub SetBackgroundDrawable(Draw As ColorDrawable)
	mBase.Background=Draw
End Sub

Public Sub SetBackgroundImage(Bitmap As Bitmap)
	mBase.SetBackgroundImage(Bitmap)
End Sub
 
Public Sub Close
	AppPanel.RemoveView
End Sub
  
Public Sub Oper
	DesignerList
End Sub

Public Sub setEnabled(B As Boolean)
	Lab.Enabled=B
End Sub

Public Sub getEnabled As Boolean
	Return Lab.Enabled
End Sub
 
#End Region
