﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=7.3
@EndOfDesignText@
''Class module
Sub Class_Globals
	#if B4A
	Type  TDropDown_Border(FillColor As Int, CornerRadius As Int, BorderWidth As Int, BorderColor As Int, DrawColor As ColorDrawable)
	Type  TDropDown_Text(Indent As Int, BGColor As Int, FGColor As Int, TextSize As Int, TextTypeFace As Typeface, TextGravity As Int)
	Type  TDropDown_Parms(Tag As Object, Position As Int, Value As Object)

	Type  TDropDown_ItemEntry(Offset			As Int,							_
							  ItemPanel 		As Panel, 						_
							  ItemLabel 		As Label, 						_
							  ItemImageView 	As ImageView,					_
							  ItemToggleButton	As ToggleButton,				_
							  MaterialFont 		As Boolean, 					_
							  FontAwesome 		As Boolean,						_
							  ItemInfo			As TDropDown_ItemInfo,			_							 
							  ShowImage			As TDropDown_ItemImage,			_
							  ShowCheckBox		As TDropDown_ItemCheckBox)			
	
	Type  TDropDown_ItemImage(WantImage			As Boolean,						_
							  ImageInfo 		As TDropDown_BitmapInfo, 		_
							  UserImage 		As BitmapDrawable)
							  
	Type  TDropDown_ItemCheckBox(WantCheckBox	As Boolean,						_
								 CheckBoxInfo	As TDropDown_CBBitmapInfo,		_
							     UseBitmaps()  	As Bitmap)								
	#else if B4I
	Type  TDropDown_Border(FillColor As Int, CornerRadius As Int, BorderWidth As Int, BorderColor As Int, DrawColor As Int)
	Type  TDropDown_Text(Indent As Int, BGColor As Int, FGColor As Int, TextSize As Int, TextTypeFace As Font, TextGravity As Int)
	Type  TDropDown_Parms(Tag As Object, Position As Int, Value As Object)

	Type  TDropDown_ItemEntry(Offset			As Int,							_
							  ItemPanel 		As Panel, 						_
							  ItemLabel 		As Label, 						_
							  ItemImageView 	As ImageView,					_
							  ItemToggleButton	As ToggleButton,				_
							  MaterialFont 		As Boolean, 					_
							  FontAwesome 		As Boolean,						_
							  ItemInfo			As TDropDown_ItemInfo,			_							 
							  ShowImage			As TDropDown_ItemImage,			_
							  ShowCheckBox		As TDropDown_ItemCheckBox)			
	
	Type  TDropDown_ItemImage(WantImage			As Boolean,						_
							  ImageInfo 		As TDropDown_BitmapInfo, 		_
							  UserImage 		As Bitmap)
							  
	Type  TDropDown_ItemCheckBox(WantCheckBox	As Boolean,						_
								 CheckBoxInfo	As TDropDown_CBBitmapInfo,		_
							     UseBitmaps()  	As Bitmap)									
	#end if
									 
							  
	Type  TDropDown_ItemInfo(ID				As Int,								_
		  				     TextPassed		As Object,							_
							 TextString		As Object,							_
							 UserData		As Object)
							 
	Type  TDropDown_ItemInfo2(TextChanged	As Boolean,							_
							  FocusChange	As Boolean,							_
							  HasFocus		As Boolean,							_
							  EnterPressed	As Boolean)
							 

	Type  TDropDown_BitmapInfo(InFront As Boolean, Indent As Int)
	Type  TDropDown_CBBitmapInfo(InFront As Boolean, Checked As Boolean, Indent As Int)

	Public  gNarrowBitmaps						As Boolean = False
	Public  gSmallScreen						As Boolean = False
			
	#if B4A			
    Private mIMELibrary                         As IME
    Private mB64Image                           As Base64Convert
	#end if

	Private mAddingItem							As Boolean = False

    Private mRoot			                    As B4XView
	
    Private mCallRoutine	                    As Object
    Private mCallFunction                       As String
	
'   Private mParent                             As Panel
	Private mUseForSize							As Panel
	
    Private mAttachTo                           As Panel
'	Private mGridPanel							As Panel
	
	Private mAttachTo_Left						As Int
	Private mAttachTo_Top						As Int
	
	Private mTouchEater                         As Panel

    Private mDDListBorder                       As TDropDown_Border   '= MakeTDropDown_Border(Colors.Gray, 0dip, 3dip, Colors.Black)
    Private mDDFrameBorder                      As TDropDown_Border   '= MakeTDropDown_Border(Colors.White, 5dip, 3dip, Colors.Black)
	Private mDDFrameBorderDisabled				As TDropDown_Border

    Private mDDListText                         As TDropDown_Text     '= MakeTDropDown_Text(20, Colors.Gray,  Colors.White, Typeface.DEFAULT,      Bit.OR(Gravity.LEFT, Gravity.CENTER_VERTICAL))
	Private mDDText                		        As TDropDown_Text     '= MakeTDropDown_Text(20, Colors.White, Colors.Blue,  Typeface.DEFAULT_BOLD, Bit.OR(Gravity.LEFT, Gravity.CENTER_VERTICAL))
	Private mDDTextDisabled        		        As TDropDown_Text     '= MakeTDropDown_Text(20, Colors.White, Colors.Blue,  Typeface.DEFAULT_BOLD, Bit.OR(Gravity.LEFT, Gravity.CENTER_VERTICAL))
	
	Private mFirsTDropDown						As Boolean			 = True
	
	Private mPopListDown                        As Boolean           = True
	Private mPassTag                            As Boolean           = False
	
	Private mIsGridList							As Boolean			 = False
	
	Private mShowButton                         As Boolean           = True	
	Private mKeepOpen							As Boolean			 = False
	
	Private mAutoSizeDisplay					As Boolean			 = False
	
	Private mButtonInFront                      As Boolean           = False
	Private mCenterRight                        As Boolean           = False
	Private mUseTouchEater                      As Boolean           = True

    Private mDDDisplay                          As Label
    Private mDDButton                           As Button
    Private mDDListFrame                        As Panel
    Private mDDList                             As ScrollView
	
	Private mDDListItems						As List
	
'	Private mHeightAddOn						As Int				 = 0
	Private mSmallestFont						As Int				 = -1
	
	Private mDefaultItemHeight					As Int 				 = 40dip
	Private mWidestItem							As String			 = ""

	#if B4A
    Private mDDButtonStateList                  As StateListDrawable

    Private mDDArrowDown                        As BitmapDrawable
    Private mDDArrowDown_Pressed                As BitmapDrawable
	#else if B4I
    Private mDDArrowDown                        As Bitmap
    Private mDDArrowDown_Pressed                As Bitmap
	#end if

	Private mCheckBox_Unchecked					As Bitmap
	Private mCheckBox_Checked_Blue				As Bitmap
	Private mCheckBox_Checked_Green				As Bitmap		

    Private mLastSelected                       As Int    = -1
	Private mPreviousSelected					As Int	  = -1

    Private mDDMaxToShow                        As Int    =  8
	
    Private mDDButtonWidth                      As Int    
    Private mDDButtonHeight                     As Int    

	Private mHideKB								As Object
	
	Private mT8TextSize							As cT8TextSize
	
'	Private mTopOffset                          As Int    = -1
'	Private mLeftOffset                         As Int    = -1

#Region DropDown Arrows as Strings
    Private Const mDDArrowDown_String           As String =    "iVBORw0KGgoAAAANSUhEUgAAABkAAAAfCAYAAAASsGZ+AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO"  _
                                                              &"wgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTFH80I3AAAG9UlEQVRIS5WV"  _
                                                              &"C2wT9x3H75yHEzs4D5I49tk+3/ns2IkdO0mdkEBICI9BmyYbURtSVCaYWrbRTaoG7TStGyUqaynasrWi"  _
                                                              &"ohQyGmg7CoI9NKhGmpCUxO8HfdABpaIrKmrLoKVAmzT+7XvObQIJQvaVvjqfffp87v//3/nP3C7aYpMh"  _
                                                              &"V1f0epXbEtjzvH3s9LBt9MyQMHxm0DJwdtB0+NyQ4dD5t0r+9NlY0ctfRvJfGk9qt10JaJ7bsMawxeOS"  _
                                                              &"HApm+qh1hQ9nZKvHjZyRep9pomuftBJ9Pp/owlyi83OIzt1FdNZHdMpDdLKC6G0HpZI2+usLUqqlwfVc"  _
                                                              &"dZVfraBuHU6oV2dptf0My6byC/Kpq9NPF852EF1EP20j+mQZ0UeLiT6E+EwzRPOI3oP4bT9dCtRQ59KK"  _
                                                              &"kx6n06rgbp1CzmbVaHJHWIahjMwsKtMX0/tH6oliDUQRHEN1RGO1RKM1RCMYzXAV0aCbaAAjGnDSo/dx"  _
                                                              &"l4qLSu9XcLeOrlQ/b5Ym+7QsYVWqdIc2FRPt1RP1oy+XoiVEf8R3fUVEu9CXCoh25KM66n1AfY1l2ccV"  _
                                                              &"3K0zW6/36zTqP0MSYzMy3oXkymtrsoi2qomezUbxWe6WTKJn5GYQ/UY11c0s7X6AvQ7ME1O026SkpEit"  _
                                                              &"02SbIBHV2vxWVWZWqH8lBE/nApQDEPoUzp+CsAeyTXIhexLdmEG7V6juLLkx2qIyd16eLvC3jVai/Xai"  _
                                                              &"fRLRazaiV0WiVwSiPfi+n8f0WTB9ZkwfR7t/PPu6Rp09MwnvaGHyCgvnCbzw3on9WPBAIxYbi38cfQvn"  _
                                                              &"w3gAjvmJhvA4v4kHYaCa6KiPtj/muMobyzYomOlTypWrODPX2dzgPX9uEO9IEk00EcXxyMbwvkQhjaBh"  _
                                                              &"SIN4hAOQBuuo5ye+y163p0vBTB9dgU7NGUsf67xb+vrCECBxwOI4xtAoRhIGNISRBDGSAIrH+uvjNdTR"  _
                                                              &"av3I5RArFMz00ev1BbxZ/+LPHnbQF6OAyoI4jjE0CkEYghDgIUxVAB2rpnf3e6jJbx6y2+yFCmb6GMoK"  _
                                                              &"TAKvP/Zij5vGoxAkZJEsgSAKQUQRBPFSBrAeYz46+Fsn3eXhton2ugwFM30EQfRXu80fHt6JtzoJeALw"  _
                                                              &"OBoDPAp4BA1BEIIggGtCPtr4Q4EqncJKBXHnuNze7vYljuvJQwAlAU/g7uMQ/E+C78MQAE5BL11+00Pf"  _
                                                              &"77BcEnnjzNZDjrdmzqaHul30r0EAkxAkAI/jcwyNQhCBICyPwAtJFSVedVHnEvOYzWrRK4jpY3MtZuvn"  _
                                                              &"tv79l+ucdFWeliSaQOOAxwCPAR5RBKEqSkHyl987qLXRvEO08loFM33qWx4saZo/7/SOzU6id2QJ4HHA"  _
                                                              &"4wDLghjgETSMf2BIxgNu6n1c+FayGlcLtsqZLfo93Rv8rc2+L4b34i/8BOAJgOXGAZYFUcAj2LDC+D3k"  _
                                                              &"ps8GXLR+jfVjk9G4wCaKCuUOWXTv6lUdSysnPvgHQCcATwKcQOOAx9Aovo9AEK6EpIL+ebCcVrSZRmy8"  _
                                                              &"wSVKtQrlNnH5ljHVDcvZJfd2/+EHXfbJKxEA0wIc4wDLjQEeBTyCTSpcQSlIju2SJhtruD6bWF6koG5O"  _
                                                              &"w4KO3IVtq7jlqzbYVzz0q8rlD65vbll4z8jm9VKK3gE0IRfgOBoDPAZ4WuDCKJw0GXTSrh7ruL5kdi/L"  _
                                                              &"qkRGpTYybA6eMFWuomCYxpZlnvmL2rcvvLtrqOU7XcGm1u+e8nhqrx3ZiUVPAppA43IBlgVRWYLfwmio"  _
                                                              &"nCYCDlp7v2miMD//VJ5W88asPO2BXLW6Lysrs1FRMIx/TnOxt8q7sbba+eUvflpJr/yukg5uK6eLx3Gn"  _
                                                              &"aTCOUQDT4PKphrC3BNGARN+OSrTvWZ56HuFoVbuBJL74cllJ/hZNjtqiKBhGslUwdlHMKZf4H3W38x8H"  _
                                                              &"9zlS38hTEQNUbhTQiAx3TMFD2LiC6Bg2r1GRUuinR6yp17eav/reYsOwyBvaTYZSdYEuTzHcEJvNkVNu"  _
                                                              &"41evaLOcPLpTSk3K8LQA8LQA4LQAcEUwcVyg+F4+9cRa7nRDdVmPiTM7RLECO/dtItjrGUm05dp4U8fS"  _
                                                              &"+Vzije1iajIs3/l/7x7gALbdsan++6hAfU+axle2GQ9LPLdI4PlZCurOEa3WTMFsql0whwvueZqfuDIC"  _
                                                              &"6A2Cb3Ae3mOZWHuf4f06L/eozWriRKkuffdWRwuLpjkzisBbq+p9xv29Pzd/dRF3LU/NB4f41I5fmz6f"  _
                                                              &"W2voM3FcjSA6M5XL0+HtzSyqnM0gguhSWc3miprKsp2b1nFXD2w1jz/SbQz6PcZ1Am8pVS67Kf+3RI4g"  _
                                                              &"eliryVAmmgv6fc6CAy6J85k4PkeQ6pQrbo4suFnCMP8BK1hL9nt85+MAAAAASUVORK5CYII="


    Private Const mDDArrowDownPressed_String    As String =    "iVBORw0KGgoAAAANSUhEUgAAABkAAAAfCAYAAAASsGZ+AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO"  _
                                                              &"wQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTFH80I3AAAGg0lEQVRIS+2V"  _
                                                              &"a2xT5wGG7dyc2MG5kMSxj51jH19iJ3acS52QlJAQLoU2TTaiNqSoTDC17C5Vg1aa1okSlbW02tg6MVEK"  _
                                                              &"lAJtR5noLhpUI01ISuL7hV7ogFHRFRW166BlhTZp/O49ztnEJAj82M+90qtzsfU85zvnfOdT3Si6MrOx"  _
                                                              &"QF/6Sp23KrjvV86J06P28TMjttEzw1VDZ4fNh8+NGF89/0b5bz6eKH3hs2jRc5Mp3bbLQe0zG9Yat/g8"  _
                                                              &"DpeCmT0afcmD2XmaSZNgwtYn23Hlwy7g7wuAC7cD5+cB524DztYDp3zAyRrgTRfSKTv+8GtHurPV80xD"  _
                                                              &"XUCjoK4fwdaiydXp9qrU6nRRcRH6+wK4cLYX+IT9qBv4cDnw/hLgPYrPdFA0H3iH4jcDuBhsRN+ympM+"  _
                                                              &"t9uq4K6fEsFu1WoLxtQqFbJzclFpKMO7R1qAeCsQ5TbcDEw0AeONwBhHM1oHDHuBIY5oyI2H7hEulpVW"  _
                                                              &"3Kvgrh99hWH+HG3eaVmizsrKdGRTGbDfAOxlX6hgy4HneW53KbCLfa4Y2FHE6rH1Ps0VtVr9iIK7fuYa"  _
                                                              &"DAG9VvM7SuLq7Oy3Kbn88tpc4GkN8FQey325W3KAJ+VmAz/NmulmNfbcp75KzKMztBukvLxUo9fmmSmR"  _
                                                              &"NLqirqyc3PDeVRQ8UUBQPkHs4zx+nMJByjbJpewxdmM29qzM+r/kfyy5NrrSSm9hoT74x41W4KATOOAA"  _
                                                              &"XrYDL0nAizZgH8/vFfm2VfFts/BtE7DnO3OvajV5tyYRXZ2qwpKS+TbR9s6Jg5wfwTbODc6V4+wbPB7l"  _
                                                              &"fDkWAEY4+1/nvBlqAI7WY/vDrs9FU+UGBTN7KoTqLMEi9HW0+s+fG+YnJcUm24EEZ3icn5cYpVE2QmmI"  _
                                                              &"Mz5IaagZg9+vv+T3+voVzOzRF+s1gqni4b47HV9cGCEkQViC2zgb40gihIY5khBHEmT5FfjieCN6u6zv"  _
                                                              &"e1xSjYKZPQaDoVi0GJ794YMufDpOqCxIcBtnYxREKAgTHuatCrITDXj7oA/tAcuI0+4sUTCzx1hZbLaJ"  _
                                                              &"hmPPDnoxGaMgKYtkCQUxCqKKIMRvWJDPY6Ieh37mxm0+YZvkbM5WMLPHZpMCDV7Le4d38iOYIjxJeIKN"  _
                                                              &"Ex4jPMqGKQhTEOR/wvXY+C0bat22VQri5vF4/QM9S11XU68SlCI8yatPUPAfCc9HKCAcIT8uve7DN3qr"  _
                                                              &"Lkqi6daehxx/47xNDwx48LdhAlMUJAlPcD/OxiiIUhCRR+CnpA7JlzzoW2qZsFurDApi9tg9S9Qtt3f9"  _
                                                              &"6cffdeNz+bak2CSbIDxOeJzwqCII1yFNye9/4UJXm2WHZBV1Cmb2tHTeX96+YP7pHZvdwFuyhPAE4QmC"  _
                                                              &"ZUGc8Cgb4YJFyWTQi62P2L5yWE1rbPbaW3vodw1sCHR11H86up8r3gnCkwTLTRAsC2KER7m+R/h72IuP"  _
                                                              &"hzxYv9b6gdlkWmiXJIVykyy+e83q3mW1U3/9M0EnCE8RnGQThMfZGM9HKYjUUlKDvxyqxspu85hdNHok"  _
                                                              &"R5NCuUE89ctVDa0r1EvvHvjlN/ud05ejBGYE3CYIlhsnPEZ4lGt6pAZpSo7tcky3NQq77VJ1qYL677Qu"  _
                                                              &"7C1Y1L1aWLF6g3PlAz+pXXH/+o7ORXeNbV7vSOMtQpNyCU6wccLjhGcEHo7CjemQG7sGrZOG8rlb1eos"  _
                                                              &"SZWlManU+XzDsgoUhUrV1rnct2Bxz/ZFd/aPdN7RH2rv+topn6/pypGdfOgpQpNsQi7BsiAmS/hbhA1X"  _
                                                              &"Yyrowrp7zVMlRUWnCnXa1+YU6n5boNHszs3NaVMUKlVgXkeZv86/sanB/dmPflCLF39ei0PbqvHJcV5p"  _
                                                              &"BsxtjMAMuHqmYa4tITbowFfjDhx4SsTg9wSs7jHCIZZdqiwv2qLN11QpCpXKYa9ROSUpv9ohfnugR/wg"  _
                                                              &"dMCV/lK+FXFC5cYIjcpw1ww8zIUrxE5w8RqXkGY/OmJNv/K05Z9fX2IclURjj9lYoSnWFyqGa2K3u/Kr"  _
                                                              &"7eKald1VJ4/udKSnZXhGQHhGQHBGQLgimDpuQ2K/mH50nXC6taFy0CxYXJJUw5X7BrE5W1QOyV5gF829"  _
                                                              &"yxYIyde2S+npiHzl/756goNcdidm+o+jNux+zDy5qtt02CEKi22iOEdB3TyS1Zpjs5ibFs4TQvueEKcu"  _
                                                              &"jxF6jeBLHkf2VU2tu8f4brNfeMhuNQuSozlz9VZXp5rNcGaiUv0L/RaJoYoU0DMAAAAASUVORK5CYII="
															  
															  
															  
    Private Const mDDArrowDown_Narrow_String      As String =  "iVBORw0KGgoAAAANSUhEUgAAABAAAAAoCAYAAAD32nqhAAAFKklEQVR42o2Ve2xTZRiHTy/b2LVsXS9r"  _
                                                              &"z9a1G92ta7eWDltw3BwYmE5dsgASIxhEYgx/yNTIXVBQFBUMBoEIQdGhY0AQyVTEYdh67xhMIITFCwga"  _
                                                              &"E8BLTCD8/J21orK180vetKc5z/O+/d73fEcQ7lip2eomd62ls7/TeDi0X9cR6MjffeqQasvAV+nrrobk"  _
                                                              &"S38LCktSUixuIdGSpWce0mhE/HlpHHCxFhiwAeeswCkzEBGBPi2meou/SChQpKb9qNOLONPXDFxvBH6Z"  _
                                                              &"DlyaDHw7HjhfB5ypxYrFtl+lXMMK5ErFrVHpmTjwIcHLTcAPM1jFPcBZSk5PAKJ12LXegZwcMW8InCN6"  _
                                                              &"8lKUCsgUSmxcytLDHiDIv9LjAr52Al124GgljmywQFBqvUMEafmGsjSlDIJcjmeaVcC+IuCjQmCvEfhA"  _
                                                              &"D7yvA3ZrEFirAm9vHiIYXVBYn6aQsQIF5k9QApszgE2jgDfSgNdTgY0pwKtKXFgmlwRzhgjyDHmFSpns"  _
                                                              &"Y5lMeXiOUwasp+RFBUMOrGWs4W9rBFxoFYYX/L1UWlvJLCfBl9MJsoK1rOAFZl9N4UpW8LQiuSCrwFTx"  _
                                                              &"WEMusMcE7OI+7GT/dxiAbQXAVh0urFcnFyizs72rHq8Ajrm56+zAZxyoIw7gU3bhUBXObbdSkJlYoMhI"  _
                                                              &"m7ntJfY8MpGtrAcC/O7nIPWwrSfGIfyeE7nZRfclFGj1xkXtWwhG76aEYNhLCWH/XZS4cfSdsTCZXM7E"  _
                                                              &"m6hSrevcwdLDBMIcpABH2D+WMOOEE9tXlsNgMOQnFOSOVu+OdvDmiCQgHGT4eO2jtIfPwhMlNwXBlZJQ"  _
                                                              &"oNFou64cZ+bIuLiAm+l3xUbaX4MFLabLQrKlVmsG8I0nLiAcHBsXsBuhGjROLookFZSXiNcwwPIjzB4m"  _
                                                              &"HJQyE/bV8FyoRWmxYW9C2D5tWua0SaV87qW/4I4JQs5/BCEHUtPzX0kocExpNM6bxSE6zewRwmFmD1IQ"  _
                                                              &"IOxz4PvDVcjI0i5MKLB5mrzPP0lBn9QFgmFGiNn9nEKfHSd2liMzM68hocDTMHv2pmVlwElmjkqCmsGN"  _
                                                              &"g98xKNi7YQxPo5LShALn+MbWtjcp6JUGqTYusMcrqMZrrWYk7UBFzZQtPW1VzE44QjjMzEHCgWp+VmHx"  _
                                                              &"XNON5C20TTr43Ze8OUo4QjhMOMjrgCStQstM8WxSgb3G03tNytZLOGKPC6rigkrU1+k/TyrweL1X0U84"  _
                                                              &"KsG2WAQrKWCEKmEu1m1Nxssaprpv4bwkYBURSSDBbKu/An90l0Eu1zw3hKqf3tLSvGD56ocXrWqf8yBL"  _
                                                              &"7ScYqYrBzIogBT4rznSUQibL2scjZy7fok23BRMmTvd56++FrboOTz3Cd+DJOBwmGJKy893oK8Mnm83I"  _
                                                              &"ysxBrir7RvqotJ9uC6wmccb9DUXoPViGn7sr4iBnIWAdzAwfn43uElw5YkHbqyZMqdPDVJD33xeLudB4"  _
                                                              &"7GJXeSxjmHCQ4R/DINxTwpPIwjDj+LtFMIvDbKTZbHUsnM0jvLcslt0fz+yT4JjgSqcJ1eUav8uV4DQq"  _
                                                              &"0Br29O0nFBgTyy7Bg9nNuNVj5kGiuyqKojFhD41Go3pGveEGopKAJfcwuhkBM1rnFSA/X5wojLT0+YYV"  _
                                                              &"B94qZnZJYB6UtG0wQqs1LBH+zzIYXBluu/7iTamCbjP624tQUqhvF4SV8n8PXPIqNMZH314u4npXMSa5"  _
                                                              &"dedyLRbVnRM7YiU2q/b0/Id0v+fmivbhRn5EgXp09gOcuGdHuu8vaGFz3aDJ11cAAAAASUVORK5CYII="


    Private Const mDDArrowDownPressed_Narrow_String As String =  "iVBORw0KGgoAAAANSUhEUgAAABAAAAAoCAYAAAD32nqhAAAEy0lEQVR42u2WfUzUdRzH7wkOOODk4Q64"  _
                                                              &"+8FxgDzdwcHxYHca+BDQkGKNjSm5NmtmrjX/KFpLS01KSrPUjc3UpbMsLcUcEaMywwb3fIcooXOwHjSp"  _
                                                              &"tWG11kbz3fvHXbbE3/3Xf/22z+DY7/V6f+73/X4//GSyO67YpLTWmsq8wfFBY7//dEavtzf96MU+bc/U"  _
                                                              &"l/E7ZvyKTb/5ZM/ExOTVyKQuebymT6cT8Mf1RcC1SmDKClwpBC6agaAAjOmxwpn7uaRAGav+ISNTwMRY"  _
                                                              &"G/BLC/BzE3B9GfDNYuBqLTBRiRc3Wn8Vs+4qUKiUt+LiNfjofYI3WoHvm9nFfcBlSi4tAUK1ONJtQ3Ky"  _
                                                              &"kDoPThYcqTEqJeRKFXZvYusBB+DjV3FVAV/ZgaFy4GwpBnbmQabSO+cJ1OmGIrVKDplCgWfbtMCpHOCD"  _
                                                              &"bOCEEXgvE3g3Aziqg7dLC97eNk+wICu7Tq2UswMlHl2iAvYlAHvjgDfVwBuxwO4YYJcKk5sVoqBjniDV"  _
                                                              &"kJqtkss/lMtV/R12OdBNyctKlgLoYm3n37bLMNkpu7vg70urt+avshN8NZ4gO+hiBy8xfRuFW9jB08r/"  _
                                                              &"Bf+5IDHLVPJYQwpwzAQc4WY6zEN0yAAcyAL2Z2CyOy26QJWU5Nz6eAlwroZbl9v4U57KARvwCbdynwVX"  _
                                                              &"DhZSoJEWKBPUKw+8woMTrOd5qAO8/N3D0+ji2RhehMA7dqQk5TwgKdBnGjec7CEYupcSggEnJYQ991BS"  _
                                                              &"g7NvVcNkqrJLP0StdsfgIbYeIBDgafRyDniqCbOG7Ti4pRgGgyFdUpCyIO1oqJc3B0UBYR/Lzc9uSl0c"  _
                                                              &"KE/k/ymTVcVICnQ6/dD0eSYHF0UEfJieqvBc8FRgXbvphizalZamm8LXjoiAsK86IuBq+CvQsiwnGFVQ"  _
                                                              &"nC/cxBTbDzI9QNgnJhN2V3C4VqIg13BCEi5vbNQ0Li3g8BS/Qk1Y4Lf/I/DbEBuf/pqkwLa8xbh2FTfR"  _
                                                              &"JaYHCQeY7qPAS9htw3f9FiQk6tdLCqyOVufzT1IwJq4CwQDLz3QPd6G7HMOHi6HRpDZIChwNq1fv3VwE"  _
                                                              &"XGBySBRUzD04eGxzghM7F3Kk5xdICuyLWzqP76FgVNxIlRFBeaSDMrzeaUbUFSipWN7jOm5hOuEg4QCT"  _
                                                              &"fYS9ZfxpwcY1ptnoS2hdeubbL3hziHCQcICwj5+9otSC9pXC5aiC8grH6E0xbZRwsDwisEQEpairzfws"  _
                                                              &"qsDhdM5gnHBIhK3h8pVSwPKXwpybsT8aL29YUXMLV0UBuwiKAhHmsnpK8PtIERQK3XPzqLqm9va2dS9s"  _
                                                              &"e3jD1pMdD7HVcYJBSxhmKnwUuAsx0VsAuTzxFEfOGr6KtN4WLKlvcjvr7oe1rBZPPcIXiQsROEDQL6bz"  _
                                                              &"BcNdhI/3mZGoSUaKNmk2Pk79421BoUlofrAhB6NnivDTSEkE5F7wFs4lw82zMZKP6YE8HN9lwvLaTJiy"  _
                                                              &"Uv/939mcbTx3bag4nBgg7GN5FrIIu/I5ifJYZpx/Owdm4S4P0mwutK1fzRE+WhRO90SS3SIcFkwPmlBW"  _
                                                              &"rPNUVUlMoyy94djYaULeheF0EZ5LN+OWy8xBkjEjCIJRcg2NRmNac51hFiFRwJZdrBGW14zOtVlITxfq"  _
                                                              &"72T+AkSGsGqSTW8XAAAAAElFTkSuQmCC"
															  
#End Region

#Region CheckBoxes
    Private Const UnChecked_String                As String =  "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAABt0lEQVR42u3YPUvDUBiG4YiDoODgpDgq"  _
                                                              &"XUQcFMTRwU0Hwd/gIu4qQsFCIdRBKbiaf+BWCAYV6RgjYqtSKwoqtVrUNqj1q/F5wUp4SSwFkxQ5B+6l"  _
                                                              &"0HJx0iWPJLmfTjSNFLSDDLT/R+lIRXE0iVqlOk43WkevyPKpOzSPWmrhJtC9jzDeAepxw02hN/6lUChk"  _
                                                              &"hcNhT6LfdkBeol6O60PPHBaLxV5yuVzJ8uhkMpnHSCTy6QA9tD/uJrTNcfl83jMYP7qulxyQC1XgMMeZ"  _
                                                              &"pvlk+XwMwygy5E31FpftuGQyaVoBHTzuD3aLYwTcqn5Af9wgTyKRuGbAOQIeNwowlUqdM+AKAU8bBZhO"  _
                                                              &"pzkwLoACKIACKIACKIACKIACKID/HnjSwC9NqwTcbRSgqqpXDLgofV/jz4s7zRBBAaPRKB+vxgk4av8w"  _
                                                              &"qFukIYlNHzQDthGwGe3Zb1FRlIqfuGw2W3QYj2T7/DaC3vkmqGmapyNSoVAwZVkuO+AuUDvfCGdQxa/x"  _
                                                              &"8pcB8wENuq2sNJqXA5yAaV0dqrVT96NNfpseR5eyhjrqWfsH0BLS0Bm6/cNonDxCG2gWdbkhvgAAEcdh"  _
                                                              &"aphxywAAAABJRU5ErkJggg=="

    Private Const CheckedBlue_String              As String =  "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAESElEQVR42s2YX0xbVRzHS9nY0hGX+TBh"  _
                                                              &"7I+UTXFAWSIOcRuKBhNFJhpjojEh88GYLBgTEwNmScWZGLZFnTV7sC7sYXvQxRCX+LDMwNxYMEGcYGV0"  _
                                                              &"lMBaZTCl3N729rb3T7/+zpWytqNCS7nlJJ+X03vO/fR3zvnde38GQ/JWQLxFnCEuE78S1zPEL8RFwka8"  _
                                                              &"RJhib7zb6sgvb/+93tI+9NVCYkVEJxEmoBN/E23EOsuRweKKDx2fVLY7Rom6RLlGwqujWBz5JU+4ytr6"  _
                                                              &"uiutjpsWq+OVRDnWIcUOMJlMaG5uRl9f34rA5mb3MOQYsbHsORS/0QVzc7e8650LHyXKlRHBRDGPx6Ni"  _
                                                              &"hZtrbCzy9KGj2NbUg60v/ozNtYeZsIMtd1Quh+iJlWtpaYGe7dNzXGTr805sPtAKY96G6Ap+EBWszpZc"  _
                                                              &"IKTgRGcAL783g6tDnFrzTGPsnpyKRvFEtJMtq16NFxXUv+mFpWEWrj8lra+/vz+ScHDqmWB3tINtXD2a"  _
                                                              &"KKmoO+RFSVUQvUPifL8kSap2aO4KtjLBG3oLttt9WJMv49hZ3z2/mc3mWMHPmeConoKnf+DxwBYVe5q8"  _
                                                              &"EELqYoI2XQW/uxpA4TYFxRYRo5PhBa/JmuDlwSC2PxRGQZGCrmv+pNdlRXB4IoySxwQY1yl4/7j/f6/V"  _
                                                              &"XfD2jIzyZzkYjBE8sleEazq0egT5oIqa12Y0ubxNIdgv8IuO0VXwi3MCck0yctcreOpVv5b/Vo1g728h"  _
                                                              &"mPcEaV6gtCaIP26FljROF8ERdxilBwKaXN6mMOzng0seu+KC//hl7GviYVyr0pwRVDXwuMPJq0fQdlbA"  _
                                                              &"2o1hLXrrC0R83yOmND4lwZmAjGleWvLkV4YEmCtETc6QE0Ht69yCj7OMRvDmlIheZ2DRiSdnJZTvDyJn"  _
                                                              &"jaoJ7qTEfGNcSnkF0lrin66L+OwbH4Y9yU+i9RSvpRMtepT3Ok4H0toiae/B43YBpbV+2M7zlICV+D/g"  _
                                                              &"CKDoQVk7FExw1+MCJiZlfQWnZmVUNfq0xGtp4DDg+m/z+wQFpU/y2p7Tokd0nOHTPmTLOsUjt8J4eL9f"  _
                                                              &"i9SOMhFtX/qw7+3b82IM9pbsnpazI6gt50CI5EJzQpG4yDGOfs0vK01lJA8e6/TPJWLEsX13CBNTUvYF"  _
                                                              &"uYCCyoPeewRbT/qWnegXEhxJ50ni+kvCzr3C/FIX7lCW/EKQguBJJngl3UfdxX4BW1h6obz37scBZKIl"  _
                                                              &"CB4xzIUx7Q93q52j7wwV3YPLFxwfH48kfBe/wATrYksfTqczxbdmBbZv+YxEjwUoRo6VATcwwVxiIPpD"  _
                                                              &"dXU1OI5LaeJJLrxsOVYTSoheR2z5rYaQYyVTjWS6ze12q/N1wrtyE8R9iTXCw0REr+JlXAEzvmA0Szya"  _
                                                              &"rHDOiuahbJWACQ9RZVikVRCXYqOpAywop4j7DSm0SoLVin8kxog7GYQVJ4eJLqKFKEwm8S8HVYdy7FDh"  _
                                                              &"SQAAAABJRU5ErkJggg=="


    Private Const CheckedGreen_String             As String =  "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAFCUlEQVR42s2Ya0wcVRTHF3CBIoXyaAHB"  _
                                                              &"CoXQIg/LIyGNlqKmtIVGFEQJImlqSBo1EpNGrI9Q0VShBfwgLTWaqLWliMZPKAus5bk8luW9QHegpLSA"  _
                                                              &"pMCWFVh29vH3zgQITHfLa3fhJP8v986d+eWcc8/ce3g8wxZCdI1ogEhONGdEzRJNEHUSfUPkuvzD06Ik"  _
                                                              &"51lpwgXcS3LWBxZORBHBjNISCYgcugQxJ+7Un2ibkrwSog/uSyKdmeFYWfMtcSZ9H11bfWRysCY2WB/c"  _
                                                              &"pa0AY+TiZI3PLgbgemUkAv0dNGTsZS5cvL6Ftra2uqSkJLqoqAglJSUoLS01ioqLi5GXl4eoqCi1/76d"  _
                                                              &"+PRGAK7UhyE0aNfit5VMuBfhLBc2wQq4lJQUWi6Xw5Q2NCjEx7XByGkNRtQhV66DKhYBT3PhMjIyaJjY"  _
                                                              &"eqS/Ib3RD+e6D4Dqv4GgoCCNno3DelG8fMLb21urVqtNCidu/xFviL2Q3ucDae+37JhMJoOVlRXXi5kM"  _
                                                              &"4NTywfz8fJPCiSRXcFLigddknqiWfACdTrM0FxISMs8BLGcAVcsHBQKByeCaJFdxTOKGwwOuuNn8KjS0"  _
                                                              &"YsV8cnLyNAewnQGklw8KhUKTwLV2/IKYVjcEU47IFYdj9uHAI8+kpqY+5AB2mgVQ2vsnYpvd4U09ife6"  _
                                                              &"fTE6XKb3uS0BHLpTg8SGvfCgbHFS5gFx53mSd7rtAfjgXylO3fKHG2WDUGoXilvioVXPGHzerICzijGc"  _
                                                              &"rYhkPedF7cDnbUGYnuh67BqzAWrUSlwSxMNbZgdHGR+v93uhv//yquvMAsjk1+/VZxHY5wA7mRUb2j/E"  _
                                                              &"idBpVdsDkCknL7S7wo6ygjsJ7yftz0KxSmjNBjh2vx2JdXvhQD3BAsaRXdspzV3z+nUB6nRqKIa+Az17"  _
                                                              &"b00vn5+TI7PieewhO5ZPWcCfsscPLS8+8rcwqgeVCgo1NXHktHGVlIe5x+bdz8Iz8Lttz8I5Uny8I/Ux"  _
                                                              &"WJCNGuLhIQG+bg7Gr41xGL9frffFHV03cajdBbaUJayJwikn/NV2asVBwKQ5WN9SgDe7vfBupy+qxBmY"  _
                                                              &"UwwvzcknBvHWLT8276yI93aTEH/UsR+Kya515/CGARlP/FSVjojbTjhMuSK76SB6er6Hmp7Bxb8T4EkK"  _
                                                              &"MQNnQ7x3hNqNxq5zG9pkm9rFKuU0zpe/hGcoOzxNgI71uSG1eD/8u+zZsFpSPPav8ZXkOSj/u2t+QDac"  _
                                                              &"DwZwWhgAF8oaO0gZYUoJsyksCByTf0cpN1JWcjZcpoxSBwcHhIgVecCe5BwDxhvgsd5jwpzbGgpaOb61"  _
                                                              &"gOymEV9GZKcz67VF7x2n3NHdu7nrgtEAdTotrgvfx4H+nWz+PUVyL7c1HPTc+PYAZIxWzeBC+XH4kFNy"  _
                                                              &"DJN7vbnYrBkCXHFpqqysXPMLp6fuIvOfMBRIwqCaHd00ILk0cQE7GMAVg4WFhet66cRYE4ZlOTCGRURE"  _
                                                              &"KDmAVbwFNy4NBgYGarRa7frOgNr5TcONjIyAz+dzL+5fMIAfclsfBQUFMKdpNBq2kcThYNqAexhA64WO"  _
                                                              &"59KkhYUFsrOzoVKpTA43Pj6O6OhotZ7uWtPy9lu6vvabu7u7LisrC2VlZWhoaIBIJDKK6urq2HZeWloa"  _
                                                              &"bWNjo69nyAB7cnuEJVvVwNQT2lRDjfNrWwzHtODe5q1iCUSTWwDXQ+TLW4clEdUuwNILDUVjimm1jRKV"  _
                                                              &"Eh00BPE/dvAaDI4GFW0AAAAASUVORK5CYII="

#end Region

End Sub

#Region MakeDrawable / MakeBitmap
#if B4A
Private Sub MakeDrawable(BitmapString As String) As BitmapDrawable

    		Dim DDBitmap As BitmapDrawable
		
    		Dim Bmp      As Bitmap
            Dim lv 		 As LayoutValues = GetDeviceLayoutValues

			Bmp = mB64Image.DecodeToImage(BitmapString)
			Bmp = CreateScaledBitmap(Bmp, Bmp.Width * lv.Scale, Bmp.Height * lv.Scale, gNarrowBitmaps)
				
			DDBitmap.Initialize(Bmp)	

			Return DDBitmap
End Sub
#else if B4I
Private Sub MakeDrawable(BitmapString As String) As Bitmap
			Dim Bmp As Bitmap = Base64StringToImage(BitmapString)
			
			Bmp = Bmp.Resize(Bmp.Width, Bmp.Height, gNarrowBitmaps)
			
			Return Bmp
End Sub
#end if

Private Sub MakeBitmap(BitmapString As String) As Bitmap

    		Dim DDBitmap As Bitmap
		
    		Dim Bmp      As Bitmap
            Dim lv 		 As LayoutValues = GetDeviceLayoutValues

			#if B4A
			Bmp 			= mB64Image.DecodeToImage(BitmapString)
			#Else if B4I
			Bmp				= Base64StringToImage(BitmapString)
			#end if
			
			DDBitmap	 	= CreateScaledBitmap(Bmp, Bmp.Width * lv.Scale, Bmp.Height * lv.Scale, True)
				
			Return DDBitmap
End Sub

Private Sub ScaleBitmap(Bmp As Bitmap) As Bitmap
            Dim lv 		 As LayoutValues = GetDeviceLayoutValues

			Return CreateScaledBitmap(Bmp, Bmp.Width * lv.Scale, Bmp.Height * lv.Scale, True)
End Sub

Private Sub CreateScaledBitmap(Original As Bitmap, Width As Int, Height As Int, Filter As Boolean) As Bitmap
			#if B4A
  			Dim jo As JavaObject
			
  			jo.InitializeStatic("android.graphics.Bitmap")
  			Return jo.RunMethod("createScaledBitmap", Array (Original, Width, Height, Filter))
			#else if B4I
			Return Original.Resize(Width, Height, Filter)	
			#end if			
End Sub
#end Region

#Region GetParent
Private Sub GetParent(v As View) As View
			#if B4A
			Try
    			Dim jo = v As JavaObject
    			Return jo.RunMethod("getParent", Null)
			Catch
				Return Null
			End Try
			#else if B4I
				Return v.Parent
			#end if
End Sub
#end Region

#Region MakeTDropDown_Border / MakeTDropDown_Text 
Public  Sub MakeTDropDown_Border(FillColor As Int, CornerRadius As Int, BorderWidth As Int, BorderColor As Int) As TDropDown_Border

    		Dim DDBorder As TDropDown_Border
	
			DDBorder.Initialize
			DDBorder.FillColor    = FillColor
			DDBorder.CornerRadius = CornerRadius
			DDBorder.BorderWidth  = BorderWidth
			DDBorder.BorderColor  = BorderColor
	
			DDBorder.DrawColor.Initialize2(DDBorder.FillColor, DDBorder.CornerRadius, DDBorder.BorderWidth, DDBorder.BorderColor)
	
			Return DDBorder
End Sub	

#if B4A
Public  Sub MakeTDropDown_Text(Indent As Int, TextSize As Int, BGTextColor As Int, FGTextColor As Int, TextTypeFace As Typeface, TextGravity As Int) As TDropDown_Text
#else if B4I
Public  Sub MakeTDropDown_Text(Indent As Int, TextSize As Int, BGTextColor As Int, FGTextColor As Int, TextTypeFace As Font, TextGravity As Int) As TDropDown_Text
#end if
        	Dim DDText As TDropDown_Text
	   
	   
	    	DDText.Initialize
			DDText.Indent		= Indent
	    	DDText.TextSize     = TextSize
	    	DDText.FGColor      = FGTextColor
	    	DDText.BGColor      = BGTextColor
	    	DDText.TextTypeFace = TextTypeFace
	    	DDText.TextGravity  = TextGravity
	   
	    	Return DDText
End Sub
#end Region

#Region Initialize / InitializeCommon
'Private Sub InternalInitialize
'  			Dim r As Reflector
'			
'  			r.Target = Me
'  			r.Runmethod4("innerInitialize", Array As Object(r.GetProcessBA("main")), Array As String("anywheresoftware.b4a.BA"))
'End Sub
'
Public  Sub Initialize(xRoot As B4XView, xCallRoutine As Object, xCallFunction As String, xNarrowBitmaps As Boolean, xSmallScreen As Boolean)
	
			mHideKB			= Null
			
			mRoot = xRoot
			
			mDDListItems.Initialize

			mLastSelected		= -1
			mPreviousSelected 	= -1
			gNarrowBitmaps  	= xNarrowBitmaps
			gSmallScreen		= xSmallScreen
			
			
			If  cRelativePosition.IsInitialized = False Then cRelativePosition.Initialize
			If  mT8TextSize.IsInitialized		= False Then mT8TextSize.Initialize
			
        	InitializeCommon(mRoot, xCallRoutine, xCallFunction, xNarrowBitmaps)
End Sub

'------------------------------------------------------------------------------------------------------------
'  Initialize2 will use Narrow DropDown Arrows
'------------------------------------------------------------------------------------------------------------
'Public  Sub Initialize2(ActiveActivity As Activity, CallRoutine As Object, CallFunction As String)
'			InternalInitialize	
'			
'			mActiveActivity = ActiveActivity
'			
'			mDDListItems.Initialize
'
'			mLastSelected	= -1
'			
'			If  cRelativePosition.IsInitialized = False Then cRelativePosition.Initialize
'			If  mT8TextSize.IsInitialized		= False Then mT8TextSize.Initialize(ActiveActivity)
'			
'        	InitializeCommon(ActiveActivity, CallRoutine, CallFunction, gNarrowBitmaps)
'End Sub

Private Sub InitializeCommon(Root As B4XView, CallRoutine As Object, CallFunction As String, NarrowBitmaps As Boolean)	'Ignore
			mFirsTDropDown = True
		
    		mDDListBorder  			= MakeTDropDown_Border(Colors.Gray,  		0dip, 2dip, Colors.Black)
    		mDDFrameBorder 			= MakeTDropDown_Border(Colors.White, 		5dip, 2dip, Colors.Black)
			mDDFrameBorderDisabled	= MakeTDropDown_Border(Colors.LightGray, 	5dip, 2dip, Colors.Black)

    		mDDListText    			= MakeTDropDown_Text(5dip, 20, Colors.Gray,  		Colors.White, Typeface.DEFAULT,      Bit.Or(Gravity.LEFT, Gravity.CENTER_VERTICAL))
			
			mDDText		   			= MakeTDropDown_Text(5dip, 20, Colors.White, 		Colors.Blue,  Typeface.DEFAULT_BOLD, Bit.Or(Gravity.LEFT, Gravity.CENTER_VERTICAL))
			mDDTextDisabled		   	= MakeTDropDown_Text(5dip, 20, Colors.LightGray, 	Colors.Blue,  Typeface.DEFAULT_BOLD, Bit.Or(Gravity.LEFT, Gravity.CENTER_VERTICAL))

			#If B4A
    		mIMELibrary.Initialize("")
    		mB64Image.Initialize
			#end if

			
    		mCallRoutine	= CallRoutine
    		mCallFunction   = CallFunction

    		mDDDisplay.Initialize("cDropDown_Display")	
			mDDDisplay.SingleLine	= True
			
'			SetDisplayInfo(Null)

    		mDDListFrame.Initialize("cDropDown_ListFrame")
    		mDDListFrame.Background = mDDListBorder.DrawColor	
		
    		mDDList.Initialize(mDefaultItemHeight)		', "cDropDown_List")
			
			'--------------------------------------------------------------------------------------------------------
			'	Chromebook does not let you click on Icon because it is too small and it sees scrollbar instead
			'--------------------------------------------------------------------------------------------------------
			Dim r As Reflector
				
			r.Target = mDDList
			
			r.RunMethod2("setVerticalScrollBarEnabled", False, 	"java.lang.boolean")
			r.RunMethod2("setOverScrollMode", 			2, 		"java.lang.int" )
			'--------------------------------------------------------------------------------------------------------

			
'			SetListInfo(Null)
	
    		mDDButton.Initialize("cDropDown_Button")

			If  NarrowBitmaps Then
    			mDDArrowDown         		= MakeDrawable(mDDArrowDown_Narrow_String)
    			mDDArrowDown_Pressed 		= MakeDrawable(mDDArrowDownPressed_Narrow_String)
			Else
    			mDDArrowDown         		= MakeDrawable(mDDArrowDown_String)
	    		mDDArrowDown_Pressed 		= MakeDrawable(mDDArrowDownPressed_String)
    		End If
					
			mCheckBox_Unchecked				= MakeBitmap(UnChecked_String)
			mCheckBox_Checked_Blue			= MakeBitmap(CheckedBlue_String)
			mCheckBox_Checked_Green			= MakeBitmap(CheckedGreen_String)
				
			Dim DDBitmap	As Bitmap 		= mDDArrowDown.Bitmap
							
			mDDButtonHeight      			= DDBitmap.Height
			mDDButtonWidth       			= DDBitmap.Width
	
			If  mDDButtonHeight < DDBitmap.Height Then mDDButtonHeight = DDBitmap.Height
			If  mDDButtonWidth  < DDBitmap.Width  Then mDDButtonWidth  = DDBitmap.Width	
End Sub
#end Region

#Region Attach  /  Attach2  /  Attach3  /  AttachToPanels  /  GetAttachedTo
Public  Sub Attach(AttachTo As Panel)
			AttachToPanels(AttachTo, GetParent(AttachTo), GetParent(AttachTo))
End Sub

Public  Sub Attach2(AttachTo As Panel, AttachToParent As Panel)
			AttachToPanels(AttachTo, AttachToParent, AttachToParent)
End Sub

Public  Sub Attach3(AttachTo As Panel, UseForSize As Panel)	
			AttachToPanels(AttachTo, GetParent(AttachTo), UseForSize)
End Sub

Public  Sub Attach4(AttachTo As Panel, AttachedToParent As Panel, UseForSize As Panel)	
			AttachToPanels(AttachTo, AttachedToParent, UseForSize)
End Sub

Public  Sub Attach5(AttachTo As Panel, AttachedToParent As Panel, UseForSize As Panel, GridPanel As Panel)	
'			mGridPanel  = GridPanel
			mIsGridList = True
			
			AttachToPanels(AttachTo, AttachedToParent, UseForSize)
End Sub

Public  Sub AttachToPanels(AttachTo As Panel, AttachToParent As Panel, UseForSize As Panel)	
        	Try
		   		mUseForSize = UseForSize
		   
		   		If  mAttachTo.IsInitialized Then
 		   	  		mAttachTo.RemoveAllViews 
			  
		   	  		If  mTouchEater.IsInitialized  Then mTouchEater.RemoveAllViews
			  		If  mTouchEater.IsInitialized  Then mTouchEater.RemoveView

 			  		If  mDDList.IsInitialized	    Then mDDList.RemoveView			  
			  		If  mDDListFrame.IsInitialized Then mDDListFrame.RemoveAllViews

		   	  		If  mDDDisplay.IsInitialized   Then mDDDisplay.RemoveView
			  		If  mDDButton.IsInitialized    Then mDDButton.RemoveView
			  
	          		mPopListDown  = True
			  		mCenterRight  = False
		   		End If
		   
'          		mParent   		  = AttachToParent		
	       		mAttachTo 		  = AttachTo

				
				Dim RelativeLT  As TRelativeLT


				RelativeLT 		= cRelativePosition.GetRelativeLT(mAttachTo)
				
								
				mAttachTo_Left	  		= RelativeLT.Left
				mAttachTo_Top	  		= RelativeLT.Top				

	       		mAttachTo.Background 	= mDDFrameBorder.DrawColor
				
    			mDDListFrame.Background = mDDListBorder.DrawColor					
		
	       		If  mDDButtonHeight >= (mAttachTo.Height-10dip) Then mDDButtonHeight = mAttachTo.Height - 10dip
	
		   		If  mDDButtonStateList.IsInitialized = False Then
           	  		mDDButtonStateList.Initialize
           	  		mDDButtonStateList.AddState(mDDButtonStateList.State_Pressed, mDDArrowDown_Pressed)
           	  		mDDButtonStateList.AddState(mDDButtonStateList.State_Enabled, mDDArrowDown)
		   		End If
		   
           		mDDButton.Background = mDDButtonStateList

				mAttachTo.Color		 = mDDText.BGColor
				
           		mAttachTo.AddView(mDDDisplay, 0, 0, 0, 0)		
		   		mAttachTo.AddView(mDDButton,  0, 0, mDDButtonWidth, mDDButtonHeight)
		
		
'				RelativeLT = cRelativePosition.GetRelativeLT(mDDDisplay)
'
'				mAttachTo_Left	  		= RelativeLT.Left
'				mAttachTo_Top	  		= RelativeLT.Top				
		
		
		
		   		mTouchEater.Initialize("cDropDown_TouchEater")		
           		mTouchEater.Color = Colors.Transparent   
				
		   		mRoot.AddView(mTouchEater, 0, 0, mRoot.Width, mRoot.Height)
				

				If  mIsGridList Then
		       		Dim UseThisHeight         As Int =  mAttachTo.Height * mDDMaxToShow

mAttachTo_Top = 0
'					Log("mUserForSize.Top   :" &mUseForSize.Top    &"   mAttachTo.Width :" &mAttachTo.Width  &"  mAttacheTo.Left:"  &mAttachTo.Left)		   
'					Log("mUserForSize.Height:" &mUseForSize.Height &"   mAttachTo.Height:" &mAttachTo.Height &"  mGridPanel.Left:"  &mGridPanel.Left)
							   
    	       		Dim AvailableHeightDown   As Int = (mUseForSize.Height - mAttachTo_Top) - mAttachTo.Height
			   		Dim AvailableHeightUp     As Int = (mAttachTo_Top - mUseForSize.Top)

           			If  mCenterRight Then
              			mTouchEater.AddView(mDDListFrame, mAttachTo_Left+mAttachTo.Width, 0, mAttachTo.Width, UseThisHeight)		   		   							
			   		Else
						If  UseThisHeight < AvailableHeightDown Then
	    	     			mPopListDown = True
		   
            	     		If  UseThisHeight > AvailableHeightDown Then UseThisHeight = AvailableHeightDown		   
						
'Log("1 mDDListFrame(L/T) " &(mAttachTo_Left+10dip) &" / " &(mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip) &"  (W/H) "  &mAttachTo.Width &" / " &UseThisHeight)		   		   

               				mTouchEater.AddView(mDDListFrame, mAttachTo_Left+10dip, (mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip), mAttachTo.Width, UseThisHeight)		   		   
						Else						
              				If  AvailableHeightDown > AvailableHeightUp Then
		         				mPopListDown = True
		   
		                 		If  UseThisHeight > AvailableHeightDown Then UseThisHeight = AvailableHeightDown		   

'Log("2 mDDListFrame(L/T) " &(mAttachTo_Left+10dip) &" / " &(mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip) &"  (W/H) "  &mAttachTo.Width &" / " &UseThisHeight)		   		   
		   
    	             			mTouchEater.AddView(mDDListFrame, mAttachTo_Left+10dip, (mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip), mAttachTo.Width, UseThisHeight)		   		   
			          		Else
        		         		If  UseThisHeight > AvailableHeightUp Then UseThisHeight = AvailableHeightUp

'Log("3 mDDListFrame(L/T) " &(mAttachTo_Left+10dip) &" / " &(mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip) &"  (W/H) "  &mAttachTo.Width &" / " &UseThisHeight)		   		   
		   
                		 		mTouchEater.AddView(mDDListFrame, mAttachTo_Left+10dip, (mAttachTo_Top - UseThisHeight + mDDListBorder.BorderWidth + 10dip), mAttachTo.Width, UseThisHeight)		   		   		   		   
	  	      				End If
						End If
			   		End If					
				Else
'					Log("mUserForSize.Top   :" &mUseForSize.Top    &"   mAttachTo.Width :" &mAttachTo.Width  &"  mAttacheTo.Left:"  &mAttachTo.Left)		   
'					Log("mUserForSize.Height:" &mUseForSize.Height &"   mAttachTo.Height:" &mAttachTo.Height)
					
		       		Dim UseThisHeight         As Int =  mAttachTo.Height * mDDMaxToShow

'					Log("UseThisHeight:" &UseThisHeight)
		   
    	       		Dim AvailableHeightDown   As Int = (mUseForSize.Height - mAttachTo_Top) - mAttachTo.Height
			   		Dim AvailableHeightUp     As Int = (mAttachTo_Top - mUseForSize.Top)

'					Log("AvailableHeightDown:" &AvailableHeightDown)
'					Log(" AvailableHeightUp:" &AvailableHeightUp)					

           			If  mCenterRight Then
              			mTouchEater.AddView(mDDListFrame, mAttachTo_Left+mAttachTo.Width, 0, mAttachTo.Width, UseThisHeight)		   		   							
			   		Else
						If  UseThisHeight < AvailableHeightDown Then
	    	     			mPopListDown = True
		   
'Log("UseThisHeight < AvailableHeightDown")
		   
'            	     		If  UseThisHeight > AvailableHeightDown Then UseThisHeight = AvailableHeightDown		   
						
               				mTouchEater.AddView(mDDListFrame, mAttachTo_Left+10dip, (mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip), mAttachTo.Width, UseThisHeight)		   		   
						Else						
              				If  AvailableHeightDown > AvailableHeightUp Then
		         				mPopListDown = True

'Log("UseThisHeight > AvailableHeightDown")

'AvailableHeightDown = 100dip
		   
		                 		If  UseThisHeight > AvailableHeightDown Then UseThisHeight = AvailableHeightDown		   
		   
    	             			mTouchEater.AddView(mDDListFrame, mAttachTo_Left+10dip, (mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip), mAttachTo.Width, UseThisHeight)		   		   
			          		Else								
		         				mPopListDown = False
								
        		         		If  UseThisHeight > AvailableHeightUp Then UseThisHeight = AvailableHeightUp
		   
                		 		mTouchEater.AddView(mDDListFrame, mAttachTo_Left+10dip, (mAttachTo_Top - UseThisHeight + mDDListBorder.BorderWidth + 10dip), mAttachTo.Width, UseThisHeight)		   		   		   		   
	  	      				End If
						End If
			   		End If
				End If

	
   		   		mDDListFrame.AddView(mDDList, mDDListBorder.BorderWidth, mDDListBorder.BorderWidth, mDDListFrame.Width-(mDDListBorder.BorderWidth * 2), mDDListFrame.Height-(mDDListBorder.BorderWidth * 2))
				
           		ResizePanel(mAttachTo.Width, mAttachTo.Height)
				
		   		Close_DropDown(False)

           		mAttachTo.BringToFront
       		Catch
        		Log(LastException.Message)
       		End Try
End Sub


Public  Sub GetAttachedTo As Panel               
        	Return mAttachTo
End Sub

Public  Sub HideKB(KB As Object)
			mHideKB = KB
End Sub
#End Region

'Public  Sub SetHeightAddOn(HeightAddOn As Int)
'			mHeightAddOn = HeightAddOn
'End Sub

#Region  Frame_Touch / TouchEater_Touch
Private Sub cDropDown_ListFrame_Touch(Action As Int, X As Float, Y As Float)  As Boolean
#if DebugX
			Log("cDropDown_ListFrame_Touch")			
#end if
	
	    	Return False
End Sub

Private Sub cDropDown_TouchEater_Touch(Action As Int, X As Float, Y As Float)  As Boolean
#if DebugX
			Log("cDropDown_TouchEater_Touch")									
#end if

#if __SnapShots__
			If  cSnapshot.TakingSnapShots Then			
				cSnapshot.TakeSnapShot(mActiveActivity, Starter.gDirectorySnapShots, "DropDown")
			End If
#end if

        	If  mUseTouchEater Then Close_DropDown(True)
	
	    	Return False
End Sub
#end Region

Public 	Sub SetAutoSizeDisplay(SetIt As Boolean)
			mAutoSizeDisplay = SetIt	
End Sub

#Region SetBorderFrame  /  SetListFrame  /  SetTextSize  /  SetDisplayInfo  /  SetDisplayColors  /  SetListInfo
Public  Sub SetBorderFrame(BorderFrame As TDropDown_Border)
        	If  BorderFrame = Null Or BorderFrame.IsInitialized = False Then
	       		If  mDDFrameBorder.IsInitialized = False Then Return
	    	Else
	       		mDDFrameBorder 			= MakeTDropDown_Border(BorderFrame.FillColor, 	BorderFrame.CornerRadius, BorderFrame.BorderWidth, BorderFrame.BorderColor)
	       		mDDFrameBorderDisabled 	= MakeTDropDown_Border(Colors.LightGray, 		BorderFrame.CornerRadius, BorderFrame.BorderWidth, BorderFrame.BorderColor)				
	    	End If
	   
	    	If  mAttachTo.IsInitialized Then 
	       		mAttachTo.Background = mDDFrameBorder.DrawColor
				
           		ResizePosition
	    	End If
End Sub

Public  Sub SetListFrame(ListFrame As TDropDown_Border)
        	If  ListFrame = Null Or ListFrame.IsInitialized = False Then
	       		If  mDDListBorder.IsInitialized = False Then Return
	    	Else
	       		mDDListBorder = MakeTDropDown_Border(ListFrame.FillColor, ListFrame.CornerRadius, ListFrame.BorderWidth, ListFrame.BorderColor)
	    	End If
	   
	    	If  mDDListFrame.IsInitialized Then 
				mDDListFrame.Background = mDDListBorder.DrawColor
			End If
End Sub

'Public  Sub SetTextSize(TextSize As Int, ListAsWell As Boolean)
'        	If  mDDText.IsInitialized = False Then Return
'	   
'	    	mDDText.TextSize = TextSize
'	   
'	    	If  mDDDisplay.IsInitialized Then mDDDisplay.TextSize = TextSize
'	   
'	    	If  ListAsWell And mDDListText.IsInitialized Then 
'	       		mDDListText.TextSize = TextSize
'		   		SetListEntry(mDDListText)
'	    	End If
'End Sub

Public  Sub SetTag(xTag As String)
			If  mDDDisplay.IsInitialized Then
    			mDDDisplay.Tag = xTag
			End If
			
			If  mDDButton.IsInitialized Then
				mDDButton.Tag = xTag
			End If
			
			If  mDDListFrame.IsInitialized Then
    			mDDListFrame.Tag = xTag
			End If
				
			If  mDDList.IsInitialized Then
    			mDDList.Tag = xTag
			End If	
End Sub

Public  Sub SetDisplayInfo(DisplayInfo As TDropDown_Text)

	    	If  DisplayInfo = Null Or DisplayInfo.IsInitialized = False Then
	       		If  mDDText.IsInitialized = False Then Return
	    	Else
	       		mDDText 		= MakeTDropDown_Text(DisplayInfo.Indent, DisplayInfo.TextSize, DisplayInfo.BGColor, DisplayInfo.FGColor, DisplayInfo.TextTypeFace, DisplayInfo.TextGravity)
	       		mDDTextDisabled = MakeTDropDown_Text(DisplayInfo.Indent, DisplayInfo.TextSize, Colors.LightGray, 	DisplayInfo.FGColor, DisplayInfo.TextTypeFace, DisplayInfo.TextGravity)
	    	End If


        	mDDDisplay.TextSize  = mDDText.TextSize
	    	mDDDisplay.Typeface  = mDDText.TextTypeFace
	    	mDDDisplay.TextColor = mDDText.FGColor
	    	mDDDisplay.Color     = mDDText.BGColor
        	mDDDisplay.Gravity   = mDDText.TextGravity	
			mDDDisplay.Padding	 = Array As Int(0,0,0,0)  
			
			If  mDDDisplay.Parent <> Null Then
            	mT8TextSize.SingleLineNoLarger(mDDDisplay)
			End If			 
End Sub

Public  Sub SetDisplayInfo_Color(SetFG As Boolean, Color As Long)
			If  SetFG Then
				mDDDisplay.TextColor = Color
			Else
				mDDDisplay.Color	 = Color
			End If
End Sub

'Public  Sub SetDisplayColors(FGColor As Int, BGColor As Int)
'        	mDDText.FGColor = FGColor
'	    	mDDText.BGColor = BGColor
'
'	    	mDDDisplay.TextColor = mDDText.FGColor
'	    	mDDDisplay.Color     = mDDText.BGColor
'End Sub	   

Public  Sub SetListInfo(ListInfo As TDropDown_Text)

	    	If  ListInfo = Null Or ListInfo.IsInitialized = False Then
	       		If  mDDListText.IsInitialized = False Then Return
	    	Else
	       		mDDListText = MakeTDropDown_Text(ListInfo.Indent, ListInfo.TextSize, ListInfo.BGColor, ListInfo.FGColor, ListInfo.TextTypeFace, ListInfo.TextGravity)
	    	End If

        	mDDList.Color = mDDListText.BGColor

	    	SetListEntry(mDDListText)
End Sub
#end Region

Public  Sub ButtonInFront(InFront As Boolean) 
        	mButtonInFront = InFront
	   
	    	ResizePosition
End Sub

Public  Sub KeepOpen(Keep_Open As Boolean)
			mKeepOpen = Keep_Open
End Sub

Public  Sub CenterRight(Center_Right As Boolean)
        	mCenterRight = Center_Right
End Sub	  

Public  Sub ShowButton(Show_Button As Boolean)

'			Log($"ShowButton: ${Show_Button} for Button:${mCallFunction}"$)
			
        	mShowButton = Show_Button
	   
	    	ResizePosition
End Sub

Public  Sub UseTouchEater(TouchEater As Boolean)
        	mUseTouchEater = TouchEater
End Sub	  

Public  Sub Clear
			ClearSelected     
		
			mWidestItem = ""
			
			mDDListItems.Clear           
			
			mDDList.Panel.RemoveAllViews
End Sub

Public  Sub ClearSelected
			mDDDisplay.Text 	= ""
			
			mPreviousSelected 	= mLastSelected			
			mLastSelected   	= -1
			


			mAddingItem = True
						
						
			Dim ItemEntry As TDropDown_ItemEntry					
					
			For i = 0 To mDDListItems.Size-1
				ItemEntry = mDDListItems.Get(i)											
						
				If  ItemEntry.ItemToggleButton.IsInitialized Then
					If  ItemEntry.ItemToggleButton.Checked Then
						ItemEntry.ItemToggleButton.Checked = False
						Sleep(0)
					End If
				End If
			Next			
			
			mAddingItem = False
End Sub

Public  Sub PassTag(Pass_Tag As Boolean) 
        	mPassTag = Pass_Tag
End Sub	   

Public  Sub GetDisplay  As Label
			Return mDDDisplay
End Sub

Public  Sub ShowMaxItems(MaxItems As Int)

        	mDDMaxToShow 	= MaxItems
			
			ResetFrameSize			
			ResizePosition						
End Sub

#Region EnabledDisable  /   ShowEnabled  /  ShowEnabledAttachedTo 
Public  Sub EnableDisable(Enable As Boolean)
			mDDDisplay.Enabled  = Enable			
			
			mDDButton.Enabled   = Enable And mShowButton
			mDDButton.Visible	= Enable And mShowButton			
			
			If  Enable Then
				mDDDisplay.Color		= mDDText.BGColor
				mAttachTo.Background	= mDDFrameBorder.DrawColor				
			Else
				mDDDisplay.Color		= mDDTextDisabled.BGColor
				mAttachTo.Background	= mDDFrameBorderDisabled.DrawColor
			End If
End Sub

Public  Sub ShowEnabled(ShowEnable As Boolean)
        	mDDListFrame.Enabled = ShowEnable

        	mDDList.Enabled      = ShowEnable
        	mDDList.Visible      = ShowEnable

        	mDDButton.Enabled    = ShowEnable And mShowButton
        	mDDButton.Visible    = ShowEnable And mShowButton
End Sub

Public  Sub ShowEnabledAttachedTo(ShowEnable As Boolean)
        	mAttachTo.Enabled = ShowEnable
        	mAttachTo.Visible = ShowEnable
End Sub
#end Region

Public  Sub SetWidestLineFont
			Dim TempLabel As Label
			
			TempLabel.Initialize("")
			TempLabel.Text 		= mWidestItem
			TempLabel.TextSize	= mDDText.TextSize
			TempLabel.Typeface	= mDDText.TextTypeFace
			TempLabel.Padding	= Array As Int(0, 0, 0, 0)
			TempLabel.Visible   = False
			
			mAttachTo.AddView(TempLabel, 0, 0, mAttachTo.Width-15dip, mAttachTo.Height)			
			
			If  mT8TextSize.IsInitialized = False Then mT8TextSize.Initialize
			
'Log("SetWidestLineFont:" &mWidestItem &"  TextSize:" &TempLabel.TextSize)			
			mT8TextSize.SingleLineNoLarger(TempLabel)
'Log("SetWidestLineFont:" &mWidestItem &"  TextSize:" &TempLabel.TextSize)			
			
			TempLabel.RemoveView
			
'			mDDList.SingleLineLayout.Label.Padding  = Array As Int(0, 0, 0, 0)
'			mDDList.SingleLineLayout.Label.TextSize = TempLabel.TextSize
End Sub

Private Sub SetListEntry(EntryListColors As TDropDown_Text)		'Ignore
	   
'	   		mDDList.SingleLineLayout.ItemHeight		 = mDefaultItemHeight
'	    	mDDList.SingleLineLayout.Label.Color     = EntryListColors.BGColor
'	    	mDDList.SingleLineLayout.Label.TextColor = EntryListColors.FGColor
'	    	mDDList.SingleLineLayout.Label.TextSize  = EntryListColors.TextSize
'			mDDList.SingleLineLayout.Label.Padding	 = Array As Int(0, 0, 0, 0)
'	    	mDDList.SingleLineLayout.Label.Typeface  = EntryListColors.TextTypeFace
'	    	mDDList.SingleLineLayout.Label.Gravity   = EntryListColors.TextGravity	
End Sub

Public  Sub SetAsGridList(Is_GridList As Boolean)
			mIsGridList = Is_GridList
End Sub

Public  Sub IsGridList As Boolean
			Return mIsGridList
End Sub

#Region Add Routines
Public  Sub AddItem(ItemNumber As Int, Text As Object, UserData As Object)

			Dim ItemInfo 	As TDropDown_ItemInfo
		
			ItemInfo.Initialize
			ItemInfo.ID		    = ItemNumber
			ItemInfo.TextString = Text
			ItemInfo.TextPassed = Text
			ItemInfo.UserData	= UserData
			
			AddItemInfo(ItemInfo)
End Sub			
		
Public  Sub AddItemInfo(ItemInfo As TDropDown_ItemInfo)
	
			Dim  ItemEntry As TDropDown_ItemEntry
			
			ItemEntry.Initialize
			ItemEntry.ItemInfo				= ItemInfo
			
			ItemEntry.ItemPanel				= Null
			ItemEntry.ItemLabel				= Null
			ItemEntry.ItemImageView 		= Null
			ItemEntry.ItemToggleButton 		= Null
					
			ItemEntry.ShowImage.Initialize
			ItemEntry.ShowCheckBox.Initialize
			
			Add_Item(ItemEntry)
End Sub

Public  Sub AddCheckBox(ItemNumber As Int, Text As Object, UserData As Object, Checked As Boolean, BlueCheck As Boolean, InFront As Boolean)

			Dim ItemEntry 	As TDropDown_ItemEntry 
		
			ItemEntry.Initialize
			ItemEntry.ItemInfo.Initialize
			ItemEntry.ItemInfo.ID		    	= ItemNumber
			ItemEntry.ItemInfo.TextPassed   	= Text
			ItemEntry.ItemInfo.TextString		= Text 
			
			ItemEntry.ItemInfo.UserData			= UserData
			
			ItemEntry.ItemPanel					= Null
			ItemEntry.ItemLabel					= Null
			ItemEntry.ItemImageView 			= Null
			ItemEntry.ItemToggleButton 			= Null
					
			ItemEntry.ShowImage.Initialize
			ItemEntry.ShowCheckBox.Initialize
			ItemEntry.ShowCheckBox.WantCheckBox	= True
			
			If  BlueCheck Then
				ItemEntry.ShowCheckBox.UseBitmaps	= Array As Bitmap(mCheckBox_Checked_Blue,  mCheckBox_Unchecked)
			Else
				ItemEntry.ShowCheckBox.UseBitmaps	= Array As Bitmap(mCheckBox_Checked_Green, mCheckBox_Unchecked)
			End If				
			
			ItemEntry.ShowCheckBox.CheckBoxInfo.Initialize
			ItemEntry.ShowCheckBox.CheckBoxInfo.Indent		= 3dip
			ItemEntry.ShowCheckBox.CheckBoxInfo.Checked		= Checked
			ItemEntry.ShowCheckBox.CheckBoxInfo.InFront		= InFront
		
			Add_Item(ItemEntry)	
End Sub

Public  Sub AddCheckBox2(ItemNumber As Int, Text As Object, UserData As Object, Checked As Boolean, CheckedBox As Bitmap, UnCheckBox As Bitmap, InFront As Boolean, ScaleBitmaps As Boolean)

			Dim ItemEntry 	As TDropDown_ItemEntry 
		
			ItemEntry.Initialize
			ItemEntry.ItemInfo.Initialize
			ItemEntry.ItemInfo.ID		    = ItemNumber
			ItemEntry.ItemInfo.TextPassed   = Text 
			ItemEntry.ItemInfo.TextString	= Text
			ItemEntry.ItemInfo.UserData		= UserData
			
			ItemEntry.ItemPanel				= Null
			ItemEntry.ItemLabel				= Null
			ItemEntry.ItemImageView 		= Null
			ItemEntry.ItemToggleButton 		= Null
					
			ItemEntry.ShowImage.Initialize
			
			ItemEntry.ShowCheckBox.Initialize
			ItemEntry.ShowCheckBox.WantCheckBox	= True
			
			If  ScaleBitmaps Then
				ItemEntry.ShowCheckBox.UseBitmaps	= Array As Bitmap(ScaleBitmap(CheckedBox), ScaleBitmap(UnCheckBox))
			Else
				ItemEntry.ShowCheckBox.UseBitmaps	= Array As Bitmap(CheckedBox, UnCheckBox)
			End If
			
			ItemEntry.ShowCheckBox.CheckBoxInfo.Initialize
			ItemEntry.ShowCheckBox.CheckBoxInfo.Indent		= 3dip
			ItemEntry.ShowCheckBox.CheckBoxInfo.Checked		= Checked
			ItemEntry.ShowCheckBox.CheckBoxInfo.InFront		= InFront
		
			Add_Item(ItemEntry)
End Sub	

Public  Sub AddAll_ListsAsCheckBox(Text As List, Values As List, Selected As List) As Boolean

			If  Selected.Size <> Text.Size Or Selected.Size <> Values.Size Then Return False
			
			For i = 0 To Selected.Size-1
				AddCheckBox(i, Text.Get(i), Values.Get(i), Selected.Get(i), True, True)				
			Next
		
			ResetFrameSize
			
			Return True
End Sub

Public  Sub AddAll_Lists(Text As List, Values As List)

			If  Text.Size <> Values.Size Then Return
			
			For i = 0 To Text.Size-1
				AddItem(i, Text.Get(i), Values.Get(i))				
			Next
		
			ResetFrameSize
End Sub

Public  Sub AddAll_ItemInfo(Items As List)
			For i = 0 To Items.Size-1
				AddItemInfo(Items.Get(i))				
			Next				
End Sub

Public  Sub AddAll_Array(Items() As String)

			For i = 0 To Items.Length-1
				AddItem(i, Items(i), Null)			
			Next
End Sub

Public  Sub AddAll_List(Items As List)

			For i = 0 To Items.Size-1
				AddItem(i, Items.Get(i), Null)				
			Next
End Sub

Public  Sub AddImage(ItemNumber As Int, Text As Object, UserData As Object, UserImage As Object, InFront As Boolean, ScaleImage As Boolean)

			Dim ItemEntry 	As TDropDown_ItemEntry 
		
			ItemEntry.Initialize
			ItemEntry.ItemInfo.Initialize
			ItemEntry.ItemInfo.ID		    = ItemNumber
			ItemEntry.ItemInfo.TextPassed   = Text 
			ItemEntry.ItemInfo.TextString	= Text
			ItemEntry.ItemInfo.UserData		= UserData
			 
			ItemEntry.ItemPanel				= Null
			ItemEntry.ItemLabel				= Null
			ItemEntry.ItemImageView 		= Null
			ItemEntry.ItemToggleButton 		= Null
					
			ItemEntry.ShowImage.Initialize
			ItemEntry.ShowImage.WantImage	= True
			
			If  UserImage Is String Then
				Dim FileName As String = UserImage 
				
				If  File.Exists(File.DirAssets, FileName) Then		
					Try
						UserImage = LoadBitmap(File.DirAssets, FileName)
					Catch
						Log($"cDropDown::AddImage::FAILED - ${FileName}"$)
						
						Dim bmp As Bitmap
						
						bmp.InitializeMutable(40dip, 40dip)
						
						UserImage = bmp
					End Try
				Else
					Log($"cDropDown::AddImage::NOT FOUND - ${FileName}"$)				
					
					Dim bmp As Bitmap
						
					bmp.InitializeMutable(40dip, 40dip)
						
					UserImage = bmp					
				End If			
			End If
			
			If  ScaleImage Then
				If  UserImage Is BitmapDrawable Then
					Dim Drawable As BitmapDrawable = UserImage
				
					ItemEntry.ShowImage.UserImage.Initialize(ScaleBitmap(Drawable.Bitmap))
				Else
					ItemEntry.ShowImage.UserImage.Initialize(ScaleBitmap(UserImage))
				End If
			Else
				If  UserImage Is BitmapDrawable Then
					ItemEntry.ShowImage.UserImage = UserImage
				Else
					ItemEntry.ShowImage.UserImage.Initialize(UserImage)
				End If				
			End If
			
			ItemEntry.ShowImage.ImageInfo.Initialize
			ItemEntry.ShowImage.ImageInfo.Indent	= 3dip
			ItemEntry.ShowImage.ImageInfo.InFront	= InFront
			
			ItemEntry.ShowCheckBox.Initialize
		
			Add_Item(ItemEntry)
End Sub	

Private Sub Add_Item(ItemEntry As TDropDown_ItemEntry) 

			mAddingItem	= True

			Dim NextEntryAt   		As Int = 0
			Dim LastView	  		As View 
			
			Dim ItemEntryIndex		As Int = mDDListItems.Size
			Dim OffsetFromLeft		As Int = 0
			Dim OffsetFromRight		As Int = 0
			
			Dim CheckedSleepNeeded	As Boolean 	= False
			
			
			
			ItemEntry.ItemPanel.Initialize("cDropDown_ListEntry") 
			ItemEntry.ItemPanel.Tag	   		= ItemEntryIndex
			ItemEntry.ItemPanel.Color  		= mDDListText.BGColor

			ItemEntry.ItemLabel.Initialize("")
			ItemEntry.ItemLabel.SingleLine	= True
			ItemEntry.ItemLabel.Tag   		= ItemEntryIndex
			ItemEntry.ItemLabel.Text  		= ItemEntry.ItemInfo.TextPassed
			
			ItemEntry.ItemLabel.Color 		= mDDListText.BGColor
			ItemEntry.ItemLabel.Padding 	= Array As Int(0, 0, 0, 0)
			
			ItemEntry.ItemLabel.TextColor	= mDDListText.FGColor
			ItemEntry.ItemLabel.TextSize	= mDDListText.TextSize
			ItemEntry.ItemLabel.Gravity		= mDDListText.TextGravity
			ItemEntry.ItemLabel.Typeface	= mDDListText.TextTypeFace
			
			If  ItemEntry.FontAwesome Then
				ItemEntry.ItemLabel.Typeface = Typeface.FONTAWESOME
			Else If  ItemEntry.MaterialFont Then
				ItemEntry.ItemLabel.Typeface = Typeface.MATERIALICONS
			End If


			If  mDDList.Panel.NumberOfViews > 0 Then
		   		LastView = mDDList.Panel.GetView(mDDList.Panel.NumberOfViews-1)
		   
		   		NextEntryAt = LastView.Top + LastView.Height
			End If

			
			ItemEntry.Offset = NextEntryAt


			mDDListItems.Add(ItemEntry)
							
        	mDDList.Panel.AddView(ItemEntry.ItemPanel, 0, NextEntryAt, mDDList.Width, mDefaultItemHeight)


			If  ItemEntry.ShowCheckBox.WantCheckBox Then
				Dim CheckedBmp			As BitmapDrawable
				Dim UnCheckedBmp		As BitmapDrawable						
							
				Dim Checked_Bitmap		As Bitmap

				Dim CheckBoxStateList	As StateListDrawable
				Dim CheckBox			As ToggleButton
																								
				Checked_Bitmap	= ItemEntry.ShowCheckBox.UseBitmaps(0)
														
				If  mDefaultItemHeight < (Checked_Bitmap.Height + 4dip) Then
					CheckedBmp.Initialize(ItemEntry.ShowCheckBox.UseBitmaps(0).Resize(mDefaultItemHeight   - 4dip, mDefaultItemHeight - 4dip, True))
					UnCheckedBmp.Initialize(ItemEntry.ShowCheckBox.UseBitmaps(1).Resize(mDefaultItemHeight - 4dip, mDefaultItemHeight - 4dip, True))
								
					Checked_Bitmap  = CheckedBmp.Bitmap
				Else
					CheckedBmp.Initialize(ItemEntry.ShowCheckBox.UseBitmaps(0))
					UnCheckedBmp.Initialize(ItemEntry.ShowCheckBox.UseBitmaps(1))										
				End If
							
				Dim BitmapTop 		As Int = (mDefaultItemHeight - Checked_Bitmap.Height) / 2
				Dim BitmapOffset	As Int = ItemEntry.ShowCheckBox.CheckBoxInfo.Indent


				CheckBox.Initialize("DropDown_CheckBox")
				CheckBox.TextOff	= ""
				CheckBox.TextOn		= ""
				CheckBox.Tag		= ItemEntryIndex
							
				CheckBoxStateList.Initialize
				CheckBoxStateList.AddState(CheckBoxStateList.State_Checked  , CheckedBmp)
   				CheckBoxStateList.AddState(CheckBoxStateList.State_Unchecked, UnCheckedBmp)															
							
				CheckBox.Background 		= CheckBoxStateList
				
				ItemEntry.ItemToggleButton 	= CheckBox
				
				CheckedSleepNeeded			= ItemEntry.ShowCheckBox.CheckBoxInfo.Checked
				CheckBox.Checked			= ItemEntry.ShowCheckBox.CheckBoxInfo.Checked


				If  ItemEntry.ShowCheckBox.CheckBoxInfo.InFront Then							
					OffsetFromLeft = BitmapOffset + Checked_Bitmap.Width								
					
					ItemEntry.ItemPanel.AddView(ItemEntry.ItemToggleButton, BitmapOffset, BitmapTop, Checked_Bitmap.Width, Checked_Bitmap.Height)											
				Else
					OffsetFromRight = BitmapOffset + Checked_Bitmap.Width								

Log("Panel Width:" &ItemEntry.ItemPanel.Width &"   Left:" &(ItemEntry.ItemPanel.Width - OffsetFromRight))

					
					ItemEntry.ItemPanel.AddView(ItemEntry.ItemToggleButton, (ItemEntry.ItemPanel.Width - OffsetFromRight), BitmapTop, Checked_Bitmap.Width, Checked_Bitmap.Height)											
				End If
			End If
			
			If  ItemEntry.ShowImage.WantImage Then
				Dim Bmp As Bitmap = ItemEntry.ShowImage.UserImage.Bitmap
				
				If  mDefaultItemHeight < (Bmp.Height + 4dip) Then
					ItemEntry.ShowImage.UserImage.Initialize(Bmp.Resize(mDefaultItemHeight - 4dip, mDefaultItemHeight - 4dip, True))
					
					Bmp = ItemEntry.ShowImage.UserImage.Bitmap
				End If
							
				Dim ImageTop 		As Int = (mDefaultItemHeight - Bmp.Height) / 2
				
				ItemEntry.ItemImageView.Initialize("DropDown_Image")
				ItemEntry.ItemImageView.Background = ItemEntry.ShowImage.UserImage
				

				If  ItemEntry.ShowImage.ImageInfo.InFront Then								
	   				ItemEntry.ItemPanel.AddView(ItemEntry.ItemImageView, OffsetFromLeft + ItemEntry.ShowImage.ImageInfo.Indent, ImageTop, Bmp.Width, Bmp.Height)				
					
					OffsetFromLeft  = OffsetFromLeft  + (Bmp.Width + ItemEntry.ShowImage.ImageInfo.Indent)
				Else
					OffsetFromRight = OffsetFromRight + (Bmp.Width + ItemEntry.ShowImage.ImageInfo.Indent)				

	   				ItemEntry.ItemPanel.AddView(ItemEntry.ItemImageView, (ItemEntry.ItemPanel.Width - OffsetFromRight), ImageTop, Bmp.Width, Bmp.Height)									
				End If
			End If


		
 	    	ItemEntry.ItemPanel.AddView(ItemEntry.ItemLabel, (OffsetFromLeft + mDDListText.Indent), 0, (ItemEntry.ItemPanel.Width - ((mDDListText.Indent * 2) + (OffsetFromLeft + OffsetFromRight))), ItemEntry.ItemPanel.Height)


			mT8TextSize.SingleLineNoLarger(ItemEntry.ItemLabel)
			
			If  mSmallestFont = -1 Then
				mSmallestFont = ItemEntry.ItemLabel.TextSize 
			Else
				If  ItemEntry.ItemLabel.TextSize < mSmallestFont Then
					mSmallestFont = ItemEntry.ItemLabel.TextSize
				End If
			End If

		
			NextEntryAt = NextEntryAt + mDefaultItemHeight

   			mDDList.Panel.Height = NextEntryAt						

			If  CheckedSleepNeeded Then
				Sleep(0)
			End If
		
			mAddingItem = False
		
			Return
End Sub
#end Region

#Region GetUserData
Public  Sub GetUserDataLong(ThisEntry As Int) As Long
	
			Dim ReturnLong	As Long	= 0
			
			If  ThisEntry >= 0 And ThisEntry < mDDListItems.Size Then
				Dim ItemEntry As TDropDown_ItemEntry = mDDListItems.Get(ThisEntry)
							
				If  ItemEntry.ItemInfo.ID = ThisEntry Then 
					ReturnLong = ItemEntry.ItemInfo.UserData				
					
					Return ReturnLong
				End If
			End If
	
			If  mDDList.Panel.NumberOfViews > 0 Then
				For Each v As View In mDDList.Panel.GetAllViewsRecursive
					If  v Is Panel Then
						Dim ViewPanel 	As Panel  = v						
						Dim PanelTag	As Object = ViewPanel.Tag
						
						If  PanelTag Is TDropDown_ItemEntry Then
							Dim ItemEntry As TDropDown_ItemEntry = PanelTag  
							
							If  ItemEntry.ItemInfo.ID = ThisEntry Then 
								ReturnLong = ItemEntry.ItemInfo.UserData
								
								Return ReturnLong
							End If
						End If
					End If
				Next
			End If
			
			Return ReturnLong
End Sub

Public  Sub GetUserData(ThisEntry As Int) As Object
	
			If  ThisEntry >= 0 And ThisEntry < mDDListItems.Size Then
				Dim ItemEntry As TDropDown_ItemEntry = mDDListItems.Get(ThisEntry)
							
				If  ItemEntry.ItemInfo.ID = ThisEntry Then 
					Return ItemEntry.ItemInfo.UserData				
				End If
			End If
	
			If  mDDList.Panel.NumberOfViews > 0 Then
				For Each v As View In mDDList.Panel.GetAllViewsRecursive
					If  v Is Panel Then
						Dim ViewPanel 	As Panel  = v						
						Dim PanelTag	As Object = ViewPanel.Tag
						
						If  PanelTag Is TDropDown_ItemEntry Then
							Dim ItemEntry As TDropDown_ItemEntry = PanelTag  
							
							If  ItemEntry.ItemInfo.ID = ThisEntry Then Return ItemEntry.ItemInfo.UserData
						End If
					End If
				Next
			End If
			
			Return Null
End Sub
#End Region

#Region  Moved / IsShowing / SetWidestLine / GetTag / Size
Public  Sub Moved
			mFirsTDropDown = True
			
			ResizePosition			
End Sub


Public  Sub IsShowing(CloseIt As Boolean) As Boolean
			Dim Showing As Boolean = (mDDListFrame.Visible And mDDListFrame.Enabled)
			
			If  Showing And CloseIt Then Close_DropDown(False)
			
			Return Showing
End Sub

'Private Sub SetWidestLine(Line As String)
'			Dim NewLine As Int 
'			Dim OldLine As Int
'			
'			Dim TempLabel As Label
'			
'			TempLabel.Initialize("")
'			TempLabel.TextSize	= mDDText.TextSize
'			TempLabel.Typeface	= mDDText.TextTypeFace
'			TempLabel.Padding	= Array As Int(0, 0, 0, 0)			
'			TempLabel.Visible   = False
'			
'			mAttachTo.AddView(TempLabel, 0, 0, mAttachTo.Width, mAttachTo.Height)			
'
'			TempLabel.Text 		= Line			
'			NewLine				= mT8TextSize.TextWidth(TempLabel)
'			
'			TempLabel.Text 		= mWidestItem
'			OldLine				= mT8TextSize.TextWidth(TempLabel)
'			
'			
'			If  NewLine > OldLine Then
'			    mWidestItem = Line
'				
''				Log("SetWidestLine:" &mWidestItem &"  Width:" &NewLine)								
'			End If
'			
'			TempLabel.RemoveView
'End Sub

'Public  Sub GetTag      As String
'        	If mAttachTo = Null Or mAttachTo.IsInitialized = False Then Return "Err"
'	   
'        	Return mAttachTo.Tag
'End Sub

Public  Sub Size As Int
        	Return mDDListItems.Size
End Sub
#end Region

#Region GetPosition / MakePosition / SetPositionNoCallBack / SetPosition / GetItem / GetSelected / SetSelected
Public  Sub GetLastSelected As Int
        	Return mPreviousSelected
End Sub

Public  Sub GetPosition As Int
        	Return mLastSelected
End Sub


Public  Sub MakePosition(Position As Int)
	
			If Position < 0 Or Position >= mDDListItems.Size Then Return
		
			mPreviousSelected	= mLastSelected
			mLastSelected  	 	= Position	
				
			mDDDisplay.Text 	= GetItem(Position)		
			
			mT8TextSize.SingleLineNoLarger(mDDDisplay)
			
    		Dim  ItemEntry     As TDropDown_ItemEntry = mDDListItems.Get(Position)
			
			If  mDDList.Enabled = False Then
				mDDList.Enabled = True
				mDDList.ScrollToNow(ItemEntry.Offset)	
				mDDList.ScrollPosition	= ItemEntry.Offset						
				mDDList.Enabled = False				
			Else
				mDDList.ScrollToNow(ItemEntry.Offset)			
			End If
End Sub

Public  Sub SetPositionNoCallBack(Position As Int)
 		    Try
				MakePosition(Position)
'        		mLastSelected = Position

        		If mLastSelected = -1 Then
           		   cDropDown_List_ItemClick2(-1, "", False)
        		Else
           		   cDropDown_List_ItemClick2(Position, GetItem(Position), False)
        		End If
				
           		If  mAutoSizeDisplay Then mT8TextSize.SingleLineAutoScale(mDDDisplay)														
    		Catch
        		Log(LastException.Message)
    		End Try
End Sub

Public  Sub SetPosition(Position As Int)
 		    Try
				MakePosition(Position)				
'        		mLastSelected = Position

        		If mLastSelected = -1 Then
           		   cDropDown_List_ItemClick(-1, "")
        		Else
           		   cDropDown_List_ItemClick(Position, GetItem(Position))
        		End If
				
           		If  mAutoSizeDisplay Then 
					mT8TextSize.SingleLineAutoScale(mDDDisplay)														
				End If
    		Catch
        		Log(LastException.Message)
    		End Try
			
'	        CallSub3(mCallRoutine, mCallFunction &"_ItemClick", Position, mDDList.GetItem(Position))
End Sub

Public  Sub GetItem(Position As Int) As Object
    		Try
        		If Position < 0 Or Position >= mDDListItems.Size Then Return ""
    		Catch
        		Log(LastException.Message)
    		End Try

    		Dim  ItemEntry     As TDropDown_ItemEntry = mDDListItems.Get(Position)

			If  ItemEntry.ShowImage.WantImage Then
				Return FormatImageLine(ItemEntry)
			Else
    			Return ItemEntry.ItemInfo.TextPassed
			End If
End Sub

Private Sub FormatImageLine(xItemEntry As TDropDown_ItemEntry)  As Object
				Dim CSBuilder As CSBuilder
				Dim BD		  As BitmapDrawable = xItemEntry.ShowImage.UserImage
				Dim Height	  As Int 			= mDDDisplay.Height - 4dip
'				Dim TempLabel As Label
'				
'				TempLabel.Initialize("")
'				TempLabel.TextSize	= mDDText.TextSize
'				TempLabel.Typeface  = mDDDisplay.Typeface
'				TempLabel.Height	= mDDDisplay.Height
'				TempLabel.Width		= mDDDisplay.Width - Height
'				TempLabel.Left		= mDDDisplay.Left
'				TempLabel.Top		= mDDDisplay.Top
'				TempLabel.Text		= $"  ${xItemEntry.ItemInfo.TextString}"$
'				
'				mT8TextSize.SingleLineNoLarger(TempLabel)
'				
'				mDDDisplay.TextSize = TempLabel.TextSize
												
				If  xItemEntry.ShowImage.ImageInfo.InFront Then		
					If  gSmallScreen Then																				
						Return  CSBuilder.Initialize.Image(BD.Bitmap, Height, Height, True).VerticalAlign(-5dip).Append("  ").Append(xItemEntry.ItemInfo.TextString).PopAll							
					Else
						Return  CSBuilder.Initialize.Image(BD.Bitmap, Height, Height, True).VerticalAlign(-9dip).Append("  ").Append(xItemEntry.ItemInfo.TextString).PopAll		
					End If
				Else
					If  gSmallScreen Then																				
						Return  CSBuilder.Initialize.VerticalAlign(-5dip).Append(xItemEntry.ItemInfo.TextString).Append("  ").PopAll.Image(BD.Bitmap, Height, Height, True)							
					Else
						Return  CSBuilder.Initialize.VerticalAlign(-9dip).Append(xItemEntry.ItemInfo.TextString).Append("  ").PopAll.Image(BD.Bitmap, Height, Height, True)
					End If					
				End If
End Sub

Public  Sub GetSelected  As String
    		Try
        		If mLastSelected  < 0 Or mLastSelected >= mDDListItems.Size Then Return ""
    		Catch
        		Log(LastException.Message)
    		End Try

    		Dim  ItemEntry     As TDropDown_ItemEntry = mDDListItems.Get(mLastSelected)

    		Return ItemEntry.ItemInfo.TextString
End Sub
    
Public  Sub SetSelected(Item As String)
			SetPosition(FindItem(Item))
End Sub

Public  Sub SetSelectedList(SelectedItems As String)
			Dim  SelectThese()	 As String = Regex.Split(", ", SelectedItems)
			
			Dim  SelectItem    	 As String 
			Dim  Item 			 As TDropDown_ItemEntry
			
			Dim  FirstChecked	 As Boolean = True
			Dim  TextString		 As String

			mAddingItem	= True
			
			'---------------------------------------------------
			'  Clear ALL Items
			'---------------------------------------------------
			For i = 0 To mDDListItems.Size-1
				Item = mDDListItems.Get(i)
				
				If  Item.ItemToggleButton.IsInitialized Then
					Item.ItemToggleButton.Checked	= False
				End If				
			Next
			
			'---------------------------------------------------
			'  Proces the list of Items passed
			'---------------------------------------------------
			For i = 0 To SelectThese.Length-1
				SelectItem = SelectThese(i)
				SelectItem = SelectItem.Trim
				
				If  SelectItem.Length = 0 Then Continue
				
				SelectItem = SelectItem.ToLowerCase
				
#if DebugX
				Log("Looking for:" &SelectItem)				
#End If
				
				For j = 0 To mDDListItems.Size-1
					Item = mDDListItems.Get(j)
					
#if DebugX
					Log("LookingAt:" &Item.Text)
#End If
					TextString = Item.ItemInfo.TextString
					
					If  TextString.EqualsIgnoreCase(SelectItem) Then
#if DebugX
						Log("SelectingItem")						
#End If
						If  Item.ItemToggleButton.IsInitialized Then 
							Item.ItemToggleButton.Checked = True
							
							If  FirstChecked Then
								FirstChecked = False
								
								mDDList.ScrollToNow(Item.Offset)											
							End If
							
							Exit							
						End If
					End If
				Next
			Next
			
			GetAllSelected
			
			mAddingItem = False
End Sub

Public  Sub GetAllSelected As String

			Dim Item 			As TDropDown_ItemEntry
			Dim SelectedString	As String

			SelectedString = ""			
			
			For i = 0 To mDDListItems.Size-1
				Item = mDDListItems.Get(i)											
						
				If  Item.ItemToggleButton.IsInitialized Then
					If  Item.ItemToggleButton.Checked Then
						SelectedString = SelectedString &Item.ItemInfo.TextString &", "														
					End If
				End If
			Next
			
			If  SelectedString.Length > 0 Then									
				SelectedString = SelectedString.SubString2(0,SelectedString.Length - 2)
			End If			
	
			mDDDisplay.Text = SelectedString

			MarqueeTextForever(mDDDisplay)
						
			Return SelectedString
End Sub

Private Sub MarqueeTextForever(DisplayField As Object)  
		    Dim Ref 	As Reflector
			Dim LimitTo As Int = -1
			
    		Ref.Target = DisplayField

    		Ref.RunMethod2("setLines", 1, "java.lang.int")
    		Ref.RunMethod2("setHorizontallyScrolling", True, "java.lang.boolean")

    		Ref.RunMethod2("setEllipsize", "MARQUEE", "android.text.TextUtils$TruncateAt")
    		Ref.RunMethod2("setSelected", True, "java.lang.boolean")

		    Ref.RunMethod2("setMarqueeRepeatLimit", LimitTo, "java.lang.int")
End Sub    
#end Region

#Region Find / FindParticle
Public  Sub FindUserData(UserData As Object) As Int
    		Dim  ListLoop      As Int
    		Dim  ItemEntry     As TDropDown_ItemEntry

			Log("FindUserData")
			
    		For ListLoop = 0 To mDDListItems.Size-1
        		ItemEntry = mDDListItems.Get(ListLoop)

        		If  ItemEntry.ItemInfo.UserData = UserData Then
					Log("FindUserData - Found:" &ListLoop)
					
					mPreviousSelected 	= mLastSelected					
           			mLastSelected 		= ListLoop

					mDDList.ScrollToNow(ItemEntry.Offset)

					mDDDisplay.Text = ItemEntry.ItemInfo.TextString

            		If  mAutoSizeDisplay Then mT8TextSize.SingleLineAutoScale(mDDDisplay)										
					
           			Return ListLoop
        		End If
    		Next

			Log("FindUserData - Not Found")

    		Return -1
End Sub

Public  Sub FindItem(Item As String) As Int
    		Dim  ListLoop		As Int
    		Dim  ItemEntry		As TDropDown_ItemEntry
			Dim  TextString		As String

    		For ListLoop = 0 To mDDListItems.Size-1
        		ItemEntry = mDDListItems.Get(ListLoop)

				TextString = ItemEntry.ItemInfo.TextString
				
        		If  TextString.EqualsIgnoreCase(Item) Then
					mPreviousSelected 	= mLastSelected					
           			mLastSelected 		= ListLoop

					mDDList.ScrollToNow(ItemEntry.Offset)

					mDDDisplay.Text = ItemEntry.ItemInfo.TextPassed
					
            		If  mAutoSizeDisplay Then 
						mT8TextSize.SingleLineAutoScale(mDDDisplay)										
					End If
					
           			Return ListLoop
				End If				
    		Next

    		Return -1
End Sub

Public  Sub FindParticleMatch(Item As String) As Int
    		Dim  ListLoop      	As Int
    		Dim  ItemEntry     	As TDropDown_ItemEntry

			Dim  ItemString		As String 
			
			Item = Item.ToLowerCase
			

    		For ListLoop = 0 To mDDListItems.Size-1
        		ItemEntry = mDDListItems.Get(ListLoop)

				ItemString = ItemEntry.ItemInfo.TextString
				ItemString = ItemString.ToLowerCase

        		If  ItemString.StartsWith(Item) Or ItemString.CompareTo(Item) > 0 Then
					mPreviousSelected 	= mLastSelected			
           			mLastSelected 		= ListLoop

					mDDList.ScrollToNow(ItemEntry.Offset)

					mDDDisplay.Text = ItemEntry.ItemInfo.TextPassed

            		If  mAutoSizeDisplay Then 
						mT8TextSize.SingleLineAutoScale(mDDDisplay)										
					End If

           			Return ListLoop
        		End If
    		Next

    		Return -1	
End Sub
#end Region

#Region Show_DropDown / Close_DropDown
Public Sub Show_DropDown
	
'			Dim TempView As View = mAttachTo.Parent
'			
'			Log("TempView (L/T) " &TempView.Left &" / " &TempView.Top)
			
			If  mHideKB <> Null Then
				If 	SubExists(mHideKB, "HideKeyBoard") Then 
			      	CallSub(mHideKB, "HideKeyBoard")
				End If
		   	End If				
				
     		mTouchEater.Visible  = True
     		mTouchEater.Enabled  = True
 	
     		mTouchEater.BringToFront
	 
#if Debug
	 		mTouchEater.Color = Colors.ARGB(127, 0, 0, 255)
#end if

'			If  mIsGridList Then
'				Dim RelativeLT  As TRelativeLT = cRelativePosition.GetRelativeLT(mAttachTo)
'				
'				
'
'			End If
			
			If  mFirsTDropDown Then
	   			mFirsTDropDown = False
#if __DO_WE_REALLY_NEED_THIS	   
	   			Dim LeftTop() As Int = GetScreenLocation(mAttachTo)

#if DebugX			  
	   			Log("L/T: " &LeftTop(0) &" / " &LeftTop(1) &"  Left / Top: " &mAttachTo_Left &" / " &mAttachTo_Top &"  mFrame L/T: " &mDDListFrame.Left &" / " &mDDListFrame.Top)
#end if
			
	   			If  LeftTop(0) <> mAttachTo_Left Then
		  			mDDListFrame.Left = mDDListFrame.Left + (LeftTop(0) - mAttachTo_Left)
	   			End If
			
	   			If  LeftTop(1) <> mAttachTo_Top Then
	      			mDDListFrame.Top = mDDListFrame.Top + (LeftTop(1) - mAttachTo_Top)
	   			End If		
#end if							
			End If

			Dim PView 	As Panel
			Dim LView 	As Label
			Dim Obj		As Object
			
			For i = 0 To mDDList.Panel.NumberOfViews-1
	 	 		PView = mDDList.Panel.GetView(i)
				
				For j = 0 To PView.NumberOfViews-1	
					Obj = PView.GetView(j)
					
					If  Obj Is Label Then
						LView = Obj
						LView.TextSize = mSmallestFont
'						Exit
					End If
				Next
			Next
			
     		mDDListFrame.Visible = True
     		mDDListFrame.Enabled = True

'			If  mLastSelected <> -1 Then
'    			Dim  ItemEntry     As TDropDown_ItemEntry = mDDListItems.Get(mLastSelected)
'			
'				mDDList.ScrollToNow(ItemEntry.Offset)	
'				mDDList.ScrollPosition	= ItemEntry.Offset						
'			End If
				
     		mDDListFrame.BringToFront	 		 
			

			If  mLastSelected >= 0 And mLastSelected < mDDListItems.Size Then 
   				Dim  ItemEntry  As TDropDown_ItemEntry = mDDListItems.Get(mLastSelected)
				
				mDDList.ScrollToNow(ItemEntry.Offset)								
				Sleep(0)
				mDDList.ScrollToNow(ItemEntry.Offset)												
			End If					
End Sub

Public  Sub Close_DropDown(SendCloseMsg As Boolean)
	
     		mTouchEater.Visible  = False
     		mTouchEater.Enabled  = False
 	
     		mTouchEater.SendToBack	
	 
     		mDDListFrame.Visible = False
     		mDDListFrame.Enabled = False
		
     		mDDListFrame.SendToBack		 
	 
	 		If SendCloseMsg = False Then Return
	 
     		Try
				If  mPassTag Then
		   			Dim PassParms As TDropDown_Parms
		   
		   			PassParms.Initialize
		   			PassParms.Tag      = mAttachTo.Tag
		   			PassParms.Position = -1
		   			PassParms.Value    = -1
		   
		   		
	   				If  SubExists(mCallRoutine, mCallFunction &"_DropDownClosed_Tag") Then CallSub2(mCallRoutine, mCallFunction &"_DropDownClosed_Tag", PassParms)
				Else
   	       			If  SubExists(mCallRoutine, mCallFunction &"_DropDownClosed")     Then CallSub(mCallRoutine, mCallFunction &"_DropDownClosed")
				End If

		
        		mAttachTo.BringToFront
    		Catch
        		Log(LastException.Message)
    		End Try
	 
End Sub
#end Region

#region GetDisplay
Public  Sub GetButton As Button
			Return mDDButton
End Sub

#end region

#Region Click Routines
Public  Sub cDropDown_CalledClick
    		cDropDown_Button_Click	
End Sub

Private Sub cDropDown_Display_Click
    		cDropDown_Button_Click
'			cDropDown_ListEntry_Click			
End Sub

Private  Sub cDropDown_Button_Click
'Private Sub cDropDown_ListEntry_Click
			
			If  mDDList.Enabled = False Then
				Return
			End If
			
    		mIMELibrary.HideKeyboard

    		mDDList.RequestFocus

    		If  mDDListFrame.Visible = True Then
	   			Close_DropDown(True)
         		Return
    		End If

		
			If  mAttachTo.Enabled = False Then Return

    		If  mDDListItems.Size = 0     Then Return

#If DebugX
    		Log("mDDListFrame.Height:" &mDDListFrame.Height &"  mDDList.Height:" &mDDList.Height)
#End If

    		Dim ThisManyItems As Int = mDDListItems.Size
	
    		If  mDDListItems.Size > mDDMaxToShow  Then 
				ThisManyItems = mDDMaxToShow
			else if mDDListItems.Size < mDDMaxToShow Then
					ThisManyItems = mDDListItems.Size
			End If
	
    		Dim UseThisHeight As Int = (mDefaultItemHeight * ThisManyItems)

    		If  mCenterRight Then
	   			Dim Center As Int = (UseThisHeight - mDefaultItemHeight) / 2

       			mDDListFrame.Left   = mAttachTo_Left+mAttachTo.Width
	   			mDDListFrame.Top    = mAttachTo_Top - Center
       			mDDListFrame.Height = UseThisHeight + (mDDListBorder.BorderWidth * 2) 
       			mDDList.Height      = UseThisHeight	   
			Else
       			Dim UseThisHeight As Int = (mDefaultItemHeight * mDDListItems.Size)
	
       			If  mPopListDown Then
          			If  UseThisHeight < mDDListFrame.Height Then
		     			mDDListFrame.Top    = (mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip)	   						
             			mDDListFrame.Height = UseThisHeight + (mDDListBorder.BorderWidth * 2)
             			mDDList.Height      = UseThisHeight
					Else
			    		UseThisHeight 		= (mDefaultItemHeight * ThisManyItems)
						
						Log("mAttachTo_Top:" &mAttachTo_Top &"  mAttachTo.Height:" &mAttachTo.Height)
						
		     			mDDListFrame.Top    = (mAttachTo_Top + mAttachTo.Height + mDDListBorder.BorderWidth - 10dip)	   						
             			mDDListFrame.Height = UseThisHeight + (mDDListBorder.BorderWidth * 2)
             			mDDList.Height      = UseThisHeight						
          			End If
	   			Else
          			If  UseThisHeight < mDDListFrame.Height Then
		     			mDDListFrame.Top    = (mAttachTo_Top + mDDListBorder.BorderWidth)		'(mAttachTo_Top + mAttachTo.Height + mDDFrameBorder.BorderWidth - 10dip)	   
		     			mDDListFrame.Top    = (mAttachTo_Top - ((mDDListBorder.BorderWidth + UseThisHeight - mDDListBorder.BorderWidth)))
						
             			mDDListFrame.Height = UseThisHeight + (mDDListBorder.BorderWidth * 2)
             			mDDList.Height      = UseThisHeight
          			End If	
	   			End If
    		End If


'			If  mLastSelected >= 0 And mLastSelected < mDDListItems.Size Then 
'   				Dim  ItemEntry  As TDropDown_ItemEntry = mDDListItems.Get(mLastSelected)
'Log($"cDropDown_Button_Click - ItemEntry:${ItemEntry.Offset}"$)
'				
'				mDDList.ScrollToNow(ItemEntry.Offset)								
'				Sleep(0)
'				mDDList.ScrollToNow(ItemEntry.Offset)												
'			End If		

    		Show_DropDown

    		mDDListFrame.BringToFront
End Sub

Private Sub cDropDown_ListEntry_Click
			Dim  ClickedPanel As Panel = Sender
			
			If  IsNumber(ClickedPanel.Tag) Then				
				Dim  Entry As Int = ClickedPanel.Tag
				
				If  Entry >= 0 And Entry < mDDListItems.Size Then
    				Dim  ItemEntry     	As TDropDown_ItemEntry = mDDListItems.Get(Entry)

					If  ItemEntry.ItemToggleButton.IsInitialized Then
						ItemEntry.ItemToggleButton.Checked = Not(ItemEntry.ItemToggleButton.Checked)
					else if ItemEntry.ItemImageView.IsInitialized Then
						mPreviousSelected 	= mLastSelected
						mLastSelected 		= Entry
					
       					If  SubExists(mCallRoutine, mCallFunction &"_ImageClick") 	 Then 
							CallSubDelayed2(mCallRoutine, mCallFunction &"_ImageClick", ItemEntry.ItemInfo)
       					else If SubExists(mCallRoutine, mCallFunction &"_ItemClick") 	 Then 
								CallSubDelayed2(mCallRoutine, mCallFunction &"_ItemClick", ItemEntry.ItemInfo)
						End If
					
						If  ItemEntry.ShowImage.WantImage Then
							mDDDisplay.Text = FormatImageLine(ItemEntry)
						Else	
							mDDDisplay.Text = ItemEntry.ItemInfo.TextString
						End If
						
            			If  mAutoSizeDisplay Then 
							mT8TextSize.SingleLineAutoScale(mDDDisplay)					
						End If
						
						If  mKeepOpen = False Then
							Close_DropDown(False)
						End If						
					Else					
						mPreviousSelected 	= mLastSelected						
						mLastSelected 		= Entry
					
       					If  SubExists(mCallRoutine, mCallFunction &"_ItemClick") 	 Then 
							CallSubDelayed2(mCallRoutine, mCallFunction &"_ItemClick", ItemEntry.ItemInfo)
						End If					
					
						mDDDisplay.Text = ItemEntry.ItemInfo.TextString
						
            			If  mAutoSizeDisplay Then mT8TextSize.SingleLineAutoScale(mDDDisplay)						
					
						If  mKeepOpen = False Then
							Close_DropDown(False)
						End If
					End If
				End If
			End If
End Sub


Private Sub cDropDown_Image_Click
			Dim  ClickedPanel As Panel = Sender
			
			If  IsNumber(ClickedPanel.Tag) Then
				Dim  Entry As Int = ClickedPanel.Tag
				
				If  Entry >= 0 And Entry < mDDListItems.Size Then
    				Dim  ItemEntry     	As TDropDown_ItemEntry = mDDListItems.Get(Entry)

					If  ItemEntry.ItemToggleButton.IsInitialized Then
						ItemEntry.ItemToggleButton.Checked = Not(ItemEntry.ItemToggleButton.Checked)
					Else					
						mPreviousSelected	= mLastSelected
						mLastSelected 		= Entry
					
       					If  SubExists(mCallRoutine, mCallFunction &"_ImageClick") 	 Then 
							CallSubDelayed2(mCallRoutine, mCallFunction &"_ImageClick", ItemEntry.ItemInfo)
						End If					
					
						mDDDisplay.Text = ItemEntry.ItemInfo.TextString
					
						If  mAutoSizeDisplay Then mT8TextSize.SingleLineAutoScale(mDDDisplay)					
						
						If  mKeepOpen = False Then
							Close_DropDown(False)
						End If
					End If
				End If
			End If
End Sub

Private Sub DropDown_CheckBox_CheckedChange(Checked As Boolean)
	
			Dim  CheckBox As ToggleButton = Sender
						
			If  IsNumber(CheckBox.Tag) Then
				Dim  Entry As Int = CheckBox.Tag
				
				If  Entry >= 0 And Entry < mDDListItems.Size Then
    				Dim  ItemEntry     	As TDropDown_ItemEntry = mDDListItems.Get(Entry)
					
					mPreviousSelected 	= mLastSelected					
					mLastSelected 		= Entry


					If  mAddingItem = False Then
	       				If  SubExists(mCallRoutine, mCallFunction &"_CheckedChange") 	 Then 
							CallSubDelayed3(mCallRoutine, mCallFunction &"_CheckedChange", ItemEntry.ItemInfo, Checked)
						End If					
					End If
					
					
					Dim ItemEntry As TDropDown_ItemEntry					

					mDDDisplay.Text = ""
					
					GetAllSelected										
					
					If  mKeepOpen = False Then
						Close_DropDown(False)
					End If
				End If
			End If
			
End Sub

Private Sub cDropDown_List_ItemClick(Position As Int, Value As Object)
			cDropDown_List_ItemClick3(Position, Value, True, Not(mKeepOpen))
End Sub

Private Sub cDropDown_List_ItemClick2(Position As Int, Value As Object, CallBack As Boolean)
			cDropDown_List_ItemClick3(Position, Value, CallBack, True)	
End Sub

Private Sub cDropDown_List_ItemClick3(Position As Int, Value As Object, CallBack As Boolean, CloseWindow As Boolean)

    #If DebugX
        	Log("cDropDown - Position:" &Position &"  Value:" &Value &"  For:" &mCallRoutine &"::" &mCallFunction)
    #End If If

    		Try
'				If  mLastSelected = Position Then
'		   			CloseDropDown(False)
'		   			mAttachTo.BringToFront
'		   			Return
'				End If
		
				mPreviousSelected	= mLastSelected		
        		mLastSelected   	= Position
				mDDDisplay.Text 	= Value

				mT8TextSize.SingleLineNoLarger(mDDDisplay)

        		Close_DropDown(False)
				
				
				If  mPassTag Then
		   			Dim PassParms As TDropDown_Parms
		   
		   			PassParms.Initialize
		   			PassParms.Tag      = mAttachTo.Tag
		   			PassParms.Position = Position
		   			PassParms.Value    = Value

					If  CallBack Then		   
		   				If  SubExists(mCallRoutine, mCallFunction &"_ItemClick_Tag") Then 
							CallSub2(mCallRoutine, mCallFunction &"_ItemClick_Tag", PassParms)
						End If
					End If
				Else
					Dim ItemInfo As TDropDown_ItemInfo
					
					ItemInfo.Initialize
					ItemInfo.ID			= Position
					ItemInfo.TextString	= Value
					ItemInfo.TextPassed = Value
					ItemInfo.UserData	= Null
					
					If  Position >= 0 And Position < mDDListItems.Size Then
	    				Dim  ItemEntry     	As TDropDown_ItemEntry = mDDListItems.Get(Position)
						
    					ItemInfo.UserData = ItemEntry.ItemInfo.UserData
					End If					
					
					If  CallBack Then
           				If  SubExists(mCallRoutine, mCallFunction &"_ItemClick") 	 Then 
							CallSub2(mCallRoutine, mCallFunction &"_ItemClick", ItemInfo)
						End If
					End If
				End If

		
        		mAttachTo.BringToFront
    		Catch
				Log("cDropDown::List_ItemClick" &CRLF &LastException.Message)
'        		CallSubDelayed3("Main", "Error_MsgBox", LastException.Message, "cDropDown::List_ItemClick")
    		End Try
End Sub
#end Region

#Region ResizePanel / ResizePosition / ResetFrameSize
Public  Sub ResizePanel(NewWidth As Int, NewHeight As Int)
        	If  NewWidth  <> -1 Then mAttachTo.Width  = NewWidth
	    	If  NewHeight <> -1 Then mAttachTo.Height = NewHeight

        	ResizePosition
End Sub

Public Sub ResizePosition

'			Log($"ResizePosition: ${mShowButton} for Button:${mCallFunction}"$)

        	If  mAttachTo = Null Or mAttachTo.IsInitialized = False Then 
				Return
			End If
	   
	    	If  mShowButton Then
           		If  mButtonInFront Then
              		mDDButton.Left    = (mDDFrameBorder.BorderWidth+2dip)
	   
              		mDDDisplay.Left   = (mDDButton.Left + mDDButton.Width +5dip)
	          		mDDDisplay.Top    = mDDFrameBorder.BorderWidth	   
              		mDDDisplay.Width  = mAttachTo.Width  - (mDDDisplay.Left + mDDFrameBorder.BorderWidth + 5dip)
              		mDDDisplay.Height = mAttachTo.Height - (mDDFrameBorder.BorderWidth * 2)
	   
              		mDDButton.Top     = mDDFrameBorder.BorderWidth + ((mDDDisplay.Height-mDDButton.Height)/2)	   
	       		Else	   
              		mDDDisplay.Left   = (mDDFrameBorder.BorderWidth+5dip)
	          		mDDDisplay.Top    = mDDFrameBorder.BorderWidth	   
              		mDDDisplay.Width  = mAttachTo.Width  - (mDDButtonWidth + mDDFrameBorder.BorderWidth + 2dip + 5dip)
              		mDDDisplay.Height = mAttachTo.Height - (mDDFrameBorder.BorderWidth * 2)
 			  
              		mDDButton.Left    = mAttachTo.Width - (mDDButtonWidth+mDDFrameBorder.BorderWidth+2dip)
              		mDDButton.Top     = mDDFrameBorder.BorderWidth + ((mDDDisplay.Height-mDDButton.Height)/2)
	       		End If		  
	    	Else
              	mDDDisplay.Left   = (mDDFrameBorder.BorderWidth+5dip)
	          	mDDDisplay.Top    = mDDFrameBorder.BorderWidth	   
              	mDDDisplay.Width  = mAttachTo.Width  - ((mDDFrameBorder.BorderWidth * 2) + 10dip)
              	mDDDisplay.Height = mAttachTo.Height -  (mDDFrameBorder.BorderWidth * 2)
			  
              	mDDButton.Enabled = False
			  	mDDButton.Visible = False
 	    	End If

			mFirsTDropDown = True
End Sub

Public Sub ResetFrameSize
        	If  mAttachTo = Null Or mAttachTo.IsInitialized = False Then Return
			
			
	    	Dim UseThisHeight         As Int = mUseForSize.Height * mDDMaxToShow
	    	Dim ThisManyItems 		  As Int = mDDListItems.Size
			
        	Dim AvailableHeightDown   As Int = (mUseForSize.Height - mAttachTo_Top) - mAttachTo.Height
			Dim AvailableHeightUp     As Int = (mAttachTo_Top - mUseForSize.Top)

			If ThisManyItems <> 0 Then UseThisHeight = mUseForSize.Height * ThisManyItems

        	If  mCenterRight Then
           		mDDListFrame.Height = UseThisHeight
			Else
				If  UseThisHeight < AvailableHeightDown Then
'	      			mPopListDown = True
	   
           			If  UseThisHeight > AvailableHeightDown Then UseThisHeight = AvailableHeightDown					
				Else
           			If  AvailableHeightDown > AvailableHeightUp Then
'		      			mPopListDown = True
		   
              			If  UseThisHeight > AvailableHeightDown Then UseThisHeight = AvailableHeightDown
	       			Else
'		      			mPopListDown = False
		   
              			If  UseThisHeight > AvailableHeightUp Then 
							mPopListDown  = False
							UseThisHeight = AvailableHeightUp		   
						End If
	  	   			End If
				End If
			End If
	
    		If  mDDListItems.Size > mDDMaxToShow  Then ThisManyItems = mDDMaxToShow
	
    		If  UseThisHeight > (mDefaultItemHeight * ThisManyItems) Then
		   		UseThisHeight = (mDefaultItemHeight * ThisManyItems)  + 10dip
			End If
		
        	mDDListFrame.Height = UseThisHeight   
    		mDDList.Height		= mDDListFrame.Height-10dip

        	ResizePanel(mAttachTo.Width, mAttachTo.Height)
End Sub
#end Region

#if B4A
public  Sub GetDDBitmap(Pressed As Boolean) As BitmapDrawable
#else if B4i
public  Sub GetDDBitmap(Pressed As Boolean) As Bitmap
#end if
			If  Pressed Then
				Return mDDArrowDown_Pressed
			End If
			
			
    		Return	mDDArrowDown
End Sub			

#if B4I 
Private Sub Base64StringToImage(s As String) As Bitmap
   			Dim su 		As StringUtils
   			Dim bytes() As Byte = su.DecodeBase64(s)
   			Dim In 		As InputStream
			
   			In.InitializeFromBytesArray(bytes, 0, bytes.Length)
			
   			Dim bmp As Bitmap
			
   			bmp.Initialize2(In)
			
   			In.Close
			
   			Return bmp
End Sub
#End If